diff options
author | nobody <nobody@localhost> | 2003-05-03 19:02:31 +0800 |
---|---|---|
committer | nobody <nobody@localhost> | 2003-05-03 19:02:31 +0800 |
commit | 003db0ae2e1ed2b175e0b69c860d07e9967534a7 (patch) | |
tree | 1445967f5c0ef4c749bc1b4030295ea1a12e3c00 /shell | |
parent | 19f2626e65d1700ff9c631a70ecb917f98dfcb38 (diff) | |
download | gsoc2013-evolution-GNOME_PILOT_CONDUITS_2_0_8.tar.gz gsoc2013-evolution-GNOME_PILOT_CONDUITS_2_0_8.tar.zst gsoc2013-evolution-GNOME_PILOT_CONDUITS_2_0_8.zip |
This commit was manufactured by cvs2svn to create tagGNOME_PILOT_CONDUITS_2_0_8
'GNOME_PILOT_CONDUITS_2_0_8'.
svn path=/tags/GNOME_PILOT_CONDUITS_2_0_8/; revision=21067
Diffstat (limited to 'shell')
188 files changed, 0 insertions, 69532 deletions
diff --git a/shell/.cvsignore b/shell/.cvsignore deleted file mode 100644 index 635e84bd20..0000000000 --- a/shell/.cvsignore +++ /dev/null @@ -1,28 +0,0 @@ -*.lo -.deps -.libs -.pure -Evolution-Addressbook-SelectNames-common.c -Evolution-Addressbook-SelectNames-skels.c -Evolution-Addressbook-SelectNames-stubs.c -Evolution-Addressbook-SelectNames.h -Evolution-common.c -Evolution-skels.c -Evolution-stubs.c -Evolution.h -Evolution-Wombat-common.c -Evolution-Wombat-skels.c -Evolution-Wombat-stubs.c -Evolution-Wombat.h -ID -Makefile -Makefile.in -evolution -evolution-nognome -evolution-test-component -evolution.pure -libeshell.la -e-shell-marshal.c -e-shell-marshal.h -GNOME_Evolution_Shell.server -GNOME_Evolution_Shell.server.in
\ No newline at end of file diff --git a/shell/ChangeLog b/shell/ChangeLog deleted file mode 100644 index ae2abc409a..0000000000 --- a/shell/ChangeLog +++ /dev/null @@ -1,15219 +0,0 @@ -2003-05-01 Dan Winship <danw@ximian.com> - - * glade/e-shell-shared-folder-picker-dialog.glade: Don't expand - the select-names entry, because we don't want it as tall as the - button. - -2003-04-30 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-selection-dialog.c - (e_shell_folder_selection_dialog_construct): Set the default - response to GTK_RESPONSE_OK. - -2003-04-29 Rodney Dawes <dobey@ximian.com> - - * Makefile.am: Fix install of evolution - -2003-04-28 Not Zed <NotZed@Ximian.com> - - [#41013] - - * e-shell-importer.c (html_size_req): removed. - (create_help): renamed from create_html. Only creates a plain - label widget now, with line wrap turned on. Also make the - g_return an assert, it failing is entirely based on internal code. - (show_import_wizard): s/create_html/create_help/g - - [#41648] - - * e-config-upgrade.c (upgrade_xml_file): upgrade_xml_file_1_0 made - a bit more generic, this handles io, a callback handles xml - changes. - (is_xml1encoded): new function to tell if a string is in gal's - xml1 'encoded' format, or raw locale text. - (decode_xml1): decode xml1 encoded format to valid utf8. - (upgrade_xml_1_2_rec): upgrades xml1 encoded or badly encoded xml - content for specific parent->child nodes. - (CONF_REVISION): bump the config revision to 1.3.1. - (e_config_upgrade): if config revision < 1.3.1, then check xml - files for xml1 content. - -2003-04-28 Rodney Dawes <dobey@ximian.com> - - * Makefile.am: Fix up some stuff for the nognome script - * evolution-nognome.in: Fix up nognome script for Sun GNOME2 - -2003-04-28 Rodrigo Moya <rodrigo@ximian.com> - - Fixes #41916 - - * evolution-storage.c (get_folder_list_foreach): removed comment which - does not apply any more. - (impl_Storage__get_folderList): set sequence's maximum number of items - to e_folder_tree_get_count as is. - -2003-04-28 Ettore Perazzoli <ettore@ximian.com> - - Patch from Sanshao Jiang <alex.jiang@sun.com>. - - [#41484] - - * main.c (main): Add e_proxy_init() - -2003-04-24 Dan Winship <danw@ximian.com> - - * evolution-shell-component.c (impl_setOwner): Comment out the - pinging code again since it's only being used by Connector, where - it's triggering an unrelated bug. - -2003-04-25 Ettore Perazzoli <ettore@ximian.com> - - [#41059] - - * e-corba-storage.c (async_open_cb): Added a missing unref of the - storage in the closure. - (async_open_folder_idle): Add the pending open to the pending open - list before calling asyncOpenFolder, instead of after. - -2003-04-23 Not Zed <NotZed@Ximian.com> - - * e-local-storage.c (load_folder): cast to remove warning. - (construct): set a physiucal uri on the root folder, so we dont - get warnings when we add it later. - -2003-04-22 Anna Marie Dirks <anna@ximian.com> - - * e-shell-settings-dialog.c (init): Add appropriate padding - to the Evolution Settings window. This is another bit of the - fix for #41392. - - * e-corba-config-page.c (e_corba_config_page_construct): Add - appropriate padding to the corba_config_page widget. Partial - fix for #41392. - -2003-04-23 Anna Marie Dirks <anna@ximian.com> - - * glade/e-folder-list.glade: replaced buttons with stock buttons - and added HIG-blessed spacing. Fixes 41145. - -2003-04-22 Anna Marie Dirks <anna@ximian.com> - - * e-shortcuts-view.c - (destroy_group_cb): Set the border width of the message dialog - to 6. Also corrected the capitalization for "Remove Shortcut - Dialog". Fixes 41569 - (show_new_group_dialog): Fixed the title of "Create New Shortcut - Group" . Partially fixes 41038. - (rename_shortcut_cb): Corrected the label capitalization for - Rename dialog. Fixes 41567. - -2003-04-21 Chris Toshok <toshok@ximian.com> - - * e-folder-list.c (e_folder_list_parse_xml): this should never - happen unless you're really trying, but don't crash if the xml - setting is malformed. - -2003-04-21 Ettore Perazzoli <ettore@ximian.com> - - * e-local-storage.c (create_folder_directory): Don't signal an - error if mkdir() returns EEXIST. This should at least help with - situations like the one described in #40989. - -2003-04-21 Anna Marie Dirks <anna@ximian.com> - - * e-shell-folder-commands.c (delete_dialog): Corrected border - with for Delete Folder dialog. Fixes 41036. - (e_shell_command_copy_folder): Corrected capitalization of the "Copy - Folder" window title. Partial fix for 41025. - (e_shell_command_move_folder): Corrected the capitalization of the - "Move Folder" dialog. Fixes 41024. - - -2003-04-21 Anna Marie Dirks <anna@ximian.com> - - * e-shell-folder-selection-dialog.c - (e_shell_folder_selection_dialog_construct): Added appropriate border - width to the folder selection dialog. Fixes 41022, 41146, 41147, - 41010, partially fixes 41025. - - -2003-04-21 Anna Marie Dirks <anna@ximian.com> - - * glade/evolution-startup-wizard.glade: Added spacing/padding to - first-run dialog. Fixes 41242. - -2003-04-21 Anna Marie Dirks <anna@ximian.com> - - * glade/e-shell-folder-creation-dialog.glade: Misc HIG-related tweaks, - mostly spacing and padding related. Fixes 41008. - - * e-shell-folder-creation-dialog.c (add_storage_set_view): Added - appropriate spacing to the main vbox of the folder creation dialog. - Partially fixes 41008. - -2003-04-21 Anna Marie Dirks <anna@ximian.com> - - * glade/e-shell-config-default-folders.glade: Added appropriate - spacing/padding to the default folder pages of the settings dialog. - Partial fix for 41128. - - -2003-04-21 Anna Marie Dirks <anna@ximian.com> - - * glade/e-active-connection-dialog.glade: Fixed padding/spacing/caps - of the "Go Offline" dialog. Fixes 41225 and 41227. - -2003-04-18 Rodney Dawes <dobey@ximian.com> - - * e-shell-view.c: Use PREFIX instead of EVOLUTION_DATADIR for - bonobo_ui_util_set_ui () [#21499] - -2003-04-17 Dan Winship <danw@ximian.com> - - * e-shell-folder-creation-dialog.c (add_folder_types): If the - default_type is "foo/bar" and "foo" appears in the list but - "foo/bar" doesn't, use "foo" as the default type. [#41468] Also, - remove a workaround for a gtk 1.2 bug. - -2003-04-16 Dan Winship <danw@ximian.com> - - * e-corba-storage.c (async_create_folder): If the new folder's - parent has unresolved children, async_open the parent first, then - create the new folder. [#41413] - (async_create_folder, async_remove_folder, async_xfer_folder, - async_open_folder, async_discover_shared_folder, - async_remove_shared_folder): Ref the storage. - (async_folder_cb, async_folder_discovery_cb): Unref it - -2003-04-16 Jeffrey Stedfast <fejj@ximian.com> - - * e-config-upgrade.c: Turn off debugging. Fixes bug #41469. - -2003-04-16 Ettore Perazzoli <ettore@ximian.com> - - * apps_evolution_shell.schemas: Increase the default value for - /schemas/apps/evolution/shell/view_defaults/folder_bar/width to - 200. [#41002] - - * evolution-shell-component.c (owner_ping_callback): Enable this - again. - (setup_owner_pinging): Same. - (impl_setOwner): Check if the shell is in-process and, if so, call - setup_owner_pinging(). - -2003-04-15 Hans Petter Jansson <hpj@ximian.com> - - * e-setup.c (e_setup_check_config): Free the temporary string. - - * e-shell-user-creatable-items-handler.c (append_xml_for_menu_item): - Free the icon xml string. - - * e-shell.c (parse_default_uri): Free the component name, the - configuration path and the temporary path. - -2003-04-15 Dan Winship <danw@ximian.com> - - * e-folder.c (e_folder_get_has_subfolders, - e_folder_set_has_subfolders): new boolean flag. - - * e-storage.c (EStoragePrivate, impl_finalize, init): Remove the - pseudofolders hash - (e_storage_async_open_folder): Replace the pseudofolders test with - a test of whether the folder has the "has_subfolders" flag set. - (e_storage_new_folder): Likewise (for the folder's parent). - (e_storage_declare_has_subfolders): Set "has_subfolders" on the - folder. - (e_storage_get_has_subfolders): Check "has_subfolders" on the - folder. - Should fix #33919. - -2003-04-14 Not Zed <NotZed@Ximian.com> - - * glade/e-active-connection-dialog.glade: fix the title of the - dialogue box. #41304. - -2003-04-09 Dan Winship <danw@ximian.com> - - * e-folder-list.c: Update for e_option_menu prototype - constification - -2003-04-08 Ettore Perazzoli <ettore@ximian.com> - - * e-setup.c (setup_bonobo_conf_private_directory): Removed. - (e_setup): Do not call here. Also, removed hacks for - ~/evolution/config and ~/evolution/local/Trash. - -2003-04-08 Dan Winship <danw@ximian.com> - - * main.c (main): Add a "--setup-only" flag, to just run e_setup() - and exit. (For #40889) - - * glade/evolution-startup-wizard.glade: Remove the color specs so - the druid will use theme colors - - * importer/import.glade: Likewise - -2003-04-08 Ettore Perazzoli <ettore@ximian.com> - - [#40912] - - * e-shell-folder-selection-dialog.c (impl_dispose): - g_object_weak_unref() the shell here. - -2003-04-07 Dan Winship <danw@ximian.com> - - * evolution-storage.c (evolution_storage_class_init): Fix arg - types on REMOVED_SHARED_FOLDER signal. #40888 - - * evolution-folder-selector-button.c (clicked): Desensitize the - window's top-level container rather than desensitizing the window - itself, which causes strange problems [#40854]. Also fix up the - code that tries to watch for the parent window being destroyed. - - * e-shell.c (impl_Shell_selectUserFolder): Use - e_dialog_set_transient_for_xid. - - * e-shell-folder-selection-dialog.c (impl_response): Treat - GTK_RESPONSE_DELETE_EVENT the same as GTK_RESPONSE_CANCEL. - (e_shell_folder_selection_dialog_construct): No need to catch - "delete_event" signal. - -2003-04-07 Dan Winship <danw@ximian.com> - - * Makefile.am ($(server_in_files)): Substitute version number into - the evolution binary name in the server file - (INCLUDES): define EVOLUTION_TOOLSDIR - - * GNOME_Evolution_Shell.server.in.in: Clean up server names. Add - "-@VERSION@" to the end of the shell binary name - - * main.c (main): if KILL_PROCESS_CMD is defined, add a - --force-shutdown argument that runs killev and exits. - -2003-04-07 Not Zed <NotZed@Ximian.com> - - [#40536] - - * evolution-shell-component.c (impl_interactive): If going - interactive, track the view id in a private area. - (evolution_shell_component_get_parent_view_xid): Accessor method - to retrieve the current view xid. - -2003-04-06 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (update_window_icon): Get the large version of - the icon instead of the small one, so it works more nicely with - modern WMs. - -2003-04-04 Ettore Perazzoli <ettore@ximian.com> - - [#40413] - - * e-shell-folder-selection-dialog.c: Define RESPONSE_NEW for the - "New" button in the dialog. - (impl_response): Handle RESPONSE_NEW. - (e_shell_folder_selection_dialog_construct): Add the "new" button - with RESPONSE_NEW response_id. - -2003-04-04 Ettore Perazzoli <ettore@ximian.com> - - [#40748] - - * apps_evolution_shell.schemas: Remove the icon_modes schema. - - * e-shell-view.c (setup_defaults): Don't set the icon modes from - GConf, they are already stored in the shortcuts.xml file. - (e_shell_view_save_defaults): Likewise, don't set it here. - - * e-config-upgrade.c: Remove translation from - ShortcutBarGroup%iIconMode to - shell/view_defaults/shortcut_bar/icon_types. - -2003-04-02 Rodrigo Moya <rodrigo@ximian.com> - - * importer/GNOME_Evolution_Importer.idl: - * importer/evolution-importer.[ch]: added "foldertype" argument to - GNOME::Evolution::Importer. - - * importer/evolution-importer-client.[ch] - (evolution_importer_client_load_file): added "folder_type" argument - and use it in the call to GNOME_Evolution_Importer_loadFile. - - * e-shell-importer.c (start_import): added "folder_type" argument and - use it in the call to evolution_importer_client_load_file. - (folder_selected): pass in the "folder_type" argument to start_import, - -2003-04-02 Not Zed <NotZed@Ximian.com> - - [#40652] - - * e-shell-view.c (setup_widgets): Pack the folder and shortcut - bars into the paned as sizeable. - - [#39467] - - * e-shell.c (e_shell_construct): Change the splash logic slightly, - so that if we can't create the splash, we dont try and cast/use - it. - * e-splash.c (e_splash_new): dont use a g_return* for what could - be a valid (tho incorrect) runtime condition. - - [#40590] - - * e-config-upgrade.c (identity_map[]): Move the signature stuff to - a child node. - (identity_sig_map[]): Define the signature node. Fix - *autogenerated_signature_%i to map to "auto". - -2003-04-01 Not Zed <NotZed@Ximian.com> - - [#40474] - - * e-config-upgrade.c (gconf_remap_list[]): The summary settings - start at "My-Evolution", not "/My-Evolution". - (import_bonobo_config): Same for mail summary settings, and hex - decode the string for the strlist. Add a few extra debug - printf's. - -2003-03-28 Ettore Perazzoli <ettore@ximian.com> - - [#40377] - - * main.c (kill_old_wombat): New. - (kill_wombat): New. - (idle_cb): Call kill_old_wombat(). - -2003-03-27 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-offline-handler.c (update_dialog_tree_view): Renamed - from update_dialog_clist, Ported to GtkTreeView. - (update_dialog_tree_view_hash_foreach): Likewise. - - * glade/e-active-connection-dialog.glade: Rename - "active_connection_clist" to "active_connection_treeview". - -2003-03-27 Not Zed <NotZed@Ximian.com> - - * e-shell-about-box.c: Make Radek's surname correct, Doulík, - inserted utf8 into the name string. For bug #17034. - -2003-03-26 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (e_shell_view_construct): Pass "evolution-1.4" as - the app name to bonobo_ui_util_set_ui() instead of "evolution". - -2003-03-26 Ettore Perazzoli <ettore@ximian.com> - - [Shell part of #7153.] - - * e-local-storage.c (load_folder): Call e_storage_new_folder() - instead of new_folder() here so the folder doesn't get added to - the EvolutionStorage. Since the EvolutionStorage has its own - CORBAfied copy of the folder info [sigh] and it can't be updated, - we have to set up the EvolutionStorage after setup_stock_folders() - has been called. - (setup_corba_storage): New function to set up the CORBA storage. - (load_all_folders): Call setup_corba_storage() after - setup_stock_folders(). - -2003-03-25 Not Zed <NotZed@Ximian.com> - - * e-shell-settings-dialog.c (set_dialog_size): Use - set_default_size instead of size_request so we allow the user to - resize the window. Also try using 60x30 rather than 72x35 as the - approximate font cell size. For bug #39706. - -2003-03-25 Dan Winship <danw@ximian.com> - - * e-folder-dnd-bridge.c: Update for e_notice move. - * e-setup.c: Likewise - * e-shell-folder-commands.c: Likewise - * e-shell-folder-creation-dialog.c: Likewise - * e-shell-offline-sync.c: Likewise - * e-shell-shared-folder-picker-dialog.c: Likewise - * e-shell-view-menu.c: Likewise - * e-shell.c: Likewise - * evolution-shell-component-utils.c: Likewise - - * Makefile.am (libeshell_la_LIBADD): libeshell depends on - libeutil. - - * e-corba-storage.c: Fix warnings - - * glade/evolution-startup-wizard.glade: Fix colors again - -2003-03-25 Dan Winship <danw@ximian.com> - - * Evolution-ShellComponent.idl (interactive): add a "new_view_xid" - arg, so the component has a window id to make use of as a parent - if it needs to pop up a dialog. - - * e-shell.c (set_interactive): Pass the new_view_xid when going - interactive. - (e_shell_set_interactive): Remove this since it wasn't being used, - and couldn't be used for anything except lying to the components. - - * evolution-shell-component.c - (evolution_shell_component_class_init): Update "interactive" - signal definition - (impl_interactive): Update prototype and signal emission - - * e-shell-marshal.list (NONE:BOOL,INT): add - -2003-03-21 Dan Winship <danw@ximian.com> - - * e-corba-storage.c (async_open_folder_idle): If we get a second - request to open a folder we're already waiting for, don't send a - second CORBA request, just remember the additional request. - (async_open_cb): Call the callbacks for all pending requests for - this folder. - (init): grumble-grumble-non-g_new0-using-people-grumbe - -2003-03-20 JP Rosevear <jpr@ximian.com> - - * e-shell-view-menu.c: remove unused command - -2003-03-19 Not Zed <NotZed@Ximian.com> - - * e-config-upgrade.c (e_config_upgrade): Added some more doco just - to make it clear how it was intended to be used/expanded. - -2003-03-18 Ettore Perazzoli <ettore@ximian.com> - - * importer/evolution-importer.c - (impl_GNOME_Evolution_Importer_loadFile): Get a physical_uri arg - instead of a folderpath arg. - - * importer/evolution-importer-client.c - (evolution_importer_client_load_file): Get a physical_uri arg. - - * e-shell-importer.c (start_import): Get a physical_uri arg - instead of a folderpath. - (folder_selected): Updated accordingly. - -2003-03-19 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-importer.c (get_name_from_component_info): Look for the - "evolution:menu_name" property instead of "evolution:menu-name". - [#39692] - -2003-03-19 Ettore Perazzoli <ettore@ximian.com> - - * evolution-folder-selector-button.c (set_folder): If you can't - get a pixbuf icon for the folder's type, do not crash. [#39599] - - * e-shell.c (impl_Shell__get_displayName): Removed. [#38974] - (e_shell_class_init): Do not install anymore. - - * Evolution-Shell.idl: Remove displayName attribute. - -2003-03-18 Ettore Perazzoli <ettore@ximian.com> - - * importer/evolution-importer.c - (impl_GNOME_Evolution_Importer_loadFile): Get a physical_uri arg - instead of a folderpath arg. - - * importer/evolution-importer-client.c - (evolution_importer_client_load_file): Get a physical_uri arg. - - * e-shell-importer.c (start_import): Get a physical_uri arg - instead of a folderpath. - (folder_selected): Updated accordingly. - -2003-03-14 Dan Winship <danw@ximian.com> - - * e-storage.c (e_storage_get_has_subfolders): Add - (e_storage_declare_has_subfolders): Rename from - e_storage_has_subfolders to make it clearer that this is a setter, - not a getter. (Can't call it e_storage_set_has_subfolders because - that sounds like it belongs in e-storage-set.) - - * e-corba-storage.c (impl_StorageListener_notifyHasSubfolders): - update for e_storage_declare_has_subfolders name change - (get_folder): Override the default EStorage implementation: if - asked for a folder under a not-yet-expanded folder, attempt to - force the parent(s) to expand so that the child is available. - Fixes part of #30415 - -2003-03-14 Dan Winship <danw@ximian.com> - - * Evolution-Storage.idl (asyncOpenFolder): add a Bonobo::Listener - to this like the other async interfaces, rather than having a - hacky way to signal failure. - - * evolution-storage.c (impl_Storage_asyncOpenFolder): Update to - take a listener and emit it as part of the signal - (evolution_storage_class_init): update OPEN_FOLDER signal - prototype. - - * e-shell-marshal.list (NONE:POINTER,STRING): add, for changed - EvolutionStorage open_folder signal - - * e-storage.c (e_storage_async_open_folder): add a callback arg - (impl_async_open_folder): call the callback with NOTIMPLEMENTED. - (class_init): remove the CLOSE_FOLDER signal - (e_storage_has_subfolders): Don't emit CLOSE_FOLDER since it - doesn't exist any more, and this function is used for that side - effect any more anyway. - - * e-corba-storage.c (async_open_folder): add the callback arg and - create a proper closure. - (async_open_folder_idle): Call the callback in case of error. - Create a listener and pass that to the CORBA call. - (async_open_cb): Listener callback. - - * e-storage-set.c (storage_set_view_folder_opened): Pass a - callback to e_storage_async_open_folder. - (async_open_cb): emit CLOSE_FOLDER if the open failed - (storage_close_folder_cb): Remove this since the signal no longer - exists. - -2003-03-11 Dan Winship <danw@ximian.com> - - * e-shell-startup-wizard.c (start_wizard): If the wizard factory - returns NULL, we'll get a NIL wizard but no exception. Deal with - that case. (ie, try the next wizard). - (finish_func): Simplify for e-timezone-dialog changes. - (prepare_timezone_page): If there is already a timezone set in - gconf, set the map to point to it. (For connector autoconfig.) - -2003-03-07 Not Zed <NotZed@Ximian.com> - - ** reverted the following patch from ettore, this is a gnome 2.2 - api change, and shouldn't be used yet. - - * e-shell.c (impl_finalize): Use - bonobo_activation_unregister_active_server() instead of - bonobo_activation_active_server_unregister(). - (e_shell_construct): Use - bonobo_activation_register_active_server() instead of - bonobo_activation_active_server_register(). - -2003-03-04 Not Zed <NotZed@Ximian.com> - - * main.c (show_development_warning): Separated the current stable - version number from the warning prompt, and fixed a minor - grammatical error. For bug #38775. - -2003-03-06 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (impl_Shell_selectUserFolder): At least for now, - disable the nasty XWMHints trick to fool WMs; it is not needed now - that everything is in-proc. - -2003-03-06 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-utils.c (e_shell_folder_name_is_valid): Do not allow - names with a "#" in them either. - -2003-03-06 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (update_other_users_folder_items_sensitivity): - New function to toggle the "open other user's folder" menu item - sensitivity on or off depending on whether there are any storages - that actually support that. - (storage_set_removed_storage_callback): New callback for the - EStorageSet's "removed_storage" signal; it updates the sensitivity - if necessary. - (storage_set_new_storage_callback): Likewise, new callback for the - EStorageSet's "new_storage" signal. - (e_shell_view_construct): Connect these two signal callbacks here. - Also, call update_other_users_folder_items_sensitivity() to set up - the initial sensitivity of the menu item. - (update_for_current_uri): Add a missing EStorageSetView cast here. - -2003-03-06 Ettore Perazzoli <ettore@ximian.com> - - [#34371] - - * e-shell-shared-folder-picker-dialog.c - (folder_name_entry_changed_callback): New callback to set the - sensitivity of the OK button according to whether the folder name - entry is empty or not. - (show_dialog): Connect here. Pop up an error message if no user - is selected. - -2003-03-06 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (impl_finalize): Use - bonobo_activation_unregister_active_server() instead of - bonobo_activatino_active_server_unregister(). - (e_shell_construct): Use - bonobo_activation_register_active_server() instead of - bonobo_activation_active_server_register(). - -2003-03-06 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-importer.c (IN): Use G_GNUC_FUNCTION instead of - __FUNCTION__. - (OUT): Likewise. - -2003-03-06 Ettore Perazzoli <ettore@ximian.com> - - Patch from Not Zed <NotZed@Ximian.com>: - - * main.c (show_development_warning): Separated the current stable - version number from the warning prompt, and fixed a minor - grammatical error. For bug #38775. - -2003-03-06 Ettore Perazzoli <ettore@ximian.com> - - * e-config-upgrade.c (import_bonobo_config): Protect from val - being NULL when printf()ing -- should fix #39096 (Solaris-specific - crash). - -2003-03-05 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c: Added icon for "/popups/NewPopup/Folder". - -2003-03-05 Ettore Perazzoli <ettore@ximian.com> - - * importer/Makefile.am (BUILT_SOURCES): $(IDL_GENERATED), not - $(IDL_GENERATED_H). - (CLEANFILES): Make the same as $(BUILT_SOURCES). - (GNOME_Evolution_Importer-impl.o): Removed useless rule. - -2003-03-04 Mike Kestner <mkestner@ximian.com> - - * e-shell-view.c (update_for_current_uri): only set current - folder when the folder_path is different from the current folder. - -2003-03-04 Ettore Perazzoli <ettore@ximian.com> - - * e-folder-dnd-bridge.c (find_matching_target_for_drag_context): - Handle p->data as a GdkAtom instead of a GdkAtom *. - (handle_data_received_non_path): Set the target member of the - corba_data struct to be the name of the atom. - - * e-storage-set-view.c (impl_tree_drag_data_get): Pass the name of - the atom instead of the atom itself. - - * Evolution-ShellComponentDnd.idl: Changed the type of Data.target - to string. - -2003-03-03 Ettore Perazzoli <ettore@ximian.com> - - * glade/e-shell-shared-folder-picker-dialog.glade: Swap Cancel/OK - buttons as per the HIG. Also added proper response_ids. - -2003-03-03 Ettore Perazzoli <ettore@ximian.com> - - * evolution-folder-selector-button.c (impl_finalize): Protect - against priv->possible_types being NULL. - -2003-02-27 Rodney Dawes <dobey@ximian.com> - - * Makefile.am (evolution_SOURCES): Add e-config-upgrade.h - -2003-02-26 Chris Toshok <toshok@ximian.com> - - * e-folder-list.c (e_folder_list_parse_xml): make this more robust - - only assume it's a folderlistitem node if the name of the node - is "folder". - -2003-02-26 Jeffrey Stedfast <fejj@ximian.com> - - * e-config-upgrade.c: Change the type of load_http_images to INT - rather than BOOL. Fixes bug #38767. - -2003-02-26 Dan Winship <danw@ximian.com> - - * e-shell-startup-wizard.c (start_wizard): New routine to attempt - to start each available startup wizard in priority order, and - return once it has successfully started one. (Allows Connector, - etc, to override the mailer startup wizard.) - (make_corba_dialog_pages): Use it. - -2003-02-26 Not Zed <NotZed@Ximian.com> - - * apps_evolution_shell.schemas: Added a key for - /apps/evolution/version - seems the best place to put it. This - should not return any value if unset, so i'm not sure if this is - the right mechanism ... - - * e-config-upgrade.c: Upgrade settings from earlier versions of - evolution. - - * main.c (upgrade_from_1_0_if_needed): Removed. - (main): Call e_config_upgrade before going into gmainloop. - (main): Turn off the --force-upgrade option, since it doesn't work - yet ... - -2003-02-25 Dan Winship <danw@ximian.com> - - * Evolution-Wizard.idl: Change this to let the Wizard provide an - array of title/icon/control triplets, instead of just controls, so - the shell doesn't need to know the name of each page a priori. - - * glade/evolution-startup-wizard.glade: Remove the mailer-specific - pages, which are now inserted at run time based on info from the - mailer. - - * evolution-wizard.c: Update for new idl. - (evolution_wizard_new): Now takes no arguments. - (evolution_wizard_add_page): New function to add page info to the - wizard. - - * e-shell-startup-wizard.c: Various renamings to make this - slightly less mailer-centric, though it still explicitly launches - the mailer startup wizard. - (make_corba_page): Replaces make_identity_page, make_receive_page, - etc. Uses the new Wizard idl to generically create a page and - insert it into the druid. - (e_shell_startup_wizard_create): Update - -2003-02-25 Dan Winship <danw@ximian.com> - - * e-shell-startup-wizard.c (connect_page, make_importer_page): Use - g_signal_connect_after to connect to the "prepare" signal to work - around a GnomeDruidPageStandard bug (b.g.o 81869) - (e_shell_startup_wizard_create): Remove the "return TRUE" that was - added here a while back to disable the startup wizard. - - * glade/evolution-startup-wizard.glade: Change "Next" and "Finish" - in the text to "Forward" and "Apply" to match the gnome 2 druid - buttons. - -2003-02-24 Rodney Dawes <dobey@ximian.com> - - * e-shell-view.c: Doh, forgot to remove the e-gray-bar.h include - -2003-02-24 Rodney Dawes <dobey@ximian.com> - - * Makefile.am: We don't need e-gray-bar.[ch] anymore - * e-gray-bar.[ch]: Remove these unused files now - * e-shell-folder-title-bar.c: We are themeable now!!!! - Use GtkArrows now instead of pixmaps - Get rid of the hardcoded colors - Add an expose_event to paint a flat box for the background - * e-shell-view.c: Don't need e-gray-bar anymore - -2003-02-24 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component.c (impl_populateFolderContextMenu): - Don't release_unref the corba_uih since - bonobo_ui_component_set_container() takes ownership of the object - without reffing it. - -2003-02-24 Ettore Perazzoli <ettore@ximian.com> - - * glade/e-active-connection-dialog.glade: Update dialog to use - stock response IDs. - -2003-02-20 Not Zed <NotZed@Ximian.com> - - * main.c (upgrade_from_1_0_if_needed): fix the conf keys, currently unused. - - * e-shell.c (save_settings_for_component): lower-case the config prefix. - -2003-02-20 Dan Winship <danw@ximian.com> - - * Makefile.am (evolution_LDADD): - s/libemiscwidgets.a/libemiscwidgets.la/ and likewise for - libetimezonedialog - -2003-02-18 Ettore Perazzoli <ettore@ximian.com> - - * e-shortcuts.c (shortcut_item_new): Get the name from the name, - not the type. Fixes #37952, pointed out by Lonnie Borntreger. - -2003-02-17 Chris Toshok <toshok@ximian.com> - - * e-shortcuts.c (load_shortcuts): plug memory leak - free path. - -2003-02-13 Ettore Perazzoli <ettore@ximian.com> - - [Ported SIGSEGV signal redirection hack from mail/.] - - * main.c (segv_redirect): New, SIGSEGV signal handler. - (setup_segv_redirect): New function to set it up. - (main): Call setup_segv_redirect(). - -2003-02-12 Ettore Perazzoli <ettore@ximian.com> - - * e-setup.c (DEFAULT_USER_PATH): Look into evolution/$BASE_VERSION - instead of evolution-$BASE_VERSION. - -2003-02-11 Joe Shaw <joe@ximian.com> - - * main.c (show_development_warning): Suggest people use 1.2.x instead - of 1.0.x. - -2003-02-09 Larry Ewing <lewing@ximian.com> - - * e-local-storage.c (remove_folder_directory): fix length calculation. - (create_folder_directory): remove alloca usage, clears up crash. - -2003-02-07 Larry Ewing <lewing@ximian.com> - - * e-shell-folder-creation-dialog.c - (folder_name_entry_activate_cb): add an activate handler that - returns a response OK if the OK response would be active. - -2003-02-06 Dan Winship <danw@ximian.com> - - * evolution-test-component.c (main): s/PACKAGE/GETTEXT_PACKAGE/ in - gettext init. - -2003-02-06 Not Zed <NotZed@Ximian.com> - - * e-shortcuts-view.c (class_init): use POINTER_STRING_BOOL for - activate_shortcut. - - * e-shell-marshal.list: Added NONE,STRING,BOOL, and - POINTER,STRING,BOOL, removed POINTER,STRING,INT - - * evolution-shell-view.c (evolution_shell_view_class_init): Use - STRING_BOOL for the set_message signal to match rest of command. - - * e-shell-marshal.list: Added NONE,STRING,STRING,STRING - - * evolution-shell-component.c - (evolution_shell_component_class_init): Change the - user_create_new_item marshaller to STRING_STRING_STRING to match - the rest of the call. The 'new' button should work now. - - * e-setup.c (copy_default_stuff): We want to copy whats in the - default user dir, not the default user dir. - -2003-02-05 Dan Winship <danw@ximian.com> - - * Makefile.am (INCLUDES): Define EVOLUTION_IMAGES using - $(imagesdir). Define EVOLUTION_GLADEDIR using $(gladedir) - (eshellincludedir): Define in terms of $(privincludedir) - (evolution_LDFLAGS): Remove this. gmodule-2's LDFLAGS include the - equivalent of -export-dynamic for us. - (serverdir, etspecdir): Remove. Defined in configure.in now. - - * e-folder.c: #include <string.h> - * e-corba-config-page.c: Likewise - * e-shell-config.c: Likewise - * e-shell-folder-creation-dialog.c: Likewise - * e-shell-folder-title-bar.c: Likewise - * e-shell-startup-wizard.c: Likewise - * evolution-activity-client.c: Likewise. - * evolution-shell-component-client.c: Likewise - * evolution-shell-component-utils.c: Likewise - * evolution-storage.c: Likewise - * evolution-test-component.c: Likewise - - * e-shortcuts-view.c (destroy_group_cb): Remove unused variable - - * importer/Makefile.am (INCLUDES): Remove -I$(includedir). Define - EVOLUTION_GLADEDIR using $(gladedir). - (libevolution_importerincludedir): Define in terms of - $(privincludedir) - (gladedir): Removed. Defined in configure.in now. - - * glade/Makefile.am (gladedir): Likewise - -2003-02-05 Dan Winship <danw@ximian.com> - - * importer/evolution-intelligent-importer.c: - s/BonoboXObject/BonoboObject/ - - * e-folder-list.c (e_folder_list_class_init): - s/glade_gnome_init/glade_init/ - - * main.c (main): Likewise - -2003-02-05 Not Zed <NotZed@Ximian.com> - - * e-shell-startup-wizard.c (start_importers): re-enable. - (prepare_importer_page): re-enable importer code. - - * e-shell-importer.c (druid_finish_button_change): removed, since - its not such a hack to change anymore. Dunno how to get an icon - on it tho, without a stock button. - (show_import_wizard): Change the apply button to "Import" here. - -2003-01-28 Not Zed <NotZed@Ximian.com> - - * e-local-storage.c (create_folder_directory): We can't use - pointer arithmetic with g_path_get_*, so adjust code accordingly. - -2003-01-16 Not Zed <NotZed@Ximian.com> - - * e-shell-startup-wizard.c (e_shell_startup_wizard_create): Hook - onto finish instead of next on the last page. - -2003-01-28 Ettore Perazzoli <ettore@ximian.com> - - * Makefile.am ($(SELECT_NAMES_IDL_GENERATED_C)): No need for the - @true command. - ($(IDL_GENERATED_C)): Likewise. - (e-shell-marshal.h, e-shell-marshal.c): Use different names for - the .tmp files so these can be generated in parallel. - - * importer/Makefile.am (GNOME_Evolution_Importer-impl.o): Remove - unused rule. - ($(IDL_GENERATED_C)): Remove useless @true command. - (BUILT_SOURCES): Put the .h generated files in here as well. - -2003-01-28 Ettore Perazzoli <ettore@ximian.com> - - * Makefile.am (Evolution-impl.o): Removed unused rule. - -2003-01-28 Ettore Perazzoli <ettore@ximian.com> - - * importer/Makefile.am: Make this work with parallel make as well. - -2003-01-28 Ettore Perazzoli <ettore@ximian.com> - - * Makefile.am: Use a little trick for the IDL compilation so that - it works with parallel makes. - -2003-01-28 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (e_shell_construct): Use - bonobo_activation_server_register() instead of - bonobo_activation_register_active_server() again, since we want to - be able to build against bonobo-activation 2.0 and the latter is - 2.2-specific. - (impl_finalize): Likewise, use - bonobo_activation_active_server_unregister() instead of - bonobo_activation_unregister_active_server(). - -2003-01-27 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-importer.c (choose_importer_from_list): Set - GTK_RESPONSE_OK as the default response. - - * Makefile.am (INCLUDES): Add -DGNOME_DISABLE_DEPRECATED, - -DBONOBO_DISABLE_DEPRECATED. - - * e-shortcuts.c (update_shortcut_and_emit_signal): Use - g_signal_emit() instead of gtk_signal_emit(). - - * e-shortcuts-view.c (destroy_group_cb): Port from GnomeMessageBox - to GtkMessageDialog. - - * e-shell.c (get_icon_path_for_component_info): Use - gnome_program_locate_file() instead of gnome_pixmap_file(). - (impl_finalize): Use bonobo_activation_unregister_active_server() - instead of bonobo_activation_active_server_register(). - (e_shell_construct): Use - bonobo_activation_register_active_server() instead of - bonobo_activation_active_server_register(). - - * e-shell-view-menu.c (command_submit_bug): Use e_notice(). - (launch_pilot_settings): Use g_find_program_in_path() instead of - gnome_is_program_in_path(). - (command_submit_bug): Likewise. - - * e-shell-utils.c (get_icon_path): Use g_file_test() instead of - g_file_exists(). - - * e-shell-startup-wizard.c (prepare_importer_page): Port from - GnomeMessageBox to GtkMessageDialog. - - * e-shell-shared-folder-picker-dialog.c (show_dialog): Update for - GtkDialog. - (progress_dialog_close_callback): Removed. - (progress_dialog_clicked_callback): Removed. - (progress_dialog_response_callback): New. - (create_progress_dialog): Ported to GnomeDialog. - - * e-shell-offline-sync.c: Add member parent_window to struct - SyncData. - (e_shell_offline_sync_all_folders): Set it from the parent_window - arg. - (progress_dialog_close_callback): Removed. - (progress_dialog_clicked_callback): Removed. - (progress_dialog_response_callback): New. - (setup_dialog): Create a GtkDialog instead of a GnomeDialog. - (sync_folder): Updated for GtkDialog. - - * e-shell-offline-handler.c (dialog_handle_ok): Make it get a - GtkDialog instead of a GnomeDialog. - (dialog_handle_cancel): Likewise. - (dialog_clicked_cb): Removed. - (dialog_response_cb): New. - (pop_up_confirmation_dialog): Connect the new dialog_response_cb() - instead of the old dialog_clicked_cb(). Removed - gnome_dialog_set_default() call. - - * e-shell-folder-creation-dialog.c (dialog_response_cb): Make - first arg a GtkDialog, not a GnomeDialog. - - * e-shell-folder-commands.c (e_shell_command_delete_folder): - Expect delete_dialog() to return a GtkResponseType. - (delete_dialog): Ported to GtkMessageDialog; Return a - GtkResponseType. - - * e-shell-config-default-folders.c - (e_shell_config_default_folders_create_widget): Removed unused - variable. - - * e-setup.c (check_evolution_directory): Remove Evolution - directory installation message. - (e_setup): Remove check for the Executive-Summary directory. - - * e-local-storage.c (create_folder_directory): Use g_file_test() - instead of g_file_exists(). - - * evolution-shell-component-utils.c (e_pixmaps_update): Use - g_build_filename() of g_concat_dir_and_file(). - * e-folder-dnd-bridge.c (handle_data_received_path): Likewise. - * e-local-folder.c (construct_loading_metadata): Likewise. - (save_metadata): Likewise. - * e-local-storage.c (remove_folder_directory): Likewise. - (append_xfer_item_list): Likewise. - * e-setup.c (check_dir_recur): Likewise. - (e_shell_rm_dir): Likewise. - (setup_bonobo_conf_private_directory): Likewise. - * e-shell-folder-commands.c - (folder_selection_dialog_folder_selected_callback): Likewise. - (e_shell_command_rename_folder): Likewise. - * e-shell-folder-creation-dialog.c (dialog_response_cb): Likewise. - * e-shell-settings-dialog.c (load_pages): Likewise. - * e-shell-utils.c (get_icon_path): Likewise. - * e-shell.c (setup_local_storage): Likewise. - (get_icon_path_for_component_info): Likewise. - (e_shell_construct): Likewise. - * main.c (main): Likewise. - -2003-01-27 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-about-box.c (timeout_callback): Pass a the context's - language to pango_context_get_metrics() instead of NULL, so the - heights are computed correctly. - -2003-01-27 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component.c (owner_ping_callback): #if 0'ed out - for now, since it seems to cause trouble for local components. - (setup_owner_pinging): Likewise. - - * e-shell-user-creatable-items-handler.c - (get_default_action_for_view): Return default_menu_item [instead - of NULL] if there is no view displayed. [#32736] - -2003-01-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-title-bar.c (get_max_clipped_label_width): Use - clipped_label->layout instead of creating a new PangoLayout; this - way we respect the actual font being used. - -2003-01-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (create_label_for_empty_page): Update for new - args to e_clipped_label_new(). - - * e-shell-folder-title-bar.c (e_shell_folder_title_bar_construct): - Make the title label bold and larger using the new args to - e_clipped_label_new(). - -2002-01-23 Ettore Perazzoli <ettore@ximian.com> - - [Port fix for #34129 from evolution-1-2-branch, unread count in - shortcut bar doesn't update properly.] - - * e-shortcuts.c (update_shortcuts_by_path): Use - e_shell_parse_uri() so we handle default shortcuts properly as - well. - (update_shortcut_and_emit_signal): Use shortcut_item_update() - once, and use the return value from it. [Thanks to Leon Zhang - <leon.zhang@sun.com> for pointing out the brokenness of this - code.] - -2003-01-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-about-box.c: Update copyright year. - -2003-01-22 Ettore Perazzoli <ettore@ximian.com> - - * Makefile.am: Install the shell executable as - evolution-$(BASE_VERSION) using an install-exec-local hack. Also - put libeshell in $(privlibdir) instead of $(libdir). - (eshellincludedir): Version using $(BASE_VERSION). - (INCLUDES): Update for the new locations of things. - (etspecdir): Likewise. - - * e-shell-view.c (e_shell_view_construct): Get evolution.xml from - EVOLUTION_UIDIR. - - * importer/Makefile.am: Install libevolution-importer in - $(privlibdir) instead of $(libdir). - (INCLUDES): Updated for the new versioned paths. Define - EVOLUTION_UIDIR. - (libevolution_importerincludedir): Version using $(BASE_VERSION). - (gladedir): Likewise. - - * glade/Makefile.am (gladedir): Version using $(BASE_VERSION). - - * e-setup.c (DEFAULT_USER_PATH): New #define. - (check_evolution_directory): Use it. - (copy_default_stuff): Likewise. Also, remove old shortcuts.xml - removal cruft. - -2003-01-17 Chris Toshok <toshok@ximian.com> - - * e-shell-settings-dialog.c (set_dialog_size): pass - pango_context_get_language (context) to - pango_context_get_metrics. - -2003-01-14 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-selection-dialog.c - (e_shell_folder_selection_dialog_construct): Make dialog - New/Cancel/OK to match HIG. - - * glade/e-shell-folder-creation-dialog.glade: Swap Cancel/OK - buttons to match HIG. - - * e-shell-importer.c (choose_importer_from_list): Make dialog - Cancel/OK to match HIG. - - * e-shell-folder-selection-dialog.c - (e_shell_folder_selection_dialog_construct): Make dialog Cancel/OK - to match HIG. - - * e-shell-view.c: Do not #include "e-bonobo-widget.h". - -2003-01-14 Ettore Perazzoli <ettore@ximian.com> - - * Makefile.am (EXTRA_DIST): Add $(schema_DATA) here. - -2003-01-14 Rodney Dawes <dobey@ximian.com> - - * e-shell-view.c: Use GtkPaned instead of EPaned - -2003-01-13 Dan Winship <danw@ximian.com> - - * s/BonoboXObject/BonoboObject/ (for BONOBO_DISABLE_DEPRECATED) - -2003-01-10 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component.c (impl_setOwner): Don't duplicate the - shell object here before passing to evolution_shell_client_new(). - - * evolution-shell-client.c (evolution_shell_client_construct): - Dupliate the @corba_shell before storing into the - EvolutionShellClientPrivate struct. - - * e-shell-config-default-folders.c - (e_shell_config_default_folders_create_widget): Do not duplicate - the shell's CORBA objref. - - * e-shell-config-autocompletion.c - (e_shell_config_autocompletion_create_widget): Do not duplicate - the shell's CORBA objref. - -2003-01-10 Dan Winship <danw@ximian.com> - - * e-storage-set-view.c (popup_folder_menu): Make this work again. - -2003-01-10 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (e_shell_view_save_defaults): Save the expansion - state of the EStorageSetView. - (setup_defaults): Load the expansion state. - -2003-01-10 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (e_shell_request_close_view): Make the view save its - settings as the default ones if it's the last one. - - * e-shell-view-menu.c (command_quit): Make this view save its - settings as the defaults before quitting. - -2003-01-10 Ettore Perazzoli <ettore@ximian.com> - - * main.c (main): Generate the URI list from the popt context - fetched from the GnomeProgram object. - - * e-shell-view.c (setup_defaults): Removed @setup_default_uri arg. - Don't load any URI here. - (e_shell_view_construct): Open the URI here instead. - -2003-01-10 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (parse_default_uri): Remove bogus is_default check. - -2003-01-10 Ettore Perazzoli <ettore@ximian.com> - - * e-setup.c (set_default_folder_physical_uri_from_path): New - function. - (e_setup_check_config): Call it for each of the *_path keys. Do - not set the default for *_path keys as those come from the GConf - schema anyways. - -2003-01-10 Ettore Perazzoli <ettore@ximian.com> - - * apps_evolution_shell.schemas: Set defaults for - /apps/evolution/shell/default_folders/... . - - * e-shortcuts-view.c (pop_up_right_click_menu_for_group): Destroy - the popup_menu with gtk_widget_destroy() instead of - gtk_widget_unref(). - -2003-01-10 Not Zed <NotZed@Ximian.com> - - * evolution-config-control.c (impl_apply): remove cast to - GTK_OBJECT, it isn't, nor needed. - -2003-01-09 Chris Toshok <toshok@ximian.com> - - * e-shell-settings-dialog.c (set_dialog_size): use - pango_layout_get_pixel_size here instead of - pango_layout_get_width, which returns 0 (unless it's been set by - the user before, I believe). - -2003-01-09 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-client.c (impl_dispose): Properly reset - activity_interface to NULL. - (evolution_shell_client_construct): Ref the shell object here. - - * e-shell.c (view_weak_notify): Ref the shell since it's being - passed to notify_no_views_left_idle_cb as the data. - (notify_no_views_left_idle_cb): Only unref the shell here. - -2003-01-08 Not Zed <NotZed@Ximian.com> - - * e-shell-settings-dialog.c (set_dialog_size): dont unref the - pango context, get_context() doesn't create a ref. - -2003-01-08 Ettore Perazzoli <ettore@ximian.com> - - * Makefile.am: Images are now in $(datadir)/evolution/images - instead of $(datadir)/images/evolution. - - * e-folder-list.c (e_folder_list_class_init): Remove - "EFolderList::" prefix from the properties. - -2003-01-08 Ettore Perazzoli <ettore@ximian.com> - - * Makefile.am (evolution_LDFLAGS): -export-dynamic so custom - widgets in libglade work. - -2003-01-07 Dan Winship <danw@ximian.com> - - * main.c (main): setup gettext - -2003-01-06 Not Zed <NotZed@Ximian.com> - - * evolution-folder-selector-button.c (set_folder): dont - double-free storage_lname. - -2003-01-06 Dan Winship <danw@ximian.com> - - * Makefile.am: Remove idldir definition. (It's defined in - configure.in now). - - * importer/Makefile.am: Likewise - -2002-12-19 Ettore Perazzoli <ettore@ximian.com> - - [With this commit, the shell compiles without deprecated GLib/GTK+ - functions, except for a couple of places were we use GtkCList.] - - * Makefile.am (INCLUDES): Add `-DG_DISABLE_DEPRECATED - -DGTK_DISABLE_DEPRECATED'. - - * evolution-test-component.c (create_new_folder_selector): No - gtk_window_set_policy(). - - * main.c (quit_box_new): gtk_window_set_resizable() instead of - gtk_window_set_policy(). - (view_map_callback): g_signal_handlers_disconnect_by_func() - instead of gtk_signal_disconnect_by_func(). - (main): No need to push the GdkRGB visual/cmap anymore. - (new_view_created_callback): Likewise. - - * e-task-widget.c: Renamed member pixmap of ETaskWidgetPrivate to - `image'. - (init): Updated accordingly. - (e_task_widget_construct): Use GtkImage, not GtkPixmap. - - * e-storage.c (class_init): Converted from gtk_signal_new() to - g_signal_new(). - - * e-storage-set.c (class_init): Converted from gtk_signal_new() to - g_signal_new(). - - * e-storage-set-view.c - (setup_folder_properties_items_if_corba_storage_clicked): - g_string_append_printf() instead of g_string_sprintfa(). - (class_init): Converted from gtk_signal_new() to g_signal_new(). - (setup_folder_changed_callbacks): Use - e_signal_connect_while_alive() and - e_signal_connect_full_while_alive(). - - * e-splash.c (e_splash_construct): gtk_window_set_resizable() - instead of gtk_window_set_policy(). - - * e-shortcuts.c: Do not #include e-unicode.h. - (shortcut_item_update): Use g_path_get_basename() instead of - g_basename(). - (e_shortcuts_add_default_shortcuts): No need to de-utfize strings. - (e_shortcuts_add_default_group): Same here. - - * e-shortcuts-view.c: Do not #include <e-unicode.h>. - (class_init): Converted from gtk_signal_new() to g_signal_new(). - (destroy_group_cb): No need to convert the text from UTF8. - - * e-shell.c (impl_dispose): g_signal_handlers_disconnect_by_func() - instead of gtk_signal_disconnect_by_func(). - (class_init): Use g_signal_new() instead of gtk_signal_new(). - - * e-shell-view.c: Do not #include e-unicode.h. Renamed member - offline_toggle_pixmap to offline_toggle_image in - EShellViewPrivate. - (update_folder_title_bar): No need to de-UTF8-ize the title. - (cleanup_delayed_selection): - g_signal_handlers_disconnect_by_func() instead of - gtk_signal_disconnect_by_func(). - (ui_engine_add_hint_callback): gtk_label_set_text(), not - gtk_label_set(). - (class_init): Use g_signal_new() instead of gtk_signal_new(). - (update_for_current_uri): No need to convert the title from UTF8. - (setup_offline_toggle): Changed to set up a GtkImage, not a - GtkPixmap. - (update_offline_toggle_status): Accordingly (gtk_image* instead of - gtk_pixmap*). - (set_current_notebook_page): gtk_notebook_set_current_page(), not - gtk_notebook_set_page(). - (get_storage_set_path_from_uri): g_ascii_strncasecmp() instead of - g_strncasecmp(). - (folder_bar_popup_map_callback): Use - e_signal_connect_while_alive() instead of - gtk_signal_connect_while_alive(). - (e_shell_view_construct): Likewise. - (display_uri): g_signal_connect_after() instead of - gtk_signal_connect_full(). - (update_for_current_uri): - g_signal_handlers_{block,unblock}_by_func() instead of - gtk_signal_handler_{block,unblock}_by_func(). - - * e-shell-view-menu.c (command_about_box): - gtk_window_set_resizable() instead of gtk_window_set_policy(). - - * e-shell-utils.c (get_mini_name): g_path_get_basename() instead - of g_basename(). - - * e-shell-user-creatable-items-handler.c - (append_xml_for_menu_item): g_string_append_printf() instead of - g_string_sprintfa(). - (create_menu_xml): Likewise. - - * e-shell-shared-folder-picker-dialog.c: Do not #include - e-unicode.h. - (progress_bar_timeout_callback): Expect a GtkProgressBar data and - just use gtk_progress_bar_pulse(). - (create_progress_dialog): gtk_window_set_resizable() instead of - gtk_window_set_policy(). No gtk_progress_set_activity_mode(). - (setup_server_option_menu): Just use - gtk_menu_item_new_with_label() instead of - e_utf8_gtk_menu_item_new_with_label(). - - * e-shell-settings-dialog.c (set_dialog_size): Ported to Pango. - - * e-shell-offline-sync.c - (impl_SyncFolderProgressListener_updateProgress): - gtk_progress_set_fraction() instead of - gtk_progress_bar_set_percentage(). - (sync_folder): Likewise. - (setup_dialog): gtk_window_set_resizable() instead of - gtk_window_set_policy(). - (sync_folder): No gtk_progress_set_activity_mode(). - - * e-shell-offline-handler.c: #undef {G,GTK}_DISABLE_DEPRECATED - here for now (need to port from GtkCList). - (class_init): Use g_signal_new() - - * e-shell-importer.c: #undef {G,GTK}_DISABLE_DEPRECATED here for - now (need to port from GtkCList). - - * e-shell-folder-title-bar.c (create_image_widget_from_xpm): - Renamed from create_pixmap_widget_from_xpm(); handle GtkImage - instead of GtkPixmap. - (new_empty_image_widget): Renamed from new_empty_pixmap_widget(); - return a GtkImage instead of a GtkPixmap. - (add_navigation_buttons): Updated accordingly; so use GtkImages - instead of GtkPixmaps. - (e_shell_folder_title_bar_construct): Likewise. - (e_shell_folder_title_bar_set_icon): Use gtk_image_* instead of - gtk_pixmap_* on the image widgets. - (class_init): Converted to use g_signal_new() instead of - gtk_signal_new(). - (e_shell_folder_title_bar_new): No need for pushing the GdkRGB - visual/cmap anymore. - - * e-shell-folder-selection-dialog.c (check_folder_type_valid): - Just use strcmp instead of strcasecmp(). - (class_init): g_signal_new() instead of gtk_signal_new(). - (e_shell_folder_selection_dialog_construct): Removed call to - gtk_window_set_policy(). - - * e-shell-folder-creation-dialog.c - (type_with_display_name_compare_func): Changed to use - g_utf8_casefold(). - - * e-shell-folder-commands.c: Do not #include e-unicode.h. - (e_shell_command_rename_folder): g_path_get_dirname() instead of - g_dirname(). - (folder_selection_dialog_folder_selected_callback): - g_path_get_basename() instead of g_basename(). - (rename_cb): Likewise. - (delete_dialog): Do not convert from UTF8 for display purposes. - (e_shell_command_rename_folder): Likewise. - - * e-shell-about-box.c (timeout_callback): Ported to Pango and use - gdk_window_invalidate_rect() instead of gtk_widget_draw(). - - * e-setup.c (check_evolution_directory): Use - gtk_window_set_resizable() instead of gtk_window_set_policy(). - - * e-local-storage.c: Do not include e-unicode.h. - (create_folder): Use g_path_get_basename() instead of - g_basename(). - (create_folder_directory): Likewise. - (remove_folder_directory): Likewise. - (append_xfer_item_list): Likewise. - - * e-local-folder.c (construct_loading_metadata): Use - g_path_get_basename() instead of g_basename(). - - * e-folder-dnd-bridge.c (handle_evolution_path_drag_motion): Use - g_path_get_basename() instead of g_basename(). - - * e-corba-storage-registry.c: G_STRUCT_OFFSET instead of - GTK_STRUCT_OFFSET. - - * e-corba-shortcuts.c: G_STRUCT_OFFSET instead of - GTK_STRUCT_OFFSET. - - * e-component-registry.c - (sleep_with_g_main_loop_timeout_callback): g_main_loop_* instead - of g_main_*. - (sleep_with_g_main_loop): Likewise. - - * e-activity-handler.c: G_STRUCT_OFFSET instead of - GTK_STRUCT_OFFSET. - - * evolution-wizard.c (evolution_wizard_class_init): g_signal_new() - instead of gtk_signal_new(). - - * evolution-storage-listener.c (class_init): g_signal_new() - instead of gtk_signal_new(). - - * evolution-shell-view.c (class_init): g_signal_new() instead of - gtk_signal_new(). - - * evolution-shell-component-dnd.c: G_STRUCT_OFFSET instead of - GTK_STRUCT_OFFSET. - - * evolution-shell-component.c: G_STRUCT_OFFSET instead of - GTK_STRUCT_OFFSET. - - * evolution-session.c: G_STRUCT_OFFSET instead of - GTK_STRUCT_OFFSET. - - * evolution-folder-selector-button.c: Do not include e-unicode.h. - (set_folder): No need to convert from UTF8 to locale encoding - anymore. Removed unused variable. - - * evolution-config-control.c (class_init): Use g_signal_new() - instead of gtk_signal_new(). - - * evolution-activity-client.c (class_init): Use g_signal_new() - instead of gtk_signal_new(). - - * e-folder-list.c: Do not include e-unicode.h. Use E_MAKE_TYPE(). - (e_folder_list_get_type): Removed explicit implementation of this. - (e_folder_list_set_arg): Removed. - (e_folder_list_get_arg): Removed. - (e_folder_list_set_property): New. - (e_folder_list_get_property): New. - (e_folder_list_destroy): Removed. - (e_folder_list_dispose): New. - (e_folder_list_class_init): Updated accordingly. - - * e-folder.c (impl_save_info): Use G_OBJECT_TYPE_NAME() instead of - gtk_type_name(). - (impl_load_info): Likewise. - (impl_remove): Likewise. - (class_init): Use g_signal_new() instead of gtk_signal_new(). - -2002-12-16 Jeffrey Stedfast <fejj@ximian.com> - - * e-shell-importer.c: Don't #include "e-util/e-html-utils.h" as - we don't use it. - -2002-12-13 Chris Toshok <toshok@ximian.com> - - [ fixes bug #35394 ] - - * e-shell-shared-folder-picker-dialog.c (setup_name_selector): - return the SelectNames corba interface too. - (show_dialog): unref the corba interface when closing the dialog. - -2002-12-05 Chris Toshok <toshok@ximian.com> - - * e-shell-config-default-folders.c: use "contacts", - "contacts/ldap" as the accepted contacts types, so it'll allow - both normal and ldap contact folders. - -2002-12-04 Ettore Perazzoli <ettore@ximian.com> - - * e-component-registry.c (component_free): Only invoke - wait_for_corba_object_to_die on components that are out-of-proc. - -2002-11-27 Not Zed <NotZed@Ximian.com> - - * main.c (show_development_warning): changed to use a gtkdialog - instead of a gnome one. - (warning_dialog_response_callback): clicked->response. - - * e-shell-folder-selection-dialog.c: Include gtk/gtkstock.h - - * e-shell-folder-creation-dialog.c: include gnome-dialog.h - (dialog_response_cb): gtk_entry_get_text now returns const. Dont - free result. - - * e-setup.c: include gnome-messagebox.h - - * *.c: (re)run fix.sh over all, for e_notice changes & pick up - some deprecated functions. - - * e-shell-shared-folder-picker-dialog.c - (shared_folder_discovery_callback): reformat e_notice call for - script. - - * e-shell-offline-sync.c - (impl_SyncFolderProgressListener_reportFailure): Fix e_notice - call, we weren't passing type in. - - * e-shell-folder-commands.c (xfer_result_callback): changed around - slightly to save some processing & allow a script to run. - (e_shell_command_rename_folder): reformat e_notice call to help script. - Include gnome-messagebox.h - -2002-11-25 Dan Winship <danw@ximian.com> - - * e-shell-settings-dialog.c (page_new): e_get_language_list now - returns language codes that actually work with oaf, making the - _()s here redundant. - - * e-component-info.c (get_i18n_value): Remove code to turn "fr_FR" - into "fr", since e_get_language_list will return both now. - -2002-11-25 Ettore Perazzoli <ettore@ximian.com> - - * apps_evolution_shell.schemas: Fix <key> -> <applyto> typo. - -2002-11-25 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-offline-sync.c (e_shell_offline_sync_all_folders): - Filled in, use GConf. - (cleanup): Re-enabled again. - (sync_folder): Likewise. - (progress_dialog_close_callback): Likewise. - (progress_dialog_clicked_callback): Likewise. - (setup_dialog): Likewise. - (setup_progress_listener): Likewise. - (impl_SyncFolderProgressListener_reportFailure): Likewise. - (impl_SyncFolderProgressListener_reportSuccess): Likewise. - (impl_SyncFolderProgressListener_updateProgress): Likewise. - (progress_listener_servant_free): Likewise. - (progress_listener_servant_new): Likewise. - -2002-11-25 Ettore Perazzoli <ettore@ximian.com> - - * evolution-storage-set-view.c - (impl_StorageSetView__set_checkedFolders): Updated to pass a - GSList to e_storage_set_view_set_checkboxes_list() [instead of a - GList]. - (impl_StorageSetView__get_checkedFolders): Likewise with the - return value from e_storage_set_view_get_checkboxes_list(). - - * e-shell-config-offline.c (config_control_apply_callback): Filled - in, using GConf. - (init_storage_set_view_status_from_config): Likewise. - - * e-storage-set-view.c (e_storage_set_view_get_checkboxes_list): - Return a GSList instead of a GList. - (essv_add_to_list): Update for the GSList. - (e_storage_set_view_set_checkboxes_list): Get a GSList instead of - a GList. - - * apps_evolution_shell.schemas: Added - /schemas/apps/evolution/shell/offline/folder_paths. - -2002-11-20 Ettore Perazzoli <ettore@ximian.com> - - * main.c (idle_cb): Set displayed_any in the case when we are - calling e_shell_create_view(). Also initialize displayed_any to - FALSE earlier so we dont' end up opening two views at startup by - default. - -2002-11-20 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-selection-dialog.c (impl_dispose): Save the - expansion state for the EStorageSetView here. - (impl_finalize): Instead of here. - -2002-11-20 Chris Toshok <toshok@ximian.com> - - * e-folder-list.c (e_folder_list_class_init): use e_shell_ - marshallers, and make sure STRING parameters map to *_STRING* - marshallers. - - * evolution-wizard.c (evolution_wizard_class_init): same. - - * evolution-storage.c (class_init): same. - - * evolution-storage-set-view-listener.c (class_init): same. - - * evolution-storage-listener.c (class_init): same. - - * evolution-shell-view.c (class_init): same. - - * evolution-session.c (class_init): same. - - * evolution-folder-selector-button.c (class_init): same. - - * evolution-config-control.c (class_init): same. - - * evolution-activity-client.c (class_init): same. - - * e-storage-set.c (class_init): same. - - * e-shortcuts.c (class_init): same. - - * e-shortcuts-view.c (class_init): same. - - * e-shell.c (class_init): same. - - * e-shell-view.c (class_init): same. - - * e-shell-offline-handler.c (class_init): same. - - * e-shell-folder-title-bar.c (class_init): same. - - * e-shell-folder-selection-dialog.c (class_init): same. - - * e-folder.c (class_init): same. - - * e-shell-marshal.list: add all the STRING marshallers. - -2002-11-20 Not Zed <NotZed@Ximian.com> - - * e-shell-importer.c (prepare_intelligent_page): gnome message box - -> gtk message dialog. - (prepare_intelligent_page): Fix the signature on this. This could - NEVER have worked. - -2002-11-19 Ettore Perazzoli <ettore@ximian.com> - - * main.c (upgrade_from_1_0_if_needed): Disabled for now. - - * e-shell-startup-wizard.c: Removed member config_listener from - struct SWData. - (e_shell_startup_wizard_create): Updated accordingly, just use - GConf, checking the /apps/evolution/mail/account-list key. - (finish_func): Use GConf. - - * e-shell-config-default-folders.c: Removed member config_listener - in struct EvolutionDefaultFolderConfig. - (e_shell_config_default_folders_create_widget): Do not initialize - here. GConfified the paths. - (config_control_destroy_notify): No unref of the config_listener - anymore. - (config_control_apply_cb): Use GConf. - (setup_folder_selector): Likewise. - - * e-shell-config-autocompletion.c: Removed member config_listener - from EvolutionAutocompletionConfig. - (config_control_destroy_notify): Do not unref. - (config_control_apply_callback): Use a GConfClient. - - * e-folder-list.c (e_folder_list_init): Add missing cast. - - * main.c (show_development_warning): Use GConf. - - * e-setup.c (e_setup_check_config): Removed arg @listener. - GConfified. - - * e-shell-view.c (e_shell_view_save_defaults): New. - (e_shell_view_save_settings): Removed. - (e_shell_view_load_settings): Removed. - (setup_defaults): New helper function. - (e_shell_view_construct): New arg @uri. - (e_shell_view_new): New arg @uri. - - * e-shell.c: Removed member config_listener in struct - EShellPrivate. - (impl_dispose): Do not unref. - (init): Do not initialize. - (get_config_start_offline): New helper function. - (e_shell_construct): Use this to get the startup mode in case - E_SHELL_STARTUP_LINE_MODE_CONFIG. - (save_misc_settings): Changed to use GConfClient instead of - EConfigListener. - (e_shell_create_view_from_settings): Removed. - (e_shell_restore_from_settings): Removed. - (e_shell_get_config_listener): Removed. - (e_shell_disconnect_db): Removed. - (parse_default_uri): Use GConf. - - * main.c (idle_cb): Simplified the logic here. Always assume that - the view will be created with the default folder open by just - using e_shell_create_view(). - -2002-11-19 Not Zed <NotZed@Ximian.com> - - * e-shell-shared-folder-picker-dialog.c (show_dialog): Pass type - to bonobo_widget::set_property. - -2002-11-18 Not Zed <NotZed@Ximian.com> - - * e-shell-view-menu.c (file_verbs[]): re-enable importer wizard. - - * importer/importer.c (dialog_response_cb): from clicked_cb. - (start_import): gtkdialogise. - - * e-shell-importer.c: removed redundant header. - (create_html): Removed utf8 from locale stuff. - (get_name_from_component_info): oaf->bonobo activation. - (get_iid_for_filetype): " - (create_plugin_menu): Likewise, and change oafiid to bonoboiid - (get_intelligent_importers): " - (prepare_intelligent_page): " - (show_import_wizard): add null domain to glade_xml_new. - (choose_importer_from_list): gtkdialogise. - (dialog_response_cb): changed from dialog_clicked_cb. - (start_import): gtkdialogise. - (show_error): use gtk message box. - (error_response_cb): callback to close error box. - (show_import_wizard): gnome_druid_page_start/finish -> - gnome_druid_page_edge. - (prepare_file_page): - (filename_changed): set HELP button insensitive. - (create_plugin_menu): casts for warnings and fix a typo, - set_data->set_data_full. - (import_druid_finish): folder_selection_dialog api change(?), - allow create. - (dialog_weak_notify): renamed from close_dialog(). - (show_import_wizard): remove gnome_dialog_close_hides -> its a - gtkwindow anyway(!). - - * Makefile.am (evolution_LDADD): Added back importer. - (evolution_SOURCES): Added back importer. - - * importer/intelligent.c (get_intelligent_importers): - bonobo-activationised. - (create_gui): gtkdialogise. - (intelligent_importer_init): gtkdialogise. - (create_gui): remove gnome_util_user_home(). - (intelligent_importer_init): " - - * importer/evolution-importer.c (finalise): from destroy. - (evolution_importer_new): type_new->object_new. - - * importer/evolution-importer-listener.c (finalise): from destroy. - (evolution_importer_listener_new): type_new->object_new. - - * importer/evolution-importer-client.c (destroy): removed, as it - wasn't used anyway. - (evolution_importer_client_new): g_object_new. - (finalise): added, tho doesn't do anythign yet, should it unref - the client->objref? This whole class doesn't seem much use. - - * importer/evolution-importer-client.h: removed - bonobo-object-client, change to g_object. - - * importer/*.[ch]: ran fix script over everything. - - * importer/evolution-intelligent-importer.c: gobjectise. - (finalise): renamed from destroy. - (evolution_intelligent_importer_new): gtk_type_new -> g_object_new - -2002-11-18 Chris Toshok <toshok@ximian.com> - - * importer/import.glade: run libglade-convert. - -2002-11-16 Chris Toshok <toshok@ximian.com> - - * e-folder-list.c (e_folder_list_init): force the scrolled table - to be shown, apparently a bug in libglade2. - - * e-shell-config-default-folders.c (setup_folder_selector): same, - but with the evolution-folder-selector-button's. - -2002-11-16 Chris Toshok <toshok@ximian.com> - - * e-shell-settings-dialog.c (load_pages): init the corba exception - before loading each config page, so previous errors don't make - subsequence pages to fail to load. - -2002-11-15 Ettore Perazzoli <ettore@ximian.com> - - * Makefile.am: Added rule to generate - GNOME_Evolution_Shell.server.in from - GNOME_Evolution_Shell.server.in.in, substituting @BINDIR@. - - * GNOME_Evolution_Shell.server.in.in: Renamed from - GNOME_Evolution_Shell.server.in. Prepend @BINDIR@ to the location - of the executable. - -2002-11-15 Ettore Perazzoli <ettore@ximian.com> - - * evolution-storage.c (impl_finalize): Fix typo; p -> sp. - -2002-11-15 Ettore Perazzoli <ettore@ximian.com> - - * e-activity-handler.c (impl_operationStarted): No need to check - for priv being NULL here anymore. - (impl_operationProgressing): Likewise. - (impl_operationFinished): Likewise. - (impl_requestDialog): Likewise. - - * evolution-folder-selector-button.c (clicked): Use - g_object_add_weak_pointer() on the parent_window instead of using - GTK_OBJECT_DESTROYED(). - -2002-11-15 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-startup-wizard.c (e_shell_startup_wizard_create): For - now, always return TRUE. - -2002-11-14 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-client.c (class_init): Pass the right parent - type to gtk_type_class(). - -2002-11-14 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-user-creatable-items-handler.c, - * e-shell-user-creatable-items-handler.c: Changed into a GObject - subclass instead of a GtkObject subclass. - - * e-component-registry.c, - * e-component-registri.h: Changed into a GObject subclass instead - of a GtkObject subclass. - - * evolution-shell-view.c (impl_ShellView_set_message): Remove - bogus GTK_OBJECT() cast in call to g_signal_emit(). - (impl_ShellView_unset_message): Likewise. - (impl_ShellView_change_current_view): Likewise. - (impl_ShellView_set_title): Likewise. - - * e-shell-view.c (init): Ref/sink the GtkTooltips. - - * e-uri-schema-registry.c (schema_handler_free): g_object_unref() - on the component instead of bonobo_object_unref(). - -2002-11-14 Ettore Perazzoli <ettore@ximian.com> - - * main.c (no_views_left_cb): Use bonobo_main_quit() instead of - gtk_main_quit(). - (shell_weak_notify): Likewise. - (idle_cb): Likewise. - - * e-shell.c (notify_no_views_left_idle_cb): New idle function to - emit the "no_views_left" signal. - (view_weak_notify): Put it on the idle loop instead of firing the - signal here. - - * e-task-widget.c (e_task_widget_construct): Ref/sink the - GtkTooltips object. - -2002-11-14 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (save_settings_for_views): Removed. - (e_shell_save_settings): Do not call it here. - -2002-11-14 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (impl_dispose): NULL priv->ui_component - after unreffing it. - -2002-11-14 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component-client.c (destroy_listener_interface): - Avoid freeing the servant for now, it looks like something is - messed up and this causes a crash on exit. - - * evolution-storage-set-view-listener.c (impl_finalize): Do not - invoke POA_GNOME_Evolution_StorageSetViewListener__fini(). - - * evolution-storage-listener.c (impl_finalize): Do not invoke - POA_GNOME_Evolution_StorageListener__fini(). - - * e-shell-offline-sync.c (progress_listener_servant_free): Do not - invoke POA_GNOME_Evolution_SyncFolderProgressListener__fini(). - - * e-shell-offline-handler.c (progress_listener_servant_free): Do - not invoke POA_GNOME_Evolution_OfflineProgressListener__fini(). - - * e-corba-storage.c (impl_dispose): Do not invoke - POA_GNOME_Evolution_StorageListener__fini(). - - * evolution-shell-component-client.c (destroy_listener_interface): - Do not invoke POA_GNOME_Evolution_ShellComponentListener__fini(). - -2002-11-14 Ettore Perazzoli <ettore@ximian.com> - - * main.c (quit_box_destroyed_callback): Removed. - (no_views_left_cb): Use g_object_add_weak_pointer() instad of - connecting to the "destroy" signal. - (destroy_cb): Removed. - (shell_weak_notify): New. - (idle_cb): Use g_object_weak_ref() on the shell object instead of - connecting to the "destroy" signal. - - * evolution-test-component.c (dialog_destroy_callback): Removed. - (dialog_weak_notify): New. - (create_new_folder_selector): Use g_object_weak_ref() on the - dialog instead of connecting the "destroy" signal. - - * e-shortcuts.c (view_destroyed_cb): Removed. - (view_weak_notify): New. - (e_shortcuts_new_view): g_object_weak_ref() the new view instead - of connecting the "destroy" signal. - (impl_dispose): Free the ->views and g_object_weak_unref() all the - items. - - * e-shell.c (view_destroy_cb): Removed. - (view_weak_notify): New. - (create_view): Use g_object_weak_ref() on the newly created view - instead of connecting to the "destroy" signal. - (impl_dispose): g_object_weak_unref() the views. - (e_shell_show_settings): Use g_object_add_weak_pointer() on the - settings_dialog instead of connecting to the "destroy" signal. - (settings_dialog_destroy_cb): Removed. - - * e-shell-shared-folder-picker-dialog.c - (progress_bar_weak_notify): New. - (progress_bar_destroy_callback): Removed. - (create_progress_dialog): Use g_object_weak_ref() on the progress - bar object instead of connecting to its "destroy" signal. - (shell_destroy_callback): Removed. - (shell_view_destroy_callback): Removed. - (storage_destroy_callback): Removed. - (shell_weak_notify): New. - (shell_view_weak_notify): New. - (storage_weak_notify): New. - (discover_folder): Use g_object_weak_ref() on the shell, parent, - storage objects instead of connecting to their "destroy" signals. - - * e-shell-importer.c: Removed member destroyed from - ImporterComponentData. - (import_cb): Instead of checking if ->destroyed is TRUE, check if - ->dialog is NULL to decide whether the dialog has been destroyed - or not. - (dialog_destroy_cb): Removed. - (start_import): Use g_object_weak_ref() on the dialog object - instead of connecting to its "destroy" signal. - (dialog_close): Removed. - (dialog_weak_notify): New. - (show_import_wizard): Use g_object_weak_ref() on the dialog object - instead of connecting to its "destroy" signal. - (import_druid_destroy): New. - (import_druid_weak_notify): New. - (show_import_wizard): Use g_object_weak_ref() on the druid object - instead of connecting to its "destroy" signal. - - * e-shell-folder-selection-dialog.c - (e_shell_folder_selection_dialog_construct): g_object_weak_ref() - the shell object instead of connecting to its "destroy" signal. - - * e-shell-folder-creation-dialog.c (dialog_destroy_cb): Removed. - (dialog_destroy_notify): New. - (e_shell_show_folder_creation_dialog): g_object_weak_ref() the - dialog instead of connecting to its "destroy" signal. - (shell_destroy_cb): Removed. - (shell_destroy_notify): New. - (e_shell_show_folder_creation_dialog): g_object_weak_ref() the - shell object instead of connecting to its "destroy" signal. - - * e-shell-config-offline.c (config_control_destroy_callback): - Removed. - (config_control_destroy_notify): New. - (e_shell_config_offline_create_widget): g_object_weak_ref() the - config_control instead of connecting to its "destroy" signal. - - * e-shell-config-default-folders.c - (config_control_destroy_callback): Removed. - (config_control_destroy_notify): New. - (e_shell_config_default_folders_create_widget): - g_object_weak_ref() instead of connecting to the "destroy" signal. - - * e-shell-config-autocompletion.c (config_control_destroy_notify): - New. - (config_control_destroy_callback): Removed. - (e_shell_config_autocompletion_create_widget): - g_object_weak_ref() instead of connecting to the "destroy" signal. - - * e-activity-handler.c (task_bar_destroy_cb): Removed. - (task_bar_destroy_notify): New. - (e_activity_handler_attach_task_bar): Weak_ref the task_bar using - task_bar_destroy_notify. - (impl_dispose): Weak_unref the task bars in priv->task_bars. - -2002-11-13 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-startup-wizard.c: Change type of member etd in - TimezoneDialogPage to GObject from GtkObject. - (make_timezone_page): Cast to G_OBJECT() not GTK_OBJECT(). - -2002-11-13 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-startup-wizard.c (e_shell_startup_wizard_create): - Connect finish_func to the "next" signal for now, since GnomeDruid - seems to be borked. - - * e-uri-schema-registry.c (schema_handler_new): g_object_ref() - @component instead of bonobo_object_ref(). - - * e-local-storage.c (create_folder): g_object_ref() for the - component_client, instead of bonobo_object_ref(). - (remove_folder_step): Likewise. - -2002-11-13 Not Zed <NotZed@Ximian.com> - - * evolution-storage.c: remove GTK_OBJECT cast and other GTK stuff. - - * evolution-storage.h: this is a gobject not a gtkobject, fix cast - macros, and get_type call. - -2002-11-11 Chris Toshok <toshok@ximian.com> - - * e-task-widget.c (impl_finalize): need to assign priv here, fixes - a crash. - -2002-11-11 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (impl_dispose): Do unref the config_listener here [I - fixed the finalize crash we were getting]. - -2002-11-11 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (impl_finalize): Protect against - priv->checkboxes being NULL. - -2002-11-11 Ettore Perazzoli <ettore@ximian.com> - - * e-component-registry.c: Make separate dispose/finalize overrides - of just overriding destroy. - * e-corba-config-page.c: Likewise. - * e-corba-storage.c: Likewise. - * e-folder-type-registry.c: Likewise. - * e-folder.c: Likewise. - * e-history.c: Likewise. - * e-local-folder.c: Likewise. - * e-local-storage.c: Likewise. - * e-shell-folder-selection-dialog.c: Likewise. - * e-shell-folder-title-bar.c: Likewise. - * e-shell-offline-handler.c: Likewise. - * e-shell-settings-dialog.c: Likewise. - * e-shell-user-creatable-items-handler.c: Likewise. - * e-shell-view.c: Likewise. - * e-shortcuts-view-model.c: Likewise. - * e-shortcuts-view.c: Likewise. - * e-shortcuts.c: Likewise. - * e-storage-set-view.c: Likewise. - * e-storage-set.c: Likewise. - * e-storage.c: Likewise. - * e-task-bar.c: Likewise. - * e-task-widget.c: Likewise. - * e-uri-schema-registry.c: Likewise. - * evolution-activity-client.c: Likewise. - * evolution-folder-selector-button.c: Likewise. - * evolution-storage-listener.c: Likewise. - * evolution-storage-set-view-listener.c: Likewise. - * evolution-test-component.c: Likewise. - -2002-11-08 Rodrigo Moya <rodrigo@ximian.com> - - * importer/Makefile.am: use correctly IDL flags. - -2002-11-07 Chris Toshok <toshok@ximian.com> - - * e-task-widget.c (impl_destroy): guard against multiple calls. - fixes a crash whenever a task finishes (the addressbook finishing - loading, etc.). - - * e-shell-marshal.list: add NONE:BOOL for - evolution-shell-component. - - * evolution-shell-component.c (class_init): register the signals - with g_signal_new. - -2002-11-05 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (e_shell_show_settings): Allow type being NULL. - -2002-11-05 Ettore Perazzoli <ettore@ximian.com> - - * e-local-storage.c (load_folder): Do add folders with an unknown - type. - -2002-11-05 Ettore Perazzoli <ettore@ximian.com> - - * glade/e-shell-folder-creation-dialog.glade (ok_button): Set - response_id to GTK_RESPONSE_OK. - (cancel_button): Likewise, with GTK_RESPONSE_CANCEL. - - * e-shell-folder-creation-dialog.h, - e-shell-folder-creation-dialog.c: Ported to GtkDialog. - -2002-11-05 Ettore Perazzoli <ettore@ximian.com> - - * e-folder-list.c: Use g_object_get_data() instead of - gtk_object_get_data(). - * e-shell-config-default-folders.c: Likewise. - * e-shell-folder-creation-dialog.c: Likewise. - * e-shell-importer.c: Likewise. - * e-shell-shared-folder-picker-dialog.c: Likewise. - * e-shell-user-creatable-items-handler.c: Likewise. - * e-shell-view.c: Likewise. - * e-shell.c: Likewise. - * e-storage.c: Likewise. - -2002-11-05 Ettore Perazzoli <ettore@ximian.com> - - * e-activity-handler.c: Split finalize/dispose. - * e-corba-shortcuts.c: Likewise. - * e-corba-storage-registry.c: Likewise. - * e-shell-about-box.c: Likewise. - * e-shell.c: Likewise. - * e-splash.c: Likewise. - * evolution-config-control.c: Likewise. - * evolution-session.c: Likewise. - * evolution-shell-component.c: Likewise. - * evolution-shell-view.c: Likewise. - * evolution-storage-set-view.c: Likewise. - * evolution-storage.c: Likewise. - * evolution-wizard.c: Likewise. - -2002-11-05 Ettore Perazzoli <ettore@ximian.com> - - * All: g_object_unref instead of bonobo_object_unref for the - EvolutionShellComponentClient and EvolutionShellClient interfaces. - -2002-11-05 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-client.c (impl_dispose): New. - (impl_finalize): New. - (destroy): Removed. - (class_init): Install dispose, finalize handlers. - - * All: Use evolution_shell_client_corba_objref() or - evolution_shell_component_client_corba_objref() instead of - BONOBO_OBJREF() or bonobo_object_corba_objref() where needed. - - * e-folder-type-registry.c (set_handler): Use g_object_ref() for - the handler, not bonobo_object_ref(). - (folder_type_free): Likewise for unref. - - * evolution-shell-component-client.c - (evolution_shell_component_client_corba_objref): New. - (impl_dispose): Moved from impl_destroy; only unref things. - (impl_finalize) New. - (class_init): Install dispose/finalize. - (evolution_shell_component_client_get_dnd_source_interface): Use - priv->corba_objref instead of bonobo_object_corba_objref() since - we are not a BonoboObject anymore. - (evolution_shell_component_client_get_dnd_destination_interface): - Likewise. - (evolution_shell_component_client_get_offline_interface): Likewise. - (evolution_shell_component_client_set_owner): Likewise. - (evolution_shell_component_client_unset_owner): Likewise. - (evolution_shell_component_client_create_view): Likewise. - (evolution_shell_component_client_handle_external_uri): Likewise. - (evolution_shell_component_client_async_create_folder): Likewise. - (evolution_shell_component_client_async_xfer_folder): Likewise. - (evolution_shell_component_client_populate_folder_context_menu): Likewise. - (evolution_shell_component_client_unpopulate_folder_context_menu): Likewise. - - * e-component-registry.c (register_component): Use - evolution_shell_component_client_corba_objref(). - (e_component_registry_restart_component): Likewise. - (component_free): Likewise. - - * evolution-shell-component-client.c: g_object_new() instead of gtk_type_new(). - * e-component-registry.c: Likewise. - * e-corba-config-page.c - * e-folder-list.c: Likewise. - * e-folder-type-registry.c: Likewise. - * e-folder.c: Likewise. - * e-gray-bar.c: Likewise. - * e-history.c: Likewise. - * e-local-folder.c: Likewise. - * e-local-folder.c: Likewise. - * e-local-storage.c: Likewise. - * e-shell-about-box.c: Likewise. - * e-shell-config-default-folders.c: Likewise. - * e-shell-folder-selection-dialog.c: Likewise. - * e-shell-folder-title-bar.c: Likewise. - * e-shell-offline-handler.c: Likewise. - * e-shell-settings-dialog.c: Likewise. - * e-shell-user-creatable-items-handler.c: Likewise. - * e-shell-view.c: Likewise. - * e-shortcuts-view-model.c: Likewise. - * e-shortcuts-view.c: Likewise. - * e-shortcuts.c: Likewise. - * e-splash.c: Likewise. - * e-storage-set-view.c: Likewise. - * e-storage-set.c: Likewise. - * e-storage.c: Likewise. - * e-task-bar.c: Likewise. - * e-task-widget.c: Likewise. - * e-uri-schema-registry.c: Likewise. - * evolution-activity-client.c: Likewise. - * evolution-folder-selector-button.c: Likewise. - * evolution-shell-client.c: Likewise. - * evolution-shell-view.c: Likewise. - * evolution-storage-listener.c: Likewise. - * evolution-storage-set-view-listener.c: Likewise. - * evolution-storage-set-view.c: Likewise. - * evolution-wizard.c: Likewise. - - * GNOME_Evolution_TestComponent.server: Renamed from - GNOME_Evolution_TestComponent.oaf. - - * evolution-test-component.c (spit_out_shortcuts): Use - BONOBO_EX_REPOID(). - (create_new_folder_selector): Ported to use GtkDialog instead of - GnomeDialog. - (storage_cancel_discover_shared_folder_callback): Add missing - G_OBJECT() cast. - (shared_folder_discovery_timeout_callback): Likewise. - (storage_discover_shared_folder_callback): Likewise. - (timeout_callback_2): Likewise. - (timeout_callback_1): Likewise. - (shared_folder_discovery_timeout_callback): Use - g_object_get_data() instead of gtk_object_get_data(). - (storage_cancel_discover_shared_folder_callback): Likewise. - (timeout_callback_2): Likewise. - (timeout_callback_2): g_timeout_add() instead of - gtk_timeout_add(). - (create_view_fn): Likewise. - (timeout_callback_1): Likewise. - (timeout_callback_1): Pass NULL as the error arg to - gdk_pixbuf_new_from_file(). - (register_component): Use bonobo-activation instead of OAF. - - * e-shell-about-box.c (impl_destroy): Removed. - (impl_finalize): New. - (class_init): Install finalize handler, not destroy. - - * e-shell-view-menu.c (command_about_box): Use a GtkWindow again. - Set the GTK_WINDOW_TYPE_HINT_DIALOG hint. - - * e-shell-about-box.c (e_shell_about_box_construct): Removed. - -2002-11-04 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-commands.c (e_shell_command_copy_folder): Pass - TRUE for arg allow_creation to - e_shell_folder_selection_dialog_new(). - (e_shell_command_move_folder): Likewise. - * e-shell-view-menu.c (command_goto_folder): Likewise. - (command_new_shortcut): Likewise. - * e-shell.c (impl_Shell_selectUserFolder): Likewise. - - * e-shell-folder-selection-dialog.c - (e_shell_folder_selection_dialog_set_allow_creation): Removed. - (e_shell_folder_selection_dialog_get_allow_creation): Removed. - (e_shell_folder_selection_dialog_new): New arg allow_creation. - (e_shell_folder_selection_dialog_construct): Likewise. Also, do - set priv->shell. - - * e-shell-folder-selection-dialog.h, - e-shell-folder-selection-dialog.c: Port to GtkDialog. - -2002-11-04 Ettore Perazzoli <ettore@ximian.com> - - * e-folder-type-registry.c - (e_folder_type_registry_get_handler_for_type): Remove warning for - when the type is unknown. - (e_folder_type_registry_type_is_user_creatable): Likewise. - (e_folder_type_registry_get_display_name_for_type): Likewise. - (e_folder_type_registry_get_description_for_type): Likewise. - (e_folder_type_registry_get_exported_dnd_types_for_type): - Likewise. - (e_folder_type_registry_get_accepted_dnd_types_for_type): - Likewise. - (e_folder_type_registry_unregister_type): Likewise. - (e_folder_type_registry_get_icon_name_for_type): Likewise. - (e_folder_type_registry_get_icon_for_type): Likewise. - (set_handler): Removed warning here too. - -2002-11-04 Ettore Perazzoli <ettore@ximian.com> - - * e-folder-list.c: Replace gtk_signal_emit() with g_signal_emit(). - * e-folder.c: Likewise. - * e-shell-folder-selection-dialog.c: Likewise. - * e-shell-folder-title-bar.c: Likewise. - * e-shell-offline-handler.c: Likewise. - * e-shell-view.c: Likewise. - * e-shortcuts-view.c: Likewise. - * e-shortcuts.c: Likewise. - * e-storage-set-view.c: Likewise. - * e-storage-set.c: Likewise. - * e-storage.c: Likewise. - * evolution-activity-client.c: Likewise. - * evolution-folder-selector-button.c: Likewise. - * evolution-storage-listener.c: Likewise. - * evolution-storage-set-view-listener.c: Likewise. - -2002-11-04 Ettore Perazzoli <ettore@ximian.com> - - * e-folder-list.c: Use g_object_set_data() instead of - gtk_object_set_data(). - * e-shell-config-default-folders.c: Likewise. - * e-shell-folder-creation-dialog.c: Likewise. - * e-shell-importer.c: Likewise. - * e-shell-shared-folder-picker-dialog.c: Likewise. - * e-shell-user-creatable-items-handler.c: Likewise. - * e-shell-view.c: Likewise. - * e-shell.c: Likewise. - * e-storage-set-view.c: Likewise. - * e-storage.c: Likewise. - * evolution-test-component.c: Likewise. - - * e-storage-set-view.c (e_storage_set_view_construct): Use - g_object_weakref() instead of gtk_object_weakref() for the - ui_container. - (ui_container_destroy_notify): Add param where_the_object_was to - match the GWeakNotify prototype. - - * e-shell.c: Use g_signal_emit() instead of gtk_signal_emit(). - -2002-11-03 Ettore Perazzoli <ettore@ximian.com> - - * glade/e-active-connection-dialog.glade: Converted to Glade2 - format. - * glade/evolution-startup-wizard.glade: Likewise. - * glade/e-shell-shared-folder-picker-dialog.glade: Likewise. - * glade/e-shell-folder-creation-dialog.glade: Likewise. - * glade/e-shell-config-default-folders.glade: Likewise. - * glade/e-folder-list.glade: Likewise. - -2002-11-03 Ettore Perazzoli <ettore@ximian.com> - - * *.c, *.h: Changed all gtk_object_refs()/gtk_object_unrefs() into - g_object_refs()/g_object_unrefs() and all gtk_signal_connect_*() - into g_signal_connect_*(). [Except for some case where we have - gtk_signal_connect_full() or gtk_signal_connect_while_alive() - calls that cannot be trivially ported to use the g_signal_* - functions, we'll have to fix those later.] - - * e-splash.c (impl_finalize): Finalize implementation, copied over - from impl_destroy. - (impl_destroy): Removed. - (class_init): Override finalize, not destroy. - - * e-activity-handler.c: Ported from GtkObject to GObject. - * evolution-storage.c: Likewise. - * e-corba-shortcuts.c: Likewise. - * evolution-session.h: Likewise. - * evolution-config-control.c: Likewise. - * evolution-shell-component-dnd.c: Likewise. - * evolution-shell-component.c: Likewise. - * evolution-shell-view.c: Likewise. - * evolution-storage-set-view.c: Likewise. - * evolution-wizard.c: Likewise. - -2002-11-03 Ettore Perazzoli <ettore@ximian.com> - - * e-component-info.c: Updated for libxml2. - * e-shortcuts.c: Likewise. - * e-folder-list.c: Likewise. - * e-local-folder.c: Likewise. - -2002-11-03 Ettore Perazzoli <ettore@ximian.com> - - * GNOME_Evolution_Shell.server.in: Renamed from - GNOME_Evolution_Shell.oaf.in. - - * Makefile.am: Port from OAF to bonobo-activation. - (INCLUDES): Define SYSCONFDIR, DATADIR, LIBDIR. - - * main.c (main): Use gnome_program_init(). - - * e-corba-storage-registry.c (e_corba_storage_registry_new): - g_object_new(), not gtk_type_new(). - (impl_finalize): New, ported over from destroy. - (destroy): Removed. - (class_init): Install finalize handler, not destroy handler, since - we are not a GtkObject anymore. - - * e-corba-storage.c (e_corba_storage_new): g_object_new(), not - gtk_type_new(). - - * e-shell.c (class_init): Override finalize, not destroy. - (impl_finalize): Finalize implementation, basically the old - destroy renamed. - (e_shell_new): g_object_new(), not gtk_type_new(). - (class_init): Use e_shell_marshal_NONE__INT for - line_status_changed instead of using an ENUM. - (e_shell_construct): Use g_signal_connect_object() instead of - gtk_signal_connect_while_alive(). - - * e-setup.c (e_setup): Do not unref local_folder if NULL. - - * e-folder.c (init): Make not floating. - (e_folder_construct): No need to make it floating here anymore. - - * e-shell.c (impl_Shell_selectUserFolder): For now don't set - dialog parent from xid. - - * main.c (no_views_left_cb): Add missing GTK_SIGNAL_FUNC() cast. - (new_view_created_callback): Likewise. - (warning_dialog_clicked_callback): Update to use the - EConfigListener from the shell instead of bonobo-conf. - (show_development_warning): Likewise. - (upgrade_from_1_0_if_needed): BONOBO_EX_ID -> BONOBO_EX_REPOID. - (idle_cb): Use bonobo-activation and BONOBO_EX_REPOID(). - (main): Cleaned up the various things that are unneeded in GNOME - 2. - (upgrade_from_1_0_if_needed): Use EConfigListener. - - * evolution-storage-set-view.h, evolution-storage-set-view.c: - BonoboXObjectified. - - * e-storage.c (class_init): GLIB2-ified and made to use - e-shell-marshal.h. - (ES_CLASS): Use GTK_OBJECT_GET_CLASS(). - (e_storage_new_folder): Added missing GTK_SIGNAL_FUNC() prototype. - - * e-storage-set.c (class_init): GLIB2-ified and made to use - e-shell-marshal.h. - - * e-storage-set-view.c (popup_folder_menu): For now, do not add - the pop-up since we lack bonobo_ui_container_get_win() and I am - not sure how to work around it. - (popup_folder_menu): Pass self as the for_widget arg to - gnome_popup_menu_do_popup_modal(). - (class_init): GLIB2-ified, and got to use e-shell-marshal.h. - (marshal_NONE__GDKDRAGCONTEXT_STRING_STRING_STRING): Removed. - (impl_tree_drag_data_get): Don't set the selection for now -- we - have to fix the CORBA target stuff to match GTK 2. - (e_storage_set_view_construct): Pass NULL as the opt_ev arg to - bonobo_ui_component_set_container(). - - * e-splash.c: #include <libgnomecanvas/gnome-canvas-pixbuf.h> - instead of <gdk-pixbuf/gnome-canvas-pixbuf.h>. - (e_splash_new): Pass NULL as the error arg to - gdk_pixbuf_new_from_file(). - - * e-shortcuts.c (class_init): GLIB2-ified. Also use the - e-shell-marshal marshallers. - (e_shortcuts_new_view): Add missing GTK_SIGNAL_FUNC() cast. - - * e-shortcuts-view.c: Use GTK_STOCK_* stuff instead of - GNOME_STOCK_* stuff. - (pop_up_right_click_menu_for_group): Pass self as the for_widget - arg to gnome_popup_menu_do_popup_modal(). - (pop_up_right_click_menu_for_shortcut): Likewise. - (class_init): GLIB2-ified. - - * e-shell.c: Do not #include <gal/util/e-unicode-i18n.h> or - #include <libgnome/gnome-defs.h>. - (set_interactive): Use BONOBO_EX_REPOID(). - (setup_local_storage): Use _() not U_(). - (destroy): Use gtk_widget_destroy() instead of - gtk_object_destroy() on priv->settings_dialog. - (class_init): GLIB2-ized. - (init): Initialize config_listener member. - (get_icon_path_for_component_info): Port to bonobo-activation from - OAF. - (setup_components): Likewise. - (destroy): Likewise. - (e_shell_construct): Use e_setup_check_config(), not - e_setup_check_db (). Use the e_config_listener instead of - bonobo-conf. - (save_settings_for_views): Likewise. - (save_misc_settings): Likewise. - (e_shell_restore_from_settings): Likewise. - (parse_default_uri): Likewise. - (e_shell_component_maybe_crashed): Pass NULL for opt_ev arg to - bonobo_unkown_ping() - (e_shell_component_maybe_crashed): Use - bonobo_engine_deregister_dead_components() instead of - bonobo_window_deregister_component_by_ref() which is no more. - (e_shell_send_receive): BONOBO_EX_REPOID() instead of - BONOBO_EX_ID(). - (e_shell_get_config_listener): Return the config_listener. - - * e-shell-view.c (find_inbox_in_storage): Use _() instead of U_(). - (load_images): Pass NULL as the error arg to - gdk_pixbuf_new_from_file(). - (load_images): Likewise. - (find_inbox_in_storage): Work around the lack of - g_utf8_strcasecmp() in glib-2.0. - (class_init): GLIB2-ified. Also, use the marshallers in - e-shell-marshal.h. - (pop_up_folder_bar): Use gtk_window_move()/gtk_widget_show() - instead gtk_widget_popup(). - (unmerge_on_error): Work around the death of - bonobo_ui_component_get_win() and - bonobo_window_deregister_component_by_ref(). - (e_shell_view_construct): Pass NULL as the uic arg to - bonobo_window_construct(). Add missing GTK_SIGNAL_FUNC() cast. - Match the new BonoboWindow behavior wrt the UIContainer and the - new opt_ev args. - (display_uri): Use bonobo_ui_engine_freeze() and - bonobo_ui_engine_thaw() since bonobo_window_freeze() and - bonobo_window_thaw() got axed [sigh]. - (e_shell_view_save_settings): Use EConfigListener. - (e_shell_view_load_settings): Likewise. - (get_view_for_uri): Use bonobo_widget_new_control_from_objref() - instead of e_bonobo_widget_new_control_from_objref(). - - * e-shell-view-menu.c (command_help_faq): Pass NULL for the error - arg to gnome_url_show(). - (command_about_box): Use GtkDialog instead of a GtkWindow of a - type GTK_WINDOW_DIALOG [which does not exist anymore]. - (command_xml_dump): Removed. - (menu_do_misc): Do not add the corresponding verb. - - * e-shell-user-creatable-items-handler.c (execute_verb): Use - BONOBO_EX_REPOID(). - - * e-shell-startup-wizard.c: Remove id member from SWData. Replace - member db with config_listener. - (e_shell_startup_wizard_create): Initialize config_listener. - (make_mail_dialog_pages): Do not set the listener id here. - (druid_event_notify_cb): Pass FALSE as the help_sensitive arg to - gnome_druid_set_buttons_sensitive(). - (e_shell_startup_wizard_create): Likewise. - (make_mail_dialog_pages): Use bonobo-activation instead of OAF. - (get_intelligent_importers): Likewise. - (prepare_importer_page): Likewise. - (start_importers): Do nothing here for now. - (finish_func): Constify local variable displayname. - (finish_func): Updated to use the config_listener instead of the - bono-conf db. - (prepare_importer_page): Do not actually run the importer yet. - (e_shell_startup_wizard_create): Pass NULL as the domain arg to - glade_xml_new(). Use the config_listener. - - * e-shell-shared-folder-picker-dialog.c (user_clicked): - BONOBO_EX_REPOID() instead of BONOBO_EX_ID(). - (setup_name_selector): Likewise. - (setup_name_selector): Use bonobo-activation. - (show_dialog): Pass NULL as the domain arg to glade_xml_new(). - (setup_name_selector): Add a missing GTK_SIGNAL_FUNC() cast. - - * e-shell-settings-dialog.c: #include - <bonobo-activation/bonobo-activation.h>. Use - Bonobo_ActivationProperty instead of OAF_Property. - (set_dialog_size): Use gtk_style_get_font() to get the font from - the widget->style. - (load_pages): Converted to use bonobo-activation instead of OAF. - Pass NULL as the error arg to gdk_pixbuf_new_from_file(). - - * e-shell-offline-sync.c (sync_folder): BONOBO_EX_REPOID(), not - BONOBO_EX_ID(). - (e_shell_offline_sync_all_folders): For now, avoid doing anything - [see changes to e-shell-config-offline.c below]. - (setup_progress_listener): #if 0 for now. - (setup_dialog): Likewise. - (sync_folder): Likewise. - (cleanup): Likewise. - (progress_listener_servant_free): Likewise. - (progress_listener_servant_new): Likewise. - (impl_SyncFolderProgressListener_updateProgress): Likewise. - (impl_SyncFolderProgressListener_reportSuccess): Likewise. - (impl_SyncFolderProgressListener_reportFailure): Likewise. - (progress_dialog_close_callback): Likewise. - (progress_dialog_clicked_callback): Likewise. - - * e-shell-offline-handler.c (prepare_for_offline): Use - BONOBO_EX_REPOID(). - (pop_up_confirmation_dialog): Pass NULL as the domain arg to - glade_xml_new(). - (class_init): GLIB2-ified. - - * Makefile.am: Do not compile e-shell-importer.c, - e-shell-importer.h for now. - - * e-shell-folder-title-bar.c (get_max_clipped_label_width): Use - gtk_style_get_font() to retrieve the font. - (class_init): GLIB2-ified. - (e_shell_folder_title_bar_construct): Get {x,y}thickness from - widget->style, not from widget->style->klass. - - * e-shell-folder-selection-dialog.c: #include <string.h>, - <gtk/gtklabel.h> and <gtk/gtksignal.h>. - (class_init): GLIB2-ified. - - * e-shell-folder-creation-dialog.c: No <libgnome/gnome-defs.h>, - add some GTK includes. - (e_shell_show_folder_creation_dialog): Pass NULL as the domain arg - to glade_xml_new(). Added missing GTK_SIGNAL_FUNC() cast. - - * e-shell-folder-commands.c: Do not #include - <libgnomeui/gnome-stock.h> and #include - <bonobo-conf/Bonobo_Config.h>. - - * e-shell-config-default-folders.c: Replace member db in - EvolutionDefaultFolderConfig with config_listener. - (e_shell_config_default_folders_create_widget): Init here. - (config_control_destroy_cb): Unref here. - (config_control_apply_cb): Use EConfigListener instead of - BonoboConf. - (setup_folder_selector): Likewise. - (e_shell_config_default_folders_create_widget): Pass NULL as the - domain arg to glade_xml_new(). - - * e-shell-config-offline.c (config_control_apply_callback): For - now, do not change the configuration. [Needs to be ported to - EConfigListener or something, but we were storing a sequence using - typecodes here and there is no trivial way to do that right now.] - (init_storage_set_view_status_from_config): Likewise, do not - retrieve the configuration here. - - * e-shell-marshal.list: Removed duplicates, added a bunch new - marshallers. - -2002-11-02 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-config-autocompletion.c: No bonobo-conf; removed member - db in struct EvolutionAutocompletionConfig and replaced with a - config_listener arg. - (e_shell_config_autocompletion_create_widget): Init it here. - (config_control_destroy_callback): Unref it here. - (config_control_apply_callback): Updated to use the - config_listener. - - * e-shell-config.c (e_shell_config_factory_register): Use - bonobo_generic_factory_new() instead of - bonobo_generic_factory_new_multi(). - - * e-shell-about-box.c (impl_realize): Pass NULL as the error arg - to gdk_pixbuf_new_from_file(). - (timeout_callback): Use gtk_style_get_font() to retrieve the - style's font instead of style->font. - (impl_draw): Removed. - (impl_expose_event): Do the drawing of the pixmap here. - - * e-setup.c (e_setup_check_db): Removed. - (e_setup_check_config): New, version using EConfigListener instead - of bonobo-conf. - - * e-setup.h: #include "e-util/e-config-listener.h" instead of - <bonobo-conf/bonobo-config-database.h>. - - * e-local-storage.c (construct): Use _() instead of U_(). - (setup_stock_folders): Likewise. - - * e-icon-factory.c (load_icon): Pass NULL as the error arg to - gdk_pixbuf_new_from_file(). - - * e-folder-type-registry.c (folder_type_new): Pass NULL as the - error arg to gdk_pixbuf_new_from_file(). - - * e-folder-dnd-bridge.c (find_matching_target_for_drag_context): - GdkAtom is not an integer anymore; update accordingly. - - * e-corba-storage.c (async_folder_cb): Constified args - appropriately to match BonoboListenerCallbackFn. - (async_folder_discovery_cb): Likewise. - (cancel_discover_shared_folder): BONOBO_EX_ID() -> - BONOBO_EX_REPOID(). - (e_corba_storage_show_folder_properties): Likewise. - - * e-corba-storage-registry.h, e-corba-storage-registry.c: - BonoboXObjectified. - - * e-corba-config-page.c: Removed member listener_id in struct - ECorbaConfigPagePrivate. - (init): Don't init. - (setup_listener): Bonobo_EventSource_addListener doesn't return an - ID anymore. - (impl_destroy): Just pass the listener to - Bonobo_EventSource_removeListener. - (setup_listener): BONOBO_EX_REPOID() instead of BONOBO_EX_ID(). - (impl_apply): Likewise. - (listener_event_callback): Constified args appropriately to match - BonoboListenerCallbackFn. - (e_corba_config_page_construct): Likewise. - - * e-component-registry.c (wait_for_corba_object_to_die): Pass NULL - for the exception arg to bonobo_unknown_ping(). - - * e-shell-view.h: <bonobo/bonobo-window.h>, not - <bonobo/bonobo-win.h>. - - * e-shell.c: Replace member db in EShellPrivate with an - EConfigListener config_listener. - (destroy): Do not call e_shell_disconnect_db(). Unref - EConfigListener. Destroy settings_dialog if not NULL. Pass - config_listener to e_setup_check_db(). - (e_shell_get_config_db): Removed. - (e_shell_get_config_listener): New. - (e_shell_construct): Set up the config_listener, instead of the - Bonobo_ConfigDatabase. - - * e-shell.h: #include <bonobo-activation/bonobo-activation.h> - instead of <liboaf/oaf.h>. No - <bonobo-conf/bonobo-config-database.h>. - - * e-component-registry.c: #include - <bonobo-activation/bonobo-activation.h> instead of <liboaf/oaf.h>. - - * e-activity-handler.c (task_widget_button_press_event_callback): - Use BONOBO_EX() and BONOBO_EX_REPOID(). - (impl_operationStarted): Don't use GTK_OBJECT_DESTROYED() [needs - to be fixed later]. - (impl_operationProgressing): Likewise. - (impl_operationFinished): Likewise. - (impl_requestDialog): Likewise. - - * evolution-wizard.c (evolution_wizard_class_init): GLIB2-ified. - - * evolution-wizard.h: Remove BEGIN_GNOME_DECLS/END_GNOME_DECLS. - - * evolution-storage.c: Chagned to use generated marshallers - instead of custom ones or GAL's. - - * eshell-marshal.list: New. - * Makefile.am: Added rule to build eshell-marshal.[ch] and link - them in. - - * evolution-storage.h, evolution-storage.c: BonoboXObjectified. - - * evolution-storage-set-view-listener.c (class_init): GLIB2-ified. - - * evolution-storage-listener.c (class_init): GLIB2-ified. - - * evolution-shell-view.h, evolution-shell-view.c: - BonoboXObjectified. - - * evolution-shell-component-utils.c: #include - <bonobo-activation/bonobo-activation.h>. - (e_pixmaps_update): Pass NULL as the error arg to - gdk_pixbuf_new_from_file(). - (e_activation_failure_dialog): Bonobo_GeneralError instead of - OAF_GeneralError. - (e_get_activation_failure_msg): Likewise. - - * evolution-shell-component-dnd.h, evolution-shell-component-dnd.c: - BonoboXObjectified. - - * evolution-shell-component.c: #include <unistd.h>. - (owner_ping_callback): Pass NULL for the opt_ev arg to - bonobo_unknown_ping(). - (impl_populateFolderContextMenu): Pass NULL for the opt_ev arg to - bonobo_ui_component_set_container(). - (class_init): GLIB2-ified. - - * e-component-registry.c (component_free): Use g_object_unref() on - the EvolutionShellComponentClient instead of - bonobo_object_unref(). - (register_component): Likewise. - (component_new): Likewise, use g_object_ref() instead of - bonobo_object_ref(). - - * evolution-shell-component-client.c: New member corba_objref in - EvolutionShellComponentClientPrivate. - (init): Init to CORBA_OBJECT_NIL. - (impl_destroy): Unref. Also CORBA_OBJECT_NILify all the pointers - to unreffed objects. - (corba_exception_to_result): Use BONOBO_EX_REPOID(ev) instead of - ev->_repo_id. - (evolution_shell_component_client_construct): Set the corba_objref - pointer, do not call bonobo_object_client_construct(). - (evolution_shell_component_client_new): Use - bonobo_activation_activate_from_id() here instead of - oaf_activate_from_id(). - - * evolution-shell-component-client.h, - evolution-shell-component-client.c: Derive from GObject instead of - BonoboObjectClient. - - * evolution-shell-client.c - (evolution_shell_client_create_storage_set_view): Use - BONOBO_EX_REPOID() instead of BONOBO_EX_ID(). - - * evolution-folder-selector-button.c (destroy): g_object_unref the - EvolutionShellClient instead of bonobo_object_unref(). - (evolution_folder_selector_button_construct): Likewise. - - * e-folder-list.c (e_folder_list_destroy): g_object_unref the - EvolutionShellClient instead of bonobo_object_unref(). - (e_folder_list_construct): g_object_ref the EvolutionShellClient - instead of bonobo_object_ref(). - - * evolution-shell-client.c: New member corba_objref in - EvolutionShellClientPrivate. - (init): Init to CORBA_OBJECT_NIL. - (destroy): Unref/release. - (query_shell_interface): Use BONOBO_EX() and BONOBO_EX_REPOID() - instead of ._major and ._repo_id. - (destroy): Likewise. - (evolution_shell_client_get_local_storage): Likewise. - - * evolution-shell-client.h: Derive from GObject instead of - BonoboObjectClient. - - * evolution-session.c (corba_class_init): Get klass arg. - (class_init): Pass klass arg. GLIB2-ified. - (evolution_session_construct): Removed. - (evolution_session_new): Just return what gtk_type_new() returns. - - * evolution-session.h, evolution-session.c: Derive from - BonoboXObject. - - * evolution-folder-selector-button.c (init): Make icon a GtkImage - instead of a BonoboUIToolbarIcon. - (set_folder, class_init): GLIB2-ified. - - * evolution-config-control.c (class_init): GLIB2-ified. - - * evolution-activity-client.c (corba_update_progress): Use - BONOBO_EX_REPOID() instead of ._major and ._repo_id. - (evolution_activity_client_request_dialog): Likewise. - (impl_destroy): Likewise. - (class_init): GLIB2-ified. - - * e-folder-list.c: #include <gtk/gtframe.h> and #include - <string.h>. - (e_folder_list_destroy): bonobo_object_unref(), not - bonobo_object_client_unref(). - (e_folder_list_init): Pass NULL as the domain to glade_xml_new(). - - * e-folder-list.h: #include <gtk/gtkvbox.h>. - - * e-folder.c (impl_remove): Renamed from remove(). - (impl_get_physical_uri): Renamed from get_physical_uri(). - (impl_load_info): Renamed from load_info(). - (impl_save_info): Renamed from save_info(). - (class_init): GLIB2-ified. - - * Evolution-Session.idl: #include <Bonobo.idl>, not <Bonobo.h>. - * Evolution-Offline.idl: Likewise. - * Evolution-ShellComponent.idl: Likewise. - * Evolution-ShellComponentDnd.idl: Likewise. - * Evolution-Storage.idl: Likewise. - - * Makefile.am: Do not compile the importer directory for now. - - * evolution-wizard.c (evolution_wizard_set_buttons_sensitive): - ORBit2-ize type names. - (evolution_wizard_set_show_finish): Likewise. - (evolution_wizard_set_page): Likewise. - -2002-10-28 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-settings-dialog.c (set_dialog_size): Increase the width - slightly. - - * e-shell-view-menu.c: Set "settings.png" as the icon for - /menu/Tools/Settings. - -2002-10-25 Ettore Perazzoli <ettore@ximian.com> - - [#31303] - - * e-shell-view (storage_set_view_box_button_release_event_cb): Pop - down the popup folder bar if it's a toplevel node. - (folder_bar_popup_map_callback): Connect to the "folder_opened" - signal on the storage_set_view. - -2002-10-25 Ettore Perazzoli <ettore@ximian.com> - - * e-folder-list.c (create_display_string): Don't turn the string - from UTF-8 to GTK. [#32032] - -2002-10-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (setup_local_storage): Set the is_stock flag to TRUE - for the summary folder. - - * e-shell-view.c (setup_verb_sensitivity_for_folder): Don't allow - folder operations on pseudo-folders that have a NULL physical_uri. - - * e-corba-storage.c (async_remove_folder): Make sure the folder - has a physical URI. [#30950] - -2002-10-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-shared-folder-picker-dialog.c - (setup_server_option_menu): Use - e_utf8_gtk_menu_item_new_with_label() to create the option menu - items from the storage's UTF-8 name. [#31564] - -2002-10-21 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component-utils.c - (e_get_activation_failure_msg): If the exception_id is NULL, - return NULL instead of crashing. [#25891] - -2002-10-17 Ettore Perazzoli <ettore@ximian.com> - - [Implement the Cancel button in the "Open other user's folder" - dialog, as per #27735.] - - * e-corba-storage.c (cancel_discover_shared_folder): New, - implementation for the cancel_discover_shared_folder virtual - method. - (class_init): Install. - - * evolution-test-component.c - (storage_discover_shared_folder_callback): Instead of passing the - listener to the timeout function, just pass the storage. Put the - listener and the timeout ID on the storage object by using - gtk_object_set_data(). - (shared_folder_discovery_timeout_callback): Updated accordingly. - (storage_cancel_discover_shared_folder_callback): New, callback - for the cancel_discover_shared_folder signal. - (setup_custom_storage): Connect. - - * e-shell-shared-folder-picker-dialog.c: New member storage in - struct DiscoveryData. While I am at it, rename member user to - user_email_address. - (discover_folder): Set the storage member. - (cleanup_discovery): Unref storage member. - (progress_dialog_clicked_callback): New, callback for the - "clicked" signal on the dialog. - (discover_folder): Connect. - - * evolution-storage.c (class_init): Install signal - "cancel_discover_shared_folder". - (impl_Storage_cancelDiscoverSharedFolder): New, implementation for - the cancelDiscoverSharedFolder CORBA method; emit - "cancel_discover_shared_folder". - (evolution_storage_get_epv): Install CORBA method implementation. - - * evolution-storage.h: Add signal cancel_discover_shared_folder. - - * e-storage.c (e_storage_cancel_discover_shared_folder): New. - - * e-storage.h: New virtual method cancel_discover_shared_folder. - - * Evolution-Storage.idl (cancelDiscoverSharedFolder): New. - -2002-10-07 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-importer.c (choose_importer_from_list): Change the - selection mode to GTK_SELECTION_BROWSE so there is always a - selection. The code here doesn't handle a NULL selection. - [#31690] - - * e-shell-importer.c (import_cb): Only delay half a second - (instead of 5 seconds) when getting EVOLUTION_IMPORTER_NOT_READY - or EVOLUTION_IMPORTER_BUSY. - - * importer/evolution-importer-listener.c - (impl_GNOME_Evolution_ImporterListener_notifyResult): Removed - debugging message. - -2002-10-04 Chris Toshok <toshok@ximian.com> - - * e-shell-folder-selection-dialog.c (delete_event_cb): new - function, emit cancelled so the folder selector button will - sensitize the parent window again. - (e_shell_folder_selection_dialog_construct): connect the - delete_event signal. - -2002-09-30 Aaron Weber <aaron@ximian.com> - - * importer/import.glade: Import Assistant vs. Importer assistant. - - * glade/evolution-startup-wizard.glade: setup/set up confusion in 15. - -2002-09-30 Dan Winship <danw@ximian.com> - - * e-shell-view-menu.c (command_remove_other_users_folder): Calls - e_shell_command_remove_shared_folder. - (file_verbs): Set up command_remove_other_users_folder. - - * e-shell-folder-commands.c - (e_shell_command_remove_shared_folder): New. Calls - e_storage_set_async_remove_shared_folder with a callback to pop up - an error dialog if it fails. - - * e-storage-set.c (e_storage_set_async_remove_shared_folder): - Implement. Mostly like async_remove_folder. - - * e-storage.c (e_storage_supports_shared_folders, - e_storage_async_discover_shared_folder, - e_storage_async_remove_shared_folder): New methods. Default - implementations return FALSE, NOTIMPLEMENTED, and NOTIMPLEMENTED. - - * e-corba-storage.c (supports_shared_folders, - async_discover_shared_folder, async_remove_shared_folder): - Implement using CORBA. - - * Evolution-Storage.idl: add Storage_asyncRemoveSharedFolder - - * e-shell-shared-folder-picker-dialog.c: Remove all the CORBA - stuff from here and use the new EStorage methods. - (setup_server_option_menu): Use e_storage_supports_shared_folders. - (discover_folder): Use e_storage_async_discover_shared_folder. - - * evolution-storage.c (impl_Storage_asyncRemoveSharedFolder): - Implement this by emitting a REMOVE_SHARED_FOLDER signal. - (impl_Storage_asyncDiscoverSharedFolder): Make the - DISCOVER_SHARED_FOLDER signal put the Bonobo_Listener first like - all the other signals do. - (class_init): Set up REMOVE_SHARED_FOLDER signal. - -2002-09-30 Dan Winship <danw@ximian.com> - - * evolution-folder-selector-button.c (clicked): If we return from - evolution_shell_client_user_select_folder to find that our parent - window has been destroyed, unref it and bail out, since that means - we've been destroyed (and probably finalized) too. #31360 - -2002-09-26 Ettore Perazzoli <ettore@ximian.com> - - * e-local-storage.c (load_folder): Always return TRUE, even in the - unknown-type case. - -2002-09-25 Rodrigo Moya <rodrigo@ximian.com> - - * e-shell-importer.c (importer_file_page_new): set history_id on - GnomeFileEntry, to actually get the history. - -2002-09-25 Dan Winship <danw@ximian.com> - - * e-shell-folder-selection-dialog.c (check_folder_type_valid): - If one of the allowed types is "type/*", allow anything starting - with "type/". - (impl_clicked): If the first allowed type is "type/*", pass "type" - to e_shell_show_folder_creation_dialog. - - * evolution-folder-selector-button.c - (evolution_folder_selector_button_set_uri): Handle "type/*" as an - allowed type. - - * e-shell-settings-dialog.c (e_shell_settings_dialog_show_type): - If there are no pages for the current folder type, try the parent - type (eg, "mail" for "mail/public"). - - * e-shell-config-autocompletion.c - (e_shell_config_autocompletion_create_widget): Use "contacts/*" as - the allowed folder type. - -2002-09-25 Ettore Perazzoli <ettore@ximian.com> - - [Finish fixing #11645.] - - * e-shell-folder-commands.c (xfer_result_callback): Don't update - the shortcuts here anymore since now the shell takes care of it. - - * e-shell.c (storage_set_moved_folder_callback): New callback for - EStorageSetView::folder_moved; update the shortcuts. - (e_shell_construct): Connect. - - * e-storage-set.c: Renamed StorageConverterCallbackData to - StorageCallbackData. New members destination_folder, - source_folder, operation in it. - (class_init): Install "moved_folder" signal. - (storage_callback_data_new): Renamed from - storage_converter_callback_data_new. - (storage_callback_data_free): New. - (storage_callback): Renamed from storage_callback_converter. Use - storage_callback_data_free(). - (e_storage_set_async_create_folder): Updated to use the - storage_callback and storage_callback_data_new(). - (e_storage_set_async_remove_folder): Likewise. - (e_storage_set_async_xfer_folder): Likewise. - - * e-storage-set.h: New signal "moved_folder". - -2002-09-24 Ettore Perazzoli <ettore@ximian.com> - - [Fix #11645 for menu-based folder move operations. Still requires - fixage for the DnD case.] - - * e-shell-view-menu.c (launch_pilot_settings): Placate compiler. - - * e-shell-folder-commands.c (xfer_result_callback): When - FOLDER_COMMAND_MOVE, update the shortcuts by using - e_shortcuts_update_shortcuts_for_changed_uri(). - - * e-shortcuts.c (e_shortcuts_update_shortcuts_for_changed_uri): - New. - -2002-09-24 Dan Winship <danw@ximian.com> - - * e-shell.c (folder_selection_dialog_folder_selected_cb): Don't - destroy the dialog. It does that itself whenever it emits - folder_selected. - - * e-shell-folder-selection-dialog.c (double_click_cb): Don't close - the dialog if the user double-clicks a bad folder. Just ignore it - (like we do when they click OK on a bad folder). - -2002-09-24 Ettore Perazzoli <ettore@ximian.com> - - [#14019] - - * e-shell-view-menu.c: Add PilotConduitSettings verb. - (command_pilot_conduit_settings): Implementation for the verb. - (launch_pilot_settings): Helper function. - -2002-09-24 Mike Kestner <mkestner@ximian.com> - - * e-storage-set-view.c (e_storage_set_enable_search): Use the new - e_tree_set_search_column function instead of my lameass sort hack. - -2002-09-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (e_shell_construct): Oops, no @shell argument to - e_shell_startup_wizard_create(). - -2002-09-23 Ettore Perazzoli <ettore@ximian.com> - - [#28317] - - * e-shell-view-menu.c (command_close): Use - e_shell_request_close_view(). - - * e-shell.c (e_shell_request_close_view): New, code moved out of - view_delete_event_cb(). - (view_delete_event_cb): Use it. - -2002-09-23 Ettore Perazzoli <ettore@ximian.com> - - [Fix #16556.] - - * e-shell.c (e_shell_construct): Pass self to - e_shell_startup_wizard_create. - - * e-shell-startup-wizard.c (e_shell_startup_wizard_create): Get a - shell argument. Set the shell interactive when doing the start-up - wizard thing. - - * e-shell.c (e_shell_set_interactive): New. - -2002-09-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-creation-dialog.c (get_type_from_parent_path): - Return "mail" instead of NULL when we don't have a parent folder. - [#28232] - -2002-09-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-about-box.c: Added some missing names. - - * main.c (main): Declare --force-upgrade correctly so it works. - -2002-09-20 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (class_init): Use PARENT_TYPE instead of - e_tree_get_type(). - -2002-09-20 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c: Removed member sort_idle_id in - EStorageSetViewPrivate. - (resort): Removed. - (sort_traverse_callback): Removed. - (sort_idle_callback): Removed. - (queue_resort): Removed. - (impl_destroy): Removed. - (folder_name_changed_cb): Sort now instead of queueing a resort. - -2002-09-19 Ettore Perazzoli <ettore@ximian.com> - - [Fix #28495 with a lame hack that works around Bonobo sizing - brokenness] - - * e-shell-settings-dialog.c (set_dialog_size): New. - (impl_realize): Override for GtkWidget::realize; invoke - set_dialog_size() to set a minimum size. - (class_init): Install. - -2002-09-19 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-creation-dialog.c (async_create_cb): Don't set - the current folder for E_STORAGE_EXISTS. [#30533] - -2002-09-19 Ettore Perazzoli <ettore@ximian.com> - - * evolution-storage.c (evolution_storage_update_folder): Do not - stop propagating the notification to the listeners if - ::notifyFolderUpdate() fails. [#27662 (?)] - -2002-09-19 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (resort): New. - (sort_idle_callback): Use it. - (insert_storages): Use resort() instead of queue_resort() so we - sort immediately. - -2002-09-18 Mike Kestner <mkestner@ximian.com> - - * e-storage-set-view.c (etree_value_at): bandaid for 30248. - -2002-09-18 Not Zed <NotZed@Ximian.com> - - * evolution-wizard.c (impl_GNOME_Evolution_Wizard_notifyAction): - Allow 'back' to run if we're on the finish page. For #29293. - -2002-09-17 Ettore Perazzoli <ettore@ximian.com> - - * e-storage.c (e_storage_result_to_string): Add description for - E_STORAGE_NOTONLINE. - - * e-corba-storage.c - (e_corba_storage_corba_result_to_storage_result): Support - GNOME_Evolution_Storage_NOT_ONLINE (E_STORAGE_NOTONLINE). - - * Evolution-Storage.idl: Add NOT_ONLINE to enum Result. - - * e-storage.h: Add E_STORAGE_NOTONLINE to EStorageResult enum. - -2002-09-17 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (sort_idle_callback): Remove unused - variable. - - * e-shell-view.c (shell_line_status_changed_cb): Make Send/Receive - insensitive when in offline mode. [#27855] - -2002-09-17 Ettore Perazzoli <ettore@ximian.com> - - [Fix #28451.] - - * e-storage-set-view.c: New member sort_idle_id in - EStorageSetViewPrivate. - (init): Init to zero. - (impl_destroy): Remove the idle source if not zero. - (queue_resort): New. - (sort_idle_callback): Idle function to sort. - (setup_folder_changed_callback): New. - (new_folder_cb): Call it on the new folder so we get the callback - for new folders too. - (popup_folder_menu): Ref the folder before popping up the menu, - unref it after popping it down [the folder might be unreffed in - gnome_popup_menu_do_popup_modal() because of a folder action]. - (new_storage_cb): Just queue_resort() instead of sorting. - (new_folder_cb): Likewise. - (insert_folders): Likewise. - (insert_storages): Likewise. - (folder_changed_cb): Queue a resort here too. - - * e-folder.c (class_init): Set up "name_changed" signal. - (e_folder_set_name): Emit "name_changed". - - * e-folder.h: New signal "name_changed". - -2002-09-17 Kjartan Maraas <kmaraas@gnome.org> - - * e-shell-settings-dialog.c (page_new): Invoke gettext on - strings coming from the .oaf files. - -2002-09-17 Ettore Perazzoli <ettore@ximian.com> - - * e-local-storage.c: Remove some leftover junk. - -2002-09-17 Kjartan Maraas <kmaraas@gnome.org> - - * e-folder-list.c (create_display_string): Mark a string for - translation. - - * evolution-folder-selection-button.c (set_folder): Same here. - -2002-09-17 Ettore Perazzoli <ettore@ximian.com> - - * e-storage.c (e_storage_removed_folder): When a highlighted - folder gets removed, update the parent to not have a highlight. - [#24062] - -2002-09-16 Ettore Perazzoli <ettore@ximian.com> - - * evolution-nognome.in: New script to run Evolution under a - non-GNOME session when using a non-default GNOME prefix and a - non-default Evolution prefix. - -2002-09-11 Ettore Perazzoli <ettore@ximian.com> - - * e-setup.c (setup_bonobo_conf_private_directory): g_free() not - free(), since we allocate with glib functions. [#19899] - -2002-09-05 Mike Kestner <mkestner@ximian.com> - - * Makefile.am : no longer distribute the etstate files. - * e-shell-folder-selection-dialog.c : enable_search on the view. - * e-storage-set-view.c : add search_enabled flag handling. - (e_storage_set_view_set_show_checkboxes): manipulate the existing state - instead of loading a state file from disk. - (e_storage_set_view_enable_search): new. set a column in the sort_info - on the etree to allow keystroke jumping in the etree. - -2002-09-05 Anna Marie Dirks <anna@ximian.com> - - * GNOME_Evolution_Shell.oaf.in : Changed the description - of the folders page in the settings dialog to be more specific. - -2002-09-04 Ettore Perazzoli <ettore@ximian.com> - - * Makefile.am (INCLUDES): Add a -DPREFIX. - - * main.c (main): New command-line option "force-upgrade". - (show_development_warning): Suggest 1.0.8, not 1.0.5. - (upgrade_from_1_0_if_needed): New. - (idle_cb): Call it. - -2002-09-04 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (new_folder_cb): Pass FALSE as @queue to - e_shell_view_display_uri() here. - -2002-09-04 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (e_shell_view_get_current_component_id): If the - current_folder_type is NULL, just return NULL instead of passing - it to e_folder_type_registry_get_handler_for_type() [and generate - a warning]. [#21122] - -2002-09-04 Dan Winship <danw@ximian.com> - - * glade/e-shell-shared-folder-picker-dialog.glade: Remove the - "blah blah" text for now and change "Server" to "Account". - -2002-09-04 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (create_view): Pass TRUE as @queue to - e_shell_view_display_uri(). - - * e-shell-view-menu.c (command_activate_view): Pass TRUE as @queue - to e_shell_view_display_uri(). - (goto_folder_dialog_folder_selected_cb): Likewise. - - * e-shell-shared-folder-picker-dialog.c - (shared_folder_discovery_listener_callback): Pass TRUE as @queue - to e_shell_view_display_uri(). - - * e-shell-view.c - (display_uri): New arg @queue. If true, it allows the - delayed_selection mechanism to happen transparently (returning - TRUE, while before it used to return FALSE). Otherwise, refuse to - queue the URI and return FALSE. - (e_shell_view_display_uri): New arg @queue; pass it to - display_uri(). - (handle_current_folder_removed): Pass TRUE as @queue to - e_shell_view_display_uri(). - (set_folder_timeout): Likewise. - (switch_on_folder_tree_click): Likewise. - (activate_shortcut_cb): Likewise. - (corba_interface_change_current_view_cb): Likewise. - (socket_destroy_cb): Likewise. - (socket_destroy_cb): Likewise. - (e_shell_view_load_settings): Here, try displaying the old URI - with @queue set to FALSE; if this fails, display the default URI - and then invoke display again using @queue = TRUE so it gets - queued up. This should fix #27721. - -2002-09-04 Ettore Perazzoli <ettore@ximian.com> - - * main.c (idle_cb): Pass FALSE as @restore_all_views to - e_shell_restore_from_settings() so we only restore the first view. - - * e-shell.c (e_shell_restore_from_settings): New arg - @restore_all_views. - -2002-09-04 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (popup_folder_menu): Remove the context - menu items using - evolution_shell_component_client_unpopulate_folder_context_menu() - instead of doing it ourself, since BonoboUI sucks. - - * evolution-shell-component-client.c - (evolution_shell_component_client_unpopulate_folder_context_menu): - New. - - * evolution-test-component.c (register_component): Pass NULL as - @unpopulate_folder_context_menu_fn to - evolution_shell_component_new(). - - * evolution-shell-component.c: New member - unpopulate_folder_context_menu_fn in - EvolutionShellComponentPrivate. New member uic in - EvolutionShellComponentPrivate. - (init): Init new members to NULL. - (destroy): bonobo_object_unref() priv->uic if not NULL. - (evolution_shell_component_new): New arg - @unpopulate_folder_context_menu_fn. - (evolution_shell_component_construct): Likewise. - (impl_populateFolderContextMenu): Set priv->uic to the newly - created UIComponent. - (impl_unpopulateFolderContextMenu): New, implementation for the - ::unpopulateFolderContextMenu CORBA method. - (class_init): Install. - - * Evolution-ShellComponent.idl (unpopulateFolderContextMenu): New - method. - (AlreadyPopulated): New exception. - (populateFolderContextMenu): Can raise it. - (NotPopulated): New exception. - -2002-09-03 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (popup_folder_menu): Create an Items - placeholder under ComponentPlaceholder, and then - bonobo_ui_component_rm() it after we are done with the menu. This - -should- fix #29782, but it doesn't. I am not sure why. - - * evolution-shell-component.h - (EVOLUTION_SHELL_COMPONENT_POPUP_PLACEHOLDER): Append a "/Items" - part. - -2002-09-03 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-importer.c (show_import_wizard): Make the WM close - button in the dialog hide instead of destroying, using - gnome_dialog_close_hides(). [#15572] - -2002-08-28 Dan Winship <danw@ximian.com> - - * e-shell.c (setup_components): Pass a selection_order to - oaf_query so we get the components back in a consistent order. - Hack fix for #28490 for 1.2 by ensuring that Connector gets - started before evolution-mail. - (get_icon_path_for_component_info): Rename the oaf icon name - property to use underscores to match the launch order property - (which needs to use underscores because dashes are interpreted as - subtraction in the selection_order context). - -2002-08-27 Ettore Perazzoli <ettore@ximian.com> - - * e-shortcuts-view.c (get_shortcut_info): Make sure - *custom_icon_name_return is at least set to NULL on return [it - used to leave it uninitialized if the URI was not prefixed with - E_SHELL_URI_PREFIX]. Also use e_shell_parse_uri() to parse the - URI so we handle the default shortcuts properly, too. - -2002-08-19 Dan Winship <danw@ximian.com> - - * e-shell-shared-folder-picker-dialog.c (show_dialog): Get the - "addresses" property of the select names control rather than - "text", so we get the email address too. #28953 - - * e-folder-type-registry.c - (e_folder_type_registry_type_registered, - e_folder_type_registry_unregister_type): Fix the names of these - functions. (They previously used "register" instead of - "registry".) - - * e-component-registry.c (register_type): Update for renaming - - * e-local-storage.c (load_folder): Likewise - -2002-08-16 Dan Winship <danw@ximian.com> - - * evolution-folder-selector-button.c - (evolution_folder_selector_button_set_uri): If the selected URI is - of an invalid type, don't accept it. - (evolution_folder_selector_button_get_folder): Returns the - selected folder. - (various): updates to support get_folder, and to simplify. - -2002-08-09 Dan Winship <danw@ximian.com> - - * e-shell-shared-folder-picker-dialog.c (create_progress_dialog): - Remove both timeouts when the dialog is destroyed, not just one of - them. - (shared_folder_discovery_listener_callback): Don't try to access - fields of discovery_data after destroying it. Interpret the result - argument correctly, and put up an error dialog (using - e_corba_storage_corba_result_to_storage_result and - e_storage_result_to_string) if something went wrong. - - * e-corba-storage.c - (e_corba_storage_corba_result_to_storage_result): convert a - GNOME_Evolution_Storage_Result to an EStorageResult. - (async_folder_cb): Use that. - -2002-08-06 Dan Winship <danw@ximian.com> - - * e-storage-set-view.c (folder_property_item_verb_callback): Don't - include the storage name in the path passed to - e_corba_storage_show_folder_properties, for consistency with the - other EStorage methods. - -2002-08-06 Ettore Perazzoli <ettore@ximian.com> - - * evolution-test-component.c - (storage_show_folder_properties_callback): New callback for the - show_folder_properties signal. - (setup_custom_storage): Add two property items, and connect the - callback to the signal. - - * e-storage-set-view.c: Renamed private member container into - ui_container; new member ui_component. - (init): Initialize ui_component to NULL. - (impl_destroy): Unref if not NULL. - (e_storage_set_view_construct): If @ui_container is not NULL, - weakref it and create a new ui_component that uses it as its - container. - (ui_container_destroy_notify): New, weakref destroy callback for - priv->ui_container. - (remove_property_items): New helper function. - (setup_folder_properties_items_if_corba_storage_clicked): New - helper function. - (folder_property_item_verb_callback): New callback for the verbs - associated to the folder property items. - (popup_folder_menu): Set up the per-storage folder property items - using setup_folder_properties_items_if_corba_storage_clicked() and - remove them with remove_property_items() after the menu has been - popped down. Don't invoke populate_folder_context_menu if there - is no handler for this node [this avoids a spurious warning]. - - * e-corba-storage.c (e_corba_storage_show_folder_properties): New. - (e_corba_storage_get_folder_property_items): New. - (e_corba_storage_free_property_items_list): New. - - * evolution-storage.c: New private member folder_property_items. - (init): Init to NULL. - (destroy): Free. - (impl_showFolderProperties): New, implementation for the - Storage::showFolderProperties CORBA method. - (class_init): Set up the "show_folder_properties" signal here. - (impl_Storage__get_propertyItems): New, getter for the - Storage::propertyItems property. - (corba_class_init): Install the new methods. - (evolution_storage_add_property_item): New function to add - property items to the storage. - - * evolution-storage.h: New signal show_folder_properties. - - * e-storage-set.c (e_storage_set_create_new_view): Renamed from - e_storage_set_new_view(). - - * Evolution-Storage.idl: Added attribute folderPropertyItems and - method ::showFolderProperties. - -2002-08-01 Ettore Perazzoli <ettore@ximian.com> - - * e-gray-bar.c (endarken_style): Set the color for - GTK_STATE_INSENSITIVE too so it doesn't look ugly when we quit. - -2002-07-31 Ettore Perazzoli <ettore@ximian.com> - - * e-shortcuts-view.c (create_default_shortcuts_cb): New, implement - a right-click -> "Add Default Shortcuts" menu item. - (rename_group_cb): Remove double casts. *lol* - - * e-shortcuts.c (e_shortcuts_add_default_shortcuts): New. - (e_shortcuts_add_default_group): Use - e_shortcuts_add_default_shortcuts(). - -2002-07-31 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-user-creatable-items-handler.c (ensure_menu_items): - Don't sort the menu_items here. - (create_menu_xml): Instead, sort here, and only sort the - non-default section of the menu. - (get_default_action_for_view): Just get the first item that is - default; since we don't sort anymore, this works. - (find_menu_item_for_verb): Removed since it is not used anymore. - -2002-07-31 Ettore Perazzoli <ettore@ximian.com> - - * evolution-test-component.c (register_component): Pass NULL for - @folder_type to - evolution_shell_component_add_user_creatable_item(). - - * e-shell-user-creatable-items-handler.c: New member folder_type - in struct MenuItem. - (ensure_menu_items): Initialize ->folder_type. - (item_is_default): New helper function. - (create_menu_xml): New arg @folder_type. Put the items on the top - using item_is_default(). - (shell_view_view_changed_callback): Pass the folder type to - create_menu_xml(). - - * evolution-shell-component.c: New member folder_type in - UserCreatableItemType. - (user_creatable_item_type_new): New arg @folder_type. - (user_creatable_item_type_free): Free ->folder_type. - (evolution_shell_component_add_user_creatable_item): New arg - @folder_type. - (impl__get_userCreatableItemTypes): Set ->folderType in the - returned CORBA structs. - - * Evolution-ShellComponent.idl: New member folderType in struct - UserCreatableItemType. - - * e-shell-user-creatable-items-handler.c: New member component_id - in struct MenuItem. Removed member menu_xml from - EShellUserCreatableItemsHandlerPrivate. - (init): No need to initialize menu_xml here anymore. - (impl_destroy): ...And no need to free here, either. - (setup_menu_xml): New, derived from ensure_menu_xml(). This - orders the menu so that the items for the current component go at - the top. - (create_menu_xml): Removed. - (e_shell_user_creatable_items_handler_attach_menus): Set up - properly for the current component ID, using setup_menu_xml(). - -2002-07-29 Jeffrey Stedfast <fejj@ximian.com> - - * evolution-folder-selector-button.c - (evolution_folder_selector_button_set_uri): New function to set - the uri programatically on a EvolutionFolderSelectorButton dingus. - -2002-07-26 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c (command_new_shortcut): Capitalize the title - of the dialog for consistency. - - * e-shell-folder-creation-dialog.c (setup_dialog): Don't prepend - the window's title with "Evolution -" since we don't do that - anywhere else. Also capitalize properly. - -2002-07-26 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-user-creatable-items-handler.c (ensure_menu_xml): Put in - the ComponentItems placeholder, instead of NewItems. - -2002-07-26 Ettore Perazzoli <ettore@ximian.com> - - * e-local-storage.c (load_all_folders): Don't return FALSE if any - of the folders fails to load; otherwise, if the user has played - with ~/evolution, he might end up not seeing any folders at all. - -2002-07-24 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c (command_work_online): Remove debugging - message. - (command_work_offline): Likewise. - -2002-07-18 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-selection-dialog.c (double_click_cb): Renamed - from `dbl_click_cb'. - (check_folder_type): Don't pop up an error dialog anymore. - (check_folder_type_valid): Renamed from check_folder_type(). - (folder_selected_cb): Make the OK button sensitive only if the - type of the selected folder is in the list of valid types; - otherwise, make it insensitive. [#848] - -2002-07-18 Rodrigo Moya <rodrigo@ximian.com> - - * e-shell-importer.c (start_import): removed check for local folders, - so that we can import into non-local ones. - -2002-07-18 Ettore Perazzoli <ettore@ximian.com> - - * evolution-storage-set-view.c - (impl_StorageSetView__set_checkedFolders): Removed unused - variable. - - * e-shell-folder-title-bar.c (e_shell_folder_title_bar_construct): - Removed unused variable. - - Mass-replaced G_DIR_SEPARATOR and G_DIR_SEPARATOR_S with - E_PATH_SEPARATOR and E_PATH_SEPARATOR_S: - - * e-storage.c - (e_storage_path_is_absolute) - (e_storage_path_is_relative) - (e_storage_async_xfer_folder) - * e-storage-set.c - (make_full_path) - (get_storage_for_path) - (signal_new_folder_for_all_folders_under_paths) - (signal_new_folder_for_all_folders_in_storage) - (e_storage_set_get_path_for_physical_uri) - * e-storage-set-view.c - (storage_sort_callback) - (new_storage_cb) - (removed_storage_cb) - (new_folder_cb) - * e-shortcuts-view.c - (get_shortcut_info) - * e-shell-view.c - (handle_current_folder_removed) - * e-shell-utils.c - (e_shell_folder_name_is_valid) - * e-local-storage.c - (construct) - * e-folder-tree.c - (get_parent_path) - (get_parent_path) - (e_folder_tree_destroy) - (e_folder_tree_add) - (e_folder_tree_foreach) - * e-folder-dnd-bridge.c - (handle_data_received_path) - * evolution-storage.c - (make_full_uri) - - * e-shell-constants.h: New #defines E_PATH_SEPARATOR and - E_PATH_SEPARATOR_S. - - * e-local-storage.c (load_folder): Don't add the folder if its - type isn't registered. - -2002-07-17 Ettore Perazzoli <ettore@ximian.com> - - * e-shortcuts-view-model.c (get_icon_for_item): Get the - EStorageSet from the shortcut's shell since there is no - e_shortcuts_get_storage_set() anymore. - * e-shortcuts-view.c (get_shortcut_info): Likewise. - (impl_shortcut_drag_motion): Likewise. - (impl_shortcut_drag_data_received): Likewise. - - * e-shell.c (e_shell_construct): e_shortcuts_new_from_file(), not - e_shortcuts_new() here. - - * e-shortcuts.c: Removed members storage_set and - folder_type_registy in EShortcutsPrivate. New member shell. - (init): Init to NULL. - (e_shortcuts_construct): Removed arg @storage_set and - @folder_type_registry, new arg @shell. - (e_shortcuts_new): Removed. - (e_shortcuts_new_from_file): New. - (impl_destroy): Renamed from destroy(). - (e_shortcuts_get_storage_set): Removed. - (e_shortcuts_get_shell): New. - (load_shortcuts): Accept any URI that can be parsed (by - e_shell_parse_uri). - - * e-shell.c (e_shell_parse_uri): New. - - * e-shell-view.c (evolution_uri_for_default_uri): New. - (display_uri): Use it to determine the evolution: uri given a - default: uri. - - * e-shell.c (impl_Shell_handleURI): Pass it over to - e_shell_create_view_from_uri_and_settings() even if it's an - E_SHELL_DEFAULTURI_PREFIX. - (handle_default_uri): Removed. - -2002-07-12 Peter Williams <peterw@ximian.com> - - * Makefile.am (INCLUDES): Add -I$(builddir)/libical/src/libical - for the generated ical.h (some headers rely on this because - they too get installed.) - -2002-07-14 Rodrigo Moya <rodrigo@ximian.com> - - * evolution-storage.c (impl_Storage_getFolderAtPath): no need to - convert the value returned by e_folder_tree_get_folder to a - GNOME_Evolution_Folder, since it already is, and duplicate it before - returning. - -2002-07-14 Chris Toshok <toshok@ximian.com> - - * e-shell.c (folder_selection_dialog_folder_selected_cb): set - corba_folder.customIconName so we don't crash. - (impl_Shell_selectUserFolder): remove the default_type parameter - to fix a compiler warning. - -2002-07-12 Dan Winship <danw@ximian.com> - - * evolution-storage.c (impl_Storage_asyncDiscoverSharedFolder): - dup the listener, for consistency with the other signals - -2002-07-12 Ettore Perazzoli <ettore@ximian.com> - - * evolution-folder-selector-button.c (clicked): Ref the - parent_window and then unref after you are done using it. - [#27673] - -2002-07-12 Peter Williams <peterw@ximian.com> - - * Makefile.am (eshellinclude_HEADERS): Install some headers - that weren't getting installed. - -2002-07-11 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-title-bar.c (e_shell_folder_title_bar_set_icon): - Allow a NULL icon [remove the precondition]. - - * e-shell-view.c (update_folder_title_bar): Only unref the - folder_icon if not NULL. - -2002-07-11 Ettore Perazzoli <ettore@ximian.com> - - * evolution-storage-set-view.c - (impl_StorageSetView__set_checkedFolders): Handle - Folder.evolutionUri as a URI, not as a path. Also use - e_free_string_list(). - -2002-07-11 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (update_folder_title_bar): Ref the folder_icon - that we get from e_folder_type_registry_get_icon_for_type(). - -2002-07-11 Ettore Perazzoli <ettore@ximian.com> - - * evolution-storage.c (get_folder_list_foreach): Copy - customIconName and sortingPriority in the new_corba_folder. - [#27670] - -2002-07-11 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-title-bar.c: Remove some `#if 0'ed broken code. - New members title_icon and title_button_icon in struct - EShellFolderTitleBarPrivate. Remove member icon_widget. New - static global variable empty_pixbuf. - (init): Initialize these new members to NULL. Don't initialize - icon_widget anymore since it's gone. - (e_shell_folder_title_bar_construct): Create the title_button_icon - and pack it into the title_button_hbox. Also, create the - title_icon and pack that one as well. Retouched some of the - hardcoded padding values. - (size_allocate_icon): Rewritten to use the title_icon and return - the allocated space like size_allocate_navigation_buttons. - (e_shell_folder_title_bar_set_icon): Remove bogus const from the - @icon arg. Ref the pixbuf, and update the two pixmap widgets from - it. If @icon is NULL, use the empty_pixbuf. - (impl_destroy): Renamed from destroy(). - (realize): Removed. - (unrealize): Removed. - (impl_size_allocate): Renamed from size_allocate(). - (class_init): Call it. - (add_icon_widget): Removed. - (new_empty_pixbuf): New. - (new_empty_pixmap_widget): New. - (size_allocate_navigation_buttons_and_title_icon): Renamed from - size_allocate_navigation_buttons; set up the title_icon too. - - * e-shell-view.c (update_folder_title_bar): Unref the folder_icon - after using it. - - * e-icon-factory.c (e_icon_factory_get_icon): Ref the returned pixbuf. - -2002-07-10 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (update_folder_title_bar): Get a @folder arg - instead of a @type arg. Use the custom icon if the folder has - one. - (update_for_current_uri): Updated accordingly. - -2002-07-10 Ettore Perazzoli <ettore@ximian.com> - - * evolution-test-component.c (setup_custom_storage): Pass - @sorting_priority to evolution_storage_new_folder() so we test it. - Also make /FirstFolder have an "inbox" custom icon. - - * e-local-storage.c (new_folder): Pass zero as @sorting_priority - to evolution_storage_new_folder(). - - * evolution-storage.c (evolution_storage_new_folder): New arg - @sorting_priority; put it in the CORBA folder struct. - - * evolution-shell-client.c - (impl_FolderSelectionListener_selected): Copy the sortingPriority - as well. - - * e-folder.c (e_folder_to_corba): Set sortingPriority. - - * e-corba-storage-registry.c - (impl_StorageRegistry_getFolderByUri): Set sortingPriority in the - new CORBA Folder struct. - - * e-corba-storage.c (impl_StorageListener_notifyFolderCreated): - Set the custom_icon if folder->customIconName is not an empty - string. Likewise, set the sorting_priority - - * Evolution-common.idl: New member sortingPriority in struct - Folder. - - * e-storage-set-view.c (folder_sort_callback): Sort according to - the sorting_priorities. - - * e-folder.c: New member sorting_priority in EFolderPrivate. - (init): Init to zero. - (e_folder_set_custom_icon): Emit "changed" if required. - (e_folder_set_sorting_priority): New. - -2002-07-09 Ettore Perazzoli <ettore@ximian.com> - - * e-icon-factory.c (load_icon): Ooops. Swapped the large/small - pixbufs here. Also, plug a leak. - -2002-07-09 Ettore Perazzoli <ettore@ximian.com> - - * evolution-test-component.c (setup_custom_storage): Pass NULL for - @custom_icon_name to evolution_storage_new_folder(). - - * e-local-storage.c (new_folder): Pass the custom_icon_name here - to evolution_storage_new_folder(). - - * evolution-shell-client.c - (impl_FolderSelectionListener_selected): Set customIconName here - too. - - * e-folder.c (e_folder_to_corba): Set customIconName too. - - * e-corba-storage-registry.c - (impl_StorageRegistry_getFolderByUri): Set customIconName. Also, - use e_safe_corba_string() to clean up the code a bit. - - * evolution-storage.c (evolution_storage_new_folder): New arg - @custom_icon_name. - - * Evolution-common.idl: New member customIconName in struct - Folder. - -2002-07-09 Ettore Perazzoli <ettore@ximian.com> - - * e-shortcuts-view-model.c (get_icon_for_item): If the - custom_icon_name is not NULL, return the pixbuf for it. - - * e-storage-set-view.c: #include "e-icon-factory.h". - - * e-shortcuts-view.c (impl_shortcut_dropped): Pass the - custom_icon_name. - (get_shortcut_info): New arg @custom_icon_name_return. - (rename_shortcut_cb): Pass the custom_icon_name here. - - * e-shell-view-menu.c (new_shortcut_dialog_folder_selected_cb): - Pass the custom_icon_name for the folder's shortcut. - - * e-shell-folder-commands.c (e_shell_command_add_to_shortcut_bar): - Pass the custom_icon_name for the folder's shortcut. - - * e-corba-shortcuts.c (impl_add): Use the customIconName member in - struct ::Shortcuts::Shortcut. - (shorcut_list_to_corba): Set the customIconName member on the - returned shortcuts. - (impl_get): Likewise. - - * Evolution-Shortcuts.idl: New member customIconName in struct - Shortcut. - - * e-shortcuts.c (shortcut_item_new): New arg @custom_icon_name; - initialize the member in EShortcutItem from it. - (shortcut_item_update): New arg @custom_icon_name; set the - custom_icon_name from it. Also remove some braindeadness from - this code. - (update_shortcut_and_emit_signal): New arg @custom_icon_name. - (load_shortcuts): Load the custom icon name from the XML - [eg. <item name="foo" type="mail" icon="inbox">]. - (save_shortcuts): Save the custom icon name in the XML. - (e_shortcuts_add_shortcut): New arg @custom_icon_name. - (update_shortcuts_by_path): Pass the custom_icon_name to - update_shortcut_and_emit_signal(). - (e_shortcuts_update_shortcut): New arg @custom_icon_name; pass it - to update_shortcut_and_emit_signal(). - (e_shortcuts_add_default_group): Pass "inbox" as the - custom_icon_name for the inbox shortcut, and NULL for the other - shortcuts. - - * e-shortcuts.h: New member custom_icon_name in EShortcutItem. - -2002-07-09 Ettore Perazzoli <ettore@ximian.com> - - * e-shortcuts-view.c (impl_shortcut_drag_motion): Remove debugging - message. - (impl_shortcut_drag_motion): Likewise. - - * e-local-storage.c (remove_folder_step): Remove debugging message. - - * e-folder-dnd-bridge.c (e_folder_dnd_bridge_data_received): - Remove debugging message. - -2002-07-09 Ettore Perazzoli <ettore@ximian.com> - - * main.c (main): Call e_icon_factory_init(). - - * e-local-storage.c (setup_folder_as_stock): New arg @icon_name; - if not NULL, set up a custom icon for the folder. - (setup_stock_folders): Set up custom icons for inbox and outbox. - - * e-storage-set-view.c (get_pixbuf_for_folder): If the folder has - a custom icon, return the custom icon. - - * e-folder.c: New member custom_icon_name. - (init): Initialize to NULL. - (destroy): Free. - (e_folder_get_custom_icon): New. - (e_folder_set_custom_icon): New. - - * e-icon-cache.c: New. - * e-icon-cache.h: New. - -2002-07-09 Ettore Perazzoli <ettore@ximian.com> - - * e-local-storage.c (remove_folder): Remove unused variable. - -2002-07-08 Ettore Perazzoli <ettore@ximian.com> - - * e-shortcuts-view.c (toggle_large_icons_cb): Change the group - icon size using e_shortcuts_set_group_uses_small_icons() instead - of changing it on the widget directly. - (toggle_small_icons_cb): Likewise. - (group_change_icon_size_callback): New, callback for the - "group_change_icon_size" signal on the EShortcuts object. - (e_shortcuts_view_construct): Connect. Also, initialize the icon - sizes in the icon bars from the EShortcuts object. - - * e-shell-view.c (e_shell_view_load_settings): Don't set the - shortcut group icon modes here anymore. - - * e-shortcuts.c: New member use_small_icons in struct - ShortcutGroup. - (shortcut_group_new): Init to FALSE. - (e_shortcuts_set_group_uses_small_icons): New. - (e_shortcuts_get_group_uses_small_icons): New. - (class_init): Install "group_change_icon_size" signal. - (save_shortcuts): Save the icon size per-group - here, i.e. <group title="foo" icon_size="small">. - (load_shortcuts): Set the icon size from the group's definition - here. - - * e-shortcuts.h: New signal "group_change_icon_size" in - EShortcutsClass. - -2002-07-08 Ettore Perazzoli <ettore@ximian.com> - - * e-folder.c (safe_corba_string_dup): New helper function. - (e_folder_to_corba): Use it here. - - * Makefile.am (libeshell_la_SOURCES): Move e-folder.c here, from - evolution_SOURCES. - (eshellinclude_HEADERS): Likewise, move e-folder.h here. - - * evolution-storage.c (impl_Storage_getFolderAtPath): New, - implementation for Evoluiton::Storage::getFolderAtPath. - (evolution_storage_get_epv): Install CORBA method here. - - * Evolution-Storage.idl (getFolderAtPath): New method in - Evolution::Storage. - -2002-07-05 Ettore Perazzoli <ettore@ximian.com> - - [Fix #22047, Crash after running the start-up wizard. The patch - was applied a while ago to the evolution-1-0-branch but not on - the trunk.] - - * e-shell-startup-wizard.c (startup_wizard_cancel): Unref the - ETimezoneDialog. - (finish_func): Likewise. - -2002-07-03 Ettore Perazzoli <ettore@ximian.com> - - [Fixes #27354.] - - * e-storage-set-view.c (impl_tree_drag_drop): Invoke - e_folder_dnd_bridge_drop(). - - * e-folder-dnd-bridge.c (find_matching_target_for_drag_context): - New arg @atom_return. Return the GdkAtom associated with the type - through it. - (e_folder_dnd_bridge_drop): New. - -2002-07-02 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (e_shell_show_settings): Don't set up the settings - dialog as a transient. [#25776] - -2002-07-02 Ettore Perazzoli <ettore@ximian.com> - - * e-local-storage.c (bonobo_interface_remove_folder_cb): Add - parameter @listener to match the signal's signature. [#24413] - -2002-07-02 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-user-creatable-items-handler.c: New member tooltip in - struct MenuItem. - (ensure_menu_items): Initialize the tooltip member. - (shell_view_view_changed_callback): Set the tooltip for the "New" - button. - (ensure_menu_xml): Set up the tooltip here as well. - - * evolution-shell-component.c: Add tooltip member to struct - UserCreatableItemType. - (user_creatable_item_type_new): New arg @tooltip. - (evolution_shell_component_add_user_creatable_item): New arg - @tooltip. - (impl__get_userCreatableItemTypes): Put the tooltip in the struct - as well. - - * e-shell-user-creatable-items-handler.c (setup_toolbar_button): - Create a GtkTooltips object and attach it to the combo_button - using gtk_object_set_data(). - (shell_view_view_changed_callback): Set up a tooltip for the - button, according to the default. - - * Evolution-ShellComponent.idl: Add a tooltip member to struct - UserCreatableItemType. - -2002-07-01 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (e_shell_prepare_for_quit): Remove debugging message. - - * e-shell-view.c (setup_verb_sensitivity_for_folder): Set - sensitivity of /commands/AddFolderToShortcutBar, - /commands/OpenFolder and /commands/OpenFolderInNewWindow too, - depending on whether the node that was right-clicked can be opened - as a folder. - - * e-storage-set-view.c (popup_folder_menu): Pop up the right-click - menu even if we are not clicking on a folder with a proper - handler. - -2002-07-01 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c: New member preparing_to_quit in EShellPrivate. - (init): Initialize to FALSE. - (e_shell_prepare_for_quit): Set preparing_to_quit to TRUE on - entering, and set it to FALSE on return. - (view_delete_event_cb): Don't call e_shell_prepare_for_quit() if - preparing_for_quit is TRUE. - -2002-06-28 Ettore Perazzoli <ettore@ximian.com> - - * evolution-storage.c (impl_Storage_updateFolder): Don't stop - notifying the listeners if ::notifyFolderUpdated() fails. Should - fix #25598. - -2002-06-28 Ettore Perazzoli <ettore@ximian.com> - - [Fix #10681, Incorrect behavior when deleting a hierarchy of local - folders.] - - * e-local-storage.c: Change the ASyncRemoveFolderCallbackData - struct to have only storage and next_paths_to_delete members. - (remove_folder_step): New. - (component_async_remove_folder_callback): Start deletion for the - next path in next_paths_to_delete, so we handle recursion - properly. - (create_subfolder_list): New. - (remove_folder): Create the list with create_subfolder_list, - initialize the ASyncRemoveFolderCallbackData with the - next_paths_to_delete list and do the first deletion. This way we - handle recursion properly. - -2002-06-26 Iain <iain@ximian.com> - - * e-shell-importer.c (show_import_wizard): Only let the dialog be - opened once. - -2002-06-26 Iain <iain@ximian.com> - - * Evolution-StorageSetView.idl: Add a notifyFolderToggled method, - allow checkedFolders to be writable. - - * e-shell-importer.c (free_iid_list): Free the list of iid infos. - (get_name_from_component_info): Move this function from futher down - the file to here because it's useful. - (choose_importer_from_list): Present the user with a list of importer - names to select the one they want to use. - (get_iid_for_filetype): Store the name of the importer as well as the - iid in the list. If there are multiple matches, show the user a list. - - * evolution-storage-set-view-listener.[ch]: Add a folder toggled signal. - (impl_GNOME_Evolution_StorageSetViewListener_notifyFolderToggled): - Notify listeners that a folder has been toggled. - (corba_class_init): Hook up the new method. - (class_init): Create the new signal. - - * evolution-storage-set-view.c - (storage_set_view_widget_folder_toggled_cb): Call the CORBA method for - each listener. - (impl_StorageSetView__set_checkedFolders): Set the checked folders - from the list. - (impl_StorageSetView__get_checkedFolders): Don't include blanks in the - list. - -2002-06-24 Ettore Perazzoli <ettore@ximian.com> - - * e-local-storage.c (remove_folder): Removed arg @physical_uri. - - * e-shell-folder-selection-dialog.c (impl_clicked): Pass - default_type to e_shell_show_folder_creation_dialog() properly. - [Patch by Christian Kreibich <christian@whoop.org>.] - -2002-06-19 Kjartan Maraas <kmaraas@gnome.org> - - * e-corba-config-page.h: Remove #include <config.h> - * e-shell-about-box.h: Same - * e-history.h: Same - * e-shell-importer.c: gtk_widget_show() all items in the optionmenu - before showing it. - * e-shell-offline-handler.h: Remove #include <config.h> - * e-shell-settings-dialog.h: Same. - -2002-05-31 Ettore Perazzoli <ettore@ximian.com> - - * evolution-storage-set-view.c - (impl_StorageSetView__get_checkedFolders): Set release for the - CORBA path sequence to TRUE. - - * evolution-shell-component.c - (fill_corba_sequence_from_null_terminated_string_array): Set - release for the CORBA sequence to TRUE so it gets freed properly. - (impl__get_externalUriSchemas): Likewise for the returned - uri_chema_list. - - * e-shell-offline-handler.c (duplicate_connection_list): Set - release for the connection sequence to TRUE. - - * e-shell-config-offline.c (config_control_apply_callback): Set - release for the path sequence to TRUE. - - * e-corba-storage-registry.c - (impl_StorageRegistry_getStorageList): Set release for the storage - sequence to TRUE. - - * evolution-storage.c (impl_Storage__get_folderList): Set release - for the folder sequence to TRUE. - -2002-05-30 Ettore Perazzoli <ettore@ximian.com> - - [This fixes #25361.] - - * e-folder-list.c (e_folder_list_construct): Use - bonobo_object_ref() instead of bonobo_object_client_ref() as the - former only refs the CORBA object [Sigh]. - - * e-shell-config-autocompletion.c - (e_shell_config_autocompletion_create_widget): Don't unref the - shell_client here, as we need it. :-) - -2002-05-30 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c (command_about_box): Connect - about_box_event_callback() to the "key_press_event" signal as - well. This way the about box is closed when you press a key too. - [#25349] - -2002-05-28 Chris Toshok <toshok@ximian.com> - - * e-folder-list.c (e_folder_list_set_items): skip folders that - aren't valid uri's. - (e_folder_list_get_items): didn't update this to track the change - in model columns. bad toshok. - -2002-05-24 Chris Toshok <toshok@ximian.com> - - [ fixes 90% of #25047 ] - * e-folder-list.c (get_folder_for_uri): shamelessly lifted from - evolution-folder-selector-button.c. - (create_display_string): modeled again after - evolution-folder-selector-button.c, so we can give a little more - context (and make the table look like the folder selector - buttons.) - (SPEC): add a pixbuf column, also remove the sorting behavior. - (columns): add a pixbuf column and another string column (for the - display string). - (add_clicked): create the display string and get the proper - pixbuf, and insert both. - (edit_clicked): removed. - (update_buttons): remove edit button handling from here. - (e_folder_list_init): remove the hooking up of button-edit's - "clicked" signal. - (e_folder_list_construct): get a reference to the storage registry - so we can look up folders. - (e_folder_list_set_items): analogous change to add_clicked - get - the display string and pixbuf and insert them. - - * glade/e-folder-list.glade: remove the edit button. - - * glade/e-shell-config-default-folders.glade: remove the - frame/vbox, since we embed it in a notebook and the tab has the - title already. - - * e-shell-config.c (config_control_factory_cb): the only config - control we deal with here now is the folder settings control. - - * e-shell-config-default-folders.c - (e_shell_config_default_folders_create_widget): rename - e_shell_config_default_folders_create_control to this, return the - widget, and take the config control to use as an arg. - - * e-shell-config-offline.c (e_shell_config_offline_create_widget): - make an analogous change here as with - default_folders_create_widget. - - * e-shell-config-default-folders.h - (e_shell_config_default_folders_create_widget): track change to - prototype. - - * e-shell-config-offline.h (e_shell_config_offline_create_widget): same. - - * GNOME_Evolution_Shell.oaf.in: remove the DefaultFolders and - OfflineFolders controls and add a FolderSettings_Control. - - * Makefile.am (evolution_SOURCES): add - e-shell-config-folder-settings.[ch] and - e-shell-config-autocompletion.[ch]. - - * e-shell-config-folder-settings.[ch]: new files, embed (after a - fashion) the default folder, offline, and autocompletion UI's in a - notebook. - - * e-shell-config-autocompletion.[ch]: Basically copy over and - shell-ize the addressbook autocompletion config control so it can - be embedded more easily with the other folder settings. - -2002-05-23 Ettore Perazzoli <ettore@ximian.com> - - * main.c (quit_box_new): Set @allow_shrink and @allow_grow to - FALSE for the window. Fixes #17534. - -2002-05-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-selection-dialog.c - (e_shell_folder_selection_dialog_construct): Pass FALSE for - @allow_shrink. Fixes #15688. - -2002-05-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-commands.c (delete_dialog): Make a little bit - prettier. Default to "Delete", not "Cancel". - -2002-05-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shortcuts-view.c (rename_group_cb): Set the view type from the - original group, thus preserving the small-icon/large-icon state. - Fixes #6732. - -2002-05-23 Ettore Perazzoli <ettore@ximian.com> - - * main.c (show_development_warning): Add a toggle to avoid - displaying the dialog again. Don't display the dialog at all if - the /Shell/skip_warning_dialog_1_1 bonobo-conf key is set to - FALSE. - (warning_dialog_clicked_callback): Set - /Shell/skip_warning_dialog_1_1 according to the state of the check - button. - -2002-05-22 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (impl_Shell_selectUserFolder): No more @default_type - arg to e_shell_folder_selection_dialog_new(). - - * e-shell-view-menu.c (command_goto_folder): No more @default_type - arg to e_shell_folder_selection_dialog_new(). - (command_new_shortcut): Likewise. - - * e-shell-importer.c (import_druid_finish): No more @default_type - arg to e_shell_folder_selection_dialog_new(). - - * e-shell-folder-commands.c (e_shell_command_move_folder): No more - @default_type arg to e_shell_folder_selection_dialog_new(). - (e_shell_command_copy_folder): Likewise. - - * e-shell-folder-selection-dialog.c: Removed default_type member - in EShellFolderSelectionDialogPrivate. - (e_shell_folder_selection_dialog_new): Removed @default_type arg. - (e_shell_folder_selection_dialog_construct): Likewise. - (impl_clicked): Just pass the first of the allowed types to - e_shell_show_folder_creation_dialog() for the default type. - - * evolution-shell-client.c (user_select_folder): No more - @default_type arg to the ::userSelectFolder CORBA method. - - * Evolution-Shell.idl (selectUserFolder): Remove arg - @default_type. - -2002-05-22 Ettore Perazzoli <ettore@ximian.com> - - * main.c (view_map_callback): New callback for when the first - created view in the shell gets mapped. - (new_view_created_callback): New callback for when the first view - of the shell gets created. - (show_development_warning): New function to display a warning - about the fact that Evolution is unstable. - (idle_cb): Call show_development_warning() here unless the - EVOLVE_ME_HARDER environment variable is set. - - * e-shell.c (class_init): Add the "new_view_created" signal here. - (create_view): Emit the signal here. - - * e-shell.h: New signal "new_view_created". - -2002-05-22 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-user-creatable-items-handler.c: New member - default_menu_item in EShellUserCreatableItemsHandlerPrivate. - (ensure_menu_items): Set ->default_menu_item. - (get_default_action_for_view): When no default item is specified, - just return ->default_menu_item. - -2002-05-22 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (e_shell_prepare_for_quit): Only refuse quitting if - the result is CANCEL. This way we allow quitting if one of the - components has crashed or something else otherwise goes wrong. - Fixes #25093. - - * evolution-shell-component-client.c - (result_from_async_corba_result): Handle - GNOME_Evolution_ShellComponentListener_CANCEL. - -2002-05-21 Christopher James Lahey <clahey@ximian.com> - - * e-corba-storage.c (async_open_folder_idle): Do async_open_folder - in an idle callback. - - * e-shell-shared-folder-picker-dialog.c (user_clicked), - glade/e-shell-shared-folder-picker-dialog.glade: Added a select - names button here. - -2002-05-20 Chris Toshok <toshok@ximian.com> - - * evolution-folder-selector-button.c (clicked): set the parent - window insensitive before popping up the dialog and sensitive - after it's popped down, to give us semi-modal behavior. Also, - emit a "popped_up" signal when popping up the dialog, and emit - "canceled" when the return folder is NULL (when the user canceled - the dialog). - (class_init): fix typo (?) - parent type isn't - bonobo_object_get_type(), it's PARENT_TYPE. Also, initialize the - POPPED_UP and CANCELED signals. - - * evolution-folder-selector-button.h (struct - _EvolutionFolderSelectorButtonClass): add popped_up and canceled - signals. - -2002-05-20 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-offline-sync.c (sync_folder): Skip the folder if it - doesn't have the can_sync_offline property set. - -2002-05-20 Ettore Perazzoli <ettore@ximian.com> - - * e-corba-storage.c (impl_StorageListener_notifyFolderCreated): - Set the can_sync_offline property on the EFolder based on the - canSyncOffline value on the CORBA folder. - - * evolution-test-component.c (setup_custom_storage): Pass FALSE - for @sync_offline to evolution_storage_new_folder(). - - * e-local-storage.c (new_folder): Pass FALSE for @sync_offline to - evolution_storage_new_folder(). - - * evolution-storage.h (evolution_storage_new_folder): New arg - @can_sync_offline. - -2002-05-20 Ettore Perazzoli <ettore@ximian.com> - - * Evolution-Offline.idl (syncFolder): Remove exception. - (cancelSyncFolder): Remove exception. - - * e-shell-config-offline.c (storage_set_view_has_checkbox_func): - New. - (e_shell_config_offline_create_control): Pass it as the - @has_checkbox_func. - - * e-folder.c: New member can_sync_offline in EFolderPrivate. - (init): Init to FALSE. - (e_folder_get_can_sync_offline): New. - (e_folder_to_corba): Set canSyncOffline in the returned CORBA - folder. - (e_folder_set_physical_uri): Protect from when @physical_uri and - ->physical_uri are the same thing. - (e_folder_set_description): Same here with description. - (e_folder_set_type_string): And type. - - * Evolution-common.idl: New member canSyncOffline in struct - Folder. - -2002-05-20 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-config-offline.c - (e_shell_config_offline_create_control): Pass NULL for - @has_checkbox_func and @has_checkbox_func_data. - - * evolution-storage-set-view.c - (impl_StorageSetView__set_showCheckboxes): Pass NULL for - @has_checkbox_func and @has_checkbox_func_data. - - * e-storage-set-view.c: New member has_checkbox_func and - has_checkbox_func_data in EStorageSetViewPrivate. - (init): Init to NULL. - (e_storage_set_view_set_show_checkboxes): New args - @has_checkbox_func and @func_data. - (has_checkbox): Always return FALSE for the toplevels. For the - other ones return TRUE unless ->has_checkbox_func is not-NULL; in - which case, we use that function to determine whether the folder - is actually checkable. - - * Evolution-ShellComponent.idl (requestQuit): Remove exception. - -2002-05-16 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (view_delete_event_cb): Ask e_shell_prepare_for_quit() - before destroying the view if it's the last one. - - * e-shell-view-menu.c (command_close): Synthesize a delete_event - on the view instead of directly destroying it. - -2002-05-15 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c (command_quit): Check with - e_shell_prepare_for_quit() before quitting. - - * e-shell.c (e_shell_prepare_for_quit): New. - - * evolution-test-component.c (request_quit_fn): New function - asking for confirmation to quit. - - * evolution-shell-component.c (evolution_shell_component_new): New - arg @request_quit_fn. - (impl_requestQuit): New, implementation for - EvolutionShellComponent::requestQuit. - (evolution_shell_component_result_to_string): Handle - EVOLUTION_SHELL_COMPONENT_CANCEL. - (evolution_shell_component_client_request_quit): New. - - * Evolution-ShellComponent.idl (requestQuit): New. - -2002-05-15 Iain <iain@ximian.com> - - * e-corba-storage-registry.c (impl_StorageRegistry_addStorage): Remove - debuggin spew - -2002-05-15 Iain <iain@ximian.com> - - * e-corba-storage-registry.c (impl_StorageRegistry_addStorage): Apply - patch from Peter Williams to notify listeners when a new storage is - created. - -2002-05-14 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-offline-handler.c - (e_shell_offline_handler_put_components_offline): Call - e_shell_offline_sync_all_folders() if no connection is reported - here. - (dialog_handle_ok): Sync all the folders here through - e_shell_offline_sync_all_folders(). - - * e-shell-offline-sync.c: New. - * e-shell-offline-sync.h: New. - - * Evolution-Offline.idl (syncFolder): Make oneway. - (cancelSyncFolder): Likewise. - (SyncFolderProgressListener::reportSuccess): New method. - -2002-05-14 Christopher James Lahey <clahey@ximian.com> - - * Makefile.am: Added check-empty.xpm, check-filled.xpm, and - check-missing.xpm. - - * check-empty.xpm, check-filled.xpm, check-missing.xpm: New xpms. - Copied from gal. check-missing.xpm is simply a transparent xpm of - the correct size. - - * e-storage-set-view.c (etree_value_at): When getting, check if - the path doesn't have a check box and return 2 in that case. - (etree_set_value_at): Check if the path doesn't have a check box - and don't change it in that case. Also, just invert the value - here instead of paying attention to the set value passed in. - (class_init): Initialize the checks GdkPixbufs. - (e_storage_set_view_construct): Create the "optional_checkbox" - cell. - - * e-storage-set-view.etspec: Changed the cell for the checkbox - column to "optional_checkbox". - -2002-05-14 Christopher James Lahey <clahey@ximian.com> - - * evolution-storage.c (evolution_storage_new_folder): Compute the - evolutionUri here and pass it in. - -2002-05-14 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-config-offline.c - (init_storage_set_view_status_from_config): Add a missing - CORBA_free in the case in which the typecode of the - /OfflineFolders/Paths key in the ConfigDatabase doesn't match the - expected type. - -2002-05-14 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (e_shell_go_offline): Pass self to - e_shell_offline_handler_new() instead of the component registry. - - * e-shell-offline-handler.c: Replace member `component_registry' - in EShellOfflineHandlerPrivate with a `shell' member. Updated all - the code to retrieve the component registry from the shell instead - of directly. - (e_shell_offline_handler_construct): Get a @shell instead of a - @component_registry. - -2002-05-13 Christopher James Lahey <clahey@ximian.com> - - * e-storage-set-view.c (e_storage_set_view_get_checkboxes_list): - Changed this to just walk the hash table to get the list of - checked checkboxes instead of walking the tree. (Makes it so that - checked paths will remain checked, even if they're not shown in - the tree when the list is gotten.) - -2002-05-13 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-config.c: Handle the e-shell-config-offline and - e-shell-config-default-folders pages. - - * e-shell-config-offline.h: New. - * e-shell-config-offline.c: New. - - * e-shell-config-default-folders.h: New. - * e-shell-config-default-folders.c: New. Moved default folder - page configuration in from e-shell-config.c. - - * GNOME_Evolution_Shell.oaf.in: Add - GNOME_Evolution_Shell_Config_OfflineFolders_Control. - -2002-05-13 Christopher James Lahey <clahey@ximian.com> - - * e-storage-set-view.c (etree_set_value_at): Added a signal when - the value of the checkboxes changes. - -2002-05-10 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-shared-folder-picker-dialog.c: Add members `parent' and - `shell' in DiscoveryData. - (shell_view_destroy_callback): Callback for destruction of - ->parent; set ->parent to NULL. - (shell_destroy_callback): Callback for the desctruction of the - shell; clean up everything. - (discover_folder): Initialize ->parent and shell, and add the - corresponding destruction handlers. - (shared_folder_discovery_listener_callback): Open the discovered - folder. - (setup_progress_dialog): Renamed from `show_progress_dialog'. Set - up a timeout for displaying the dialog instead of displaying it - right away. - (progress_dialog_show_timeout_callback): Callback for showing the - dialog after the callback. - -2002-05-10 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-shared-folder-picker-dialog.c - (shared_folder_discovery_listener_callback): Updated for - FolderResult instead of DiscoverSharedFolderResult. - - * Evolution-Storage.idl: Remove struct DiscoverSharedFolderResult; - we want to just use FolderResult for asyncDiscoverSharedFolder. - -2002-05-10 Ettore Perazzoli <ettore@ximian.com> - - * evolution-test-component.c: Added some tests for the custom - storage. - - * evolution-storage.c: New signal DISCOVER_SHARED_FOLDER. - (impl_Storage_asyncXferFolder): Renamed from - impl_Storage_async_xfer_folder. - (impl_Storage_asyncRemoveFolder): Renamed from - impl_Storage_async_remove_folder. - (impl_Storage_asyncCreateFolder): Renamed from - impl_Storage_async_create_folder. - (impl_Storage_asyncOpenFolder): Renamed from - impl_storage_async_open_folder. - (impl_Storage_addListener): Renamed from - impl_Storage_add_listener. - (impl_Storage_removeListener): Renamed from - impl_Storage_remove_listener. - (impl_Storage_asyncDiscoverSharedFolder): New, implementation for - ::asyncDiscoverSharedFolder. - (evolution_storage_get_epv): Install the CORBA method here. - (class_init): Set up the "discover_shared_folder" signal here. - (e_marshal_NONE__POINTER_POINTER): Yet Another Marshaller. Die - die die. - - * Evolution-Storage.idl (Storage::asyncDiscoverSharedFolder): New - method. - (StorageListener::notifySharedFolderDiscovered): New method. - - * e-shell-shared-folder-picker-dialog.c: New. - * e-shell-shared-folder-picker-dialog.h: New. - - * e-shell-view-menu.c (command_open_other_users_folder): New, - implementation for the FileOpenOtherUsersFolder verb. - - * Makefile.am: Generate stubs and skels for - Evolution::Addressbook::SelectNames as well. - - * glade/e-shell-shared-folder-picker-dialog.glade: New. - -2002-05-09 Ettore Perazzoli <ettore@ximian.com> - - * e-local-storage.c (construct): Pass %FALSE as - @has_shared_folders to evolution_storage_new(). - - * evolution-storage.c: New member has_shared_folders in - EvolutionStoragePrivate. - (init): Initialize to FALSE. - (evolution_storage_new): New arg @has_shared_folders. - (evolution_storage_construct): Likewise. - (impl_Storage__get_folderList): Renamed from - impl_Storage__get_folder_list. - (impl_Storage__get_hasSharedFolders): New, implementation for - ::hasSharedFolders. - (evolution_storage_get_epv): Install the CORBA method - implementation. - - * Evolution-Storage.idl: Make Storage::name a readonly attribute. New attribute Storage:: - -2002-05-09 Ettore Perazzoli <ettore@ximian.com> - - * Evolution-Offline.idl: Rename NotPrepared to notPrepared and - NotSyncing to notSyncing. - - * evolution-storage.c (impl_Storage__get_folder_list): Renamed - from impl_Storage_get_folder_list(). - - * Evolution-Storage.idl: Don't typedef FolderList here. Replace - `getFolderList' method with a readonly attribute. - -2002-05-07 Ettore Perazzoli <ettore@ximian.com> - - * Evolution-Offline.idl: New interface SyncFolderProgressListener. - (Offline::cancelSyncFolder): New. - (Offline::syncFolder): New. - -2002-05-07 JP Rosevear <jpr@ximian.com> - - * evolution-storage.c (get_folder_list_foreach): add every folder - to the sequence except the root folder - (impl_Storage_get_folder_list): implement corba method - (evolution_storage_get_epv): set new method implementation - - * evolution-folder-selector-button.h: fix signal prototype - - * e-folder-tree.h: new proto - - * e-folder-tree.c (e_folder_tree_get_count): count nodes - (count_nodes): bump count foreach path - - * e-corba-storage-registry.c - (impl_StorageRegistry_getStorageList): implement idl method - (corba_class_init): set epv method - - * Evolution-Storage.idl: add getStorageList and getFolderList - methods - -2002-05-07 Ettore Perazzoli <ettore@ximian.com> - - * evolution-test-component.c (create_new_folder_selector): Use the - new evolution_shell_client_create_storage_set_view() call. - - * evolution-shell-client.c - (evolution_shell_client_create_storage_set_view): New. - -2002-05-07 Ettore Perazzoli <ettore@ximian.com> - - * evolution-storage-set-view-factory.c - (evolution_storage_set_view_factory_new_view): Put the - EStorageSetView in an EScrollFrame. - - * e-shell.c (impl_Shell_createStorageSetView): - CORBA_Object_duplicate the object before returning. - - * evolution-test-component.c - (create_new_folder_selector): New function to create a simple test - environment for the new checkbox-enabled StorageSetView. - (register_component): Add user-creatable type FolderSelector. - (user_create_new_item_callback): Handle FolderSelector. - (dialog_clicked_callback): Print out the checked items in the - folder selector. - (main): Print out a message before going into bonobo_main(). - - * evolution-storage-set-view.c - (impl_StorageSetView__get_showFolders): Renamed from - impl_StorageSetView__get_show_folders. - (impl_StorageSetView__set_showFolders): Renamed from - impl_StorageSetView__set_show_folders. - (impl_StorageSetView__set_showCheckboxes): New, write the - showCheckboxes CORBA attribute. - (impl_StorageSetView__get_showCheckboxes): New, read the - showCheckboxes CORBA attribute. - (impl_StorageSetView__get_checkedFolders): New, read the - checkedFolders CORBA attribute. - (corba_class_init): Install the new CORBA methods methods. - - * e-storage-set-view.c (essv_add_to_list): strdup() the path. - (e_storage_set_view_get_storage_set): New. - - * e-folder.c (e_folder_to_corba): New. - - * Evolution-StorageSetView.idl: Add showCheckboxes and - checkedFolders attributes. - - * Evolution-common.idl: Add typedef for FolderList. - -2002-05-03 Christopher James Lahey <clahey@ximian.com> - - * e-folder-list.c: Use bonobo_object_client_(un)?ref instead of - gtk_object_(un)?ref. - (add_clicked): Don't pass NULL to - evolution_shell_client_user_select_folder. - - * glade/Makefile.am: Added e-folder-list.glade - - * glade/e-folder-list.glade: The glade file for e-folder-list. - -2002-05-03 Christopher James Lahey <clahey@ximian.com> - - * Makefile.am (eshellinclude_HEADERS): Added e-folder-list.h. - (libeshell_la_SOURCES): Added e-folder-list.c. - - * e-folder-list.c, e-folder-list.h: New widget for editing a list - of folder uris. - -2002-04-29 Christopher James Lahey <clahey@ximian.com> - - * e-storage-set-view.c (e_storage_set_view_set_checkboxes_list, - e_storage_set_view_get_checkboxes_list): Added these functions. - Implemented checkboxes in the ETreeModel here. - -2002-04-19 Anna Marie Dirks <anna@ximian.com> - - * glade/e-shell-config-default-folders.glade: Minor label tweaks; - changed "Default folders" to "Default Folders", and added - accelerators. - -2002-04-18 JP Rosevear <jpr@ximian.com> - - * evolution-shell-view.c (impl_ShellView_show_settings): emit - show_settings signal - (corba_class_init): assign epv method - (class_init): add signal - - * evolution-shell-view.h: new signal - - * e-shell.c (init): init settings_dialog private member - (settings_dialog_destroy_cb): reset dialog pointer - (e_shell_show_settings): show the settings dialog, bring it to the - front if one already exists for this shell - - * e-shell.h: new proto - - * e-shell-view.c (corba_interface_show_settings): implement - showSettings method - (setup_corba_interface): listen for show_settings signal - (e_shell_view_show_settings): show the settings dialog - - * e-shell-view.h: new proto - - * e-shell-view-menu.c (command_settings): call - e_shell_view_show_settings instead - - * Evolution-ShellView.idl: add showSettings method - -2002-04-17 Ettore Perazzoli <ettore@ximian.com> - - * e-shortcuts-view.c (impl_shortcut_drag_motion): New, override - for EShortcutBar::shortcut_drag_motion. - (impl_shortcut_drag_data_received): New, override for - EShortcutBar::shortcut_drag_data_received. - (class_init): Install the method overrides. - -2002-04-17 Christopher James Lahey <clahey@ximian.com> - - * e-activity-handler.c: Updated this to match the new EPopupMenu. - -2002-04-17 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (handle_evolution_path_drag_motion): - Removed. - (impl_tree_drag_motion): Rewritten to use - `e_folder_dnd_bridge_motion()'. - (impl_tree_drag_data_received): Rewritten to use - `e_folder_dnd_bridge_data_received()'. - (convert_gdk_drag_action_to_corba): Removed. - (convert_corba_drag_action_to_gdk): Removed. - (find_matching_target_for_drag_context): Removed. - - * e-folder-dnd-bridge.c: New. - * e-folder-dnd-bridge.h: New. - -2002-04-10 Dan Winship <danw@ximian.com> - - * e-shell-config.c: Shell config page routines. Right now - handles the default folders page. - - * glade/e-shell-config-default-folders.glade: New. - - * GNOME_Evolution_Shell.oaf.in: Add info for the default folders - config page. - - * main.c (idle_cb): If we successfully registered the shell, - register the config factory. - - * evolution-shell-client.c (evolution_shell_client_new): Note the - fact that it frees the corba_shell when it is destroyed. - - * evolution-folder-selector-button.c - (evolution_folder_selector_button_construct, destroy): Use - bonobo_object_ref/unref on the shell client, not gtk. - - * e-shell.c (e_shell_construct): Pass local_directory to - e_setup_check_db. - (handle_default_uri): Fix the config db paths here to match the - other routines. - - * e-setup.c (e_setup_check_db): Make this take the evolution - directory path as well so we can properly set up file: URIs for - the default folders. - -2002-04-09 Ettore Perazzoli <ettore@ximian.com> - - * main.c (idle_cb): Change the logic for displaying a default - window, so we don't end up with two windows all the time. - -2002-04-09 Ettore Perazzoli <ettore@ximian.com> - - [Patch from Max Horn <max@quendi.de>.] - - * e-local-storage.c: Move <dirent.h> down the #include list so it - compiles on Darwin. - -2002-04-09 Dan Winship <danw@ximian.com> - - * e-setup.c (e_setup_check_db): New. Check that things that need - to be in the config db are. Right now it sets up the default - folders. - - * e-shell.c (e_shell_construct): Call e_setup_check_db after - getting the config db. - (impl_Shell_handleURI): Handle "default:" URIs by looking up the - default folders in the config db. - - * main.c (idle_cb): Check for "default:" URIs and treat them the - same way as "evolution:" URIs. If the shell fails to display all - of the requested URIs, fall back to the default URI (Summary). - - * e-shell-constants.h: Add E_SUMMARY_URI, E_LOCAL_INBOX_URI, etc. - - * e-shortcuts.c (e_shortcuts_add_default_group): Use - E_LOCAL_INBOX_URI, etc. - - * e-shell-view.c: #define FALLBACK_URI to E_SUMMARY_URI - -2002-04-09 Dan Winship <danw@ximian.com> - - * Evolution-ShellComponent.idl (createView): Add a "view_info" - argument. - - * e-shell-view.c (get_view_for_uri): if the URI contains a '#', - split it into a URI and a "view_info" at that point. (Otherwise, - pass "" for the view_info to ShellComponent_createView.) This can - be used for things like specifying day/month/week view to the - calendar. - - * e-shell.c (create_view): Ignore e_shell_view_display_uri's - return code: it's possible/likely that the requested URL is remote - and hasn't been filled in yet. - (impl_Shell_handleURI): Don't use Shell_createNewView directly, - call e_shell_create_view_from_uri_and_settings. (For the above fix - and some others.) - - * evolution-shell-component.c (impl_createView): Add view_info. - - * evolution-shell-component-client.c - (evolution_shell_component_client_create_view): Add view_info. - - * evolution-test-component.c (create_view_fn): add view_data. - - * e-corba-storage-registry.c - (impl_StorageRegistry_getFolderByUri): kill a warning - -2002-04-08 Dan Winship <danw@ximian.com> - - Fix "evolution evolution:/path/to/folder" to use default view - prefs. - - * e-shell.c (impl_Shell_createNewView): Use - e_shell_create_view_from_uri_and_settings to create the new view - based on saved view 0 instead of always using the initial - evolution defaults. - (e_shell_create_view_from_uri_and_settings): Renamed and - simplified; the template_view argument was useless and - settings_found would always be set to TRUE in the context it was - being used it. - (e_shell_restore_from_settings): Simplify for - e_shell_create_view_from_uri_and_settings changes. - - * e-shell-view.c (e_shell_view_load_settings): Only load the - DisplayedURI if the view isn't already displaying a URI. Also, - pass an &ev to the first bonobo_config_get_long so we can tell if - it failed and bail out. - - * e-shell-view.h: Remove a prototype for a non-existent function - (e_shell_view_remove_control_for_uri). - - * main.c (idle_cb): Add some comments here and remove some dead - code. - -2002-04-06 JP Rosevear <jpr@ximian.com> - - * e-shell-settings-dialog.c (page_new): set type - (load_pages): get the oaf property for type and track the page - number of the highest priority for each type - (destroy_type_entry): destroy hash func - (impl_destroy): destroy the hash table - (init): create private struct and hash table - (e_shell_settings_dialog_show_type): show the page of the given - type - - * e-shell-view-menu.c (command_settings): show the page for the - current folder type by default - - * e-shell-settings-dialog.h: new proto - -2002-04-06 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-settings-dialog.c (init): Set the title of the dialog. - -2002-04-04 Dan Winship <danw@ximian.com> - - * evolution-shell-client.c - (evolution_shell_client_get_pixbuf_for_type): Fix a memory mixup. - -2002-04-04 Dan Winship <danw@ximian.com> - - * evolution-folder-selector-button.c: New widget for a button that - displays a folder selection in a standard form, and when clicked - lets the user select a new folder. - - * Evolution-Shell.idl (FolderSelectionListener:notifySelected): - Make this take an Evolution:Folder instead of a pair of uris. - (Shell:getIconByType): New method to get the icon for a type from - the folder type registry. - - * Evolution-common.idl (Folder): add "evolutionUri" to the folder - structure. - - * Evolution-Storage.idl (StorageRegistry:getFolderByUri): get an - Evolution:Folder for a given uri. - - * evolution-shell-client.c - (evolution_shell_client_user_select_folder): Update this to - reflect the IDL change: return a GNOME_Evolution_Folder instead of - a pair of URIs. Make sure it always sets *@folder_return to %NULL - if it fails (even if it's a g_return_if_fail). - (evolution_shell_client_get_storage_registry_interface): New. - (evolution_shell_client_get_pixbuf_for_type): New. Uses - Shell_getIconByType, but caches results. - - * e-shell.c (folder_selection_dialog_folder_selected_cb): Update - for API change. (Return a GNOME_Evolution_Folder.) - (impl_Shell_getIconByType): Implement. - - * e-corba-storage-registry.c - (impl_StorageRegistry_getFolderByUri): Implement. - - * evolution-storage.c (evolution_storage_new_folder): Add a - (dummy) evolutionUri to the folder. - - * Makefile.am (libeshell_la_SOURCES): add - evolution-folder-selector-button.c - (eshellinclude_HEADERS): and .h - -2002-04-04 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component.c: Change type of parent_class to - BonoboXObjectClass. - - * e-shell.c (pop_up_activation_error_dialog): New helper function - to pop up a dialog if one of the components couldn't be activated, - getting the description for the error from - e_get_activation_failure_msg(). - (setup_components): Use this function in case of activation error. - (set_owner_on_components): Likewise, when the component gets - restarted. Also get a @splash arg so we can set the parent for - this dialog correctly. - - * e-component-registry.c (register_component): New arg @ev. - (e_component_registry_register_component): Likewise. - (e_component_registry_restart_component): Likewise. Also, remove - some bogus code that was #if'ed out. - - * evolution-shell-component-client.c - (evolution_shell_component_client_new): New arg @ev. - - * evolution-shell-component-utils.c - (e_get_activation_failure_msg): New. - -2002-04-03 Dan Winship <danw@ximian.com> - - * e-storage.c (get_path_for_physical_uri_foreach): Deal with - folders with no physical_uri. - -2002-04-02 Christopher James Lahey <clahey@ximian.com> - - * e-storage-set-view.c (e_storage_set_view_set_show_checkboxes): - Set the show_checkboxes field here instead of the show_folders - field. - -2002-04-02 Christopher James Lahey <clahey@ximian.com> - - * e-storage-set-view.c (etree_value_at): If folder is NULL, return - the correct type of data. - -2002-04-02 Christopher James Lahey <clahey@ximian.com> - - * Makefile.am (etspec_DATA): Added - e-storage-set-view-checkboxes.etstate and - e-storage-set-view-no-checkboxes.etstate here. - - * e-storage-set-view-checkboxes.etstate, - e-storage-set-view-no-checkboxes.etstate: The two possible states - of the EStorageSetView. - - * e-storage-set-view.c, e-storage-set-view.h - (e_storage_set_view_set_show_checkboxes, - e_storage_set_view_get_show_checkboxes): Added this functionality. - Added a model column to the underlying table for the checkbox - data. - - * e-storage-set-view.etspec: Added a view column for the - checkboxes. - -2002-03-29 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-settings-dialog.c: Add type "Page". - (page_new): New helper function. - (page_free): New helper function. - (compare_page_func): Callback for sorting a GList of pages. - (sort_page_list): New helper function. - (load_pages): Create the pages, sort them, add them sorted. Now - we have a priority field that overrides alphabetical sorting. - -2002-03-26 Ettore Perazzoli <ettore@ximian.com> - - * e-component-info.c: New. - * e-component-info.h: New. - -2002-03-26 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-settings-dialog.c (load_pages): g_warning if the control - cannot be activated. - -2002-03-25 Dan Winship <danw@ximian.com> - - * e-shell.c (e_shell_construct): Register a "working" folder type - with the hourglass icon. (Would eventually like an animated gif, - when ETable supports that.) - - * e-storage.c (e_storage_has_subfolders): Use "working" rather - than "noselect" as the folder type. - - * e-shell-view.c (get_view_for_uri): Simplify a bit. - -2002-03-22 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-settings-dialog.c (get_language_list): Removed. - (load_pages): Use e_get_language_list() here instead. Also, free - using e_free_language_list(). - -2002-03-22 Dan Winship <danw@ximian.com> - - * evolution-storage.c (evolution_storage_update_folder): Fix a - "how can this ever have worked" bug to make unread message counts - start working again. (#22293 etc) - (evolution_storage_removed_folder): Oops. Fix here too. - (evolution_storage_has_subfolders): And here. When cut and paste - goes bad... - - * e-shell-folder-commands.c (e_shell_command_rename_folder): Use - e_folder_get_name. Don't assume it's the same as the last path - element. - -2002-03-21 Dan Winship <danw@ximian.com> - - * e-splash.c (e_splash_construct): Set the wmclass to - "evolution-splash" so sawfish knows it's not the same kind of - window as the main window. - -2002-03-20 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c: Make all the verb/menu arrays appropriately - static. - -2002-03-20 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c (command_send_receive): New, implementation - for the "SendReceive" verb. - - * e-shell.c (e_shell_send_receive): New. - - * evolution-shell-component.c (impl_sendReceive): Implementation - of ShellComponent::sendReceive. - (class_init): Add the "send_receive" signal. - - * evolution-shell-component.h: Added `send_receive' signal. - - * Evolution-ShellComponent.idl: Added ShellComponent::sendReceive. - -2002-03-18 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.etspec: Add `search="string"' for the - keyboard navigability search thingy. - -2002-03-15 Jeffrey Stedfast <fejj@ximian.com> - - * e-activity-handler.c (show_cancellation_popup): Updated to use - new EPopupMenu API. - -2002-03-14 Dan Winship <danw@ximian.com> - - Support for delayed filling-in of storages/folders. - - * Evolution-Storage.idl (StorageListener): add - notifyHasSubfolders, to announce that a folder has currently- - unknown subfolders. - (Storage): add asyncOpenFolder, to request that previously- - announced subfolders be filled in. - - * evolution-storage.c (impl_Storage_async_open_folder): emit - OPEN_FOLDER. - (evolution_storage_has_subfolders): Implement by calling - notifyHasSubfolders on all of its listeners. - - * evolution-storage-listener.c - (impl_GNOME_Evolution_StorageListener_notifyHasSubfolders): emit - HAS_SUBFOLDERS. - - * e-corba-storage.c (impl_StorageListener_notifyHasSubfolders): - Implement by calling e_storage_has_subfolders. - (async_open_folder): Implement by calling asyncOpenFolder on the - CORBA storage. - - * e-storage.c (EStoragePrivate, init, destroy): Keep a list of - pseudofolders representing un-filled-in subtrees. - (impl_async_open_folder): No-op default implementation - (e_storage_async_open_folder): New function to request that - un-filled-in subtrees be filled in. - (e_storage_new_folder): If the new folder's parent has an - "un-filled-in children" pseudofolder, remove it. - (e_storage_has_subfolders): New function to note that a folder has - unknown children. If the folder previously was marked as having - real children, remove them, and emit CLOSE_FOLDER to reset it back - to an a "unknown subfolders" state. - - * e-storage-set.c (make_full_path): Make this deal with path being - "/", since that case gets used from storage_close_folder_cb - sometimes. - (storage_close_folder_cb): Proxy EStorage's CLOSE_FOLDER signal. - (storage_set_view_folder_opened): Handle EStorageSetView's - FOLDER_OPENED signal by calling e_storage_async_open_folder. - - * e-storage-set-view.c (etree_fill_in_children): If the given node - is its parent's first child, emit FOLDER_OPENED for the parent. - (close_folder_cb): Handler for EStorageSet's CLOSE_FOLDER signal. - Ask the model to close that node. - (e_storage_set_view_construct): Set the default expanded state for - the tree to FALSE rather than TRUE, to prevent unwanted expansion - of delayed nodes. (This only affects the very first time the tree - is displayed anyway: after that its state is loaded off disk.) - - * e-shell.c (e_shell_construct): Register the "noselect" type with - the folder type registry, so icon lookups on placeholder folders - will work. - -2002-03-13 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-settings-dialog.c (load_pages): Use - `evolution:config_item:icon_name' instead of - `evolution:config_item:icon_path'. If it's not an absolute path, - load from the IMAGESDIR. Also, no need to specify the language - list for this one, as the icon name shouldn't be translated. - -2002-03-12 Ettore Perazzoli <ettore@ximian.com> - - * evolution-test-component.c (create_configuration_page): Update - to create an EvolutionConfigControl instead of just a - BonoboControl. - - * e-corba-config-page.c (e_corba_config_page_construct): Get a - GNOME_Evolution_ConfigControl instead of a CORBA_Object. Retrieve - the control from it using ::_get_control instead of just assuming - it's a control. Also return a boolen indicating success or - failure. - (e_corba_config_page_new): Likewise, get a - GNOME_Evolution_ConfigControl. - (setup_listener): Renamed from `setup_config_control_interface'. - Get a ::ConfigControl instead of a CORBA::Object. Thus, no need - to queryInterface here anymore. - - * evolution-config-control.c, evolution-config-control.h: New, - implementation for the Evolution::ConfigControl interface. - - * Evolution-ConfigControl.idl: New attribute `control'. - -2002-03-09 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-commands.c (e_shell_command_rename_folder): Make - old_name_locale non-const to placate a compiler warning. - (get_corba_null_value): Likewise. - - * e-activity-handler.c (report_task_event): `#if 0' out. - -2002-03-09 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-settings-dialog.c (load_pages): Use ECorbaConfigPages. - - * e-corba-config-page.c: New. - * e-corba-config-page.h: New. - - * Evolution.idl: #include <Evolution-ConfigControl.idl>. - - * Evolution-ConfigControl.idl: New IDL for configuration Controls - that will be displayed in the global config dialog. - -2002-03-08 Dan Winship <danw@ximian.com> - - * e-storage-set-view.[ch]: Note that e_storage_set_view_new - shouldn't be used directly. - - * e-shell-view.c (setup_storage_set_subwindow): Use - e_storage_set_new_view instead of e_storage_set_view_new. - - * evolution-storage-set-view-factory.c - (evolution_storage_set_view_factory_new_view): Likewise. - -2002-03-07 Ettore Perazzoli <ettore@ximian.com> - - * evolution-test-component.c (create_configuration_page): New - function to create a test configuration page for the test - component. - (configuration_control_factory_fn): Factory function for the - configuration controls. - (register_configuration_control_factory): New function to register - the factory. - (main): Call it. - - * e-shell-view-menu.c: Add verb "Settings". - (command_settings): Implementation for the "Settings" verb. - - * GNOME_Evolution_TestComponent.oaf: Add a configuration control. - - * e-shell-settings-dialog.c: New. - * e-shell-settings-dialog.h: New. - -2002-03-07 Dan Winship <danw@ximian.com> - - Addendum to previous commit: Remove "storage_selected" vs - "folder_selected" distinction. - - * evolution-storage-set-view.c - (storage_set_view_widget_storage_selected_cb): Removed. - - * evolution-storage-set-view-listener.c - (impl_GNOME_Evolution_StorageSetViewListener_notifyStorageSelected): - Removed. - (class_init): Remove STORAGE_SELECTED signal. - - * e-storage-set-view.c (impl_cursor_activated): Always emit - FOLDER_SELECTED, never STORAGE_SELECTED. - (class_init): Remove STORAGE_SELECTED signal. - - * e-shell-view.c (storage_selected_cb): Removed. - - * e-shell-folder-creation-dialog.c - (storage_set_view_storage_selected_cb): Removed. - - * Evolution-StorageSetView.idl (StorageSetViewListener): Remove - notifyStorageSelected. - -2002-03-07 Dan Winship <danw@ximian.com> - - Make storages-with-toplevel-views less of a hack. - - * e-folder-tree.c (e_folder_tree_add): Allow the caller to "add" a - root folder, if the existing root folder has no children. - (e_folder_tree_new): Use e_folder_tree_add to create the root - folder, since it can do that now. - - * e-storage.c: (e_storage_construct): Replace toplevel_node_uri - and toplevel_node_type args with root_folder. - (e_storage_new): Likewise. - (*): Remove toplevel uri/type stuff everywhere. Also remove - display_name since now we will use the name of the root folder for - that. - - * evolution-storage.c: Remove toplevel uri/type stuff everywhere. - - * e-local-storage.c (construct): Pass root_folder to - e_storage_construct instead of toplevel uri/type. - Also, evolution_storage_new no longer takes toplevel uri/type. - - * e-corba-storage.c (e_corba_storage_construct): Out with toplevel - uri/type, in with root_folder. - (e_corba_storage_new): Remove toplevel uri/type. - - * e-shell.c (setup_local_storage): Create a top-level folder of - type "summary" for the Summary storage. - - * e-storage-set-view.c (set_e_shortcut_selection): Remove - special-case for storages. - (etree_icon_at): Remove special case for figuring out storage - icons (but leave the code for storages without icons). - (etree_value_at): Remove special case for storage names. (But - still make storages always bold.) Remove unused special-case code - for Summary. - - * e-shortcuts.c (load_shortcuts): Remove special case for - storages, reorganize a bit. - - * e-shortcuts-view.c (get_shortcut_info): Remove special case for - storages. - - * e-shell-view.c (update_for_current_uri): Remove special case for - storages. - (socket_destroy_cb): Likewise. - (get_type_for_storage): No longer needed. - (get_view_for_uri): No longer needs to special-case storages (but - add a special case for folders of type "noselect", to make them - unselectable like storages-without-toplevel-views used to be). - - * e-storage-set.c (get_storage_for_path): If passed "/foo", return - "/" as subpath_return so e_storage_set_get_folder will DTRT in the - NWO. - - * Evolution-Storage.idl (addStorage): Remove the toplevel_node_uri - and toplevel_node_type arguments. - - * e-corba-storage-registry.c (impl_StorageRegistry_addStorage): - Likewise. - -2002-03-06 Dan Winship <danw@ximian.com> - - * e-storage.c: Keep the storage name and display_name in - EStoragePriv. - (impl_get_name, impl_get_display_name): Return them. - (e_storage_construct): Set them here. - (e_storage_new): And here. - - * e-local-storage.c: (impl_get_name, impl_get_display_name): - Removed. - (construct): Pass E_LOCAL_STORAGE_NAME and U_("Local Folders") to - e_storage_construct. - - * e-corba-storage.c: Remove priv->name. - (get_name, get_display_name): Removed. - (e_corba_storage_construct): Pass name to e_storage_construct(). - - * e-summary-storage.[ch]: Gone. This didn't override anything in - EStorage but get_name/get_display_name, and the defaults for those - DTRT now. - - * e-shell-constants.h: Move E_SUMMARY_STORAGE_NAME here from - e-summary-storage.h, and move E_LOCAL_STORAGE_NAME too for - consistency. - - * e-storage-set-view.c: Fix up #includes. - - * e-shell-importer.c: Likewise - - * e-shell.c: Likewise. Create summary_storage as a plain EStorage - since ESummaryStorage is gone now. - - * Makefile.am (evolution_SOURCES): Remove e-summary-storage.[ch] - -2002-03-06 Dan Winship <danw@ximian.com> - - * e-corba-storage-registry.c - (impl_StorageRegistry_removeListener): Fix up GList/GSList - confusion. - - * e-shell-user-creatable-items-handler.c - (get_default_action_for_view): Don't look into the types list if - it's empty. - -2002-03-06 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-about-box.c: Reduce width of the copyright message so it - looks prettier with the new Rupert artwork. - -2002-03-04 Iain Holmes <iain@ximian.com> - - * Evolution-Storage.idl: Add some methods to the StorageRegistry - interface to get a storage, and add or remove listeners. Also add a - new exception and some structs and enums for messages. - - * e-corba_storage-registry.c: Add a GSList to the private stuct for - recording the listeners. - (listener_notify): Send a message to the listeners. - (impl_StorageRegistry_getStorageByName): Implementation of the - getStorageByName method. Returns the associated storage interface - (storage_set_foreach): Loop through all the storages in the storageset - and notify the listeners about them. - (find_listener): Find a listener in the list of them. - (impl_StorageRegistry_addListener): Add a new listener to the - registry. - (impl_StorageRegistry_removeListener): Remove a listener. - (corba_class_init): Add the new methods to the EPV. - (init): NULL the listeners list. - - * e-corba-storage.[ch] (e_corba_storage_get_corba_objref): Get the CORBA - interface from the GtkObject. - -2002-03-04 Ettore Perazzoli <ettore@ximian.com> - - [Fix #20234, Deleting Folder gratuitiously causes /local to open.] - - * e-shell-view.c (find_inbox_in_storage): New helper function to - heuristically find an Inbox folder. - (handle_current_folder_removed): New function to handle the - removal of the currently displayed folder in a slightly smarter - way than before. It tries to display the parent folder of the - folder that got deleted and, if not possible, the Inbox in the - same storage. If neither of this is possible, it displays the - default local Inbox. [It still doesn't handle the case where you - have no Inbox gracefully, but that can come later.] - (storage_set_removed_folder_callback): Call - `handle_current_folder_removed'. - -2002-03-04 Ettore Perazzoli <ettore@ximian.com> - - [Fix #20237, Shell silently drops xfer_folder errors.] - - * e-shell-folder-commands.c (xfer_result_callback): Display an - error message if the operation failed. - -2002-02-26 Ettore Perazzoli <ettore@ximian.com> - - [This gets rid of some spurious "could not find handler" messages - on exit. What happened is that the signal would be disconnected - twice, once by cleanup_delayed_selection() and once by the - while_alive handler.] - - * e-shell-view.c (destroy): Call cleanup_delayed_selection() here. - (e_shell_view_display_uri): Use gtk_signal_connect_full(), not - e_gtk_signal_connect_full_while_alive(). - -2002-02-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-about-box.c: Add year 2002 to the copyright. - -2002-02-23 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (impl_destroy): Renamed from `destroy'. - (impl_right_click): Renamed from `right_click'. - (impl_cursor_activated): Renamed from `cursor_activated'. - (impl_tree_start_drag): Renamed from `tree_start_drag'. - (impl_tree_drag_begin): Renamed from `tree_drag_begin'. - (impl_tree_drag_end): Renamed from `tree_drag_end'. - (impl_tree_drag_data_get): Renamed from `tree_drag_data_get'. - (impl_tree_drag_data_delete): Renamed from - `tree_drag_data_delete'. - (impl_tree_drag_motion): Renamed from `tree_drag_motion'. - (impl_tree_drag_leave): Renamed from `tree_drag_leave'. - (impl_tree_drag_drop): Renamed from `tree_drag_drop'. - (impl_tree_drag_data_received): Renamed from - `tree_drag_data_received'. - -2002-02-22 Ettore Perazzoli <ettore@ximian.com> - - [Fix #3029, Offline mode should be preserved across sessions.] - - * main.c (idle_cb): Use the e_shell_new() API below so that we use - the saved offline settings at the next start-up if neither - --offline nor --online has been specified. - - * e-shell.c (save_misc_settings): New function. For now, just - save `/Shell/StartOffline' indicating whether the shell should - start in offline mode or not. - (e_shell_construct): Replace @start_online with - @startup_line_mode. - (e_shell_new): Likewise. - - * e-shell.h: New enum EShellStartupLineMode. - -2002-02-22 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (remove_uri_from_history): New helper function to - remove all the matching URIs from the history. - (history_uri_matching_func): Compare function for using - e_history_remove_matching. - (storage_set_removed_folder_callback): Call - `remove_uri_from_history()'. - - * e-history.c (e_history_remove_matching): New. - -2002-02-22 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (update_navigation_buttons): New. - (display_uri): Call it before returning so the navigation buttons - always have the right sensitivity. - - * e-shell-folder-title-bar.c - (e_shell_folder_title_bar_update_navigation_buttons): New. - (add_navigation_buttons): Remove the "Back" label. - -2002-02-22 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c: New member `history' in `EShellViewPrivate'. - (init): Initialize. - (destroy): Unref. - (e_shell_view_display_uri): Make it a no-op if the URI is the same - as the current one. Also, moved code into `display_uri' and use - it. - (back_clicked_callback): New, callback for the back button on the - folder title bar. - (forward_clicked_callback): Likewise for the forward button. - - * e-history.c: New. - * e-history.h: New. - -2002-02-22 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (e_shell_view_show_folder_bar): - `e_shell_folder_title_bar_set_title_clickable()', not - `e_shell_folder_title_bar_set_clickable()'. - - * e-shell-folder-title-bar.c: Rename `button', `button_label' and - `button_arrow' to `title_button', `title_button_label' and - `title_button_arrow'. Renamed `label' to `title_label'. Renamed - `arrow_xpm' to `down_arrow_xpm'. Added `left_arrow.xpm' and - `right_arrow.xpm'. - (class_init): Add the "back_clicked" and "forward_clicked" - signals. - (add_navigation_buttons): New function to add the navigation - buttons to the title bar. - (back_button_clicked_callback): Callback for the back button, - emits "back_clicked". - (forward_button_clicked_callback): Callback for the forward - button, emits "forward_clicked". - (e_shell_folder_title_bar_construct): Call - `add_navigation_buttons()'. - (forward_button_clicked_callback): - (create_arrow_pixmap): Removed. - (create_pixmap_widget_from_xpm): New. - (title_button_box_realize_cb): Removed. - (e_shell_folder_title_bar_construct): Don't connect. Just add the - icon normally using the new `create_pixmap_widget_from_xpm()'. - (e_shell_folder_title_bar_set_title_clickable): Renamed from - `e_shell_folder_title_bar_set_clickable'. - (size_allocate_navigation_buttons): New. - (size_allocate_title_button): Get an @offset. - (size_allocate_label): Get an @offset. - (size_allocate): Allocate the navigation buttons and offset - everything else accordingly. - - * e-shell-folder-title-bar.h: New signals "back_clicked", - "forward_clicked". - -2002-02-21 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-user-creatable-items-handler.c - (get_default_action_for_view): Return NULL if there is no - component ID for the current view. - -2002-02-21 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-user-creatable-items-handler.c (ensure_menu_items): Set - the icons for all the "New..." menu items from the specified one - in the type definitions. - - * e-activity-handler.c (create_gdk_pixbuf_from_corba_icon): - Removed. - (impl_operationStarted): Just use - `e_new_gdk_pixbuf_from_corba_icon()'. - - * e-shell-corba-icon-utils.c (e_new_gdk_pixbuf_from_corba_icon): - New. - -2002-02-20 Ettore Perazzoli <ettore@ximian.com> - - [Fix #20311, new window from Shortcuts should not show the folder - bar and the shortcut bar. Also do the same for right-click on the - folder bar.] - - * e-shell-view-menu.c (command_open_folder_in_new_window): Don't - show the folder bar and the shortcut bar in the new window. - - * e-shell-view.c (activate_shortcut_cb): Don't show the folder bar - and the shortcut bar in the new window. - - * e-shell-view.c (e_shell_create_view): Don't flush the GTK events - here. - -2002-02-20 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (e_shell_construct): New arg @start_online. If true, - invoke `e_shell_go_online()' before returning. - (e_shell_new): New arg @start_online. Pass it to - e_shell_construct(). - (init): Default ->line_status to E_SHELL_LINE_STATUS_OFFLINE. - - * main.c (main): Add "--offline" and "--online" options. - -2002-01-30 Not Zed <NotZed@Ximian.com> - - * e-storage-set-view.c (popup_folder_menu): Use - right_click_row_path rather than selected_row_path, so clients get - the uri that was actually clicked on. - -2002-01-27 Ettore Perazzoli <ettore@ximian.com> - - * Makefile.am: Use SHELL_CFLAGS and SHELL_LIBS. - * importer/Makefile.am: Likewise. - -2002-01-24 Ettore Perazzoli <ettore@ximian.com> - - * Makefile.am: Just use BONOBO_HTML_GNOME_CFLAGS and - BONOBO_HTML_GNOME_LIBS for compiling/linking; we don't need the - other ones. - -2002-01-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-user-creatable-items-handler.c: New member `id' in - struct `Component'. New member `icon' in struct `MenuItem'. - (component_free): Free ->id. - (component_new): Renamed from `component_new_from_client'. Get an - @id arg and set ->id accordingly. - (e_shell_user_creatable_items_handler_add_component): New arg @id. - Pass it to `component_new'. - (e_shell_user_creatable_items_handler_setup_menus): New arg - @current_component_id. - (e_shell_user_creatable_items_handler_update_menus): New. - (set_current_component): New helper function. - (get_component_by_id): New helper function. - (add_verbs): Renamed from `add_verbs_to_ui_component()'. Get a - @shell_view instead of a @ui_component. Set the SHELL_VIEW_KEY on - the ui_component of the shell_view to point to the shell_view - itself. - (ensure_menu_items): Set item->icon to NULL. - (free_menu_items): Unref item->icon. - (ensure_menu_xml): Set the icon as well. - (get_default_action_for_view): New helper function. - (find_menu_item_for_verb): New helper function. - (shell_view_view_changed_callback): New callback, set up the label - on the "New" button depending on the current component. - (e_shell_user_creatable_items_handler_attach_menus): New. For - now, do not display the toolbar button yet. - (execute_verb): New helper function, splitting out code from - `verb_fn'. - (verb_fn): Use `execute_verb'. - (combo_button_activate_default_callback): Callback for the - "activate_default" signal on the EComboButton. - (setup_toolbar_button): Connect. - - * evolution-shell-component.c: New member `icon' in - `UserCreatableItemType'. - (impl__get_userCreatableItemTypes): Put the ->icon in the - corba_type as well. - (user_creatable_item_type_new): Get a new @icon argument. - (evolution_shell_component_add_user_creatable_item): New arg - @icon. - - * Evolution-ShellComponent.idl: New member `icon' in struct - `UserCreatableItemType'. - - * evolution-test-component.c (register_component): Pass a NULL - @icon to `evolution_shell_component_add_user_creatable_item()'. - - * e-shell-view.c (class_init): Add the signal to the class. - (e_shell_view_display_uri): Emit "view_changed". - (e_shell_view_get_current_component_id): New. - - * evolution-shell-component-client.c: New member `id' in - EvolutionShellComponentClientPrivate. - (init): Init to NULL. - (impl_destroy): Free. - (evolution_shell_component_client_new_for_objref): Removed. - (evolution_shell_component_client_construct): New arg @id. - Initialize ->id from it. - (evolution_shell_component_client_get_id): New. - - * e-shell-view.h: New signal "view_changed". - - * evolution-activity-client.c (create_icon_from_pixbuf): Removed. - (create_corba_animated_icon_from_pixbuf_array): Removed. - (evolution_activity_client_construct): Use - `e_new_corba_animated_icon_from_pixbuf_array()' instead. - - * e-shell-icon-utils.h: New. - * e-shell-icon-utils.c: New. - -2002-01-23 Ettore Perazzoli <ettore@ximian.com> - - [Patch by Michael Meeks <michael@ximian.com>.] - - * e-splash.c (e_splash_set_icon_highlight): g_return if there is - no num-th icon. - -2002-01-15 Iain Holmes <iain@ximian.com> - - * e-shell-importer.c (show_import_wizard): Set the importer druid - as a transient window of the parent shell. - -2002-01-15 Ettore Perazzoli <ettore@ximian.com> - - [Fix #17441, Crash trying to import Multiple VCard file into LDAP - folder.] - - * e-shell-importer.c (show_error): Add a NULL in the call to - `gnome_message_box_new()'. - -2001-12-14 Michael Meeks <michael@ximian.com> - - * e-shell-view.c (set_current_notebook_page): re-order - activate / de-activate to minimise flicker switching between - identical components. - -2002-01-11 Damon Chaplin <damon@ximian.com> - - * e-shell-startup-wizard.c (finish_func): handle translated timezone - names. - - * Makefile.am (INCLUDES): added -I$(top_srcdir)/libical/src/libical. - -2001-12-17 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-about-box.c: Add Michael MacDonald. - -2001-12-17 Ettore Perazzoli <ettore@ximian.com> - - [Fix #17377, Evolution doesn't work on multi-depth displays.] - - * main.c (main): Push GdkRGB visual and colormap. - -2001-12-17 Ettore Perazzoli <ettore@ximian.com> - - [Fix #16693. What happens there is that the user closed the - dialog before the async operation was completed, so when the - notification was received the shell crashed.] - - * e-shell-folder-creation-dialog.c: New member - `creation_in_progress' in `DialogData'. - (e_shell_show_folder_creation_dialog): Init to %FALSE. - (async_create_cb): Set to %FALSE. Also, if the - dialog_data->dialog is %NULL, free the dialog_data before - returning. - (dialog_clicked_cb): Set to %TRUE. - (dialog_destroy_cb): If a creation is in progress, just set the - widget pointers in the DialogData struct to %NULL instead of - freeing the whole struct. - (async_create_cb): Make the OK and Cancel buttons sensitive. - (dialog_clicked_cb): Make them insensitive here. - -2001-12-12 Ettore Perazzoli <ettore@ximian.com> - - [Fix #17258, shell displays splash even if Evolution is already - running.] - - * e-shell.c (e_shell_construct): Display the splash screen only if - the registration succeeds. - -2001-12-10 Ettore Perazzoli <ettore@ximian.com> - - [Fix #14838, saving passwords doesn't work. It is actually a - workaround for some obscure Bonobo-conf bug.] - - * e-setup.c (setup_bonobo_conf_private_directory): New helper - function to create the `~/evolution/private' directory. - (e_setup): Call it. - -2001-12-07 Iain Holmes <iain@ximian.com> - - [Trying to fix #14701, importing locks up Evolution.] - - * e-shell-importer.c (show_error): Show an error message, but not - modally. - (start_import): Use above function so none of the errors are modal. - (folder_selected): Hide the folder dialog. - -2001-12-04 Ettore Perazzoli <ettore@ximian.com> - - [Fix #7827, Switching desktops leaves the folder bar popped up.] - - * e-shell-view.c (folder_bar_popup_map_callback): And grab the - keyboard as well. - (popdown_transient_folder_bar): Ungrab the keyboard as well. - (switch_on_folder_tree_click): Likewise. - - [Fix #16507, Right Click -> View does nothing.] - - * e-shell-view-menu.c: New verb "ActivateView". - (command_activate_view): New, callback for the "ActivateView" - verb. - -2001-11-15 Zbigniew Chyla <cyba@gnome.pl> - - * e-shell-folder-commands.c (e_shell_command_rename_folder): Convert - folder name to locale's encoding before using it as part of the prompt. - -2001-11-28 Federico Mena Quintero <federico@ximian.com> - - Fixes bug #3290. - - * e-shell-folder-selection-dialog.c - (e_shell_folder_selection_dialog_construct): Use our own filename - for the collapsation state of the tree, instead of sharing the one - of shell view number 0. - (save_expanded_state): New function, saves the collapsation state - of the tree. - (impl_destroy): Call save_expanded_state(). - -2001-11-14 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-about-box.c: Add more contributors to the box. - -2001-11-14 Damon Chaplin <damon@ximian.com> - - * e-shell-startup-wizard.c (finish_func): make timezone default to - "UTC" rather than "". - -2001-11-12 Iain Holmes <iain@ximian.com> - - * e-shell-startup-wizard.c (make_identity_page): Check for exception. - (make_receive_page): Check for exception. - (make_extra_page): Check for exception. - (make_transport_page): Check for exception. - (make_management_page): Check for exception. - -2001-11-06 Iain Holmes <iain@ximian.com> - - * e-shell-startup-wizard.c (make_timezone_page): Move the call to - e_timezone_dialog_new out of the the GTK_OBJECT macro to stop it - being called 4 times, and leaking 3. - -2001-11-05 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (set_e_shortcut_selection): Get the storage - name if we are dragging a storage instead of a folder. - -2001-11-01 Anna Marie Dirks <anna@ximian.com> - - * e-shell-importer.c (prepare_intelligent_page): Fixed spacing and - alignment probelms. (See bug #14281) - - * e-shell-startup-wizard.c (prepare_importer_page): Fixed - spacing and alignment problems. (See bug #14281) - -2001-11-05 Dan Winship <danw@ximian.com> - - * e-storage-set-view.c (set_e_shortcut_selection): Set the - shortcut name to be the folder name, not just the last component - of its path, which may be different. - -2001-11-01 Ettore Perazzoli <ettore@ximian.com> - - * glade/evolution-startup-wizard.glade: `timezone-48.png', not - `timezone.png'. - -2001-11-01 Anna Marie Dirks <anna@ximian.com> - - * glade/evolution-startup-wizard.glade: Changed the welcome - message and the finishing message to be more descriptive. Also - changed the window title to be "Evolution Setup Assistant". Finally, - fixed a misnamed icon (replaced timezone.png with timezone-48.png). - Partially fixes bug #14281 and totally fixes #14286. - -2001-10-31 Christopher James Lahey <clahey@ximian.com> - - * e-storage-set-view.c (cursor_activated): Don't do operations on - a NULL path. - (updated_folder_cb, folder_changed_cb): Send pre_change signal - here. - -2001-10-31 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (handle_evolution_path_drag_motion): If the - source folder is stock and the operation is GDK_ACTION_MOVE, - always return %FALSE as we don't want that to be allowed ever. - -2001-10-30 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (bonobo_widget_is_dead): Removed. - (show_existing_view): Don't call it. - -2001-10-30 Ettore Perazzoli <ettore@ximian.com> - - * e-component-registry.c (sleep_with_g_main_loop): New utility - function. - (sleep_with_g_main_loop_timeout_callback): Callback function for - `sleep_with_g_main_loop()'. - (wait_for_corba_object_to_die): Use `sleep_with_g_main_loop()' - instead of `sleep()'. - -2001-10-30 Ettore Perazzoli <ettore@ximian.com> - - * main.c (development_warning): Removed. - (idle_cb): Don't call it. - (warning_dialog_clicked_callback): Removed. - -2001-10-30 Iain Holmes <iain@ximian.com> - - * e-shell-view.c (e_shell_view_load_settings): If the display uri is - NULL, set the view to the default. - -2001-10-30 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component.c (owner_ping_callback): Duplicate the - owner before pinging it. Fixes #13802. - -2001-10-30 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component.c (impl_owner_unset): New. - (class_init): Install it. - (impl_unsetOwner): Just emit the "owner_unset" signal as the - default implementation for that signal does all the work now. - (impl_owner_died): Set the owner_client to %NULL before unreffing - it. - (destroy): Likewise. - (impl_owner_unset): Likewise. - -2001-10-30 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (e_shell_view_construct): Connect to the - "removed_folder" signal with gtk_signal_connect_while_alive() so - we don't crash if the view gets destroyed. Fixes #13285. - -2001-10-29 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-startup-wizard.c (next_func): If we're not at the end of - the druid list, tell the druid we're going to change the page. - (back_func): Same for going back a page. This way we can properly - synchronise with the druid object and not race with the wizard - object to set the right page. Part of fix for #12127. - -2001-10-29 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component.c (owner_ping_callback): Slightly - change the debugigng message for when the shell has disappeared. - -2001-10-29 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component.c (owner_ping_callback): Remove - ping debugging messages. - -2001-10-29 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (set_interactive): Remove debugging message. - -2001-10-29 Damon Chaplin <damon@ximian.com> - - * Makefile.am (evolution_LDADD): use libical-evolution.la - -2001-10-29 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (e_shell_view_construct): Ref the shell. - (destroy): Unref the shell. - (destroy): Free the delayed_selection. No need to call - `cleanup_delayed_selection()' as the signal handler will have - already be disconnected at this point [as we are using - connect_while_alive()']. - -2001-10-28 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (destroy): Call `cleanup_delayed_selection()' as - there is a slight chance that the callback gets invoked during the - cleanup phase. - (e_shell_view_display_uri): For extra safety, make sure we don't - get invoked on a dead object by connecting the "new_folder" signal - with `e_gtk_signal_connect_full_while_alive()' instead of using - plain `gtk_signal_connect_after()'. - -2001-10-28 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (new_folder_cb): Don't do the - `gtk_signal_disconnect_by_func()' as it's already done in - `cleanup_delayed_selection()'. - (e_shell_view_construct): Set the ->shell member as the first - thing. - (set_current_notebook_page): Add a cast to make the compiler - happy. - (new_folder_cb): Don't set priv->uri before calling - `e_shell_view_display_uri()', because the latter does it anyways, - and also if you set it before calling it, the selection in the - folder tree doesn't get updated properly. - -2001-10-29 <NotZed@Ximian.com> - - * evolution-storage.c (class_init): Set the return type of the - signal handlers to GTK_TYPE_NONE. - -2001-10-28 Ettore Perazzoli <ettore@ximian.com> - - [The following should fix #13802, crash on exit.] - - * evolution-shell-component.c (impl_unsetOwner): Set the ping - timeout ID to -1 when removing the source. - (impl_destroy): Likewise. - (impl_unsetOwner): Remove the timeout before unreffing, not after - unreffing. - -2001-10-28 Jon Trowbridge <trow@ximian.com> - - * e-shell-about-box.c: Distribute credit equally. - -2001-10-27 <NotZed@Ximian.com> - - * evolution-storage.c (impl_Storage_async_xfer_folder): We want - XFER_FOLDER not REMOVE_FOLDER! - -2001-10-26 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-offline-handler.c (prepare_for_offline): Remove - debugging messages. - (finalize_offline_hash_foreach): Likewise. - -2001-10-26 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-offline-handler.c: New member `finished' in - `EShellOfflineHandlerPrivate'. - (finalize_offline): Ref the handler as we might get destroyed - while putting every component offline. - (impl_OfflineProgressListener_updateProgress): Don't emit - ::offline_procedure_finished if ->finished is %TRUE. Also, set it - to %TRUE after emitting the signal. - (cancel_offline): Likewise. - (finalize_offline): Likewise. - (update_dialog_clist): Guard against NULL ->dialog_gui. - -2001-10-26 Ettore Perazzoli <ettore@ximian.com> - - * evolution-storage.c (impl_Storage_async_xfer_folder): Implement. - (class_init): Add the signal "xfer_folder" signal. - - * evolution-storage.h: New signal "xfer_folder". - -2001-10-26 Ettore Perazzoli <ettore@ximian.com> - - * e-corba-storage.c - (async_xfer_folder): New, implementation for the - ::async_xfer_folder method. - (class_init): Install it. - -2001-10-26 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (destroy): Set ->is_initialized to %FALSE. - (e_shell_unregister_all): Same here. - -2001-10-26 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-importer.c (prepare_intelligent_page): - gtk_widget_show_now() the dialog. - * e-shell-startup-wizard.c (prepare_importer_page): Likewise. - -2001-10-26 Ettore Perazzoli <ettore@ximian.com> - - * main.c (quit_box_new): Use gtk_widget_show_now() so the stupid - dialog hopefully displays all the time. - -2001-10-26 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (set_current_notebook_page): Clear the folder bar - label to be empty. [#12553] - -2001-10-26 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-about-box.c (timeout_callback): Draw one more line. - -2001-10-26 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c (command_about_box): Set the GtkWindow - policy so that @allow_shrink, @allow_grow and @auto_shrink are all - %FALSE. - -2001-10-26 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-commands.c (e_shell_command_rename_folder): Don't - allow invalid folder names. [#12027] - - * e-shell-folder-creation-dialog.c (entry_name_is_valid): Removed. - (dialog_clicked_cb): Use `e_shell_folder_name_is_valid()' instead. - - * e-shell-utils.c (e_shell_folder_name_is_valid): New. Sorry I18N - people, it breaks the string freeze slighty. - - * e-component-registry.c (component_free): Add a cast. - (e_component_registry_restart_component): Argh, use the - corba_objref properly in calling `wait_for_corba_object_to_die()'. - -2001-10-25 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c (update_offline_menu_item): Add accelerators - for "Work Offline" and "Work Online". - -2001-10-25 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (update_for_current_uri): Don't allow translators - to translate "Ximian Evolution". - -2001-10-25 Ettore Perazzoli <ettore@ximian.com> - - * e-component-registry.c (wait_for_corba_object_to_die): New - helper function. - (e_component_registry_restart_component): Use it. - (component_free): Call it to wait for the unowned object to die. - -2001-10-25 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (impl_Shell_selectUserFolder): Handle failure from - XGetClassHint properly. Also, free res_name and res_class in case - of success. Fixes #13554. - -2001-10-25 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (etree_icon_at): Don't display an icon for - storages that have subfolders. - -2001-10-25 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-importer.c: #include "e-util/e-gtk-utils.h". - - * e-shell-folder-creation-dialog.c - (e_shell_show_folder_creation_dialog): Constify a local variable - to placate a warning. - - * e-activity-handler.c (task_widget_cancel_callback): #if 0'ed - out. - - * evolution-shell-component-client.c - (evolution_shell_component_client_new): Remove unused variable - `ior'. - -2001-10-25 Ettore Perazzoli <ettore@ximian.com> - - * e-activity-handler.c (impl_destroy): Set ->priv to NULL. - (impl_operationStarted): Check for priv not being NULL. - (impl_operationProgressing): Likewise. - (impl_operationFinished): Likewise. - (impl_requestDialog): Likewise. - -2001-10-25 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-startup-wizard.c (make_mail_dialog_pages): Set the - ->mailer to be CORBA_OBJECT_NIL in case of an exception, otherwise - the caller will not realize about the problem. - -2001-10-25 Ettore Perazzoli <ettore@ximian.com> - - * evolution-wizard.c (evolution_wizard_set_buttons_sensitive): - Don't use __FUNCTION__. - (evolution_wizard_set_show_finish): Likewise. - (evolution_wizard_set_page): Likewise. - - * e-shell-startup-wizard.c (make_mail_dialog_pages): Do not use - __FUNCTION__ and __LINE__. This breaks the string freeze, but the - old way made Evolution non-compilable with non-GNU compilers. - -2001-10-24 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-about-box.c: Add a few names to the box. - -2001-10-24 Dan Winship <danw@ximian.com> - - * evolution-storage.c (evolution_storage_new_folder): - g_return_if_fail if the display_name is NULL. "Fixes" 11182 - although there may be a few more cases lying around that pass - NULLs in. - -2001-10-24 Ettore Perazzoli <ettore@ximian.com> - - * main.c (quit_box_new): Set the WMClass of the quit dialog to be - different from the default one in an attempt to fix #13441. - -2001-10-24 Ettore Perazzoli <ettore@ximian.com> - - * e-local-storage.c (storage_result_from_component_result): New. - (async_xfer_folder_callback): Use it so we get the right error - message. - (async_xfer_folder_complete): New arg @success. Don't remove the - directory and the metadata if @success is %FALSE. - -2001-10-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-commands.c (rename_callback_data_new): Get the - path and the shell view instead. - (rename_callback_data_free): Updated accordingly. - (rename_cb): Set the name on the folder based on the path, not the - actual object [as the old object gets unreffed -- of course]. - -2001-10-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-commands.c (rename_callback_data_new): New. - (rename_callback_data_free): New. - (rename_cb): Rename the folder here. - (e_shell_command_rename_folder): Don't rename the EFolder here. - -2001-10-23 Ettore Perazzoli <ettore@ximian.com> - - * e-local-storage.c (async_xfer_folder_callback): Handle the - return codes properly, and invoke the result callback too. - -2001-10-23 Ettore Perazzoli <ettore@ximian.com> - - * e-activity-handler.c (show_cancellation_popup): #if 0'ed for - now, per #7427. - -2001-10-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (storage_set_removed_folder_callback): Explicitly - deactivate the control frame, and display the default URI before - destroying the dead one. - - * e-shell.c (e_shell_component_maybe_crashed): If the URI is of a - folder that doesn't exist anymore, don't assume that the - corresponding component has crashed. Also, try pinging the - component first; if the component responds, don't pop up the - dialog. - -2001-10-22 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c (command_open_folder_in_new_window): No need - to gtk_widget_show() the view anymore. - - * e-shell-view.c (activate_shortcut_cb): No need to - gtk_widget_show() the view anymore. - - * e-shell.c (impl_Shell_createNewView): Don't explicitly show the - new view. - (e_shell_create_view): gtk_widget_show() the new view and flush - the GTK+ event loop before sending the ::interactive notification. - (create_view): New helper function. - (e_shell_create_view): Use it. - (e_shell_create_view_from_settings): New. - (e_shell_restore_from_settings): Use - `e_shell_create_view_from_settings()'. - -2001-10-22 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c (command_open_folder_in_new_window): Don't - explicitly show the new view. - -2001-10-22 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component.c (impl_unsetOwner): Remove the ping - timeout. - -2001-10-22 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (impl_Shell_selectUserFolder): Don't die if the parent - window has no WMHints. - -2001-10-22 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (show_existing_view): If the view is dead, just - return FALSE. Prevents crash #12483. - -2001-10-22 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c: New member `is_interactive' in `EShellPrivate'. - (init): Init to %FALSE. - (set_interactive): New. - (e_shell_create_view): Make interactive. - (view_destroy_cb): If no views are left, make non-interactive. - - * evolution-shell-component.c (class_init): Set up the - "interactive" signal. - (impl_interactive): New implementation for the ::interactive - method. - (class_init): Install. - - * evolution-shell-component.h: New signal `interactive'. - - * Evolution-ShellComponent.idl: New method ::interactive. - -2001-10-19 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (tree_drag_data_received): Pass the - @folder_type to ::handleDrop. - - * evolution-shell-component-dnd.c - (impl_GNOME_Evolution_ShellComponentDnd_DestinationFolder_handleMotion): - New arg @folder_type. - (impl_GNOME_Evolution_ShellComponentDnd_DestinationFolder_handleDrop): - Likewise. - - * evolution-shell-component-dnd.h: Add @folder_type to - `DndDestinationFolderHandleDropFn' and - `DndDestinationFolderHandleMotionFn'. - - * e-storage-set-view.c (tree_drag_motion): Pass the folder type to - `::handleMotion'. - - * Evolution-ShellComponentDnd.idl: Pass @folder_type in - ::handleDrop and ::handleMotion. - -2001-10-19 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c (command_about_box): Use EShellAboutBox. - (zero_pointer): Removed. - - * e-shell-about-box.h: New. - * e-shell-about-box.c: New. - -2001-10-18 Ettore Perazzoli <ettore@ximian.com> - - * Makefile.am (evolution_SOURCES): Ooops. Remove stale files - `e-shell-about-box.[ch]'. - -2001-10-17 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (impl_Shell_selectUserFolder): Set the parent - according to the XID we get. - - * Evolution-Shell.idl: New arg @parent_xid in `::selectUserFolder'. - - * evolution-shell-client.c - (evolution_shell_client_user_select_folder): New arg @parent. - (user_select_folder): Likewise. Pass it to the CORBA method. - -2001-10-17 Ettore Perazzoli <ettore@ximian.com> - - * main.c (idle_cb): Urgh. Remove stale line that caused - `display_default' to be set to TRUE for all the non-NULL shell - cases. - -2001-10-17 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (set_owner_on_components): Re-set the owner on the - component that raised OldOwnerHasDied. - -2001-10-15 Iain Holmes <iain@ximian.com> - - * e-shell-startup-wizard.c (prepare_importer_page): Stop the prepare - running twice. - -2001-10-14 Dan Winship <danw@ximian.com> - - * e-corba-storage.c (async_folder_cb): - * e-storage.c (e_storage_result_to_string): Add two missing codes. - -2001-10-13 Dan Winship <danw@ximian.com> - - * evolution-shell-component-utils.c (e_activation_failure_dialog): - New function to try to activate a component when you know it's - going to fail, and then pop up a dialog explaining why it failed. - -2001-10-12 Iain Holmes <iain@ximian.com> - - * e-shell-importer.c (prepare_intelligent_page): Flush the gdk - functions so that the window will be shown. - - * e-shell-startup-wizard.c (make_mail_dialog_pages): Fix some - strings. - (prepare_importer_page): Flush GDK functions so that the window - is shown. - -2001-10-12 Ettore Perazzoli <ettore@ximian.com> - - [Fix #7643, Starting new view doesn't honor "view" settings.] - - * e-shell-view-menu.c (command_open_folder_in_new_window): Pass - the parent @shell_view as the @template_view arg to - `e_shell_create_view()' - - * e-shell-view.c (activate_shortcut_cb): Pass the _view as the - @template_view arg to `e_shell_create_view()'. - - * e-shell-folder-commands.c - (e_shell_command_open_folder_in_other_window): Pass the parent - @shell_view as the @template_view arg to `e_shell_create_view()'. - - * e-shell.c (e_shell_create_view): New arg @template_view. - (impl_Shell_createNewView): Pass %NULL as @template_view when - calling it. - (e_shell_restore_from_settings): Likewise. - -2001-10-12 Ettore Perazzoli <ettore@ximian.com> - - * main.c (quit_box_new): Also flush GDK after flushing GTK. - Otherwise GTK might queue draw requests to X that don't get - executed. - -2001-10-12 Ettore Perazzoli <ettore@ximian.com> - - [Hopefully really fix #8615 and friends.] - - * main.c (no_views_left_cb): Invoke `e_shell_disconnect_db()' - before unreffing the shell. - - * e-shell.c (e_shell_disconnect_db): New. - (destroy): Call it instead of unreffing the db manually here. - -2001-10-12 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-commands.c - (folder_selection_dialog_folder_selected_callback): Don't free the - folder_command_data here. It is supposed to be freed in the async - callback. The leak that Dan supposedly fixed was probably only - due to the fact that the component that was supposed to perform - the xfer didn't report a result. Now that xfer actually works, it - was triggering the crash instead. [Fixes #9769.] - -2001-10-12 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-offline-handler.c (prepare_for_offline): Only invoke - `progress_listener_servant_free()', no need to also do `__fini()' - on it as `__fini()' is also called by the former. [Fixes #12329.] - Also, print out the CORBA exception that gets raised so we have - some more clues about what is wrong. - -2001-10-11 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c - (reparent_storage_set_view_box_and_destroy_popup): Don't die if - the folder_bar_popup is %NULL. Fixes #10922. - -2001-10-11 Ettore Perazzoli <ettore@ximian.com> - - * main.c (idle_cb): Display the default view only if we are - starting our own shell, or if the command-line has no arguments - and we are talking to an already existing shell. - - * e-uri-schema-registry.c - (e_uri_schema_registry_set_handler_for_schema): Do not return a - value. - -2001-10-11 Dan Winship <danw@ximian.com> - - * Evolution-Storage.idl: Remove "display_name" arg from update - methods. It was only there to do the "Inbox (5)" hack, which is - supported directly now. - - * evolution-storage.c (impl_Storage_updateFolder): no longer takes - display_name. - (evolution_storage_update_folder, - evolution_storage_update_folder_by_uri): Likewise. - (class_init): Update signal signature. - - * evolution-storage-listener.c - (impl_GNOME_Evolution_StorageListener_notifyFolderUpdated): No - longer takes display_name, but make it pass the unread_count along - in the signal it emits. - (class_init): Update signal signature. - - * e-local-storage.c (bonobo_interface_update_folder_cb): - * e-corba-storage.c (impl_StorageListener_notifyFolderUpdated): No - longer take display_name. - -2001-10-10 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (handle_evolution_path_drag_motion): Ooops, - remove debugging message. - -2001-10-10 Ettore Perazzoli <ettore@ximian.com> - - * e-storage.c (e_storage_async_xfer_folder): Make this a no-op if - the source and the destination path are the same. - - * e-local-storage.c (impl_async_xfer_folder): return after - returning `E_STORAGE_CANTCHANGESTOCKFOLDER' to the callback. - - * e-storage-set-view.c (handle_evolution_path_drag_motion): Make - the check for dragging a folder over itself a little bit more - accurate. - -2001-10-05 Jon Trowbridge <trow@ximian.com> - - * e-shell-view-menu.c (command_work_offline): This is a message, - not a warning! - (command_work_online): This is also a message, not a warning! - (I'm feeling very anal today.) - -2001-10-05 Ettore Perazzoli <ettore@ximian.com> - - * main.c (idle_cb): Do not invoke - `e_shell_restore_from_settings()' if `shell' is NULL. - -2001-10-05 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (e_shell_view_save_settings): Get the right - hpaned positions for when the shortcut bar and/or the folder bar - are visible. - -2001-10-05 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (impl_Shell_handleURI): Handle the return value from - `evolution_shell_component_client_handle_external_uri()' as an - EvolutionShellComponentClientResult instead of treating it as a - boolean. This prevents the incorrect NotFound exceptions we were - getting for `mailto:' invocations. - -2001-10-05 Ettore Perazzoli <ettore@ximian.com> - - * main.c (quit_box_new): Also `gdk_flush()'. - (idle_cb): If the user doesn't specify at least one `evolution:' - URI, restore from the settings. [Fixes #6093.] - -2001-10-05 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component.c: New member `ping_timeout_id' in - `EvolutionShellComponentPrivate'. - (setup_owner_pinging): New helper function. - (impl_owner_died): Unref the owner and set ->owner_client to - %NULL. - (impl_setOwner): Don't unref here. - (destroy): Remove the source for ->ping_timeout_id if not -1. - -2001-10-05 Ettore Perazzoli <ettore@ximian.com> - - * main.c: #include "e-util/e-gtk-utils.h". - (quit_box_new): Queue a draw on the window; otherwise it seems to - fail to redraw in some cases for some reason [see #11412]. - -2001-10-05 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component.c (impl_setOwner): If the owner is - dead, emit "owner_died" instead of "owner_unset". - (impl_owner_died): New, default implementation for "owner_died". - (class_init): Install it. - - * evolution-shell-component.h: New signal "owner_died". - -2001-10-05 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (set_owner_on_components): If setting the owner fails, - print the a warning message out. Then restart the component. - - * e-component-registry.c (component_free): Return a boolean value. - %FALSE if ::unsetOwner raises an exception. - (register_type): New arg @override_duplicate, to avoid complaining - if a component gets re-registered. - (register_component): Likewise. - (e_component_registry_restart_component): New. - - * e-uri-schema-registry.c - (e_uri_schema_registry_set_handler_for_schema): Changed return - type to `void'. Just remove the old handler and set up the new - one. - - * evolution-shell-component-client.c (corba_exception_to_result): - Translate ::OldOwnerHasDied into - EVOLUTION_SHELL_COMPONENT_OLDOWNERHASDIED. - - * evolution-shell-component.h: New enum value - `EVOLUTION_SHELL_COMPONENT_OLDOWNERHASDIED'. - - * evolution-shell-component.c (impl_setOwner): If the old owner is - not alive anymore [use CORBA_Object_non_existent() to figure this - out], emit OWNER_UNSET and raise `OldOwnerHasDied'. - (evolution_shell_component_result_to_string): New. - - * Evolution-ShellComponent.idl: New exception `OldOwnerHasDied'. - (ShellComponent::setOwner): Can raise it. - - * e-folder-type-registry.c - (e_folder_type_register_type_registered): New. - (e_folder_type_register_unregister_type): New. - -2001-10-04 Rodrigo Moya <rodrigo@ximian.com> - - * importer/Makefile.am: added BONOBO_GNOME_CFLAGS to make it compile - with latest Bonobo - -2001-10-02 Ettore Perazzoli <ettore@ximian.com> - - [Fix #11326, The folder list can become detached from its parent - window.] - - * e-shell-view.c (folder_context_menu_popped_down_cb): Pop down - the folder bar if it's popped up. - -2001-10-02 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (e_shell_component_maybe_crashed): Make the crash - message less dorky. [#10264] - -2001-10-02 Ettore Perazzoli <ettore@ximian.com> - - [Don't allow dragging from a folder to one of its descendants or - onto itself, when the operation is GDK_DRAG_MOVE. This fixes bugs - like #8737.] - - * e-storage-set-view.c (handle_evolution_path_drag_motion): Don't - highlight if the user is attempting to move a folder to one of its - descendants. - -2001-10-02 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (e_shell_view_construct): Use - `bonobo_ui_component_new_default()', not - `bonobo_ui_component_new()'. - -2001-10-02 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (storage_set_removed_folder_callback): New, - callback for the ::removed_folder signal on the shell's - EStorageSet. - (e_shell_view_construct): Connect. - (e_shell_view_remove_control_for_uri): Removed. - - * e-shell-folder-commands.c - (folder_selection_dialog_folder_selected_callback): Don't call - `e_shell_view_remove_control_for_uri()'. - (e_shell_command_delete_folder): Not here either. And don't - display the default URI either. - -2001-09-28 Ettore Perazzoli <ettore@ximian.com> - - [Fix #8053, `GNOME_Evolution_Shortcuts' doesn't seem to work.] - - * e-shell.c (e_shell_construct): Don't create the EShortcuts - object a second time. - -2001-09-28 Ettore Perazzoli <ettore@ximian.com> - - [Fix #8434, Shortcut bar not shown properly.] - - * e-shell-view.c (e_shell_view_show_shortcut_bar): Set the - hpaned_position from the EPaned *before* hiding it -- otherwise, - the position will of course always be zero. - (e_shell_view_save_settings): Save from ->hpaned_position and - ->view_hpaned_position. - -2001-09-28 Iain Holmes <iain@ximian.com> - - * importer/import.glade: Add new pages. - - * e-shell-importer.c (show_import_wizard): Set up new pages. - (import_druid_finish): Check which type of importer to run. - -2001-09-26 Iain Holmes <iain@ximian.com> - - * Evolution-Shell.idl: Added a default_type parameter for setting the - default folder creation type. - - * e-shell-folder-commands.c (e_shell_command_create_new_folder): Add NULL - for default type. - (e_shell_command_move_folder): Add NULL for default type. - - * e-shell-folder-creation-dialog.c (add_folder_types): Check for the - default_type instead of for mail. - (get_type_from_parent_path): Get the folder type from the parent folder - (e_shell_show_folder_creation_dialog): Get the default folder type - before creating the menu. - - * e-shell-folder-creation-dialog.h: Update headers. - - * e-shell-folder-selection-dialog.c (impl_clicked): Add default type. - (e_shell_folder_selection_dialog_construct): Add default type. - (e_shell_folder_selection_dialog_new): Add default type. - - * e-shell-folder-selection-dialog.h: Update headers. - - * e-shell-importer.c (import_druid_finish): Add NULL for default type. - - * e-shell-view-menu.c (command_new_folder): Set NULL for default type. - (command_goto_folder): Set NULL for default type. - - * e-shell.c (impl_Shell_selectUserFolder): Update for the new default - type. - - * evolution-shell-client.c (user_select_folder): Add "" for default type - -2001-09-27 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c (DEFINE_UNIMPLEMENTED): Remove. - (command_new_mail_message): Removed. - (command_pilot_settings): New. - (e_shell_view_menu_setup): Add tools verbs. - -2001-09-26 Ettore Perazzoli <ettore@ximian.com> - * e-shell-view.c (setup_verb_sensitivity_for_folder): New helper - function. - (folder_selected_cb): Call it. - (folder_context_menu_popping_up_cb): New callback for the - "folder_context_menu_popping_up" signal on the folder bar's - EStorageSetView; set the sensitivities of the verbs according to - the right-clicked folder. - (folder_context_menu_popped_down_cb): New, callback for the - "folder_context_menu_popped_down" signal on the folder bar's - EStorageSetView; set the sensitivities of the verbs according to - the currently displayed folder. - (e_shell_view_get_folder_bar_right_click_path): Add a cast to - placate a warning. - - * e-storage-set-view.c (class_init): Set up the - "folder_context_menu_popping_up" and - "folder_context_menu_popped_down" signals. - (right_click): Emit "folder_context_menu_popping_up" before - popping up the menu, "folder_context_menu_popped_down" after the - menu is gone. - - * e-storage-set-view.h: New signals - "folder_context_menu_popping_up" and - "folder_context_menu_popped_down". - -2001-09-25 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-commands.c (e_shell_command_rename_folder): - Change the name on the EFolder object too. - -2001-09-25 Ettore Perazzoli <ettore@ximian.com> - - * e-storage.c (e_storage_async_xfer_folder): Ooops. Make the - check for CANTMOVETODESCENDANT really work. - - * e-storage-set-view.c (tree_drag_data_received): Pass the - EStorageSetView as the data for the async_xfer function. - (folder_xfer_callback): Display an error dialog if something goes - wrong. - - * e-shell-view-menu.c (command_rename_folder): Enable again. - - * e-shell-folder-commands.c (e_shell_command_rename_folder): - Re-implemented. - (delete_dialog): Use double quotes instead of single quotes around - the folder name, for consistency with the other dialogs. - -2001-09-25 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c (get_path_for_folder_op): New helper - function. - (command_move_folder): Pass the @folder_path argument to - `e_shell_command_move_folder' by using it. - (command_copy_folder): Pass the @folder_path argument to - `e_shell_command_copy_folder' by using it. - (command_delete_folder): Pass the @folder_path argument to - `e_shell_command_delete_folder()' by using it. - (command_add_folder_to_shortcut_bar): Pass the @folder_path - argument to `e_shell_command_add_to_shortcut_bar()' by using it. - (command_create_folder): Pass the @parent_folder_path argument to - `e_shell_command_create_new_folder()' by using it. - (command_new_folder): Use `get_path_for_folder_op()'. - - * e-shell-folder-commands.c (e_shell_command_add_to_shortcut_bar): - New arg @folder_path. - (e_shell_command_copy_folder): New arg @folder_path. - (e_shell_command_move_folder): New arg @folder_path. - (e_shell_command_open_folder_in_other_window): New arg @folder_path. - (e_shell_command_create_new_folder): New arg @parent_folder_path. - (e_shell_command_delete_folder): New arg @folder_path. - - * e-shell-view.c (e_shell_view_get_folder_bar_right_click_path): New. - - * e-storage-set-view.c: New member `right_click_row_path'. - (init): Init to NULL. - (destroy): Free. - (right_click): Set. - (popup_folder_menu): Use `gnome_popup_menu_do_popup_modal()' so we - are stuck in here until the menu disappears. After that, destroy - the menu and call `e_tree_right_click_up()'. - (e_storage_set_view_get_right_click_path): New. - -2001-09-21 Iain Holmes <iain@ximian.com> - - * e-shell-importer.c (folder_selected): Use GNOME functions to get - full expanded path from file entry. - -2001-09-20 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (tree_drag_motion): Check for a component - for the given row *after* trying to handle - EVOLUTION_PATH_TARGET_TYPE. Otherwise, we always fail in the case - of dnd between a folder and the toplevel node of its storage. - (find_matching_target_for_drag_context): If not on a folder, - always return EVOLUTION_PATH_TARGET_TYPE. - -2001-09-20 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (storage_set_view_box_event_cb): Removed. - (folder_bar_popup_map_callback): Don't connect. - (reparent_storage_set_view_box_and_destroy_popup): Don't ungrab - here. - (popdown_transient_folder_bar): Ungrab here. - (popdown_transient_folder_bar_idle): New. - (switch_on_folder_tree_click): Invoke it in the idle loop. Also, - ungrab. - -2001-09-20 Iain Holmes <iain@ximian.com> - - * e-shell-startup-wizard.c (e_shell_startup_wizard_create): Check - the number of mail accounts that exist and display the dialog it this - is 0. - -2001-09-19 Ettore Perazzoli <ettore@ximian.com> - - * e-task-widget.c: New member `tooltips' in `ETaskWidgetPrivate'. - (init): Init to NULL. - (e_task_widget_construct): Create a GtkTooltips and make - `tooltips' point to it. - (e_task_widget_update): Set the tooltip for the label too. - -2001-09-19 Ettore Perazzoli <ettore@ximian.com> - - * evolution-test-component.c: Removed globals `activity_client', - `progress'. - (timeout_callback_3): Get the activity client from @data. - (timeout_callback_2): Likewise here. Pass the activity client as - the user data pointer for `gtk_timeout_add()'. Put the progress - count in a "my_progress" GtkObject data key. - (timeout_callback_1): Pass the newly created EActivityClient as - the user data pointer for `gtk_timeout_add()'. Also, dispatch - itself again with a random timeout delay, for a maximum of - NUM_ACTIVITES times. Initialize the "my_progress" GtkObject data - to be -1. - - [Lame hack to reduce the number of parallel operations reported by - the same component displayed in the task bar.] - - * e-activity-handler.c: New member `component_id' in - `ActivityInfo'. - (activity_info_new): New arg @component_id. Init the - `component_id' member accordingly. - (activity_info_free): Free the `component_id' member. - (impl_operationStarted): Pass the component_id to - `activity_info_new()'. - (task_widget_new_from_activity_info): Pass the component_id to the - activity_info. - - * e-task-widget.c: New member `component_id' in - `ETaskWidgetPrivate'. - (impl_destroy): Free it. - (init): Init to NULL. Also init all the other members to NULL as - well. - (e_task_widget_construct): New arg @component_id. Assign - ->component_id to match it. - (e_task_widget_new): New arg @component_id here as well. Pass it - over to `e_task_widget_construct()'. - (e_task_widget_get_component_id): New. - -2001-09-18 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (handle_evolution_path_drag_motion): New - arg @row. Highlight that row. - (tree_drag_motion): Pass @row to - `handle_evolution_path_drag_motion()'. - -2001-09-18 Ettore Perazzoli <ettore@ximian.com> - - * e-splash.c: #include "e-gtk-utils.h". - -2001-09-18 Ettore Perazzoli <ettore@ximian.com> - - * e-splash.c (e_splash_construct): Make the canvas backing stored. - -2001-09-17 Ettore Perazzoli <ettore@ximian.com> - - * main.c (quit_box_new): Call `e_make_widget_backing_stored()' on - the widget so it refreshes properly even when we are busy waiting - on CORBA calls. - -2001-09-17 Ettore Perazzoli <ettore@ximian.com> - - * main.c (quit_box_new): New. - (quit_box_destroyed_callback): New. - (no_views_left_cb): Use these two functions to display a warning - message when Evolution is quitting. - -2001-09-17 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (impl_Shell_getLocalStorage): Only raise NotReady if - the local storage pointer is actually NULL. This way it is - possible for the components to access the local storage during - initialization even if the shell is not quite finished - initializing yet. - -2001-09-17 Ettore Perazzoli <ettore@ximian.com> - - [Fix #9060, Shell crash after mailer crash.] - - * e-shell-view.c (hash_foreach_destroy_view): Renamed from - `hash_forall_destroy_view'. Don't free `name'. - (socket_destroy_cb): Use `g_hash_table_lookup()' instead of - `g_hash_table_lookup_extended()'. Don't free the URI. - (e_shell_view_remove_control_for_uri): Likewise. - (show_existing_view): Use view->uri as the key when inserting the - view. Remove the old view from the hash when destroying it. - (create_new_view_for_uri): Same here. - -2001-09-16 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (e_shell_view_show_folder_bar): Hide the - storage_set_view_box *before* getting the child1_size [otherwise, - the latter will, um, always be zero]. - -2001-09-16 Christopher James Lahey <clahey@ximian.com> - - * e-storage-set-view.c (etree_get_node_by_id): Made save_id const - here. - -2001-09-14 Ettore Perazzoli <ettore@ximian.com> - - [Automake 1.5 fixes pointed out by Richard Boulton - <richard@tartarus.org>, as per #9258.] - - * importer/Makefile.am (CLEANFILES): Assign directly using `=', - instead of `+='. - * Makefile.am (CLEANFILES): Likewise. - -2001-09-14 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (impl_Shell_getLocalStorage): Return a proper value. - (impl_Shell_createStorageSetView): Likewise. - (impl_Shell_setLineStatus): Likewise. - (impl_Shell__get_displayName): Likewise. - (impl_Shell_getComponentByType): Likewise. - (impl_Shell_createNewView): Likewise. - (impl_Shell_handleURI): Likewise. - -2001-09-14 Iain Holmes <iain@ximian.com> - - * e-shell-importer.c (start_import): Only check for local path if the - folderpath != NULL. - - * e-shell-startup-wizard.c (prepare_importer_page): Remove GTK_CLIST - cast. - -2001-09-12 Iain Holmes <iain@ximian.com> - - * evolution-wizard.c: Remove spewage. - -2001-09-14 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-importer.c (start_import): Removed unused variable. - -2001-09-14 Ettore Perazzoli <ettore@ximian.com> - - [Fix #8204 and the other bugs caused by allowing invocations on - the ::Shell interface to happen before the shell is actually fully - initialized. This is a lame hack and not a nice, complete - solution for the problem, but it should do for now.] - - * e-shell.c: New member `is_initialized' in `EShellPrivate'. - (init): Initialize to %FALSE. - (e_shell_construct): Set `is_initialized' to %TRUE after the - initialization sequence is finished. - (raise_exception_if_not_ready): New utility function to raise the - notReady exception if the shell is not ready. - (impl_Shell__get_displayName): Call it. - (impl_Shell_getComponentByType): Likewise. - (impl_Shell_createNewView): Likewise. - (impl_Shell_handleURI): Likewise. - (impl_Shell_selectUserFolder): Likewise. - (impl_Shell_getLocalStorage): Likewise. - (impl_Shell_createStorageSetView): Likewise. - (impl_Shell_setLineStatus): Likewise. - (e_shell_construct): Print out the repo_id of the exception from - `bonobo_get_object()' if it fails. Also, register on OAF just - before displaying the splash. - - * Evolution-Shell.idl: New exception `NotReady'. All the CORBA - methods on ::Shell can now raise this exception. - -2001-09-13 Ettore Perazzoli <ettore@ximian.com> - - [Fix #5990, Remembering Evolution window geometry.] - - * e-shell.c (impl_Shell_createNewView): gtk_widget_show() the new - view returned by `e_shell_create_view()'. - (e_shell_restore_from_settings): Same here, after loading the - settings. - - * e-shell-view.c (activate_shortcut_cb): gtk_widget_show() the new - view returned by `e_shell_create_view()'. - - * e-shell-view-menu.c (command_open_folder_in_new_window): - gtk_widget_show() the view returned by `e_shell_create_view()'. - - * e-shell-folder-commands.c - (e_shell_command_open_folder_in_other_window): gtk_widget_show() - the view returned by `e_shell_create_view()'. - - * e-shell.c (e_shell_create_view): Don't show the view - automatically anymore. - - * e-shell-view.c (e_shell_view_save_settings): Save the width and - height of the window. - (e_shell_view_load_settings): Restore the width and the height and - gtk_window_set_default_size() based on them. - -2001-09-13 Ettore Perazzoli <ettore@ximian.com> - - [Remove a bunch of debugging messages, as per #7741.] - - * evolution-wizard.c (impl_GNOME_Evolution_Wizard_notifyAction): - Removed debugging messages. - - * e-storage-set.c (storage_removed_folder_cb): Removed debugging - message. - - * e-storage-set-view.c (tree_drag_begin): Removed debugging - message. - (tree_drag_data_received): Removed debugging messages. - - * e-shortcuts.c (idle_cb): Removed debugging message. - - * e-shortcuts-view-model.c (get_icon_for_item): Removed debugging - message. - - * e-shell.c (setup_components): Removed debugging message. - - * e-shell-startup-wizard.c (druid_event_notify_cb): Removed - debugging message. - (e_shell_startup_wizard_create): Removed debugging message. - - * e-shell-offline-handler.c (finalize_offline_hash_foreach): - Removed debugging message. - - * e-shell-importer.c (start_import): Removed debugging message. - (item_selected): Same here. - - * e-local-storage.c (async_xfer_folder_step): Removed debugging - message. - - * e-corba-storage.c (impl_StorageListener_notifyFolderCreated): - Changed the error from a g_print() into a g_warning(). Removed - debugging message. - - * e-corba-storage-registry.c (impl_StorageRegistry_addStorage): - Removed debugging message. - (impl_StorageRegistry_removeStorageByName): Likewise. - - * e-component-registry.c (component_free): Removed debugging - message. - (register_component): Don't printf() about the registered folder - type. - (register_component): Don't printf() about the registered schema - type. - -2001-09-13 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (pop_up_folder_bar): Disable DnD on the - EStorageSetView to avoid strange behaviors. - (reparent_storage_set_view_box_and_destroy_popup): Re-enable DnD - here. - (popdown_transient_folder_bar): And here as well. - - * evolution-storage-set-view-factory.c - (evolution_storage_set_view_factory_new_view): Disable DnD on the - EStorageSetView. - - * e-shell-folder-selection-dialog.c - (e_shell_folder_selection_dialog_construct): Disable DnD on the - EStorageSetView. - - * e-shell-folder-creation-dialog.c (add_storage_set_view): Disable - DnD on the EStorageSetView. - - * e-storage-set-view.c: New member `allow_dnd' in - `EStorageSetViewPrivate'. - (init): Init to `allow_dnd' %TRUE. - (tree_start_drag): If `allow_dnd' is false, don't start the drag - and return %FALSE. - (tree_drag_motion): If `allow_dnd' is false, return %FALSE. - (e_storage_set_view_get_allow_dnd): New. - (e_storage_set_view_set_allow_dnd): New. - -2001-09-12 Ettore Perazzoli <ettore@ximian.com> - - * main.c (main): Add SUB_VERSION to the version string passed to - `gnome_init_with_popt_table()'. - -2001-09-12 Chris Toshok <toshok@ximian.com> - - * e-shell-importer.c (start_import): only allow importing to - /local folders. - -2001-09-12 Ettore Perazzoli <ettore@ximian.com> - - [Fix #4962, "Highlighting is left after a drag".] - - * e-storage-set-view.c (tree_drag_motion): Only highlight when - moving over allowed targets. - -2001-09-12 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-title-bar.c (unrealize): Only - gtk_widget_destroy() the icon_widget if it's not NULL. - -2001-09-12 Iain Holmes <iain@ximian.com> - - * importers/evolution-importer-client.c - (evolution_importer_client_process_item): Remove spew. - -2001-09-10 Dan Winship <danw@ximian.com> - - * e-shell-view.c (socket_destroy_cb): Oops. Remove duplicate free. - -2001-09-09 Dan Winship <danw@ximian.com> - - Purify run. All small leaks. - - * e-shell-folder-commands.c - (folder_selection_dialog_folder_selected_callback): Free the - folder_command_data when destroying the dialog. - - * e-local-storage.c (remove_folder): Free physical_uri if we - allocated it. - - * e-shortcuts-view.c (pop_up_right_click_menu_for_group): Unref - the popup menu, don't destroy it. - (destroy_group_cb): Free the question string. - (rename_group_cb): Free the new_name. - - * e-shell-importer.c (create_plugin_menu): Free the list of - importers. - (get_iid_for_filetype): Likewise. - (import_druid_finish): #ifdef out some g_strdups that are only - used by other #ifdef'ed-out code. - - * e-shell-view.c: Make sure the keys in the uri_to_view hash get - freed. - - * e-shell-folder-title-bar.c (set_title_bar_label_style): Unref - the style after setting it on the widget. - - * e-shell-offline-handler.c (impl_destroy): free priv. - - * e-storage-set-view.c (tree_drag_data_received): Make sure - target_type always gets freed. - - * e-shell-folder-creation-dialog.c (add_folder_types): Don't leak - the type names. - -2001-09-07 Iain Holmes <iain@ximian.com> - - * e-shell-startup-wizard.c (prepare_importer_page): New design. - (make_importer_page): Remove the extra widgets for the new design. - -2001-09-07 Christopher James Lahey <clahey@ximian.com> - - * e-storage-set-view.c (tree_start_drag): Changed this to use the - new ETable/ETree drag stuff. - -2001-09-07 Dan Winship <danw@ximian.com> - - * evolution-shell-component-client.c - (evolution_shell_component_client_new): Remove the "see previous - error messages?" comment from the error message when starting a - component, since oafd eats the output of the components it - launches now, so it's just misleading. - -2001-09-06 Chris Toshok <toshok@ximian.com> - - * evolution-storage.c (impl_Storage_async_remove_folder): change - to match create_folder. - (e_marshal_NONE__POINTER_POINTER_POINTER): new marshaller for - remove_folder. - (class_init): make sure to use the right marshaller for - create/remove_folder. - - * evolution-storage.h: change the signature of both the - create_folder and remove_folder signals to be more in line with - what's in evolution-storage.c. They both take a Bonobo_Listener - which the signal func notifies, instead of synchronously returning - the result. - -2001-09-06 Ettore Perazzoli <ettore@ximian.com> - - * evolution-activity-client.c (evolution_activity_client_update): - Allow a value of -1.0 for @progress [which means "unknown - progress"]. - -2001-09-05 Ettore Perazzoli <ettore@ximian.com> - - [Fix #958, ShellComponents should not be created by factories, for - the test component.] - - * GNOME_Evolution_TestComponent.oaf: Remove the factory. - - * evolution-test-component.c (COMPONENT_FACTORY_ID): Removed. - (component_factory_init): Removed. - (register_component): Rename from `component_fn'. No args, no - return value. Register the thing on OAF by yourself instead of - using a factory. - -2001-09-05 Ettore Perazzoli <ettore@ximian.com> - - * e-shortcuts-view.c (get_shortcut_info): New. - (get_efolder_from_shortcut): Removed. - (impl_shortcut_dropped): Use `get_shortcut_info()' instead. - -2001-09-05 Ettore Perazzoli <ettore@ximian.com> - - * main.c (development_warning): s/Evolution/Ximian Evolution/. - (idle_cb): Likewise. - - * e-splash.c (e_splash_construct): s/Evolution/Ximian Evolution/. - - * e-shell-view.c (e_shell_view_construct): s/Evolution/Ximian - Evolution/. - (update_for_current_uri): Likewise. - (update_offline_toggle_status): Likewise. - - * e-shell-view-menu.c (command_about_box): s/Evolution/Ximian - Evolution/. - -2001-09-04 Ettore Perazzoli <ettore@ximian.com> - - [Fix #6474 and friends, crash when selecting things from the - context activity context menu.] - - * e-activity-handler.c: New member `menu' in struct - `ActivityInfo'. - (activity_info_new): Init to NULL. - (show_cancellation_popup): Set the `menu' member to point to this - newly created pop-up, use `gnome_popup_menu_do_popup_modal()' - instead of `gnome_popup_menu_do_popup()', and set the `menu' - member to NULL when the menu is gone. - (activity_info_free): Destroy `menu' member. - (impl_requestDialog): Return - `GNOME_Evolution_Activity_DIALOG_ACTION_ERROR' instead of nothing. - -2001-09-04 Ettore Perazzoli <ettore@ximian.com> - - [Fix #6971, Default folder should be the Summary.] - - * main.c (idle_cb): s/DEFAULT_URI/E_SHELL_VIEW_DEFAULT_URI/. - - * e-shell.c (e_shell_create_view): - s/DEFAULT_URI/E_SHELL_VIEW_DEFAULT_URI/. - - * e-shell-view.c (socket_destroy_cb): - s/DEFAULT_URI/E_SHELL_VIEW_DEFAULT_URI/. - (e_shell_view_save_settings): Likewise. - - * e-shell-folder-commands.c (e_shell_command_delete_folder): - s/DEFAULT_URI/E_SHELL_VIEW_DEFAULT_URI/. - - * e-shell-view.h (DEFAULT_URI): Rename to - `E_SHELL_VIEW_DEFAULT_URI'. Change from "evolution:/local/Inbox" - to be "evolution:/summary". - -2001-09-04 Ettore Perazzoli <ettore@ximian.com> - - [Fix ^#7675, Crashes trying to empty trash folder.] - - * e-shortcuts.c (e_shortcuts_construct): Use - `gtk_signal_connect_while_alive()' so we don't invoke the - callbacks on dead EShortcuts objects. - -2001-09-04 Iain Holmes <iain@ximian.com> - - * e-shell-importer.c (start_importer): Report errors in a dialog. - -2001-09-04 Ettore Perazzoli <ettore@ximian.com> - - * e-activity-handler.c (impl_operationProgressing): Just ignore - the request if the activity handler has the GTK_OBJECT_DESTROYED() - flag set. This should prevent crashes like #7542 and friends when - the components are not well-behaved enough to respect the Bonobo - refcounting. - (impl_operationStarted): Likewise. - (impl_operationFinished): Likewise. - (impl_requestDialog): Likewise. - -2001-09-04 Iain Holmes <iain@ximian.com> - - * e-shell-importer.c (start_import): Check the file exists before trying - to do anything. - -2001-09-04 Iain Holmes <iain@ximian.com> - - * e-shell.c (e_shell_construct): Make the other components shut down - correctly when the first time dialog is cancelled. - -2001-09-04 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (tree_drag_motion): Remove debugging - message. - (tree_drag_motion): Likewise. - -2001-09-04 Ettore Perazzoli <ettore@ximian.com> - - [Patch from Richard Boulton <richard@tartarus.org> to fix #8497, - "Warning when shutting view: RootNode not found".] - - * e-storage-set-view.c (e_storage_set_view_construct): Add the - root node to the hash. - (e_storage_set_view_set_show_folders): Likewise. - -2001-08-30 Peter Williams <peterw@ximian.com> - - * e-local-storage.c (async_xfer_folder_complete): Remove the folder from - the EvolutionStorage as well as the EStorage. - -2001-08-29 Peter Williams <peterw@ximian.com> - - * e-storage-set-view.c (etree_node_destroy_func): Only call - remove_node_from_hash if it's not the root node. - (removed_storage_cb): Don't remove the node from the hash here, - because it will be removed in the node_destroyed callback. - (removed_folder_cb): Same. - - * e-shell-view.c (e_shell_view_remove_control_for_uri): Disconnect - from the destroy signal so as not to confuse ourselves. Also, the - page remove in the notebook destroys the control and the socket, so don't - do that explicitly. - - * e-shell-folder-commands.c - (folder_selection_dialog_folder_selected_callback): Remove the control - for the source view if we're moving. - -2001-08-31 Zbigniew Chyla <cyba@gnome.pl> - - * e-local-storage.c - (setup_folder_as_stock): Don't convert folder name to UTF-8 manually... - (setup_stock_folders): ... just use U_() here. - (impl_get_display_name): Marked string for translation (with U_). - - * e-storage-set-view.c - (storage_sort_callback): s/strcasecmp/g_utf8_collate/ - (folder_sort_callback): ditto - - * e-summary-storage.c (impl_get_display_name): - Marked string for translation (with U_). - -2001-08-29 Iain Holmes <iain@ximian.com> - - * e-local-storage.c (notify_listener): Function to create CORBAany - and notify listeners. - (component_async_create_folder_callback): Notify the listener again. - (create_folder): Handle the Bonobo_Listener again and make it async. - (impl_async_create_folder): Pass CORBA_OBJECT_NIL as the listener. - (bonobo_interface_create_folder_cb): Make async. - - * evolution-storage.c (notify_bonobo_listener): Removed this broken - broken function. - (impl_Storage_async_create_folder): Make async, duplicate the listener - instead of notifying it. - (impl_Storage_async_remove_folder): Notify listener by hand. - (e_marshal_NONE__POINTER_POINTER_POINTER_POINTER_POINTER): Return of the - worst signal marshaller in Scotland. - (class_init): Use the above marshaller for the create_folder signal. - -2001-08-30 Jeffrey Stedfast <fejj@ximian.com> - - * e-shell-folder-creation-dialog.c (entry_name_is_valid): Check - for \r in the folder name, this is an invalid char. Also take a - "reason" argument so we can inform the user why his folder name is - invalid. - (dialog_clicked_cb): Tell the user why the folder name is invalid. - -2001-08-28 Ettore Perazzoli <ettore@ximian.com> - - [Fix #8125, Evolution crashes while starting.] - - * e-shortcuts.c (load_shortcuts): Handle the case when there is no - URI without crashing. Only add shortcuts when they are evolution: - URIs. - -2001-08-27 Ettore Perazzoli <ettore@ximian.com> - - * Evolution-ShellComponent.idl: Studlycapsize all the IDs that are - not. - * Evolution-common.idl: Likewise. - * evolution-activity-client.c: Updated accordingly. - * evolution-shell-component.c: Likewise. - * evolution-storage.c: Likewise. - * e-activity-handler.c: Likewise. - * e-component-registry.c: Likewise. - * e-corba-storage.c: Likewise. - * e-shell-user-creatable-items-handlers.c: Likewise. - - * e-local-storage.c (remove_folder): Remove unused variable. - - * e-shell-view.c (update_for_current_uri): Assign zero to - `unread_count', not NULL. - - * e-shell-importer.c (import_druid_finish): Remove unused - variable. - - * e-shell-user-creatable-items-handler.c: #include - "e-corba-utils.h". - - * e-shell-startup-wizard.c: #include "e-shell-startup-wizard.h". - - * e-shell-startup-wizard.h: #include <glib.h> - -2001-08-24 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (update_for_current_uri): Also display the unread - count in the title bar. - -2001-08-24 Ettore Perazzoli <ettore@ximian.com> - - * e-setup.c (copy_default_stuff): Remove the stupid "do you want - me to initialize stuff?" dialog. - -2001-08-24 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c: Change the `selected_row_path' to be - non-const. - (destroy): Free it. - (e_storage_set_view_set_current_folder): Set the selected_row_path - to be this path. - (tree_drag_begin): Free the selected_row_path and strdup() the - value we assign. - -2001-08-24 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (e_shell_view_remove_control_for_uri): Ooops. - Save the pointer to the control for use after the view struct is - freed. - -2001-08-24 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c: New struct `View'. Replace `uri_to_control' in - `EShellViewPrivate' with `uri_to_view'. - (view_new): New. - (hash_forall_destroy_view): New, replacing - `hash_forall_destroy_control'. - (destroy): Updated to match the uri_to_control -> uri_to_view - changes. - (socket_destroy_cb): Likewise. - (get_view_for_uri): Renamed from `get_control_for_uri'. Return a - View instead of a GtkWidget. - (show_existing_view): Updated to use `get_view_from_uri', get a - @view instead of a @control. - (e_shell_view_display_uri): Updated to use `uri_to_view' instead - of `uri_to_control'. - (e_shell_view_remove_control_for_uri): Likewise. - -2001-08-24 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (update_folder_title_bar): Changed to get a - @title and a @type. - (update_for_current_uri): Updated accordingly. - (update_window_icon): Get a @type instead of a @folder. - (update_for_current_uri): Updated accordingly. - -2001-08-24 Ettore Perazzoli <ettore@ximian.com> - - [Fix #5978, "If a component dies, it's toolbar buttons remain".] - - * e-shell-view.c (socket_destroy_cb): If the view belongs to a - toplevel storage node, get the right type information with - `e_storage_get_toplevel_node_uri()' instead of trying to get the - [non-existing] folder for it. - -2001-08-24 Iain Holmes <iain@ximian.com> - - * e-shell-startup-wizard.c (druid_event_notify_cb): Implement the other - missing events. - (make_identity_page): - (make_receive_page): - (make_extra_page): - (make_transport_page): - (make_management_page): Add the GnomeDruidPages to the page_list. - -2001-08-24 Ettore Perazzoli <ettore@ximian.com> - - * e-shortcuts-view.c: Added accelerators for the right-click - shortcut menu. - -2001-08-23 Zbigniew Chyla <cyba@gnome.pl> - - * e-shortcuts.c (e_shortcuts_add_default_group): Convert names of the - default group and shortcuts to UTF-8 (still no U_ :(). - -2001-08-23 Zbigniew Chyla <cyba@gnome.pl> - - * e-shortcuts-view.c (destroy_group_cb): Convert the name of the group - to GTK+ locale before displaying it in a dialog. - -2001-08-23 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (tree_drag_data_received): If we get no - data, don't notify the receiving component at all. - -2001-08-23 Ettore Perazzoli <ettore@ximian.com> - - [Fix #5736, crashing when copying a message with drag and drop.] - - * e-storage-set-view.c (tree_drag_data_received): Handle NULL data - gracefully. - -2001-08-22 Ettore Perazzoli <ettore@ximian.com> - - * e-storage.c (e_storage_async_xfer_folder): If the remove_source - is %TRUE and destination is a descendant of the parent, pass an - `E_STORAGE_CANTMOVETODESCENDANT' error code to the callback. - - * e-storage.h: New value `E_STORAGE_CANTMOVETODESCENDANT' in - `EStorageResult'. - -2001-08-22 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-commands.c - (folder_selection_dialog_folder_selected_callback): Actually - return if the folder is being moved into one of its descendants. - -2001-08-22 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-title-bar.c (label_realize_callback): `#if 0'ed - out. - (make_bold): Likewise. - (e_shell_folder_title_bar_construct): Don't call it. - - * e-local-storage.c (component_async_remove_folder_callback): Only - remove the directory if the component succeeds. - -2001-08-22 Peter Williams <peterw@ximian.com> - - * e-local-storage.c (async_xfer_folder_callback): Fix the improper - construction of the new folder's physical URI. - -2001-08-22 Ettore Perazzoli <ettore@ximian.com> - - * e-local-storage.c (remove_folder): Don't remove the folder - directory here. - (component_async_remove_folder_callback): Remove it here instead. - -2001-08-22 Ettore Perazzoli <ettore@ximian.com> - - [Fix #7775, crash trying to do New Task] - - * e-shell-user-creatable-items-handler.c (verb_fn): Make sure we - don't pass NULL strings to - `GNOME_Evolution_ShellComponent_userCreateNewItem()'. - -2001-08-21 Damon Chaplin <damon@ximian.com> - - * e-gray-bar.c (endarken_style): unref the rc_style. - -2001-08-21 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c: #include "e-shell-startup-wizard.h". - - * e-shell-startup-wizard.h: New. - -2001-08-21 Iain Holmes <iain@ximian.com> - - * e-shell-startup-wizard.c (make_mail_dialog_pages): Show an error - window if mailer doesn't respond. - -2001-08-21 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-title-bar.c (label_realize_callback): Fix a leak: - unref the EFont after we have used it. Also, don't crash if - `e_font_to_gdk_font()' returns NULL. [This should fix #7666, - Folder View crashes Evo.] - -2001-08-21 Iain Holmes <iain@ximian.com> - - * e-shell-importer.c (start_import): Don't print a NULL. - -2001-08-20 Iain Holmes <iain@ximian.com> - - * e-shell-importer.c (import_druid_finish): Do the correct thing when - the new folder button is clicked. - (folder_selected): Import the file. - (folder_cancelled): Kill the dialog. - -2001-08-18 Iain Holmes <iain@ximian.com> - - * e-shell-startup-wizard.c (make_identity_page): - (make_receive_page): - (make_extra_page): - (make_transport_page): - (make_management_page): Check that the mailer has been inited correctly. - (e_shell_startup_wizard_create): If some of the pages could not be - created, just stop trying to show the startup wizard. - -2001-08-20 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (e_shell_view_load_settings): Don't set the - paneds' positions if the respective left-hand elements [i.e. the - shortcut bar and the folder bar] are hidden. - (e_shell_view_show_folder_bar): Set the paned position to zero - when hiding. - (e_shell_view_show_shortcut_bar): Likewise. - -2001-08-20 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-startup-wizard.c (finish_func): Don't free the returned - displayname. - -2001-08-20 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (pop_up_folder_bar): Make sure we display a pin - when we are popped up. - -2001-08-20 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (setup_widgets): Don't set the paned tree - position. - -2001-08-19 Chris Toshok <toshok@ximian.com> - - * evolution-shell-component.c (impl__get_supported_types): fill - the corba sequence for the accepted_dnd_types. - -2001-08-20 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (setup_storage_set_subwindow): Don't show the - vbox here. - (setup_widgets): Don't show the storage_set_view_box here. - -2001-08-20 Ettore Perazzoli <ettore@ximian.com> - - * evolution-test-component.c: Added display_name and description - to the type. - - * evolution-shell-component.c (impl__get_supported_types): Pass - `display_name' and `description' here. - (evolution_shell_component_construct): Likewise. - - * evolution-shell-component.h: New members `display_name', - `description' in `EvolutionShellComponentFolderType'. - - * e-component-registry.c (register_type): New args @description - and @display_name. Pass to - `e_folder_type_registry_register_type()'. - (register_component): Pass the values returned in the sequence - from __get_supported_types. - - * e-folder-type-registry.c: New members `display_name' and - `description' in `struct _FolderType'. - (folder_type_new): New args @description and @display_name. - Initialize the respective fields in the `FolderType' accordingly. - (folder_type_free): Free `display_name' and `description'. - (register_folder_type): New args @display_name, @description. - (e_folder_type_registry_register_type): New args @display_name, - @description. - (e_folder_type_registry_get_description_for_type): New. - (e_folder_type_registry_get_display_name_for_type): New. - - * Evolution-ShellComponent.idl: Added `display_name' and - `description' fields to the `FolderType' struct. - -2001-08-19 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (destroy): Put the bonobo_object_release_unref() for - the db at the top in an attempt to fix #7542. - -2001-08-19 Ettore Perazzoli <ettore@ximian.com> - - * e-summary-storage.c (e_summary_storage_new): Change type of - toplevel node from "Summary" to "summary". [All the other folder - types use lowercase names.] - - * e-shortcuts.c (load_shortcuts): Also use the display name for - the storage. - -2001-08-19 Ettore Perazzoli <ettore@ximian.com> - - * e-shortcuts.c (load_shortcuts): Use xmlMemStrdup() to override - the type as it's expected to be allocated by libxml later on. - Also, get the icon for the storage if the shortcut points to a - storage. - - * e-storage-set-view.c (etree_icon_at): Don't special case the - Summary storage. Rather, use `e_storage_get_toplevel_node_type()' - for getting the type of the node. - - * e-shortcuts-view-model.c (get_icon_for_item): New helper - function. - (shortcuts_update_shortcut_cb): Use it. - (shortcuts_new_shortcut_cb): Use it. - (load_group_into_model): Use it. - -2001-08-18 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c: New constant `MIN_POPUP_TREE_WIDTH'. - (pop_up_folder_bar): Make sure the pop-up is always this size or - more. - (setup_widgets): Pass %FALSE for @shrink to `e_paned_pack1()'. - (reparent_storage_set_view_box_and_destroy_popup): Likewise. - -2001-08-18 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c (shortcut_bar_visibility_changed_cb): New, - replacing `shortcut_bar_mode_changed_cb'. - (folder_bar_visibility_changed_cb): New, replacing - `folder_bar_mode_changed_cb'. - (command_toggle_folder_bar): Use `e_shell_view_show_folder_bar()' - instead of `e_shell_view_set_folder_bar_mode()'. - (command_toggle_shortcut_bar): Use - `e_shell_view_show_shortcut_bar()' instead of - `e_shell_view_set_shortcut_bar_mode()'. - (e_shell_view_menu_setup): Updated for the - "shortcut_bar_visibility_changed" and - "folder_bar_visibility_changed" signals and the above changes. - - * e-shell-view.c: New member `folder_bar_popup' in - `EShellViewPrivate'. Replaced `folder_bar_mode' and - `shortcut_bar_mode' with `folder_bar_shown' and - `shortcut_bar_shown', respectively. - (init): Updated to initialize these correctly. - (reparent): New helper function. - (reparent_storage_set_view_box_and_destroy_popup): New helper - function. - (popdown_transient_folder_bar): Updated to use the - `folder_bar_popup'. - (folder_bar_popup_map_callback): Renamed from - `storage_set_view_box_map_cb'. - (e_shell_view_set_shortcut_bar_mode): Removed. - (e_shell_view_set_folder_bar_mode): Removed. - (e_shell_view_show_shortcut_bar): New. All the calls to - `e_shell_view_set_shortcut_bar_mode()' replaced with calls to this - one. - (e_shell_view_show_folder_bar): New. All the calls to - `e_shell_view_set_folder_bar_mode()' replaced with calls to this - one. - (e_shell_view_folder_bar_shown): New. All the calls to - `e_shell_view_get_folder_bar_mode()' replaced with calls to this - one. - (e_shell_view_shortcut_bar_shown): New. All the calls to - `e_shell_view_get_shortcut_bar_mode()' replaced with calls to this - one. - (class_init): Replace signal `folder_bar_mode_changed' with - `folder_bar_visibility_changed' and `shortcut_bar_mode_changed' - with `shortcut_visibility_changed'. - (e_shell_view_save_settings): Use keys "ShortcutBarShown" and - "FolderBarShown" instead of "ShortcutBarMode" and "FolderBarMode", - respectively. - (e_shell_view_load_settings): Likewise. - - * e-shell-view.h: Removed enum `EShellViewSubwindowMode'. Renamed - signal `shortcut_bar_mode_changed' to - `shortcut_bar_visibility_changed' and `folder_bar_mode_changed' to - `folder_bar_visibility_changed'. - -2001-08-17 Iain Holmes <iain@ximian.com> - - * Makefile.am: Add the Evolution-Wizard.idl file - -2001-08-17 Iain Holmes <iain@ximian.com> - - * e-shell-folder-selection-dialog.c (folder_creation_dialog_result_cb): - Check the priv isn't NULL before dereferencing it. - -2001-08-17 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-client.c - (evolution_shell_client_set_line_status): g_return_if_fail(), not - g_return_val_if_fail(). - -2001-08-17 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-client.c - (evolution_shell_client_get_local_storage): Added some g_warnings - for when we return CORBA_OBJECT_NIL; this might help to figure out - what is wrong with bug #6625. Also, added a missing - CORBA_exception_free(). - -2001-08-17 Jeffrey Stedfast <fejj@ximian.com> - - * e-shell.c (e_shell_construct): Don't destroy the splash twice. - - * e-local-storage.c (setup_folder_as_stock): utf_name should not - be const as e_utf8_from_locale_string() returns an allocated - buffer. - -3001-08-17 Iain Holmes <iain@ximian.com> - - * Evolution.idl: Add Evolution-Wizard.idl - - * Evolution-Wizard.idl: New file implementing a wizard interface. - - * Makefile.am: Add the wizard stuff and the startup dialog stuff - - * e-shell.c (e_shell_construct): Hide the splash screen and try to - start the startup assistant. - - * glade/Makefile.am: Add the evolution-startup-wizard.glade - -2001-08-16 Jason Leach <jleach@ximian.com> - - * e-shell-view-menu.c (authors): Add myself. - - * e-shell-view.c (folder_selected_cb): Desensitize the - move/copy/delete/rename in the menus (including right click) for - stock folders. - - * Evolution-Icon.idl: Actually remove this file from CVS (its - contents are now in Evolution-common.idl). - -2001-08-16 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c: Remove the Help menu verbs and add a - "HelpFAQ" verb. - (command_help): Removed. - (command_help_faq): New, implementation for the "HelpFAQ" verb. - -2001-08-16 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-title-bar.c (label_realize_callback): New - callback for the realize signal. - (make_bold): New. Hooks up the label_realize_callback. - (e_shell_folder_title_bar_construct): Make the name of the folder - bold using it. - -2001-08-16 Ettore Perazzoli <ettore@ximian.com> - - * e-gray-bar.c (endarken_style): Just hardcode the colors. - - * e-shell-folder-title-bar.c (set_title_bar_label_style): New. - (e_shell_folder_title_bar_construct): Call it on the labels here, - so we get nice white labels. - -2001-08-16 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (e_shell_component_maybe_crashed): s/the view for `%s' - have/the views for `%s' have/. - -2001-08-16 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (etree_icon_at): Remove debugging message. - -2001-08-15 Jason Leach <jleach@ximian.com> - - * e-shell-view-menu.c (command_help): Don't hardcode/build a help - URI here, use gnome_help_display() instead, which will figure out - what language the user needs, etc. - (help_verbs): Adapt these menu items to above changes, they don't - need to pass "evolution/foo.html" to command_help, just - "foo.html". - - * e-folder.c (e_folder_set_child_highlight): Emit a "changed" - signal at the end of this function. Bug #7232. - -2001-08-15 Aaron Weber <aaron@ximian.com> - - * e-shell-view-menu.c (command_about_box): Changed help menus to - point to evolution/ and not evolution-guide/. - -2001-08-15 Iain Holmes <iain@ximian.com> - - * e-summary-storage.c: s/My Evolution/Summary - - * e-storage-set-view.c: s/My Evolution/Summary - -2001-08-15 Jason Leach <jleach@ximian.com> - - * Evolution-Shell.idl: Add a new IDL function, - Evolution::Shell::setLineStatus (in boolean). Bug #3030. - - * e-shell.c (impl_Shell_setLineStatus): Implementation of the - above. - - * evolution-shell-client.c - (evolution_shell_client_set_line_status): A wrapper function for - the above, this is what a component can call to set the shell - on/offline. - -2001-08-14 Dan Winship <danw@ximian.com> - - * evolution-storage.c (evolution_storage_new_folder): Use the - passed-in unread_count. - - * e-corba-storage.c (impl_StorageListener_notifyFolderCreated): - Pass the passed-in unread_count to e_storage_new_folder. - -2001-08-13 Ettore Perazzoli <ettore@ximian.com> - - * e-gray-bar.c (impl_style_set): Chain to the parent class. - (endarken_style): Hardcode the colors here. - -2001-08-13 Anna Marie Dirks <anna@ximian.com> - - * importer/intelligent.c : Changed the "Evolution has found the - following data sources" text in the import dialog to "Evolution - can import data from the following files" in an attempt to - increase user-friendliness. - -2001-08-13 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (setup_widgets): Add some little padding to the - title bar so it looks nicer. - -2001-08-13 Ettore Perazzoli <ettore@ximian.com> - - [Fix #7109, Evolution crashes when the splash screen dialog is - killed by clicking the "X" button.] - - * e-shell.c (e_shell_construct): Connect - `gtk_widget_hide_on_delete()' correctly. - -2001-08-13 Anna Marie Dirks <anna@ximian.com> - - * importer/import.glade : Changed all instances of "druid" - and "wizard" to "assistant". - -2001-08-13 Ettore Perazzoli <ettore@ximian.com> - - * main.c (idle_cb): Replaced the chained `if' statements with a - `switch' statement for clarity. Also, don't ref the created - shell, and release the object reference properly. - -2001-08-13 Ettore Perazzoli <ettore@ximian.com> - - * e-corba-shortcuts.c (shortcut_list_to_corba): set_release on the - sequence, not the buffer. - -2001-08-13 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (view_destroy_cb): Restore the shell reffing/unreffing - here. - -2001-08-13 Peter Williams <peterw@ximian.com> - - * e-corba-shortcuts.c (shortcut_list_to_corba): Don't cause an abort - if the shortcut group is empty. - -2001-08-13 Ettore Perazzoli <ettore@ximian.com> - - * Makefile.am (IDLS): Add `Evolution-common.idl'. - -2001-08-13 Dan Winship <danw@ximian.com> - - * evolution-shell-component.c (init): Initialize - priv->user_creatable_item_types. [Score: g_new: 0, g_new0: 2] - -2001-08-13 Jason Leach <jleach@ximian.com> - - * e-local-storage.c (remove_folder_directory): Remove unused - variable @folder. - - * e-shell-folder-commands.c (e_shell_command_add_to_shortcut_bar): - Give icons to shortcuts added via Right-click->Add to Shortcut - Bar. - -2001-08-12 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-selection-dialog.c - (e_shell_folder_selection_dialog_construct): Grab focus on the - storage set view. - -2001-08-12 Ettore Perazzoli <ettore@ximian.com> - - * e-local-storage.c (setup_folder_as_stock): Use utf 8 to set the - name. - -2001-08-12 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (etree_value_at): Remove debugging message. - -2001-08-12 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (setup_widgets): Put the folder title bar into an - EGrayBar. - - * e-gray-bar.c: New. - * e-gray-bar.h: New. - -2001-08-12 Ettore Perazzoli <ettore@ximian.com> - - [Finally! Fix #413, "Support for stock folders", and #786, "i18n: - default folder names are not translated".] - - * e-local-storage.c (setup_folder_as_stock): New helper function. - (setup_stock_folders): Use it to set the default folders as - "stock" folders. This will give them a translated name and also - make them unmodifiable. - (load_all_folders): Call `setup_stock_folders()' here. - - * e-shell-folder-commands.c (delete_cb): Display an error dialog - if the deletion fails. - (e_shell_command_delete_folder): Pass the shell view to the delete - callback. - - * e-storage.c (e_storage_result_to_string): Add a string for - `E_STORAGE_CANTCHANGESTOCKFOLDER' as well. - - * e-local-storage.c (remove_folder): Don't allow a stock folder to - be removed. - (impl_async_xfer_folder): Don't allow a stock folder to be moved. - - * e-corba-storage.c (async_remove_folder): Don't allow a stock - folder to be removed. - - * e-storage.h: New enum value `E_STORAGE_CANTCHANGESTOCKFOLDER' in - `EStorageResult'. - - * e-folder.c: Make member `self_highlight' a :1 int. New :1 int - member `is_stock'. - (init): Init `is_stock' to %FALSE. - (e_folder_set_is_stock): New. - (e_folder_get_is_stock): New. - - * e-local-storage.c (bonobo_interface_update_folder_cb): For now, - don't set the display name. - -2001-08-10 Ettore Perazzoli <ettore@ximian.com> - - * Evolution-common.idl: Add Folder struct here. - - * Evolution-Storage.idl: Removed Folder struct. - - * Evolution.idl: #include <Evolution-common.idl>, not - <Evolution-Icon.idl>. - - * Evolution-common.idl: New. - - * Evolution-Icon.idl: Removed. - -2001-08-10 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-commands.c (rename_clicked): `#if 0'ed out. - (rename_cb): Likewise. - - * evolution-shell-component.c (destroy): Fixed a confusion between - GList and GSList. - -2001-08-10 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-user-creatable-items-handler.c (component_free): Only - free the `type_list' if not NULL. - (setup_menu_xml): Deal with the case of `type_list' being NULL - gracefully. - (verb_fn): Same here. - (add_verbs_to_ui_component): Likewise. - -2001-08-10 Ettore Perazzoli <ettore@ximian.com> - - [Fix #6787, Removing a storage with children and then re-adding it - causes a crash.] - - * e-storage-set-view.c (convert_corba_drag_action_set_to_gdk): - Removed `#if 0'ed function. - (etree_node_destroy_func): New destroy function. - (e_storage_set_view_construct): Set this as the new destroy - function on the ETreeMemory. - -2001-08-09 Ettore Perazzoli <ettore@ximian.com> - - * evolution-test-component.c (user_create_new_item_callback): - Updated to display the parent folder's URI and its type as well. - - * evolution-shell-component.c (impl_userCreateNewItem): Updated to - get the @parent_folder_physical_uri and the @parent_folder_type. - (class_init): Update the "user_create_new_item" signal to have - @parent_folder_physical_uri and @parent_folder_type args. - - * e-shell-view.c (get_type_for_folder): Don't bork on a NULL - @physical_uri_return. - (e_shell_view_get_current_physical_uri): New. - (e_shell_view_get_current_folder_type): New. - - * e-shell-user-creatable-items-handler.c - (e_shell_user_creatable_items_handler_setup_menus): Replace - @ui_component arg with a @shell_view arg. Set it on the - UIComponent using gtk_object_set_data(). - (verb_fn): Pass the type and physical URI of the current folder; - retrieve that from the shell_view got with gtk_object_get_data(). - - * Evolution-ShellComponent.idl - (userCreateNewItem): New args @parent_folder_uri, - @parent_folder_type. - -2001-08-09 Ettore Perazzoli <ettore@ximian.com> - - * e-shortcuts-view.c (show_new_group_dialog): Cast the toplevel to - be passed to `e_request_string()' to GtkWindow, not GtkWidget. - Also, remove unused variables. - (get_efolder_from_shortcut): Constify @item_url. - (get_storage_set_path_from_uri): Removed. - - * evolution-shell-component.c (destroy): `p' shall be a GList, not - a GSList. - -2001-08-09 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (e_shell_view_construct): Add the menu items - using the EShellUserCreatableItemsHandler. - - * e-shell-user-creatable-items-handler.c: New. - * e-shell-user-creatable-items-handler.h: New. - - * e-shell.c: New member `user_creatable_items_handler' in - `EShellPrivate'. - (init): Initialize to NULL. - (destroy): Unref. - (e_shell_construct): Create here. - (e_shell_get_user_creatable_items_handler): New accessor. - (setup_components): Add the registered components to the - user_creatable_items_handler. - - * evolution-test-component.c (factory_fn): Add a couple sample - user-creatable items. - (user_create_new_item_callback): New callback for the - "user_create_new_item" signal on the EvolutionShellComponent. - (factory_fn): Connect. - - * e-shell.c (e_shell_get_component_registry): New. - - * evolution-shell-component.c: New enum value - `USER_CREATE_NEW_ITEM'. New member `user_create_item_types' in - `_EvolutionShellComponentPrivate'. - (init): Init to NULL. - (impl_destroy): Free it. - (user_creatable_item_type_free): New helper function. - (user_creatable_item_type_new): New helper function. - (impl_userCreateNewItem): New, implementation for - ::userCreateNewItem. - (class_init): Install the "user_create_new_item" signal and the - userCreateNewItem impl. - (impl__get_external_uri_schemas): Renamed from - `impl_ShellComponent__get_external_uri_schemas'. - (impl___get_supported_types): Renamed from - `impl_ShellComponent__get_supported_types'. - (impl__get_user_creatable_item_types): New, implementation for the - `user_creatable_item_types' attribute. - (class_init): Install it. - (evolution_shell_component_add_user_creatable_item): New. - - * evolution-shell-component.h: Added signal - `user_create_new_item'. - - * Evolution-ShellComponent.idl: Added typedefs - `UserCreatableItemType', `UserCreatableItemTypeList'. New - attribute `user_creatable_item_types'. - (userCreateNewItem): New. - -2001-08-09 Federico Mena Quintero <federico@ximian.com> - - * e-component-registry.c (destroy): Chain to the destroy handler - in the parent class! - - * e-shortcuts-view-model.c (impl_destroy): Likewise. Sigh. - -2001-08-08 Ettore Perazzoli <ettore@ximian.com> - - [Fixes, among other things, #5705, "Ampersands not handled - correctly in drag + drop". Thanks to Nat for actually discovering - the problem.] - - * e-shortcuts.c (save_shortcuts): Use `xmlNewTextChild()' instead - of `xmlNewChild()'. - - * e-local-folder.c (save_metadata): Use `xmlNewTextChild' instead - of `xmlNewChild()'. - -2001-08-08 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component.c - (fill_corba_sequence_from_null_terminated_string_array): Set the - release flag on the sequence, and CORBA_string_dup() the strings - anyway. - -2001-08-08 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component.c - (impl_ShellComponent__get_supported_types): Set the release flag - on the returned folder type list too. - - * evolution-activity-client.c (create_icon_from_pixbuf): Set the - release flag on the sequence, not the struct that contains it. - -2001-08-08 Ettore Perazzoli <ettore@ximian.com> - - * e-corba-shortcuts.c (shortcut_list_to_corba): Set the release - flag for the newly allocated sequence. - - * e-activity-handler.c (impl_operationStarted): Unref the - icon_pixbuf. - - * e-task-widget.c (impl_destroy): g_free the private struct. - -2001-08-08 Jason Leach <jleach@ximian.com> - - * e-storage-set-view.c (etree_icon_at): Set the My Evolution icon - for the folder tree correctly. - -2001-08-08 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component.c - (impl_ShellComponent__get_supported_types): Fill the CORBA - sequence once. - - * e-activity-handler.c (activity_info_free): Unref the icon. - -2001-08-08 Ettore Perazzoli <ettore@ximian.com> - - * e-task-bar.c (e_task_bar_prepend_task): Sigh. If the function - says "prepend", of course the function to call is - `g_list_prepend()', not `g_list_append()'. You dumbass. - -2001-08-08 Jason Leach <jleach@ximian.com> - - * e-shell-folder-creation-dialog.c - (storage_set_view_storage_selected_cb): Set the sensitivity for - the OK button when a storage is selected too. Bug #6473. - -2001-08-08 Ettore Perazzoli <ettore@ximian.com> - - * evolution-activity-client.c (create_icon_from_pixbuf): Set the - release flag on the returned icon to %TRUE. - -2001-08-07 Ettore Perazzoli <ettore@ximian.com> - - * e-shortcuts.c (load_shortcuts): If the shortcut points to some - folder in the storage set, get the type from it. - - * e-storage-set.c (signal_new_folder_for_all_folders_under_paths): - New helper function. - (signal_new_folder_for_all_folders_in_storage): New helper - function. - (e_storage_set_add_storage): Call the latter to emit a - "new_folder" signal for all the folders contained in the newly - added storage. - -2001-08-07 Ettore Perazzoli <ettore@ximian.com> - - [This should fix #5407, application crash on re-opening.] - - * e-shell.c (e_shell_construct): Call - `gtk_widget_hide_on_delete()' on the splash. - - * e-splash.c (e_splash_add_icon): Don't check for destruction - here. - (e_splash_set_icon_highlight): Not even here. - (button_press_event): Use a GTK+ cast. - -2001-08-07 Ettore Perazzoli <ettore@ximian.com> - - * e-shortcuts-view-model.c (load_group_into_model): Get the icon - from the folder type registry. - (shortcuts_new_shortcut_cb): Likewise. - (shortcuts_update_shortcut_cb): Likewise. - - * e-shortcuts-view.c (icon_callback): Removed. - (e_shortcuts_view_construct): Don't set the icon callback anymore. - -2001-08-07 Jason Leach <jleach@ximian.com> - - * e-storage-set-view.c (etree_value_at): Don't use a leaky hash to - get folder names with unread count, use gtk_object_set_data_full - and gtk_object_get_data on the EFolder. - (etree_icon_at): Give the "My Evolution" storage an icon through a - non-generic way. Will be replaced by a generic method when other - storages get icons too. - -2001-08-07 Ettore Perazzoli <ettore@ximian.com> - - * evolution-activity-client.c - (evolution_activity_client_construct): Free the CORBA version of - the animated icon. - -2001-08-07 Not Zed <NotZed@Ximian.com> - - * evolution-activity-client.c (impl_destroy): Unref the listener - when done. - -2001-08-06 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-title-bar.c: Remove member `hbox' from `struct - _EShellFolderTitleBarPrivate'. - (make_icon_pixmap): Removed. - (rgb_from_gdk_color): Removed. - (endarken_style): Removed. - (set_style_cb): Removed. - (create_arrow_pixmap): Renamed from `create_icon_pixmap'. - (get_max_clipped_label_width): New helper function. - (size_allocate_icon): New helper function. - (size_allocate_button): New helper function. - (size_allocate_label): New helper function. - (add_icon_widget): New helper function. - (realize): Changed to use `add_icon_widget()'. - (size_allocate): New function, handler for the ::size_allocate - method. - (class_init): Install it. - (e_shell_folder_title_bar_construct): Changed so that the widget - get added to this widget instead of adding an hbox to it and - adding the widgets to the hbox. - (e_shell_folder_title_bar_set_icon): Changed to use - `add_icon_widget()'. - - * e-shell-folder-title-bar.h, e-shell-folder-title-bar.c: Changed - to derive from GtkHBox, not GtkEventBox. - -2001-08-06 Christopher James Lahey <clahey@ximian.com> - - * e-storage-set-view.c (tree_drag_motion): Turn on highlighting on - a row by row basis. - -2001-08-04 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-title-bar.c (e_shell_folder_title_bar_construct): - Add some padding to the label so that the title doesn't move - around when you switch between pop-up and non-pop-up folder bar. - Also, change all the GtkLabels to be GtkClippedLabels instead. - (e_shell_folder_title_bar_set_title): Updated to use - EClippedLabels instead of GtkLabels. - (e_shell_folder_title_bar_set_folder_bar_label): Likewise. - - * e-shell.c (impl_Shell__get_displayName): New, implementation for - the `displayName' attribute. - - * Evolution-Shell.idl: Added readonly attribute `displayName' to - get the canonicalized X11 display name for the shell. - - * e-shell.c (e_shell_construct): Ooops. Return - `E_SHELL_CONSTRUCT_RESULT_CANNOTREGISTER' if the OAF registration - fails, not `E_SHELL_CONSTRUCT_RESULT_GENERICERROR'. - - * e-shortcuts-view.c (rename_group_cb): Get the toplevel from the - shortcuts view, not the widget. - (rename_shortcut_cb): Likewise. - (show_new_group_dialog): Changed to use `e_request_string()'. - - * evolution-test-component.c: Add the %FALSE value for the - `user_creatable' field in the `folder_types' entry. - - * evolution-shell-client.c: New member `shortcuts_interface' in - `EvolutionShellClientPrivate'. - (destroy): Unref it if not CORBA_OBJECT_NIL. - (init): Init to CORBA_OBJECT_NIL. - (query_shell_interface): New helper function to query an interface - on the shell and spit out warnings if it fails. - (evolution_shell_client_construct): Use it to query the ::Activity - interface. Also query the ::Shortcuts interface and set the - `shortcuts_interface' member to point to it. - - * e-shell.c: New member `corba_shortcuts' in `EShellPrivate'. - (init): Init to NULL. - (setup_shortcuts_interface): Helper function to add the - ::Shortcuts CORBA interface to the shell. - (e_shell_construct): Call it. - - * e-corba-shortcuts.c, e-corba-shortcuts.h: New objects - implementing the `Evolution::Shortcuts' CORBA interface. - - * Evolution-Shortcuts.idl: New interface for accessing the - shortcuts in the shell. - - * e-shell.c (e_shell_get_config_db): Moved down. - -2001-08-03 Christopher James Lahey <clahey@ximian.com> - - * e-storage-set-view.c (tree_drag_data_received): Some paths here - don't set handled properly so lets initialize it to FALSE. - (update_folder_with_unread_hash, etree_value_at): constified - folder_name here. - (init): Initialize priv->drag_path here to NULL. - -2001-08-03 Jason Leach <jleach@ximian.com> - - [Removing Evolution::LocalStorage interface, abstracting the - unread counts from a folder's name, also abstract unread counts - from a shortcut's name. Fixes #4489 and #5497] - - * e-shortcuts.c (shortcut_item_new): Take an unread_count argument - now. - (shortcut_item_update): Ditto. - - * e-shortcuts-view-model.c (get_name_with_unread): Get a string - containing a shortcut name and it's unread, because these are - abstracted now. - (load_group_into_model): Use the above function to make shortcuts - that have unread counts. - - * e-storage-set-view.c (update_folder_with_unread_hash): Keep a - hash of folder names with unread counts, because the folder name - and it's unread count are to be separated, only the ETree is - supposed to present it as one string. - - * e-shell-view.c: Renamed EShellView::view_title_bar to - folder_title_bar, to closer match the - - * e-shell-view-menu.c (new_shortcut_dialog_folder_selected_cb): - Make a shortcut with the unread count. - - * e-shell-folder-commands.c (e_shell_command_add_to_shortcut_bar): - Make a shortcut with the unread count. - - * e-local-storage.c: Updated for API changes. - - * e-folder.c (e_folder_get_unread_count): New function, does what - it says. - (e_folder_set_unread_count): Ditto. - - * e-corba-storage.c (impl_StorageListener_new_folder): Renamed to - match the IDL function name. - (impl_StorageListener_update_folder): Ditto. - (impl_StorageListener_removed_folder): Ditto. - - * Evolution-Storage.idl (struct Folder): Replace the boolean - highlighted with a long unread_count. - (updateFolder): Brought in from the now dead - Evolution::LocalStorage. - - * Evolution-Shell.idl (getLocalStorage): Return a Storage instead - of a LocalStorage. - - * Evolution-LocalStorage.idl: Removed, no longer needed, only used - function, updateFolder, has been moved into Evolution::Storage - interface. - - * evolution-local-storage.[ch]: Ditto. - - * evolution-storage.c (impl_Storage_updateFolder): Implementation - of the updateFolder taken from ::LocalStorage. - (class_init): New "update_folder" signal, taken from - evolution-local-storage.c too. - (evolution_storage_update_folder): Take an @unread_count int - instead of a @highlighted boolean. - (evolution_storage_new_folder): Same for here. - (evolution_storage_update_folder_by_uri): And here. - - * evolution-storage-listener.h: "update_folder" signal no longer - sends a @highlighted boolean. - -2001-08-03 Jason Leach <jleach@ximian.com> - - * e-shell-view-menu.c (update_offline_menu_item): Use Jakub's new - "Work Online" icon and fix a typo. - -2001-08-03 Ettore Perazzoli <ettore@ximian.com> - - [Fix #6232, the thirty-four-splash-screens-at-startup bug.] - - * e-shell.c (setup_local_storage): Add an E_STORAGE() cast to - prevent a warning. - - * main.c (idle_cb): Only try to activate from the shell ID if the - result is `E_SHELL_CONSTRUCT_RESULT_CANNOTREGISTER'; if there is a - different error, spit out a dialog box with a description of it - and exit instead. - - * e-shell.c (e_shell_construct): Return an `EShellConstructResult' - describing what kind of result we had. Show the splash after the - DB has been reached, not before. - (e_shell_construct_result_to_string): New function to get a - descriptive string out of an `EShellConstructResult'. - (e_shell_new): New arg @construct_result_return to return a - description of the result of the operation. - - * e-shell.h: New enum `EShellConstructResult'. - - * e-shell.c (impl_Shell_createNewView): Raise `InternalError' - instead of crashing if the shell_view returns a CORBA_OBJECT_NIL. - - * Evolution-Shell.idl: New exception `InternalError'. - `createNewView' and `handleURI' can raise it. - -2001-08-03 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (storage_sort_callback): Put the storage - named E_SUMMARY_STORAGE_NAME on top. - - * e-shell.c: New member `summary_storage' in `EShellPrivate'. - (init): Init to NULL. - (destroy): Unref if not NULL. - - * e-summary-storage.c: New. - * e-summary-storage.h: New. - - * e-storage-set-view.c: New #define `ROOT_NODE_NAME', defined to - be "/RootNode". - (e_storage_set_view_set_show_folders): Use that instead of "My - Evolution". - (e_storage_set_view_construct): Hide the root node. Use - `ROOT_NODE_NAME' instead of "My Evolution". - - * e-shortcuts-view.c (icon_callback): No bad special hack for "My - Evolution" here. - - * e-shell-view.c (update_window_icon): Remove kludgey - @is_my_evolution arg and stop doing special "My Evolution" things. - (update_folder_title_bar): Likewise. - (update_for_current_uri): Don't do special "My Evolution" things - here either. - (get_control_for_uri): Don't do the "My Evolution" hack here. - -2001-08-03 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (tree_drag_data_received): Call - `gtk_drag_finish()' here. - -2001-08-03 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-offline-handler.c (progress_listener_servant_free): - Actually __fini the servant and deactivate the object too. - (component_info_free): Updated accordingly [i.e. don't do the - deactivation stuff here]. - -2001-08-03 Ettore Perazzoli <ettore@ximian.com> - - [Fixes #4663, startup crash.] - - * e-shell.c (e_shell_construct): Make sure the pointer to the db - object is CORBA_OBJECT_NIL if `bonobo_get_object()' raises an - exception. - -2001-08-03 Ettore Perazzoli <ettore@ximian.com> - - [Fixes #3818, crash when going off-line.] - - * e-shell-offline-handler.c (component_info_free): Also call - `PortableServer_POA_deactivate_object()' on the progress listener - object so it gets deactivated. - -2001-08-02 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (e_shell_construct): Spit out a warning if we cannot - resolve "Bonobo/ConfigDatabase" on "wombat:". Also, register on - OAF only after we are sure we are not going to return FALSE. - -2001-08-01 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (switch_on_folder_tree_click): Set the - `set_folder_uri' to NULL when freeing it. - - * e-task-bar.c (e_task_bar_remove_task): Just destroy the widget. - No need to `gtk_container_remove()' it. - -2001-08-01 Jeffrey Stedfast <fejj@ximian.com> - - * e-shell-view-menu.c (command_new_folder): Do a NULL-check on - current_uri - socket is being closed? (as per the comments for the - NULL-check in e-shell-view.c:socket_destroy_cb). - -2001-07-31 Ettore Perazzoli <ettore@ximian.com> - - * evolution-activity-client.c: Removed debugging messages. - -2001-07-31 Not Zed <NotZed@Ximian.com> - - * evolution-activity-client.c (evolution_activity_client_update): - Also update have_pending_update before calling corba, as below. - -2001-07-30 Ettore Perazzoli <ettore@ximian.com> - - [This should fix #5110, shell crash when switching folders.] - - * evolution-activity-client.c (update_timeout_callback): Set the - `have_pending_update' flag before doing the CORBA call. - (evolution_activity_client_update): Set the timeout before doing - the CORBA call. - -2001-07-30 Jason Leach <jleach@ximian.com> - - * e-shortcuts-view.c (rename_group_cb): Remember the current group - so after renaming a group it doesn't flip to the next group. Bug - #3857. - - * e-shortcuts.c (e_shortcuts_rename_group): Comparing two - separately allocated strings, use strcmp() instead of !=. - -2001-07-30 Jason Leach <jleach@ximian.com> - - * e-shell-folder-creation-dialog.c (async_create_cb): If we can't - create a folder because it already exists, select that folder that - exists. Bug #1716. - -2001-07-30 Frederic Crozat <fcrozat@mandrakesoft.com> - - * main.c (main): call gconf_init if gtkhtml is compiled with gconf - support. - - * Makefile.am (INCLUDES): add $(GTKHTML_CFLAGS) since we might - need to link with GConf (if gtkhtml is compiled with GConf - support) - -2001-07-26 Ettore Perazzoli <ettore@ximian.com> - - * evolution-activity-client.c (impl_destroy): Remove the source - for the timeout *before* invoking the CORBA method, as we might - get the timeout callback while invoking the CORBA method, thus - screwing things up. - - * evolution-shell-component-client.c (destroy_listener_interface): - New helper function. - (dispatch_callback): Use it. - (impl_destroy): Call it when destroying the listener interface - instead of just freeing the servant. - -2001-07-26 Jason Leach <jleach@ximian.com> - - * e-shell-view-menu.c (update_offline_menu_item): Little UI thing: - capitalize the words Offline/Online for the File menu. - -2001-07-25 Jason Leach <jleach@ximian.com> - - * e-shell-folder-selection-dialog.c (folder_selected_cb): New - function. When a folder is selected set the OK button to be - sensitive (but before that have it desensitized). Bug #5483. - -2001-07-25 Jason Leach <jleach@ximian.com> - - * e-shortcuts-view.c (icon_callback): A warning fix from Jacob. - Bug #5057. - - * Makefile.am (INCLUDES): $(BONOBO_CONF_CFLAGS) was here twice, - took out one of them. - - * e-shell-view.c (socket_destroy_cb): Mem leak fix. Thanks to the - amazing Jacob B. Bug #5054. - -2001-07-25 Jason Leach <jleach@ximian.com> - - * e-task-widget.c: #include <libgnome/gnome-defs.h> and - <libgnome/gnome-i18n.h> instead of the full <libgnome/libgnome.h>, - as noted by a comment here. - -2001-07-24 Jason Leach <jleach@ximian.com> - - * e-storage-set-view.c (e_storage_set_view_construct): Add the - "/My Evolution" path to the path_to_etree_node hash so that - storage_set_view_set_current_folder() can select the My Evolution - node when it's the current one. Fixes #5114 and #3956. - -2001-07-23 Ettore Perazzoli <ettore@ximian.com> - - * main.c (development_warning): Only show the warning dialog - instead of using `gnome_dialog_run()' so it is not modal. Modal - would be nice, but unfortunately it works bad with Bonobo. Plus - Sawfish doesn't like to keep the modal dialog on top, so it gets - very confusing for users. - -2001-07-23 Ettore Perazzoli <ettore@ximian.com> - - * e-task-widget.c (e_task_widget_construct): Uhm, set the usize to - `1, -1' instead. - -2001-07-23 Ettore Perazzoli <ettore@ximian.com> - - * e-task-widget.c (e_task_widget_construct): Set the usize for the - contained hbox to 0x0. - -2001-07-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c: Get the manuals from the `evolution-guide' - dir as that's where they get installed. - -2001-07-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (storage_set_view_box_button_release_event_cb): - Don't handle button events whose button number is not 1. - -2001-07-22 Ettore Perazzoli <ettore@ximian.com> - - * e-local-storage.c (remove_folder): Pass the folder type to - `evolution_shell_component_client_async_remove_folder()'. - (async_xfer_folder_step): Likewise with - `evolution_shell_component_client_async_xfer_folder()'. - - * evolution-shell-component-client.c - (evolution_shell_component_client_async_remove_folder): New arg - @type. Pass it to the `ShellComponent::removeFolder' CORBA - method. - (evolution_shell_component_client_async_xfer_folder): Likewise - with `::xferFolder'. - - * evolution-shell-component.c (impl_removeFolderAsync): Add @type - arg according to the IDL. - (impl_xferFolderAsync): Likewise. - - * evolution-shell-component.h: Add arg @type to - `EvolutionShellComponentRemoveFolderFn' and - EvolutionShellComponentXferFolderFn'. - - * Evolution-ShellComponent.idl: Add @type arg to - `::removeFolderAsync' and `::xferFolderAsync'. - -2001-07-21 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-creation-dialog.c (add_folder_types): Only put - the types that are user-creatable in the folder type option menu. - - * evolution-shell-component.c - (impl_ShellComponent__get_supported_types): Set the - `user_creatable' member too. - (evolution_shell_component_construct): Copy the `user_creatable' - member too. - - * evolution-shell-component.h: New member `user_creatable' in - `EvolutionShellComponentFolderType'. - - * e-component-registry.c (register_type): Pass the user_creatable - member of the CORBA FolderType struct. - - * e-folder-type-registry.c: New member `user_creatable' in struct - FolderType. - (e_folder_type_registry_register_type): New arg @user_creatable. - (register_folder_type): Likewise. - (folder_type_new): Likewise. - (e_folder_type_registry_type_is_user_creatable): New. - - * Evolution-ShellComponent.idl: New member `user_creatable' in - `struct FolderType'. - -2001-07-21 Ettore Perazzoli <ettore@ximian.com> - - * evolution-activity-client.c (impl_destroy): Use - `g_source_remove()' instead of `gtk_timeout_remove()' here, as we - are using `g_timeout_add()' and not `gtk_timeout_add()' to set up - the timeout callback. - (update_timeout_callback): Reset `have_pending_update' when - returning %TRUE. Set the timeout id to zero when returning - %FALSE. - -2001-07-20 Jason Leach <jleach@ximian.com> - - [Fix a crash if you start evolution with a bad URI.] - - * e-shell.c (e_shell_create_view): If we can't display the URI, - display the default uri. This is because it's necessary for - e_shell_view_display_uri() to run all the way through so corba - interfaces get setup. - - * e-shell-view.c (e_shell_view_display_uri): If we fail to create - a new view for a URI (happens if you pass in an invalid URI), be - sure to return FALSE. - -2001-07-20 Jason Leach <jleach@ximian.com> - - [This is a better way to have "Local Folders" be shown as the - local storage name without breaking current user's shortcuts.] - - * e-corba-storage.c (get_display_name): Implement this, but it's - only returning the real name now. Need to change the IDL soon to - let corba storages have separated display names. - - * e-shortcuts.c (e_shortcuts_add_default_group): Set these default - shortcut URI's back to evolution:/local/ - - * e-shell-view.h (DEFAULT_URI): Set this back to - "evolution:/local/Inbox" - - * e-storage-set-view.c (etree_value_at): Get the display name for - a storage rather than it's true name. - - * e-local-storage.c (impl_get_display_name): Implemented for the - local folder (to return a translated "Local Folders"). - - * e-storage.c (e_storage_get_display_name): New virtual function - for retrieving the display name. - -2001-07-19 Jason Leach <jleach@ximian.com> - - * e-local-storage.h: Make the local storage name "Local Folders" - instead of "local", looks better with "My Evolution", "VFolders", - and "Other Contacts". - - * e-shell-view.h: Put the #define DEFAULT_URI here instead of in - e-shell-view.c. - - * main.c: Remove the duplicated #define STARTUP_URI, actually make - use of the nice defines. - - * e-shell-folder-commands.c (e_shell_command_delete_folder): Use - the DEFAULT_URI here instead of a hard coded string. - - * e-shortcuts.c (e_shortcuts_add_default_group): Fix the URI's - here to use "Local Folder". - -2001-07-19 Jason Leach <jleach@ximian.com> - - * e-shell-folder-title-bar.c (e_shell_folder_title_bar_construct): - Line up the padding for the folder title bar labels when you have - the folder bar enabled or disabled (previously when disabled it - was padding ~8 pixels to the right while the other had 0). - - * e-shell-view.c (setup_widgets): Take out a 2 pixel padding - around the vbox containing the title bar, folder bar, message list - and mail display. Also remove 2 more extra pixels of padding on - the bottom. - -2001-07-16 Ettore Perazzoli <ettore@ximian.com> - - * e-shortcuts.c - (override_shortcut_name_and_type_from_storage_set): Removed. - (load_shortcuts): Don't call it. - -2001-07-15 Ettore Perazzoli <ettore@ximian.com> - - [Fix #4387, Shortcut bar items don't keep the name after rename.] - - * e-shortcuts.c (update_shortcuts_by_path): Do not change the name - of the shortcut if the folder's name changes. - -2001-07-15 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (etree_icon_at): Return an icon for depths - greater than 2 as well. - -2001-07-15 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c (e_shell_view_menu_setup): Connect the - "line_status_changed" signal with - `gtk_signal_connect_while_alive()' for the shell views, so we - don't crash if a view gets destroyed. - * e-shell-view.c (e_shell_view_construct): Likewise. - -2001-07-12 Jason Leach <jleach@ximian.com> - - * e-shell-view-menu.c (command_submit_bug): Because - bugzilla.ximian does have a mail gateway now, we can have - Help->Submit Bug Report open up bug-buddy. - -2001-07-12 Iain Holmes <iain@ximian.com> - - * importers/intelligent.c (create_gui): Remove the g_warnings as - they are an annoying red herring - -2001-07-12 Dan Winship <danw@ximian.com> - - * e-shell.c (init): Initialize priv->db and priv->iid so that - destroy() won't crash if e_shell_construct bails out before - setting them. Reduces bug #4173 to #4169. - -2001-07-11 Iain Holmes <iain@ximian.com> - - * importers/intelligent.c (intelligent_importer_init): Sync the config - so that the Don't Ask Again gets saved. - -2001-07-11 Kjartan Maraas <kmaraas@gnome.org> - - * importers/intelligent.c: Mark a string for translation. - -2001-07-11 Jason Leach <jleach@ximian.com> - - * e-shell-view.c (e_shell_view_save_settings): Make sure to create - ~/evolution/config/ if it doesn't exist. (ShellView settings get - saved before component settings, so when the mailer comes around - to saving ETree stuff, this dir will be there). Fixes bug #4279. - -2001-07-10 Jason Leach <jleach@ximian.com> - - * e-setup.c (copy_default_stuff): Add a temporary block of code to - not use the $GNOME/share/evolution/default_user/shortcuts.xml for - users who might be upgrading, so they'll get the shell-generated - default set of shortcuts. See notes on #4394. - -2001-07-09 Larry Ewing <lewing@ximian.com> - - * e-shell-folder-commands.c (delete_dialog): convert the folder - name from utf8 before displaying them in the dialog and set the - dialog parent. - -2001-07-09 Federico Mena Quintero <federico@ximian.com> - - * e-shortcuts-view.c: Make the "Rename" item be a - GNOMEUIINFO_ITEM_NONE() since we don't have a stock icon; likewise - for the "Open in New Window". This gets rid of warnings from - gnome-libs. Use a better stock icon for the "Remove" command, and - add a stock icon to the "Open" command. - -2001-07-09 Jason Leach <jleach@ximian.com> - - * e-shell-view.c (updated_folder_cb): It's very possible that - get_storage_set_path_from_uri() returns NULL (5 of the 6 return - cases), so check that it's not NULL before trying to strcmp() it. - Fixes a startup crash. - -2001-07-06 Dan Winship <danw@ximian.com> - - * e-shortcuts.c (shortcut_item_update): Return a gboolean saying - whether or not the shortcut changed. Use strcmp rather than - pointer comparisons to determine this. - (update_shortcut_and_emit_signal): propagate the gboolean from - shortcut_item_update (and only emit the signal if it's TRUE). - (update_shortcuts_by_path): Only call make_dirty if something - changed. - (storage_set_new_folder_callback, - storage_set_updated_folder_callback): Don't call make_dirty: - update_shortcuts_by_path will have called it if necessary. - - * e-shell-view.c (updated_folder_cb): Don't call - update_for_current_uri if the folder that was updated isn't the - one being displayed. - -2001-07-06 Jason Leach <jleach@ximian.com> - - * e-shortcuts-view.c: Little UI tweak for right click menu, - pronouns shouldn't be capitalized ("This" in this case). - - [Misc fixes and part of #2228, There should be no dialog boxes - during startup.] - - * e-setup.c (e_setup): Check for searches.xml instead of - shortcuts.xml, since shortcuts.xml doesn't really need to exist - (and thus wouldn't be a necessary test whether ~/evolution was - invalid) because shell can generate shortcuts. - (copy_default_stuff): For first time users, only present a dialog - if a problem occurred. We've already clicked "Ok" on a dialog - about copying files. - (check_evolution_directory): Take out the "successfully installed" - dialog on updates too. - -2001-07-06 Ettore Perazzoli <ettore@ximian.com> - - [This should fix #3873, Bizzarre crash after deleting a few - folders.] - - * e-local-storage.c (remove_folder): Don't free the - `physical_path' on error, as it gets freed when freeing the - callback data. - -2001-07-06 Ettore Perazzoli <ettore@ximian.com> - - [Fix #3959, copying a folder over itself crashes Evolution.] - - * e-shell-folder-commands.c - (folder_selection_dialog_folder_selected_callback): Sanity checks: - don't allow copying a folder over itself, or moving it under one - of its descendants. In such cases, pop up an error dialog. - -2001-07-05 Iain Holmes <iain@ximian.com> - - * e-shortcuts-view.c (icon_callback): Special case the evolution:/My - Evolution uri. - -2001-07-05 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c: Removed handler for verb - "ChangeFolderProperties". - (command_folder_properties): Removed. - - * e-shell-folder-commands.c (e_shell_command_folder_properties): - Removed. - -2001-07-03 Ettore Perazzoli <ettore@ximian.com> - - * main.c (development_warning): Use both `VERSION' and - `SUB_VERSION' here. - (main): Likewise. - -2001-07-04 Gediminas Paulauskas <menesis@delfi.lt> - - * evolution-shell-component-utils.c (e_pixmaps_update): set - "pixname" value only if pixbuf was loaded successfully. Otherwise - component crashes if image is not found. Should be checked for - sanity in bonobo_ui_component_set_prop IMHO. - -2001-07-03 Aaron Weber <aaron@ximian.com> - - * main.c (development_warning): Revised to make it less scary. - -2001-07-03 Ettore Perazzoli <ettore@ximian.com> - - [Fix a problem with not being able to save a newly created - `shortcuts.xml' file, and another bug that caused the default - group to be added at every start-up, even there were groups - already.] - - * e-shortcuts.c (e_shortcuts_new): If loading the shortcuts fails, - set the file_name. - (load_shortcuts): Update `num_groups'. - -2001-07-03 Iain Holmes <iain@ximian.com> - - * importer/Makefile.am: Add bonobo-conf stuff - -2001-07-03 Ettore Perazzoli <ettore@ximian.com> - - [The following makes the shell able to create the `shortcuts.xml' - file by itself when the file is not present or corrupted. Fixes - #3668, failure to handle malformed shortcuts.xml file.] - - * e-shell.c (e_shell_construct): If the `e_shortcuts_new()' - returns an object with no shortcuts in it, fill it in with - `e_shortcuts_add_default_group()'. - - * e-shortcuts.c: New member `num_groups' in EShortcutsPrivate. - (init): Init to zero. - (e_shortcuts_add_group): Increment. - (e_shortcuts_remove_group): Decrement. - (e_shortcuts_get_num_groups): New. - (e_shortcuts_add_default_group): New function to set up the - default shortcuts. - (e_shortcuts_new): Return an empty EShortcuts object if loading - the file files, instead of returning NULL. - -2001-07-03 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-offline-handler.c - (e_shell_offline_handler_put_components_offline): Ref/unref the - handler so the signal handlers can unref it safely. Also, if - `prepare_for_offline()' fails, don't say that there was an - internal error, as that's confusing. Just say we couldn't put the - components off-line. - - [Fix #3758, clicking on the online/offline button crashed - Evolution.] - - * Evolution-Offline.idl: Don't derive OfflineProgressListener from - Bonobo::Unknown. - -2001-07-03 Ettore Perazzoli <ettore@ximian.com> - - [Fixed #3643, Shell crash when component crashed] - - * e-shell-view.c (socket_destroy_cb): Fix Jason's broken fix for - #3205 that was causing #3643. It is not safe to strcmp() the - return value from `e_shell_view_get_current_uri()' as it might be - NULL already. - -2001-07-02 Christopher James Lahey <clahey@ximian.com> - - * Makefile.am (INCLUDES): Added $(BONOBO_CONF_CFLAGS). - (evolution_LDADD): Added $(BONOBO_CONF_LIBS). - -2001-07-02 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (popup_folder_menu): Don't assert that - there is a handler, so we don't crash if user clicks on a folder - whose type we cannot handle for some reason [such as an - uninstalled component]. - - * evolution-test-component.c (activity_client_cancel_callback): - New callback for the "cancel" signal on the - EvolutionActivityClient object. - (activity_client_show_details_callback): New callback for the - "show_details" signal. - (timeout_callback_1): Connect these two signal handlers. - - * e-activity-handler.c (task_widget_button_press_event_callback): - Ahem, right-click is button 3, not button 2. - (show_cancellation_popup): Actually pop up the menu. - (get_corba_null_value): New helper function to create a CORBA_any - null value. - (report_task_event): New helper function to report events to the - listener. - (task_widget_cancel_callback): Use it. Report "Cancel" instead of - "Cancelled". - (task_widget_show_details_callback): New, callback for the "Show - Details" right-click menu item. - - * evolution-activity-client.c: Updated to dispatch the "Cancel" - and "ShowDetails" events as "cancel" and "show_details" signals. - (class_init): Install the signals. - (listener_callback): Updated to update the signals corresponding - to the "ShowDetails" and "Cancel" events. - - * Evolution-Activity.idl: Changed the docs about the events sent - to the Bonobo::Listener. We now only have "ShowDetails" and - "Cancelled". - - * evolution-test-component.c (timeout_callback_1): Make the - activity cancellable so we can test the right-click cancel menu - too. - - * main.c (idle_cb): Actually exit if we cannot reach to the shell. - -2001-07-01 Ettore Perazzoli <ettore@ximian.com> - - * e-uri-schema-registry.c (init): Unset the FLOATING flag on the - object. - -2001-07-01 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c: Fixing a bug that could cause Evolution to crash - if a new ShellView was created and then destroyed, and then a new - folder would appear in the folder tree. Sigh, this code with the - delayed_selection is pretty messed up, but at least this will add - some consistency to it and make it safe. - (cleanup_delayed_selection): New function to disconnect the - "new_folder_cb" callback if the `delayed_selection' is not NULL, - and also free the `delayed_selection' itself. - (new_folder_cb): Use it. - (destroy): Call it here, otherwise we might [a] leak [b] cause a - crash as soon as a new folder appears in the folder tree, as - "new_folder" gets emitted and our connected signal handler has no - EShellView to handle the signal on. - (e_shell_view_display_uri): Call it here before re-setting the - `delayed_selection'. - - * e-shortcuts-view.c (open_shortcut_in_new_window_cb): Add - invocation for `open_shortcut_helper()' back in [it was gone, for - unknown reasons]. - -2001-07-01 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (tree_drag_begin): If the node doesn't have - a component, just don't start the whole CORBA drag thing instead - of crashing with an assertion. - -2001-07-01 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c (command_new_shortcut): New, implementation - for the "New Shortcut" command create a new shortcut. - (goto_folder_dialog_cancelled_cb): Renamed from - `folder_selection_dialog_cancelled_callback'. - (goto_folder_dialog_folder_selected_cb): Renamed from - `folder_selection_dialog_cancelled_callback'. - - * e-shell-folder-selection-dialog.c: New member `allow_creation' - in `EShellFolderSelectionDialogPrivate'. - (e_shell_folder_selection_dialog_get_allow_creation): New; return - the value of `allow_creation'. - (e_shell_folder_selection_dialog_set_allow_creation): New; hide or - show the "New" button according to the @allow_creation arg. - -2001-07-01 Ettore Perazzoli <ettore@ximian.com> - - * e-shortcuts-view.c: Added "Rename Group" command to the - right-click group menu item. - (rename_group_cb): New callback for the "Rename Group" command. - - * e-shortcuts-view-model.c (shortcuts_rename_group_cb): New, - callback for the EShortcuts::rename_group signal. It renames the - group by removing it and creating a new one which is the same; - this sucks, but there is no other way with the current shortcut - bar widget. - (e_shortcuts_view_model_construct): Connect it. - - * e-shortcuts.c - (class_init): Install signal "rename_group". - (e_shortcuts_rename_group): New. - - * e-shortcuts.h: New signal "rename_group". - -2001-07-01 Ettore Perazzoli <ettore@ximian.com> - - * e-shortcuts.c: Removed `title_to_group' hash from - `EShortcutsPrivate'. - (init): Don't initialize it anymore. - (unload_shortcuts): Don't remove the groups from the hash, and - don't destroy/realloc the hash. - (load_shortcuts): Don't check for duplicate group names. Don't - add the groups to the hash. - (destroy): Don't free the hash. - (e_shortcuts_get_shortcuts_in_group): Changed to get a @group_num - instead of a @group_title. - - * e-shortcuts-view-model.c (load_group_into_model): Updated to - pass the group number to `e_shortcuts_get_shortcuts_in_group()'. - Removed arg @group_title. - -2001-07-01 Ettore Perazzoli <ettore@ximian.com> - - * e-shortcuts-view.c: Added a "Rename" right-click command. - (rename_shortcut_cb): New function, implementation for the "Rename - command". - (rename_shortcut_dialog_cb): Callback for the gnome_request_dialog - function to ask the new name. - - * e-shortcuts.c (e_shortcuts_update_shortcut): Call `make_dirty()' - so we get saved too. - -2001-07-01 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (activate_shortcut_cb): Receive an @in_new_window - arg as well. - - * e-shortcuts-view.c: Added a new "Open in New Window" right-click - menu item. Renamed "Activate" to "Open". - (class_init): Update the installation of the "activate_shortcut" - signal for the additional @in_new_window_arg. - (open_shortcut_helper): New helper function. - (open_shortcut_cb): Renamed from `open_shortcut_cb'. Changed to - use `open_shortcut_helper' - (open_shortcut_in_new_window_cb): New. - (item_selected): Pass %FALSE as the @in_new_window arg for - "activate_shortcut". - - * e-shortcuts.c (save_shortcuts): Set the "name" and "type" - properties for the <item> nodes too. - (load_shortcuts): Change `shortcut_group_title' to be an `xmlChar - (shortcut_set): New helper function. - (shortcut_update): New helper function. - (update_shortcut_and_emit_signal): New helper function. - (e_shortcuts_update_shortcut): Use it. - -2001-07-01 Ettore Perazzoli <ettore@ximian.com> - - This is a first shoot at making shortcuts renameable [#3719]; - unfinished. Also, it causes the shortcut bar to stop displaying - message unread count, but this is unfixable until we get rid of - the ::LocalStorage interface, which should hopefully happen soon. - - * e-shortcuts-view.c (icon_callback): Get the icon from the type - member of the shortcut item instead of going to the actual folder. - - * e-shell-view.c (updated_folder_cb): Don't update the shortcuts - here for now. - - * e-shortcuts-view.c (item_selected): Use - `e_shortcuts_get_shortcut()' instead of `e_shortcuts_get_uri()'. - (impl_shortcut_dropped): Pass a NULL @name and @type. - - * e-shortcuts-view-model.c (load_group_into_model): Updated to - match the new `e_shortcuts_get_shortcuts_in_group()' function that - doesn't allocate the list anymore and returns a list of - EShortcutItems instead of a list of strings. - (load_group_into_model): Likewise. - (load_all_shortcuts_into_model): Likewise. - (shortcuts_new_shortcut_cb): Get the URI and the name from the - EShortcutItem instead of retrieving them from the storage. - (shortcuts_update_shortcut_cb): Likewise. - (get_storage_set_path_from_uri): Removed [now unused]. - - * e-shortcuts.c: Define the shortcuts to be EShortcutItems instead - of just strings. - (shortcut_new): New helper function to allocate a Shortcut. - (shortcut_free): New helper function to free a Shortcut. - (shortcut_group_new): New helper function to allocate a - ShortcutGroup. - (shortcut_group_free): New helper function to free a - ShortcutGroup. - (load_shortcuts): Use `shortcut_group_new()' here. - (e_shortcuts_add_group): Same here. - (unload_shortcuts): Use `shortcut_group_free()' here. - (e_shortcuts_remove_group): Here too. - (load_shortcuts): Update to handle `Shortcut's instead of simple - `char *'s representing the URIs. - (save_shortcuts): Likewise. - (e_shortcuts_get_shortcuts_in_group): Likewise. The returned list - now doesn't belong to the caller anymore; the return type is now - const. - (removed_folder_cb): Removed. - (e_shortcuts_construct): Don't connect. - (e_shortcuts_get_group_titles): Dont' re-allocate the string. - (e_shortcuts_get_uri): Removed. - (e_shortcuts_get_shortcut): New. - (e_shortcuts_add_shortcut): new args @name, @type. - (e_shortcuts_update_shortcut_by_uri): Remove. - (e_shortcuts_remove_shortcut_by_uri): Remove. - (get_item): New helper function. - (e_shortcuts_get_shortcut): Use it. - (find_positions_by_uri): Removed. - - * e-shortcuts.h: New typedef EShortcutItem. - -2001-06-30 Federico Mena Quintero <federico@ximian.com> - - * e-storage-set-view.c (popup_folder_menu): Pass the event time to - gtk_menu_popup() so that we can release the button and have the - menu stay up. - -2001-06-29 Christopher James Lahey <clahey@ximian.com> - - * e-shortcuts-view-model.c (load_all_shortcuts_into_model): - Replaced GList with GSList here to fix a type mismatch. - -2001-06-29 Christopher James Lahey <clahey@ximian.com> - - * Makefile.am (INCLUDES): Changed $(datadir)/evolution/etspec to - "$(etspecdir)" here. - -2001-06-29 Christopher James Lahey <clahey@ximian.com> - - * e-shortcuts-view-model.c (load_group_into_model): Replaced GList - with GSList here to fix a type mismatch. - -2001-06-29 Ettore Perazzoli <ettore@ximian.com> - - * e-shortcuts-view-model.c (load_group_into_model): Updated to - match the fact that `e_shortcuts_in_group()' now returns a GSList - instead of a GList. - (load_all_shortcuts_into_model): Likewise for - `e_shortcuts_get_group_titles()'. - - * e-shortcuts.c: Change all `groups' and `views' from GLists to - GSLists in EShortcutsPrivate. - (e_shortcuts_get_group_titles): Return a GSList instead of a - GList. - (e_shortcuts_get_shortcuts_in_group): Likewise. - -2001-06-28 Ettore Perazzoli <ettore@ximian.com> - - [Fix #3756, `--debug' option not working anymore.] - - * main.c (main): Get the URI list from popt with `poptGetArgs' - instead of just using argv. Sigh, I am rusty. - -2001-06-28 Ettore Perazzoli <ettore@ximian.com> - - [Fix #3382, shortcut bar crashes when checking mail, and all the - different incarnations involving updates to an shortcut bar having - shortcuts to non-existent folders. Also, this fixes #1643, - shortcuts not visible until you enable an IMAP account, and #2436, - misbehavior of shortcut groups when IMAP or invalid shortcuts are - involved.] - - * e-shortcuts-view-model.c (load_group_into_model): Add the - shortcuts that point to folders that don't exist yet, too. - -2001-06-28 Dan Winship <danw@ximian.com> - - * e-storage.c (e_storage_new_folder): Call folder_changed_cb after - adding the new folder so that if it was added highlighted, its - parent will get its child_highlight set. - (e_storage_new_folder): Move the folder_changed_cb() call to avoid - a g_warning. - -2001-06-28 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (e_shell_create_view): Renamed from - `e_shell_new_view'. - -2001-06-28 Ettore Perazzoli <ettore@ximian.com> - - * main.c (idle_cb): Re-implemented to get a GSList of URIs and - open them on a running shell [if any] or on a newly created shell. - If no args are provided [i.e. the list is NULL], it either - restores from settings [if any], or it just opens the Inbox. - (main): Set up the GSList of arguments and have it passed to the - idle callback. - - * e-shell.c (init): Ooops. Init `uri_schema_registry' to NULL as - well. - - * evolution-shell-component-client.c - (evolution_shell_component_client_handle_external_uri): New. - (corba_exception_to_result): Handle the `UnsupportedSchema' - exception too. - - * evolution-shell-component.h: New - EvolutionShellComponentResult value - `EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDSCHEMA'. - - * Evolution-ShellComponent.idl: New exception `UnsupportedSchema'. - (handleExternalURI): This can now raise `NotFound', - `UnsupportedSchema' and `InternalError'. - (createView): This can now raise `UnsupportedSchema' too. - - * e-shell.c (impl_Shell_handleURI): Finish implementation. - (class_init): Install it. - - * e-uri-schema-registry.c - (e_uri_schema_registry_get_handler_for_schema): Ooops. Rename - from `e_uri_schema_get_handler_for_schema'. Also, return NULL if - no handler is found. - -2001-06-27 Ettore Perazzoli <ettore@ximian.com> - - * e-component-registry.c (register_component): Get the supported - schemas and register them into the schema registry. - - * e-shell.c: New member `uri_schema_registry' in `EShellPrivate'. - (e_shell_construct): Init. - (destroy): Unref. - (impl_Shell_createNewView): Raise exception `UnsupportedSchema' if - it's not an `evolution:' URI. Raise exception `NotFound' if - `e_shell_new_view()' returns NULL. - (impl_Shell_handleURI): New, implementation for the `::handleURI' - method. - (e_shell_get_uri_schema_registry): New. - - * Evolution-Shell.idl: New exceptions `UnsupportedSchema' and - `InvalidURI'. - (createNewView): Make this able to raise `NotFound', - `UnsupportedSchema' and `InvalidURI'. - (handleURI): New method. - - * e-uri-schema-registry.h: New. - * e-uri-schema-registry.c: New. - -2001-06-27 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component-client.c: Remove redundant declaration - for `free_ShellComponentListener_servant()'. - -2001-06-27 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component.c (impl_handleExternalURI): - Implementation for the `::handleExternalURI' CORBA method; just - emit the `HANDLE_EXTERNAL_URI' signal. - (class_init): Install. - -2001-06-27 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component.c (impl_setOwner): Renamed from - `impl_ShellComponent_set_owner'. - (impl_unsetOwner): Renamed from `impl_ShellComponent_unset_owner'. - (impl_debug): Renamed from `impl_ShellComponent_debug'. - (impl_createView): Renamed from `impl_ShellComponent_create_view'. - (impl_createFolderAsync): Renamed from - `impl_ShellComponent_async_create_folder'. - (impl_removeFolderAsync): Renamed from - `impl_ShellComponent_async_remove_folder'. - (impl_xferFolderAsync): Renamed from - `impl_ShellComponent_async_xfer_folder'. - (impl_populateFolderContextMenu): Renamed from - `impl_ShellComponent_populate_folder_context_menu'. - (class_init): Updated accordingly. - -2001-06-27 Ettore Perazzoli <ettore@ximian.com> - - * evolution-test-component.c (factory_fn): Pass NULL as the - @external_uri_schemas arg to `evolution_shell_component_new'. - - * evolution-shell-component.c: New enum value - `HANDLE_EXTERNAL_URI'. New member `external_uri_schemas' in - `EvolutionShellComponentPrivate'. - (init): Initialize `external_uri_schemas' to NULL. - (destroy): Free it. - (destroy): - (class_init): Add the "handler_external_uri" signal. - (evolution_shell_component_new): Added precondition on - @folder_types. New arg @external_uri_schemas. - (evolution_shell_component_construct): Added preconditions. New - arg @external_uri_schemas. Initialize the `external_uri_schemas' - member in the EvolutionShellComponentPrivate part. - (impl_ShellComponent__get_external_uri_schemas): New, - implementation for reading the `external_uri_schemas' attribute. - (class_init): Install it in the EPV. - - * evolution-shell-component.h: New signal `handle_external_uri'. - - * Evolution-ShellComponent.idl: New attribute `extra_uri_schemas'. - (handleExternalURI): New method. - -2001-06-26 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (etree_value_at): Don't strdup "My - Evolution"! It was getting leaked every time the e-table wanted - to read the value this way. - -2001-06-26 Ettore Perazzoli <ettore@ximian.com> - - * e-local-storage.c: Removed member `BonoboListener' from - `AsyncCreateFolderCallbackData' and - `AsyncRemoveFolderCallbackData'. - (bonobo_interface_remove_folder_cb) : Return the value from - `create_folder()'. - (bonobo_interface_remove_folder_cb): Return the value from - `remove_folder()'. - (notify_bonobo_listener): Removed. - (component_async_create_folder_callback): Don't notify the - listener here. - (component_async_remove_folder_callback): Ditto. - (create_folder): Removed @listener arg. Not here either. Return - a valid E_STORAGE error code instead. Also, don't set the - `listener' field in `callback_data'. - (remove_folder): Likewise. - (bonobo_interface_create_folder_cb): Remove @listener arg. - (bonobo_interface_remove_folder_cb): Likewise. - -2001-06-25 jacob berkman <jacob@ximian.com> - - * e-shell-view.c: (set_folder_timeout): display a selected uri in - a timeout rather than right away, so the UI feels a bit more - responsive, and the tree is more navigable via keyboard - (switch_on_folder_tree_click): use the timeout rather than setting - the URI right away - (destroy): remove the timeout if it still exists - (update_for_current_uri): if there is a timeout set, don't update - (e_shell_view_display_uri): remove the timeout if it exists - -2001-06-25 Ettore Perazzoli <ettore@ximian.com> - - * main.c (no_views_left_cb): Call `e_shell_unregister_all()'. - - * e-shell.c (e_shell_unregister_all): New. - -2001-06-25 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (convert_gdk_drag_action_to_corba): Remove - trailing "\n" from g_warning. - (convert_corba_drag_action_to_gdk): Likewise. - (tree_drag_data_received): Likewise. - (new_folder_cb): Likewise. - - * e-shortcuts-view-model.c (load_group_into_model): Remove - trailing "\n" from g_warning. - -2001-06-25 Ettore Perazzoli <ettore@ximian.com> - - * main.c (no_views_left_cb): Unref the shell here. - - * e-storage-set.c (destroy): Use - `name_to_named_storage_foreach_destroy()' as the function argument - to `g_hash_table_foreach()', not `named_storage_destroy()', which - is just plainly wrong. - - * e-shell.c (setup_corba_storages): Don't ref the - corba_storage_registry here. - (destroy): Don't unref here. - (setup_activity_interface): Don't ref the activity_handler either. - (destroy): Don't unref it here. - - * e-component-registry.c (e_component_registry_construct): Don't - ref the shell here. - (destroy): Don't unref it here. - -2001-06-25 Ettore Perazzoli <ettore@ximian.com> - - * main.c (no_views_left_cb): Don't call `e_shell_quit()' anymore. - - * e-shell-view-menu.c (command_quit): Call - `e_shell_destroy_all_views()' instead of `e_shell_quit()', which - does not exist anymore. - - * e-shell.c (e_shell_quit): Removed. - (e_shell_destroy_all_views): New. - -2001-06-24 Ettore Perazzoli <ettore@ximian.com> - - * Makefile.am: s/\.oafinfo/.oaf/g. - - * GNOME_Evolution_TestComponent.oafinfo: Renamed to - `GNOME_Evolution_TestComponent.oaf'. - -2001-06-24 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c: New member `iid' in EShellPrivate. - (init): Init to NULL. - (e_shell_construct): Set it to the value of the @iid argument. - (destroy): Unregister that IID. - (register_shell): Removed. - (e_shell_construct): Just do all the work here. The function was - too simple to really be useful as separate. - - * e-shell.c, e-shell.h: Changed to derive from BonoboXObject - instead of deriving from BonoboObject and doing all the nasty - CORBA work by hand. - -2001-06-24 Ettore Perazzoli <ettore@ximian.com> - - * evolution-test-component.c (activity_client_clicked_callback): - New callback for the "clicked" signal on the EActivityClient. - Just spit out a warning now, for testing purposes. - (timeout_callback_1): Connect it. - - * evolution-activity-client.c (listener_callback): Emit the - "clicked" signal if we get the "Clicked" event from the Bonobo - listener. - -2001-06-24 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-commands.c: #include <gtk/gtklabel.h>. - (delete_dialog): Constify @folder_name properly. - (delete_cb): Change the first arg to be an EStorageSet as expected - for EStorageSetResultCallbacks. - (rename_dialog): #if 0. - -2001-06-24 Ettore Perazzoli <ettore@ximian.com> - - * e-task-widget.h, e-task-widget.c: Changed to derive from - GtkEventBox. - - * e-activity-handler.c (task_widget_button_press_event_callback): - New callback for the "button_press_event" signal on the - ETaskWidgets. Dispatch the "Clicked" event through the Bonobo - listener. - (task_widget_new_from_activity_info): Connect here. - -2001-06-24 Ettore Perazzoli <ettore@ximian.com> - - * evolution-test-component.c: Changed to use the - `EvolutionActivityClient' object. New global static variable - `activity_client'. - (create_animated_icon): Removed. - (create_icon_from_pixbuf): Removed. - (task_bar_event_listener_callback): Removed. - (timeout_callback_1): Create an EvolutionActivityClient object and - put a pointer to it into `activity_client'. Lower the timeout - delay from 1000 msecs to 100 msecs, so we can stress-test the - speed control code in EvolutionActivityClient. - (timeout_callback_2): Use the EvolutionActivityClient. Increment - progress by 1, instead of 10. - (timeout_callback_3): Destroy the EvolutionActivityClient. - - * Makefile.am (libeshell_la_SOURCES): Add - `evolution-activity-client.c'. - (eshellinclude_HEADERS): Add `evolution-activity-client.h'. - - * evolution-activity-client.c: New. - * evolution-activity-client.h: New. - - * e-activity-handler.c: Updated all instances of `ActivityID' with - `ActivityId'. - - * Evolution-Activity.idl: Renamed `ActivityID' to `ActivityID'. - Added value `DIALOG_ACTION_ERROR' to `DialogAction'. - -2001-06-24 Ettore Perazzoli <ettore@ximian.com> - - * evolution-test-component.c: Remove the `activity_interface' - global. - (timeout_callback_3): Get the ::Activity interface using - `evolution_shell_client_get_activity_interface()' on - `parent_shell' instead. - (timeout_callback_2): Likewise. - (timeout_callback_2): Likewise. - (timeout_callback_1): Likewise. - (owner_set_callback): Don't query interface here. Check if the - shell has an ::Activity interface by using - `evolution_shell_client_get_activity_interface()' here as well. - - * evolution-shell-client.c: New member `activity_interface' in - `EvolutionShellClientPrivate'. - (destroy): unref/release it. - (evolution_shell_client_construct): Initialize it by querying the - shell CORBA Object for the ::Activity interface. - (evolution_shell_client_get_activity_interface): New. - -2001-06-23 Jason Leach <jleach@ximian.com> - - * e-shell-folder-selection-dialog.c - (e_shell_folder_selection_dialog_construct): Make the folder tree - have a similar expanded state as the shell's folder tree. - - * e-local-storage.c (remove_folder): New function that does the - meat of actual deletion stuff. - (remove_folder_directory): A helper function that remove_folder() - uses. - (component_async_remove_folder_callback): A new callback to do the - removing stuff from shell (if there weren't errors from the - component). - (impl_async_remove_folder): Implemented this. - - * evolution-shell-component-client.c - (evolution_shell_component_client_async_remove_folder): - Implemented this. - - * e-shell-view.c (e_shell_view_remove_control_for_uri): New - function. - -2001-06-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (e_shell_view_set_current_shortcuts_group_num): - Moved at the bottom, as it's public API. Also add preconditions. - (e_shell_view_get_current_shortcuts_group_num): Likewise. - -2001-06-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c: Get rid of some `#if 0'ed code. - -2001-06-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (corba_interface_set_message_cb): Replaced with - an empty stub, as the "set_message" method is going to be - deprecated. - (corba_interface_unset_message_cb): Likewise for the - "unset_message" method. - -2001-06-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c (e_shell_construct): Set `splash' to NULL when - @show_splash is false, so the compiler doesn't complain. - - * e-shell-view-menu.c: #include <gtk/gtkmain.h>. - - * e-setup.c: #include <unistd.h>. - - * importer/intelligent.c: #include <gtk/gtkhbox.h> and - <gtk/gtkdrawingarea.h>. - -2001-06-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c: New member `menu_hint_label' in - `EShellViewPrivate'. - (init): Init to NULL. - (ui_engine_add_hint_callback): Set the label in the menu hint - label, show the menu hint label, hide the task bar. - (ui_engine_remove_hint_callback): New callback for the - "remove_hint" signal on the BonoboUIEngine; hide the hint label, - show the task bar. - (setup_statusbar_hints): Connect it. - (setup_menu_hint_label): New helper function to create the menu - hint label. - (create_status_bar): Call it. - -2001-06-23 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c (command_quit): Add a `gtk_main_quit()' at - the end here. - -2001-06-23 Ettore Perazzoli <ettore@ximian.com> - - * Makefile.am: Add rules to build the test component and an - `install-test-component' target to install it. - - * GNOME_Evolution_TestComponent.oafinfo: New OAF file for the test - component. - - * evolution-test-component.c: New component, currently to test the - activity interfaces. We will be able use it for testing more - things in the future. - - * e-shell.c: New member `activity_handler' in `EShellViewPrivate'. - (init): Init here. - (class_init): Unref. - (setup_activity_interface): New helper function to create an - `EActivityHandler' object and aggregate it to the `EShell'. - (e_shell_construct): Call here. - (e_shell_new_view): Attach the task bar of the newly created view - to the activity handler by using - `e_activity_handler_attach_task_bar()'. - - * e-shell-view.c: Removed old progress bar code. New members - `status_bar' and `task_bar' in EShellViewPrivagte; removed member - `progress_bar'. - (init): Initialize the new fields; remove initialization for - `progress_bar'. - (impl_destroy): Handle the new fields here too. - (setup_task_bar): New helper function to set up an ETaskBar. - (create_status_bar): New helper function to create the status bar - with an ETaskBar in it. - (ui_engine_add_hint_callback): New callback for the "add_int" - BonoboUIEngine signal. - (setup_statusbar_hints): New helper function to set up the menu - hints for the status bar; connect `ui_engine_add_hint_callback()' - here. - (setup_widgets): Call `create_status_bar()' and - `setup_statusbar_hints()'; pack the status bar in a vbox instead - of using the Bonobo status bar stuff, which is kinda broken. - (e_shell_view_get_task_bar): New. - (get_type_for_folder): No use to get the EFolderTypeRegistry here. - - * Evolution.idl: #include <Evolution-Activity.idl> and - <Evolution-Icon.idl>. - - * Evolution-Activity.idl: New. - - * Evolution-Icon.idl: New. - - * e-activity-handler.c: New. - * e-activity-handler.h: New. - - * e-task-bar.c: New. - * e-task-bar.h: New. - - * e-task-widget.c: New. - * e-task-widget.h: New. - -2001-06-21 Jason Leach <jleach@ximian.com> - - * evolution-storage.c (evolution_storage_deregister_on_shell): New - function, uses the StorageRegistry::removeStoragebyName corba call - to properly make the storage vanish from the shell. - -2001-06-18 Dan Winship <danw@ximian.com> - - * Makefile.am (evolution_LDADD): Remove DB3_LDADD - - * e-shell-view-menu.c: Fix the help URLs - -2001-06-13 Not Zed <NotZed@Ximian.com> - - * e-shell-view.c (switch_on_folder_tree_click): Check priv->uri - isn't null before strcmp'ing it here too. - -2001-06-11 Dan Winship <danw@ximian.com> - - * e-shell-view.c (destroy): Don't destroy the - offline_toggle_pixmap: the offline_toggle 0wnz it. - (update_for_current_uri): Check priv->uri isn't NULL before - strcmp()ing it. - -2001-06-11 Jason Leach <jleach@ximian.com> - - * evolution-storage.c (impl_Storage_async_create_folder): Fixed - folder creation on IMAP storages (by notifying bonobo listener - with the result). - - * evolution-storage-listener.c: Some cleaning. - -2001-06-08 Iain Holmes <iain@ximian.com> - - * e-setup.c (check_dir_recur): Don't copy the old Executive-Summary dir. - (e_setup): If there is an Executive-Summary dir in ~/evolution/local - ask it the user wants to remove it. - (e_shell_rm_dir): Function to completely delete a directory. - -2001-06-07 Iain Holmes <iain@ximian.com> - - * evolution-storage.c (impl_Storage_async_create_folder): Removed - debug spew. - - * e-shell-importer.c (start_import): Removed spew. - - * e-shell-view.c (update_window_icon): Take a gboolean to say if - the folder is my evolution. Do special cased things for My Evolution. - (update_folder_title_bar): Same. - (update_for_current_uri): Find out if the uri is the my evolution one - and act accordingly. - (get_control_for_uri): Handle the toplevel My Evolution. - - * e-storage-set-view.c (etree_icon_at): Get an icon for the toplevel - My Evolution. - (etree_value_at): Default is to return "My Evolution" - (e_storage_set_view_construct): Set the toplevel to be called "My - Evolution" and show it. - (e_storage_set_view_set_show_folders): Same. - -2001-06-08 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-commands.c (e_shell_command_add_to_shortcut_bar): - Allow a NULL @shell_view arg. - -2001-06-08 Jason Leach <jleach@ximian.com> - - * e-shell.c (e_shell_construct): Fix splash setup to keep it from - giving two Gtk-CRITICAL assertions when you do --no-splash. - -2001-06-06 Jon Trowbridge <trow@ximian.com> - - * evolution-storage.c (impl_Storage_async_create_folder): Changed - purely informational debug spew from a g_warning to a g_message. - - * e-shell-importer.c (show_import_wizard): The import wizard - defined in import.glade only has three pages... yet we were trying - to manipulate "page4" as the finish page, with the expected bad - results. My guess is that the .glade file got changed, but the - code didn't get updated. - (start_import): We were trying to bonobo_object_unref - (BONOBO_OBJECT (icd->client)), which is fine except for the - fact that icd->client is just a GtkObject, not a BonoboObject. - Changed to a gtk_object_unref. - (start_import): Changed a purely informational bit of debug - spew from a g_warning to a g_message. - -2001-06-06 Iain Holmes <iain@ximian.com> - - * importers/intelligent.c (create_gui): Make a few boxes, and make - the whole dialog horizontal. Add better buttons, and a "Don't ask - again button" (And the world rejoices). - Fixed the notebook so it displayed the blank page on startup. - (intelligent_importer_init): Handle the "Don't ask me again" button. - -2001-06-06 Jason Leach <jleach@ximian.com> - - (Fix bug #3205: Component crash causes folder switch even when not - needed) - - * e-shell-view.c (socket_destroy_cb): Only flip around the - ShellView to different folders when we're currently viewing the - URI that's being closed/crashed. - -2001-06-06 Jason Leach <jleach@ximian.com> - - (Fix bug #418: Save state of folder tree view) - - * e-shell-view.c (e_shell_view_save_settings): Changed the char * - @prefix argument to an int @view_num. - (e_shell_view_load_settings): Ditto. - (get_local_prefix_for_view): New function that gets us a prefix - from a view_num. - - * e-shell-view.c (e_shell_view_save_settings): Save the - expanded/collapsed information for each storage-set-view here. - (e_shell_view_load_settings): Load it here. - - * e-storage-set-view.c (e_storage_set_view_construct): Make it so - new storage set views have their storages expanded by default, but - will respsect the expanded state information that we load into it. - (insert_storages): Minor change here too. - (new_folder_cb): Ditto. - -2001-06-05 Jason Leach <jleach@ximian.com> - - * e-shell-view-menu.c: Plug in all the folder tree right click - menu verbs so bonobo-warnings aren't emitted (even though the - respective implementation functions are currently unimplemented). - (command_delete_folder): New function, see above. - (command_rename_folder): Ditto. - (command_folder_properties): Ditto. - - * e-shell-folder-commands.c (e_shell_command_delete_folder): New - function, currently unimplemented. - -2001-06-04 Jason Leach <jleach@ximian.com> - - (Fixing bug #1299: Shell saves shortcuts when display name - changes) - - * e-shortcuts.c (class_init): New signal: "update_shortcut". - - * e-shortcuts-view-model.c (e_shortcuts_view_model_construct): - Connect thew new signal here. - - * e-shortcuts-view-model.c (shortcuts_update_shortcut_cb): New - function, uses the new e_shortcut_model_update_item(). - - * e-shell-view.c (corba_interface_set_folder_bar_label): Fix a - warning here. - -2001-06-03 Ettore Perazzoli <ettore@ximian.com> - - * Makefile.am (evolution_LDADD): Move `$(DB3_LDADD)' before - libeutil. - -2001-06-01 Ettore Perazzoli <ettore@ximian.com> - - * Makefile.am (evolution_LDADD): Add `$(DB3_LDADD)'. - -2001-05-30 Jason Leach <jleach@ximian.com> - - * e-shell-view.c (e_shell_view_set_current_shortcuts_group_num): - New function (probably should just be static). - (e_shell_view_load_settings): Load the current shortcut group here - using the above new function. - (e_shell_view_save_settings): Save current shortcut group in here. - -2001-05-30 Jason Leach <jleach@ximian.com> - - * e-shell-folder-title-bar.c: New 'folder_bar_label' member for - EShellFolderTitleBar, it's for information that's shown to the - left of the icon like the dates in the calendar (or, potentially - total and unread numbers for mailer). - (e_shell_folder_title_bar_set_folder_bar_label): New function, - lets others set the title bar extra label. - - * Evolution-ShellView.idl: New method 'setFolderBarLabel' for our - exposed ShellView interface. - - * evolution-shell-view.h: New signal "set_folder_bar_label" for - EvolutionShellView. - - * evolution-shell-view.c (impl_ShellView_set_message): Emit the - new signal here. - - * e-shell-view.c (setup_corba_interface): Connect the signal here. - - * e-shell-view.c (corba_interface_set_folder_bar_label): New - function, callback for the above signals, does the actual extra - label setting for the folder title bar. - - * e-shell-folder-commands.c (e_shell_command_add_to_shortcut_bar): - Fix a warning here. - -2001-05-30 Jason Leach <jleach@ximian.com> - - * e-shell.c (e_shell_construct): Removed an unecessary sleep(2) - call, so evolution will start up 2 seconds faster now. - -2001-05-30 Jason Leach <jleach@ximian.com> - - * e-shell-view-menu.c: Connect the AddFolderToShortcutBar verb to - their implementation functions. - - * e-shell-view.c (e_shell_view_get_current_shortcuts_group_num): - New function, use it to find out which shourtcut group is - currently open on the shortcut bar. - - * e-shell-folder-commands.c (e_shell_command_add_to_shortcut_bar): - Implement this using new function described above. - -2001-05-29 Federico Mena Quintero <federico@ximian.com> - - * e-shell-view.c (setup_progress_bar): Added missing castt. - (setup_offline_toggle): Likewise. - -2001-05-29 JP Rosevear <jpr@ximian.com> - - * e-shell-view.c (setup_progress_bar): unref the control when - finished with it - (setup_offline_toggle): ditto - (destroy): destroy offline and progress widgets - -2001-05-28 Dan Winship <danw@ximian.com> - - * e-storage-set-view.c (new_storage_cb): Call - e_tree_node_set_expanded on the storage_set_view, not the - storage_set (which is not an ETree). - -2001-05-27 Dan Winship <danw@ximian.com> - - * evolution-shell-component-utils.c: New file. - (e_pixmaps_update): Moved here from e-util to break e-util bonobo - dependency. - - * e-shell-view-menu.c: #include - "evolution-shell-component-utils.h" instead of "e-gui-utils.h" - - * Makefile.am (libeshell_la_SOURCES, eshellinclude_HEADERS): Add - evolution-shell-component-utils.[ch] - -2001-05-26 Dan Winship <danw@ximian.com> - - * e-storage-set-view.c (destroy): Don't free the hash keys in - priv->path_to_etree_node, because they're owned by the ETree now. - (e_storage_set_view_set_show_folders): Likewise. - -2001-05-25 Peter Williams <peterw@ximian.com> - - * Makefile.am: Change libeshell from a noinst_LIBRARIES to - a lib_LTLIBRARIES. Install its headers in - $includedir/evolution/shell. - - * evolution-storage.c (safe_corba_string): New, copy of e_safe_corba_string - in libeutil. This way libeshell doesn't have a missing symbol when programs - that don't have libeutil link to it. - (evolution_storage_register): s,e_safe_corba_string,safe_corba_string,g. - -2001-05-25 jacob berkman <jacob@ximian.com> - - * e-shell-view.c (setup_widgets): place the shortcut bar in a - frame - -2001-05-21 Christopher James Lahey <clahey@ximian.com> - - * Makefile.am (INCLUDES): Added ETSPECDIR. Added - e-storage-set-view.etspec to get installed. - - * e-local-storage.c (remove_folder_directory): Commented out this - function since it is unused. - - * e-shell-folder-commands.c - (folder_selection_dialog_folder_selected_callback), e-shell-view.c - (update_offline_toggle_status): Fixed warnings here by adding a - return; after the g_assert_not_reached();. - - * e-shell-importer.c (start_import): Got rid of real_folderpath - here and just reused folderpath (It was causing uninitialized - variable warnings.) - - * e-shell.c (impl_Shell_getLocalStorage): Use - bonobo_object_dup_ref here. It makes things simpler. - - * e-storage-set-view.c: Removed ETREE_SPEC since it's no longer - needed. - (convert_corba_drag_action_set_to_gdk, - folder_context_menu_activate_cb, remove_cb, - folder_context_menu_remove_cb): Commented out these functions - since they're unused. - (new_storage_cb, new_folder_cb, insert_folders, insert_storages): - Don't bother using insert_id here since it no longer does - anything. - (new_storage_cb, removed_storage_cb, removed_folder_cb): Don't - free the data returned from e_tree_memory_node_remove. - (e_storage_set_view_construct): Set the destroy func here so that - memory will automatically get freed when nodes are destroyed. - g_strdup the root node string here. Use - e_tree_construct_from_spec_file here to use an external file. - (e_storage_set_view_set_show_folders): g_strdup the root node - string here. - - * e-storage-set-view.etspec: New etspec file. - - * evolution-shell-component-client.c - (free_ShellComponentListener_servant): Added a prototype here. - -2001-05-23 Chris Toshok <toshok@ximian.com> - - * evolution-shell-component.h - (EVOLUTION_SHELL_COMPONENT_POPUP_PLACEHOLDER): track change to the - path to the ComponentPlaceholder. - -2001-05-20 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c: New static members `offline_pixmap', - `offline_mask', `online_pixmap', `online_mask'. Add members - `tooltips', `offline_toggle' and `offline_toggle_pixmap' to - `EShellViewPrivate'. - (init): Init to NULL. Also init the `progress_bar' member to NULL - as well, as we were not initializing it. - (destroy): Unref the tooltips. - (load_images): New static function to load the offline and online - icons into the pixmaps/masks. - (class_init): Call it. - (update_offline_toggle_status): New. - (shell_line_status_changed_cb): Call it. - (offline_toggle_clicked_cb): New, callback for the "clicked" - signal on the offline/online button. - (setup_offline_button): New function to set up the - `offline_button'. - (setup_widgets): Call it. - (setup_progress_bar): Changed to get an `EShellView' pointer, - instead of an `EShellViewPriv' pointer. - (setup_widgets): Updated accordingly. - -2001-05-20 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c: Define the verb for "CopyFolder" as well. - (command_copy_folder): Implementation for the "CopyFolder" verb. - - * e-shell-folder-commands.c: New struct `FolderCommandData'. - (folder_command_data_new): New function to allocate and initialize - it. - (folder_command_data_free): New function to free it. - (e_shell_command_move_folder): Pass a pointer to a filled-in - `FolderCommandData' struct to the callbacks instead of just - passing a pointer to the shell object. - (move_folder_selected_callback): Removed. - (move_folder_cancelled_callback): Removed. - (folder_selection_dialog_folder_selected_callback): New generic - callback for the folder selection dialog. - (folder_selection_dialog_cancelled_callback): New generic callback - for the folder selection dialog. - (connect_folder_selection_dialog_signals): New function to connect - these two handlers to a folder selection dialog. - (xfer_result_callback): New callback for the async xfer function. - (get_folder_name): New utility function. - (e_shell_command_copy_folder): Implement. - -2001-05-19 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-commands.c - (e_shell_command_create_new_folder): Changed to use - `e_shell_view_get_current_path()' to get the default path, instead - of computing it itself. - (move_folder_cancelled_callback) (move_folder_selected_callback): - New, callbacks for the "cancelled" and "folder_selected" signals - on the folder selection dialog for the "Move folder" operation. - (e_shell_command_move_folder): Implemented. - - * e-shell-view-menu.c (command_move_folder): New, implementation - for the "MoveFolder" verb. - - * e-shell-view.c (e_shell_view_get_current_path): New. - -2001-05-19 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-selection-dialog.h: Rename @default_path to - @default_uri. - - * e-shell.c (impl_Shell_selectUserFolder): Pass a NULL @caption to - `e_shell_folder_selection_dialog_new()'. - - * e-shell-importer.c (import_druid_finish): Add a caption to the - folder selection dialog. Constify local variable `foldername', - and avoid g_strdupping/g_freeing it, as it's useless. - - * e-shell-view-menu.c (command_goto_folder): Add a caption to - the folder selection dialog. - - * e-shell-folder-selection-dialog.c - (e_shell_folder_selection_dialog_new): New arg @caption. - (e_shell_folder_selection_dialog_construct): Likewise. Also - cleaned up a bit. - -2001-05-19 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c: Removed "NewView" verb. Added - `folder_verbs', with "OpenFolderInNewWindow" in it. - (e_shell_view_menu_setup): Set up the `folder_verbs' too. - (command_new_view): Renamed to - `command_open_folder_in_new_window'. - - * e-shell-folder-commands.c - (e_shell_command_open_folder_in_other_window): Implement. - -2001-05-19 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c (command_create_folder): Call - `e_shell_command_create_new_folder()' implemented in - `e-shell-folder-commands.c'. - - * e-shell-folder-commands.c: New. - * e-shell-folder-commands.h: New. - -2001-05-17 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c - (populate_folder_context_menu_with_common_items): Removed. - (popup_folder_menu): Instead of creating the component and the - folder popup definition here, just do `bonobo_window_add_popup()' - and assume that "/popups/FolderPopup" is defined in the toplevel - window's UI xml file. - -2001-05-16 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component-client.c: Moved some functions around - to avoid the warning about the static - `free_ShellComponentListener_servant()' function being used prior - to declaration. - -2001-05-15 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c (command_run_bugbuddy): `#if 0'ed out. - (command_submit_bug): New. Just fire up the web browser with - `http://bugzilla.ximian.com' in it. - (menu_do_misc): Associate the latter instead of the former to the - "HelpSubmitBug" verb. - -2001-05-15 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c: Add an `HelpFAQ' verb. - -2001-05-14 jacob berkman <jacob@ximian.com> - - * e-folder-tree.c (remove_folder): set the subfolder's parent to - NULL so the subfolder list doesn't change whilst we are using it - (folder_remove_subfolder): this function didn't used to work at - all - -2001-05-12 Chris Toshok <toshok@ximian.com> - - * e-storage-set-view.c (tree_drag_data_received): implement the - CORBA side of dragging. - (convert_gdk_drag_action_set_to_corba): rename - convert_gdk_drag_action_to_corba to this. - (convert_corba_drag_action_set_to_gdk): rename - convert_corba_drag_action_to_gdk to this. - (convert_gdk_drag_action_to_corba): new function that doesn't - build a bitmask, useful for the Action types, instead of - ActionSet. - (convert_corba_drag_action_to_gdk): same. - -2001-05-11 Chris Toshok <toshok@ximian.com> - - * e-storage-set-view.c - (populate_folder_context_menu_with_common_items): add RemoveFolder - menu item and verb. - (folder_context_menu_remove_cb): new function, call - e_storage_set_async_remove_folder. - (remove_cb): callack for e_storage_set_async_remove_folder. - - * evolution-shell-component-client.c - (evolution_shell_component_client_populate_folder_context_menu): - fix prototype to reflect Component -> Container. - - * evolution-shell-component-client.h: same. - -2001-05-11 Chris Toshok <toshok@ximian.com> - - * evolution-shell-component.h - (EVOLUTION_SHELL_COMPONENT_POPUP_PLACEHOLDER): add this define for - the xml path to use when adding menu items to the folder popup. - - * e-storage-set-view.c - (populate_folder_context_menu_with_common_items): add (#ifdef - DEBUG_XML) a menu item to dump the bonobo xml. - (popup_folder_menu): pass the BonoboUIContainer to the - populate_folder_context_menu CORBA call, instead of the component. - Also, reorder things a bit so the component doesn't get an error - when setting xml the first time. - -2001-05-11 Iain Holmes <iain@ximian.com> - - * e-shell-folder-selection-dialog.c (dbl_click_cb): Use gnome_dialog_close - instead of gtk_widget_destroy. - (impl_clicked): Use gnome_dialog_close instead of gtk_widget_destroy. - - * e-shell-view-menu.c: #include e-shell-importer.h instead of importer/importer.h - - * importer/Makefile.am: Remove importer.c and importer.h. - - * importer/importer.[ch]: Moved these to e-shell-importer.[ch] - - * e-shell-importer.c (start_import): Take a folderpath to import into. - (importer_druid_finish): Show the EShellFolderSelectionDialog to get a folder to - import into. - -2001-05-11 JP Rosevear <jpr@ximian.com> - - * e-component-registry.c (register_component): component_new refs - the object itself, so unref ours when we finish with it - - * e-shell.c (e_shell_construct): There is no need to explicitly - ref the folder type registry, storage set and shortcuts because we - are the creator and hold the initial ref count of 1. - -2001-05-11 Dan Winship <danw@ximian.com> - - * e-local-storage.c (load_folder): Lots of people seem to have - "broken" local storage hierarchies. So ignore errors (like the old - code did) and just print a warning. - -2001-05-11 Chris Toshok <toshok@ximian.com> - - * evolution-storage-set-view-factory.c - (evolution_storage_set_view_factory_new_view): the only - problematic area - pass NULL for now in as the BonoboUIContainer. - how do we pass this container to the control? - - * e-storage-set-view.c (folder_context_menu_activate): un-#if 0 - this function. - (populate_folder_context_menu_with_common_items): build our popup - using the new xml bonobo stuffs. - (popup_folder_menu): convert to using the new xml bonobo stuffs. - (right_click): only do the popup menu if we have a - BonoboUIContainer. - (e_storage_set_view_new): add BonoboUIContainer* arg. - (e_storage_set_view_construct): same. - - * e-storage-set-view.h: add BonoboUIContainer* args to - e_storage_set_view_new and e_storage_set_view_construct. - - * e-shell-folder-creation-dialog.c (add_storage_set_view): pass - NULL for the BonoboUIContainer, since we shouldn't (?) have a - popup in this dialog. - - * e-shell-folder-selection-dialog.c - (e_shell_folder_selection_dialog_construct): pass NULL for the - BonoboUIContainer, since we shouldn't (?) have a popup in this - dialog. - - * e-storage-set.h: add BonoboUIContainer* arg to - e_storage_set_new_view. - - * e-storage-set.c (e_storage_set_new_view): add arg, and track - change to e_storage_set_view_new. - - * e-shell-view.h: add prototype for - e_shell_view_get_bonobo_ui_container. - - * e-shell-view.c (setup_storage_set_subwindow): track change to - e_storage_set_view_new. - (e_shell_view_construct): the BonoboUIContainer is now part of our - private structure. - (e_shell_view_get_bonobo_ui_container): new function. - -2001-05-09 Christopher James Lahey <clahey@ximian.com> - - * importer/intelligent.c (create_gui): Made this function static. - Removed the unused variable placeholder. - (intelligent_importer_init): Cast from gpointer to int here - properly using GPOINTER_TO_INT. - -2001-05-09 Dan Winship <danw@ximian.com> - - * e-local-storage.c: Remove get_physical_path and load_folders, - and replace the calls to them with calls to the e_path_* functions - they inspired. - -2001-05-08 Dan Winship <danw@ximian.com> - - * glade/e-active-connection-dialog.glade: Rename "port" to "type" - here too. - -2001-05-08 Iain Holmes <iain@ximian.com> - - * importer/evolution-importer-client.c (evolution_importer_client_load_file): - Actually use the duplicated value. - - * e-local-storage.c (create_folder_directory): Assign - physical_path_return before trying to create the directory. - (create_folder): Return the physical_path even if the directory - creation failed. Free the physical path. - - * importer/evolution-importer-client.[ch]: Make EvolutionImporterClient - from a GtkObject instead of a BonoboObject. - - * importer/importer.c: Use gtk_object_unref instead of - bonobo_object_unref on the clients. - - * importer/intelligent.c: New prettier dialog, and multiple importers - done in the same window. - -2001-05-07 Dan Winship <danw@ximian.com> - - * e-shell-offline-handler.c (update_dialog_clist_hash_foreach): - Fix a free of non-malloc'ed memory introduced by my last change. - -2001-05-07 Jon Trowbridge <trow@ximian.com> - - * e-shell-view-menu.c (update_offline_menu_item): Changed some - references to /commands/WorkOffline to /commands/ToggleOffline. - -2001-05-04 Chris Toshok <toshok@ximian.com> - - * evolution-shell-component-dnd.c - (impl_GNOME_Evolution_ShellComponentDnd_DestinationFolder_handleMotion): - take a physical_uri and pass it to the callback. - (impl_GNOME_Evolution_ShellComponentDnd_DestinationFolder_handleDrop): - same. - - * evolution-shell-component-dnd.h: add physical_uri args to the - destination folder HandleMotion and HandleDrop types. - - * Evolution-ShellComponentDnd.idl: add "in string physical_uri" to - DestinationFolder::handleMotion and DestinationFolder::handleDrop. - - * e-storage-set-view.c (tree_drag_motion): pass the physical uri - of the folder to handleMotion. - -2001-05-04 Dan Winship <danw@ximian.com> - - * e-shell-offline-handler.c (update_dialog_clist_hash_foreach, - (duplicate_connection_list): Use type instead of portNumber. - (e_shell_offline_handler_put_components_offline): Fix the logic of - when to show the connection dialog here. (Show it when there *are* - connections, not when there aren't.) - - * Evolution-Offline.idl: Have a "string type" instead of "short - portNumber" in Connection. - -2001-05-04 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-offline-handler.c - (e_shell_offline_handler_put_components_offline): Only display the - dialog if there are active connections. [It was displaying it all - the time before just for testing purposes.] - -2001-05-04 Ettore Perazzoli <ettore@ximian.com> - - * evolution-storage.c (evolution_storage_new_folder): Ooops. The - `corba_folder' is needed after returning; don't free it. - -2001-05-04 Ettore Perazzoli <ettore@ximian.com> - - * evolution-storage.c (evolution_storage_new_folder): Free the - `corba_folder' when not needed anymore. - - * e-local-storage.c (create_folder_directory): Free the parent - path, and don't allocate it when we don't need it. - - * evolution-shell-component-client.c (dispatch_callback): Free the - listener servant too. - (impl_destroy): Release the listener object and free the servant - if it exists. - -2001-05-04 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-creation-dialog.c (dialog_clicked_cb): Don't - strdup `path' before copying it into the `dialog_data'. - -2001-05-04 Ettore Perazzoli <ettore@ximian.com> - - * importer/intelligent.c (get_intelligent_importers): Free the - `info_list' returned by `oaf_query()', thus plugging a leak. - -2001-05-04 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-utils.c (get_icon_path): Don't use - `gnome_pixmap_file()', which is broken as it looks in the current - working directory first. Instead, if the path is not absolute, - just look up the file in the `EVOLUTION_IMAGES' directory. - -2001-05-03 Ettore Perazzoli <ettore@ximian.com> - - * glade/e-active-connection-dialog.c: Change the GtkCList mode to - GTK_BROWSE_SINGLE. - -2001-05-03 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-offline-handler.c - (impl_OfflineProgressListener_updateProgress): Update the GtkCList - before emitting the "offline_procedure_finished" signal. In fact, - we might be destroyed from within the signal handlers and then - things would get messy. - - * evolution-shell-component-client.c - (evolution_shell_component_client_get_offline_interface): - "IDL:GNOME/Evolution/Offline:1.0", not - "IDL:GNOME/Evolution/ShellComponent/Offline:1.0". Sigh. - - * e-shell-view-menu.c: Update to match the rename of the - `WorkOffline' menu item in the `File' menu into `ToggleOffline'. - Now the `WorkOffline' verb actually puts the shell offline, while - `WorkOnline' puts in online, so we don't use one single verb to - toggle the online/offline status. - (command_work_offline): Only go offline. - (command_work_online): New. Make the shell go online. - (update_offline_menu_item): New. - (shell_line_status_changed_cb): New, callback for the - "line_status_changed" signal on the associated EShell. - -2001-05-03 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-offline-handler.c: New member `dialog_gui' in - `EShellOfflineHandlerPrivate'. - (impl_destroy): Unref here if not NULL. - (init): Init to NULL. - (update_dialog_clist_hash_foreach): New. - (update_dialog_clist): New. - (dialog_clicked_cb): New, callback for the "clicked" signal on the - active connection dialog. - (pop_up_confirmation_dialog): Implemented. - (init): Init `procedure_in_progress' to `FALSE' instead of `TRUE'. - (cancel_offline): Emit `offline_procedure_finished'. - (impl_OfflineProgressListener_updateProgress): Call - `update_dialog_clist()'. - - * glade/e-active-connection-dialog.glade: New. - - * e-shell-view-menu.c: Update to use the `WorkOffline' verb - instead of the `WorkOffLine' one. - (command_work_offline): New, temporary implementation for the - "WorkOffline" verb. - - * e-shell-view.c (shell_line_status_changed_cb): New, callback for - the shell's `line_status_changed' signal. - (e_shell_view_construct): Connect it. - - * e-shell.c: New member `line_status' in `EShellPrivate'. - (init): Init to `E_SHELL_LINE_STATUS_ONLINE'. - (class_init): Set up the `line_status_changed' signal. - (e_shell_is_offline): Removed. - (e_shell_get_line_status): New. - (e_shell_go_online): Set the `line_status' member to - `E_SHELL_LINE_STATUS_ONLINE' and emit `line_status_changed'. - (offline_procedure_started_cb): New, signal for the - `offline_procedure_started' signal in EShellOfflineHandler. - (offline_procedure_finished_cb): New, signal for the - `offline_procedure_finished' signal in EShellOfflineHandler. - (e_shell_go_offline): Implemented. - - * e-shell.h: New enum `EShellLineStatus'. New signal - `line_status_changed'. - -2001-05-03 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-offline-handler.c (e_shell_offline_handler_construct): - Unset the `GTK_FLOATING' flag. - -2001-05-02 Ettore Perazzoli <ettore@ximian.com> - - * e-shell.c: New members `is_offline' and `offline_handler' in - `EShellPrivate'. - (init): Init `is_offline' to %FALSE, `offline_handler' to %NULL. - (e_shell_is_offline): New. - (e_shell_go_online): New. - (e_shell_go_offline): New. - - * e-shell-offline-handler.c: New. - * e-shell-offline-handler.h: New. - - * evolution-shell-component-client.c: New member - `offline_interface' in `EvolutionShellComponentClientPrivate'. - (init): Init to `CORBA_OBJECT_NIL'. - (impl_destroy): Unref/release if not NIL. - (evolution_shell_component_client_get_offline_interface): New. - - * Evolution-Offline.idl: New. - -2001-05-02 Chris Toshok <toshok@ximian.com> - - * evolution-shell-component-dnd.c: new file. - - * evolution-shell-component-dnd.h: new file. - - * Makefile.am (libeshell_a_SOURCES): add - evolution-shell-component-dnd.[ch]. - -2001-04-25 Dan Winship <danw@ximian.com> - - * Makefile.am (evolution_LDADD): Remove $(UNICODE_LIBS). - - * main.c (main): Remove call to unicode_init. - -2001-04-25 JP Rosevear <jpr@ximian.com> - - * evolution-shell-client.c (destroy): free the private member - -2001-04-25 Kjartan Maraas <kmaraas@gnome.org> - - * e-component-register.c, e-corba-storage.c, e-folder-tree.c, - e-folder-tree.h, e-folder.c, e-local-folder.c, e-shell.c, - e-shortcuts-view-model.c, e-shortcuts.c, e-splash.c, - e-storage-set-view.c, e-storage-set.c, evolution-local-storage.c, - evolution-shell-component-client.c, evolution-shell-component.c, - evolution-storage.[ch], importer/evolution-importer-client.[ch], - importer/evolution-importer-listener.[ch], - importer/evolution-importer.[ch], - importer/evolution-intelligent-importer.[ch], importer/intelligent.c: - #include <glib.h> and move corresponding local includes to the top. - -2001-04-23 Jeffrey Stedfast <fejj@ximian.com> - - * e-splash.c: #include gnome-window-icon.h - -2001-04-21 Duncan Mak <duncan@ximian.com> - - * e-splash.c (e_splash_construct): Set window_icon to - "evolution.png" in the splash screen. - -2001-04-18 Ettore Perazzoli <ettore@ximian.com> - - * e-local-folder.c: #include <unistd.h>. - -2001-04-17 Christopher James Lahey <clahey@ximian.com> - - * e-shell-view.c (storage_set_view_box_event_cb): Proxy events to - the tooltip object properly. - -2001-04-15 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-selection-dialog.c - (folder_creation_dialog_result_cb): Set the current folder only if - @result is `E_SHELL_FOLDER_CREATION_DIALOG_RESULT_SUCCESS'. - - * e-shell-folder-creation-dialog.c (folder_name_entry_changed_cb): - Changed to get a pointer to the DialogData instead of just a - pointer to the dialog itself. Don't set the OK button sensitive - if there is no folder selected in the storage set view. - (setup_folder_name_entry): Don't connect - `folder_name_entry_changed_cb' anymore. - (e_shell_show_folder_creation_dialog): Connect here instead. - (storage_set_view_folder_selected_cb): New callback for the - "folder_selected" signal in the EStorageSetView. Make the OK - button sensitive if the entry is non-empty. - (e_shell_show_folder_creation_dialog): Connect it. - -2001-04-14 Michael Meeks <michael@ximian.com> - - * Makefile.am (dist-hook): remove built sources from dist. - -2001-04-13 Ettore Perazzoli <ettore@ximian.com> - - * e-splash.c (impl_destroy): Call the parent class' ::destroy - method. - -2001-04-12 Christopher James Lahey <clahey@ximian.com> - - * e-storage-set-view.c (etree_has_get_node_by_id, - etree_get_node_by_id): Implemented these. - -2001-04-11 Dan Winship <danw@ximian.com> - - * e-shell-view.c (switch_on_folder_tree_click): Don't get into an - infinite loop when clicking on an IMAP storage. Might not be the - best fix? - -2001-04-08 Chris Toshok <toshok@ximian.com> - - * e-storage-set-view.c (tree_drag_motion): fix type. we want the - destination interface, not source. - -2001-04-04 Kjartan Maraas <kmaraas@gnome.org> - - * e-local-folder.c: Fix headers. - * e-shell-view.c: Same here. - * e-shortcuts-view.c: Same here. - * e-shortcuts.c: Same here. - * e-storage-set-view.c: Same here. - -2001-04-04 Gediminas Paulauskas <menesis@delfi.lt> - - * importer/importer.c (create_html): copied newer and fixed function - from mail/mail-config-druid.c. - (html_new, put_html): removed. - (show_import_wizard): use create_html instead of html_new/put_html pair. - * importer/importer.glade: a try to set logo. removed source generation - options. - -2001-04-03 Dan Winship <danw@ximian.com> - - * main.c: - * evolution-shell-component-client.c: Don't declare debug_log as - extern in evolution-shell-component-client.c, because that's part - of libeshell and so gets linked into the other components. - Instead, declare it there and extern it from main.c. - (Noticed by Peter Williams) - -2001-04-03 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (get_control_for_uri): Change `! folder_type' - with `folder_type == NULL'. - - * e-corba-storage-registry.c (impl_StorageRegistry_addStorage): If - the toplevel node URI or the toplevel node type are an empty - string, use NULL Instead. - -2001-04-03 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c: Fix bug #1878 "folder sometimes fails to - display?". Thanks to Dan for finding out an explanation for the - problem. - (e_shell_view_display_uri): Don't set `priv->uri' here. - (show_existing_view): Set it here instead, and before showing the - control. - (create_new_view_for_uri): And here, likewise. - -2001-04-03 Christopher James Lahey <clahey@ximian.com> - - * e-shell-folder-selection-dialog.c (dbl_click_cb): Made double - clicking not crash here. - -2001-04-02 Ettore Perazzoli <ettore@ximian.com> - - * e-setup.c (e_setup): If we have a local folder named "Trash" of - type "mail", rename it to "Trash.old" so that the new - vfolder-based trash type gets installed. - -2001-04-03 Gediminas Paulauskas <menesis@delfi.lt> - - * importer/evolution-importer-client.c (evolution_importer_client_load_file): - fix Iain's fix which did nothing. closes #1914. - -2001-03-31 Christopher James Lahey <clahey@ximian.com> - - * evolution-storage-set-view.c: Include <gal/util/e-util.h> here. - -2001-04-01 Gediminas Paulauskas <menesis@delfi.lt> - - * e-shell-view-menu.c: set up menu icons for new folder, import and work - offline. - -2001-03-30 Iain Holmes <iain@ximian.com> - - * importer/importer.c (start_import): If the importer can't be started, then - don't continue. - -2001-03-29 Iain Holmes <iain@ximian.com> - - * importer/evolution-importer-client.c (evolution_importer_client_load_file): - Duplicate the folderpath, or set it to \0 - -2001-03-30 Christopher James Lahey <clahey@ximian.com> - - * e-shell-folder-selection-dialog.c (dbl_click_cb): Since this is - an ETree now, the signature of the double click callback has - changed. - -2001-03-30 Dan Winship <danw@ximian.com> - - * Evolution-ShellComponent.idl: add a "debug" method to tell a - component to output debugging messages to a given file. - - * main.c (main): Add a "--debug filename" argument, to direct - debugging output for all components to a file. Redirect the - shell's stdout/stderr to that file if this argument is used. - - * evolution-shell-component-client.c - (evolution_shell_component_client_set_owner): If debug_log is set, - call the component's debug method as well. - - * evolution-shell-component.c (impl_ShellComponent_debug): - redirect stdout/stderr to the named file and emit a "debug" - signal. - -2001-03-29 Kjartan Maraas <kmaraas@gnome.org> - - * e-component-registry.c: Remove/replace unneeded includes and - move around stuff so that system headers are included first. - * e-corba-storage.c: Replace #include <bonobo.h> - * e-folder-tree.c: Shuffle. - * e-folder.c: Remove #include <gtk/gtkobject.h> - * e-local-storage.c: Replace #include <gnome.h> and <bonobo.h> - * e-setup.c: Replace #include <glib.h> and <gnome.h> - * e-shell-folder-creation-dialog.c: Replace #include <gnome.h> - * e-shell-folder-title-bar.c: Replace <gnome.h> - * e-shell-utils.c: Same here. - * e-shell-view-menu.c: Same here (and <bonobo.h>) - * e-shell-view.c: Replace <gnome.h> and <bonobo.h> - * e-shell.c: Replace <gnome.h> - * e-shell.h: Shuffle. - * e-shortcuts-view-model.c: Replace <gnome.h> - * e-shortcuts-view.c: Remove #include <gnome.h> - * e-shortcuts.c: Move <string.h> up. - * e-splash.c: Replace <gnome.h> - * e-storage-set-view.c: Replace <gnome.h> - * e-storage-set.c: Shuffle - * e-storage.c: Replace <gnome.h> - * evolution-local-storage.c: Same here - * evolution-local-storage.h: And here. - * evolution-session.c: Same here too. - * evolution-session.h: Replace <bonobo.h> - * evolution-shell-client.c: Here too. - * evolution-shell-component-client.c: Shuffle. - * evolution-shell-component.c: Replace <bonobo.h> - * evolution-shell-view.c: Remove #include <bonobo.h> - * evolution-shell-view.h: Replace <gnome.h> - * evolution-storage-listener.c: Replace <gnome.h> and <bonobo.h> - * evolution-storage-listener.h: Replace <gnome.h> - * evolution-storage-set-view-listener.c: Replace <gnome.h> and <bonobo.h> - * evolution-storage-set-view.c: Remove <gnome.h> - * evolution-storage.c: Replace <bonobo.h> - * main.c: Replace <gnome.h> and <bonobo.h> - * importer/importer.c: Replace <gnome.h> - * importer/intelligent.c: Replace <gnome.h>. Add prototype for - intelligent_importer_init(). - * importer/intelligent.h: Added this file. - -2001-03-28 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (folder_sort_callback): Use - `g_strcasecmp()' instead of `strcasecmp()'. - -2001-03-28 Christopher James Lahey <clahey@ximian.com> - - * e-storage-set-view.c (storage_sort_callback, - folder_sort_callback): Use strcasecmp instead of strcmp. - -2001-03-28 Ettore Perazzoli <ettore@ximian.com> - - * e-local-storage.c (async_xfer_folder_callback): - s/new_folder/destination_folder/ where appropriate, idiot. - -2001-03-28 Jon Trowbridge <trow@gnu.org> - - * e-shell-view-menu.c: In a fit of egomania, added myself to the - authors array. - -2001-03-26 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component-client.c - (shell_component_result_from_corba_exception): Implement. - -2001-03-26 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component-client.c - (evolution_shell_component_client_async_xfer_folder): Handle CORBA - exception. - (evolution_shell_component_client_async_create_folder): Likewise. - - * e-local-storage.c (create_folder_directory): Create the - `subfolders' directory if it doesn't exist. - - * e-storage-set-view.c (tree_drag_data_received): Build the - correct target path by appending the basename from the source - path. - - * evolution-shell-component.c - (impl_ShellComponent_async_xfer_folder): Enabled again. - (class_init): Install it. - - * e-local-folder.c (METADATA_FILE_NAME_LEN): Removed #define. - (METADATA_FILE_NAME): Removed #define. - (save_metadata): Use the public - `E_LOCAL_FOLDER_METADATA_FILE_NAME' value instead. - (construct_loading_metadata): Likewise. - - * e-local-folder.h (E_LOCAL_FOLDER_METADATA_FILE_NAME_LEN): New - #define. - (E_LOCAL_FOLDER_METADATA_FILE_NAME): New #define. - - * e-local-storage.c (remove_folder_directory): New helper - function. - (async_xfer_folder_step): New. - (async_xfer_complete): New. - (async_xfer_folder_callback): New. - (impl_async_xfer_folder): Implement. - - * e-storage.h: Added value `E_STORAGE_NOTEMPTY' to - `EStorageResult'. - - * evolution-shell-component-client.c - (evolution_shell_component_clinet_async_xfer_folder): New. - -2001-03-23 Ettore Perazzoli <ettore@ximian.com> - - * e-local-storage.c (impl_async_xfer_folder): New, implementation - for `EStorage::async_xfer_folder'. - (class_init): Install it. - (check_valid_name): Removed. Conflicts shouldn't be handled this - way, and hardcoding the names is *bad*. - (create_folder_directory): New helper function. - (real_do_folder_create): Removed. - (create_folder): New. Do things here using - `create_folder_directory'. - (impl_async_create_folder): Use `create_folder'. - (notify_bonobo_listener): Renamed from `notify_listener'. Moved - on top for clarity. - -2001-03-22 Iain Holmes <iain@ximian.com> - - * importer/evolution-importer-listener.c (evolution_importer_listener_new): - Remove the usage of the corba_object thing. - (evolution_importer_listener_construct): Ditto. - - * e-local-storage.c (real_do_folder_create): Revert the e_mkdir_hier call - to two seperate calls to mkdir. If the directory exists, just call the - callback and notify the listener. - - * importer/GNOME_Evolution_Importer.idl: Add a folderpath paramater to the - loadFile method. - - * importer/evolution-importer.[ch]: Update for the new folderpath param. - - * importer/evolution-importer-client.[ch]: Ditto. - - * importer/importer.c: Ditto. - -2001-03-22 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (motion_notify_event): Unref the target - list we create on the fly. - -2001-03-22 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-creation-dialog.c (async_create_cb): Changed - signature to match `EStorageSetResultCallback' instead of - `EStorageResultCallback', to match the changes in the async_create - API call. - -2001-03-22 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c: Removed some unused static variables. - (set_evolution_path_selection): Removed unused variable - `evolution_path'. - - * e-storage-set.c (e_storage_set_async_xfer_folder): Get an - `EStorageSetResultCallback', instead of an - `EStorageResultCallback'. - (e_storage_set_async_remove_folder): Likewise. - (e_storage_set_async_create_folder): Likewise. - (storage_callback_converter): New callback to convert from the - EStorageResultCallback to the EStorageSetResultCallback. - - * e-storage-set.h: New typedef `EStorageSetResultCallback'. - - * Evolution-ShellComponent.idl: Renamed `copyFolderAsync' into - `xferFolderAsync' for consistency. - - * e-storage-set-view.c (tree_drag_data_received): Updated to use - `e_storage_set_async_xfer_folder()' instead of - `e_storage_set_async_move_folder()' or - `e_storage_set_async_copy_folder()'. - (folder_xfer_callback): New, callback for the xfer function. - - * e-storage-set.c (e_storage_set_async_move_folder): Removed. - (e_storage_set_async_copy_folder): Removed. - (e_storage_set_async_xfer_folder): New. - -2001-03-22 Ettore Perazzoli <ettore@ximian.com> - - * e-storage.c (e_storage_async_xfer_folder): New. - (impl_async_xfer_folder): New, default implementation for the - `async_xfer_folder' method. - (class_init): Install it. - - * e-storage.h: New virtual method `async_xfer_folder'. - - * evolution-storage.c (impl_Storage_async_xfer_folder): New. Just - a stub for now. - (evolution_storage_get_epv): Install it as the implementation for - the `asyncXferFolder' method. - - * Evolution-Storage.idl: New method `asyncXferFolder'. - -2001-03-22 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c: Removed `source_drag_types', - `num_source_drag_types', `destination_drag_types', - `num_destination_drag_types', `target_list'. - (E_SHORTCUT_TARGET_TYPE): Renamed from "E_SHORTCUT_TYPE". - (EVOLUTION_PATH_TARGET_TYPE): Define to "_EVOLUTION_PRIVATE_PATH". - (find_matching_target_for_drag_context): If any of the targets - matches it, return it. - (handle_evolution_path_drag_motion): New. - (tree_drag_motion): Use it if we are matching an - `EVOLUTION_PATH_TARGET_TYPE' target. - (e_storage_set_view_construct): Call `e_tree_drag_dest_set()' on - the view so that we become a possible DnD target. - (get_folder_at_node): Don't die if you don't find a folder there. - (create_target_entries_from_dnd_type_list): Make the first entry - an `EVOLUTION_PATH_TARGET_TYPE', the second one an - `E_SHORTCUT_TYPE', and the following ones the ones defined by the - folder. - (set_evolution_path_selection): New function to set the private - Evolution path selection. - (set_e_shortcut_selection): Assert @selection_data to be not NULL. - (class_init): Don't set up the `target_list' anymore. - (storage_sort_callback): Actually compare the two nodes, not the - first node with itself. - - * e-storage-set.c (e_storage_set_async_copy_folder): New. - (e_storage_set_async_move_folder): New. - -2001-03-22 Christopher James Lahey <clahey@ximian.com> - - * e-storage-set-view.c (etree_get_save_id): Changed get_save_id to - just return a strdup of the path. - (new_storage_cb, new_folder_cb, insert_folders, insert_storages): - Call e_tree_memory_sort_node. - -2001-03-21 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (etree_get_save_id): If we have no - associated StorageSet yet, just return "root". [This can happen - when this function is called at construction time.] - -2001-03-21 Ettore Perazzoli <ettore@ximian.com> - - * Evolution-ShellComponentDnd.idl: StudlyCapsify struct members to - match the new IDL naming standards. - * e-storage-set-view.c: Updated accordingly. - -2001-03-21 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (tree_drag_data_get): Get the target type - from the atom, and pass it through the `SourceFolder::getData' - invocation. Also, signal an error by passing `-1' as the length - value to `gtk_selection_data_set()'. - (find_matching_target_for_drag_context): New helper function. - (tree_drag_motion): Use it to figure out a suitable type for the - drop action, and pass it to the `DestinationFolder::handleMotion' - method. - - * e-storage-set-view.c (get_component_at_node): New helper - function. - (table_drag_begin): Use it. - (convert_corba_drag_action_to_gdk): New helper function. - (table_drag_motion): Use the `DestinationFolder::handleMotion' - method to handle the "drag_motion" signal. - - * Evolution-ShellComponentDnd.idl: Change the signature for the - `handleMotion' method so that it only has @suggested_action - parameter. - -2001-03-20 JP Rosevear <jpr@ximian.com> - - * importer/Makefile.am: make sure intelligent.h gets disted - -2001-03-19 Christopher James Lahey <clahey@ximian.com> - - * Merged e-tree-rework-branch: - - 2001-03-19 Christopher James Lahey <clahey@ximian.com> - - * e-storage-set-view.c (etree_get_save_id): Made "root" detection - deal properly with removed nodes. - - 2001-03-18 Christopher James Lahey <clahey@ximian.com> - - * e-shell-view.c (e_shell_view_save_settings): Added some unused - code to implement saving of the expanded state. - - * e-storage-set-view.c: Added has_save_id and get_save_id methods. - - 2001-03-13 Christopher James Lahey <clahey@ximian.com> - - * e-storage-set-view.c (ETREE_SPEC): Set draw-grid here to false. - - 2001-03-09 Christopher James Lahey <clahey@ximian.com> - - * e-storage-set-view.c, e-storage-set-view.h: Chaned this to use - ETree instead of ETable. - -2001-03-19 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component-client.c: New members - `dnd_source_folder_interface' and - `dnd_destination_folder_interface' in - `EvolutionShellCompoentClientPrivate'. - (init): Initialize. - (impl_destroy): Clean up. - (evolution_shell_component_client_get_dnd_source_interface): New. - (evolution_shell_component_client_get_dnd_destination_interface): - New. - -2001-03-19 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (init): Ooops. Initialize the - `drag_corba_source_context' member. correctly. - (table_drag_begin): Don't crash if queryInterface returns - `CORBA_OBJECT_NIL'. - (table_drag_end): Don't do anything if the - `drag_corba_source_interface' is `CORBA_OBJECT_NIL'. - -2001-03-19 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c New members `drag_data', - `drag_corba_source_interface' and `drag_corba_source_context in - `EStorageSetViewPrivate'. - (init): Init the new members. - (destroy): Clean up the new members. - (table_drag_begin): Query for the - `EvolutionShellComponentDnd::SourceFolder' interface on the - handler for the folder we are dragging from, and initialize all - the CORBA context information for the drag, after invoking - `::beginDrag()' on it. - (convert_gdk_drag_action_to_corba): New helper function. - (table_drag_data_get): Get the data using - `::SourceFolder::getData'. - (table_drag_end): New, override for the "ETable::table_drag_end" - signal. Invoke `::endDrag' on the SourceFolder interface, - unref/release the interface, and clean up the source context. - (table_drag_data_delete): New, override for the - "ETable::table_drag_data_delete" signal. - (class_init): Install `table_drag_end' and - `table_drag_data_delete'. - - * Evolution-ShellComponentDnd.idl: Derive `::DestinationFolder' - and `SourceFolder' from `Bonobo::Unknown'. - -2001-03-19 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (table_drag_data_get): Don't get the - selection through - `evolution_shell_component_client_get_dnd_selection()'. - - * evolution-shell-component.c - (impl_ShellComponent_getDndSelection): Removed. - (class_init): Don't install. - - * evolution-shell-component-client.c - (evolution_shell_component_client_get_dnd_selection): Removed. - - * Evolution-ShellComponentDnd.idl: New file with the DnD stuff. - - * Evolution-ShellComponent.idl: Removed the dnd stuff. - -2001-03-15 Pablo Saratxaga <pablo@mandrakesoft.com> - - * main.c: fixed a no-c-format tag - -2001-03-14 Ettore Perazzoli <ettore@ximian.com> - - * importer/Makefile.am (INCLUDES): Remove `-g Wall' and friends. - Use `$(EXTRA_GNOME_CFLAGS)' instead of `$(GNOME_INCLUDEDIR)'. Add - `-I$(top_builddir)/shell'. - -2001-03-13 Iain Holmes <iain@ximian.com> - - * importer/intelligent.c (start_importer): Add a "Don't ask me again" - checkbox and don't ask about an importer if the box was ticked. - -2001-03-12 Iain Holmes <iain@ximian.com> - - * Evolution-Storage.idl: Add a FolderResult structure. - - * e-local-storage.c (struct _AsyncCreateFolderCallbackData): Add a - Bonobo_Listener. - (notify_listener): Function to...notify the listener. - (component_async_create_folder_callback): Use the notify_listener - function. - (real_do_folder_create): New prototype. Replace all returns with - a call to notify_listener. Make the directory with a call to - e_mkdir_hier instead of multiple calls to mkdir. Only emit a fail - on a bad error, not on EEXIST. - (bonobo_interface_create_folder_cb): Namespace create_folder_cb to match - the others. - - e-shell.c: Run the intelligent importer. - - evolution-storage.c (impl_Storage_async_create_folder): Just emit the signal, - not the callback. - (e_marshal_NONE__POINTER_POINTER_POINTER_POINTER_POINTER): Lovely signal - marshaller. - (class_init): Change the signal definition for the create_folder signal. - - importer/GNOME_Evolution_Importer.idl: Add an IntelligentImporter inteface. - - importer/Makefile.am: Add the evolution-intelligent-importer.c, intelligent.c - and evolution-intelligent-importer.h to the files. - - importer/evolution-importer-listener.[ch]: Convert to BonoboXObject. - - importer/evolution-importer.[ch]: BonoboXObjectification. - - importer/evolution-intelligent-importer.[ch]: BonoboXObject for the - GNOME:Evolution:IntelligentImporter interface. - - importer/intelligent.c: Code for running the intelligent importers. - -2001-03-08 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (get_folder_at_row): New helper function. - (create_target_list_for_row): Use it. - (table_drag_data_get): Get the selection from the shell component - using `evolution_shell_component_client_get_dnd_selection()'. - (set_e_shortcut_selection): Turn a `g_return_if_fail()' into a - `g_assert()'. - - * evolution-shell-component.c: New member `get_dnd_selection_fn' - in `EvolutionShellComponentPrivate'. - (evolution_shell_component_construct): New arg - @get_dnd_selection_fn. - (evolution_shell_component_new): Likewise. - (impl_ShellComponent_getDndSelection): New, implementation for - `ShellComponent::getDndSelection'. - (class_init): Install it. - - * evolution-shell-component-client.c - (evolution_shell_component_client_get_dnd_selection): New, wrapper - for `ShellComponent::getDndSelection'. - - * evolution-shell-component.h: Renamed - `EvolutionShellComponentPopulateFolderContextMenu' into - `EvolutionShellComponentPopulateFolderContextMenuFn'. New - function pointer typedef `EvolutionShellComponentGetDndSelectionFn'. - - * Evolution-ShellComponent.idl: New method - `ShellComponent::getDndSelection'. - - * e-storage-set-view.c (create_target_entries_from_dnd_type_list): - Always add an `E_SHORTCUT_TYPE' type at least. - (create_target_list_for_row): Don't return NULL if the list of - exported DND types is NULL. Don't create an unused target list. - Actually return the created target list. - (table_drag_data_get): If the @info is zero, set the e-shortcut - selection. - (set_uri_list_selection): Temporarily disabled. - -2001-03-07 Ettore Perazzoli <ettore@ximian.com> - - * e-component-registry.c (register_type): New args - @num_exported_dnd_types, @exported_dnd_types, - @num_accepted_dnd_types, @accepted_dnd_types. Pass them to - `e_folder_type_registry_register_type()'. - (register_component): Updated accordingly, getting the values from - the CORBA `GNOME::Evolution::FolderType' struct. - - * e-folder-type-registry.c: New members `accepted_dnd_types' and - `exported_dnd_types' in `struct _FolderType'. - (e_folder_type_registry_register_type): New args - @num_accepted_dnd_types, @accepted_dnd_types, - @num_exported_dnd_types, @exported_dnd_types. - (register_folder_type): Likewise. - (folder_type_new): Likewise. Use them to initialize - `accepted_dnd_types' and `exported_dnd_types' in the newly created - `FolderType' struct. - (e_folder_type_registry_get_accepted_dnd_types_for_type): New. - (e_folder_type_registry_get_exported_dnd_types_for_type): New. - - * e-storage-set-view.c: New #defined constant `DRAG_RESISTANCE'. - New members `drag_x', `drag_y', `drag_column', `drag_row' in - `EStorageSetViewPrivate'. - (init): Initialize them. - (button_press_event): New function, overriding for the - `::button_press_event' method. - (motion_notify_event): New function, overriding for the - `::motion_notify_event' method. - (class_init): Install them. - - * evolution-shell-component.c - (duplicate_null_terminated_string_array): New helper function. - (evolution_shell_component_construct): Copy the values for - `accepted_dnd_types' and `exported_dnd_types' from the original - folder type list using it. - (destroy): Free the `exported_dnd_types' and `accepted_dnd_types' - members too. - (fill_corba_sequence_from_null_terminated_string_array): New - helper function. - (impl_ShellComponent__get_supported_types): Also set the - `exported_dnd_types' and `accepted_dnd_types' values in the folder - type elements we return. - - * evolution-shell-component.h: Added `accepted_dnd_types' and - `exported_dnd_types' members to `EvolutionShellComponentFolderType'. - - * Evolution-ShellComponent.idl: Renamed `accepted_dnd_mime_types' - to `accepted_dnd_types' and `exported_dnd_mime_types' to - `exported_dnd_types'. These are not necessarily MIME types. - -2001-03-05 Christopher James Lahey <clahey@ximian.com> - - * e-storage-set-view.c: Override cursor_activated signal instead - of cursor_changed signal. - -2001-02-27 Dan Winship <danw@ximian.com> - - * main.c (development_warning): Update this again. - -2001-02-26 Ettore Perazzoli <ettore@ximian.com> - - * Evolution-Shell.idl: Rename `FolderTypeList' to - `FolderTypeNameList' as it was confusing. - - * Evolution-ShellComponent.idl: New members - `accepted_dnd_mime_types' and `exported_dnd_mime_types' in `struct - FolderType'. - -2001-02-24 Jeffrey Stedfast <fejj@ximian.com> - - * e-storage.c (folder_changed_cb): Don't free a const pointer. - -2001-02-23 Iain Holmes <iain@ximian.com> - - * e-local-storage.c (construct): Connect to the create-folder signal. - (impl_async_create_folder): Move this into the real_do_folder_create - function. - (real_do_folder_create): Function that creates the folder. - (create_folder_cb): Creates the folder form a callback. - -2001-02-21 Michael Meeks <michael@ximian.com> - - * importer/importer.c: add include. - (show_import_wizard): update signature to that of a verb. - - * evolution-shell-component.c (corba_class_init): move into - (class_init): here & upd. - (evolution_shell_component_construct): upd. - (create_servant): kill. - (E_MAKE_TYPE) -> E_MAKE_X_TYPE. - -2001-02-20 Dan Winship <danw@ximian.com> - - * e-folder.c (_EFolderPrivate): split "highlighted" into - self_highlight and child_highligh. - (e_folder_get_highlighted): Return TRUE if either self_highlight - is true or any child is highlighted. - (e_folder_set_child_highlight): New function to tell the folder - about a child highlight change. - - * e-storage.c (folder_changed_cb): Update child highlights - correctly on folders so that folders will be highlighted whenever - their children are. - -2001-02-17 Christopher James Lahey <clahey@ximian.com> - - * e-shell-view-menu.c (file_verbs): Cast this fucntion pointer. - - * e-storage-set-view.c (ETABLE_SPEC): Turn on horizontal scrolling - here. - - * evolution-shell-component.c - (impl_ShellComponent_async_copy_folder): Commented out this unused - function. - - * evolution-storage.c (storage_gtk_to_corba_result): Removed an - unused variable here. - - * importer/importer.c: Include gal/widets/e-gui-utils.h. - -2001-02-14 Dan Winship <danw@ximian.com> - - * Evolution-Storage.idl: add asyncCreateFolder and - asyncRemoveFolder interfaces. (Use Bonobo::Listener rather than - creating a new listener interface.) - - * Evolution-LocalStorage.idl: Remove the - Evolution::LocalStorageOpsListener interface, which wasn't being - used. - - * evolution-storage.c (impl_Storage_async_create_folder, - impl_Storage_async_remove_folder): implement by emitting signals - on the EvolutionStorage object. Convert from - EvolutionStorageResult to GNOME_Evolution_Storage_Result (blah!) - (class_init): Set up the new "create_folder" and "remove_folder" - signals. - - * e-corba-storage.c (async_create_folder, async_remove_folder): - Implement, using the new Evolution::Storage IDL. Convert from - GNOME_Evolution_Storage_Result to EStorageResult (blah!) - - * e-storage-set.c (e_storage_set_async_create_folder): Don't allow - a NULL description (since it doesn't allow a NULL anythign else). - - * e-shell-folder-creation-dialog.c (dialog_clicked_cb): Pass "" - rather than NULL for the description. - -2001-02-12 Kjartan Maraas <kmaraas@gnome.org> - - * Makefile.am: xml-i18n-tools setup. - * GNOME_Evolution_Shell.oaf.in: Mark strings for translation. - -2001-02-10 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view-menu.c: Moved the author list to the top of the - file. - (command_about_box): Display the `SUB_VERSION' as well. - -2001-02-08 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-creation-dialog.c (dialog_clicked_cb): Destroy - the dialog instead of using `gnome_dialog_close()'. - (dialog_clicked_cb): Likewise. - (dialog_close_cb): Removed. - (e_shell_show_folder_creation_dialog): Don't connect to the - "close" signal anymore. - - * e-shell-folder-selection-dialog.c - (folder_creation_dialog_result_cb): New callback. Set the default - folder to be the newly created one. - (impl_clicked): Use it. - - * e-shell-folder-creation-dialog.c: Add members `folder_path', - `result_callback' and `result_callback_data' to `struct - _DialogData'. - (e_shell_show_folder_creation_dialog): New args @result_callback - and @result_callback_data. - (async_create_cb): Notify the result through the specified - callback. - (dialog_clicked_cb): Likewise. Set the `folder_path' in the - DialogData so that we can pass it over when we get the async - notification of the result of the operation. - - * e-shell-folder-creation-dialog.h: New type - `EShellFolderCreationDialogCallback'. - - * e-storage-set-view.c (e_storage_set_view_set_current_folder): - Show the node too, using `e_tree_model_show_node()'. - -2001-02-05 Ettore Perazzoli <ettore@ximian.com> - - * e-setup.c (copy_default_stuff): s/first time you run/first time - you are running/. - -2001-02-02 Ettore Perazzoli <ettore@ximian.com> - - * e-component-registry.h: Don't #include <config.h>. - * e-corba-storage-registry.h: Likewise. - * e-corba-storage.h: Likewise. - * e-folder-type-registry.h: Likewise. - * e-folder.h: Likewise. - * e-local-folder.h: Likewise. - * e-local-storage.h: Likewise. - * e-shell-folder-title-bar.h: Likewise. - * e-shell-view.h: Likewise. - * e-shell.h: Likewise. - * e-shortcuts-view.h: Likewise. - * e-shortcuts.h: Likewise. - * e-splash.h: Likewise. - * e-storage-set-view.h: Likewise. - * e-storage-set.h: Likewise. - * e-storage.h: Likewise. - * evolution-local-storage.h: Likewise. - * evolution-session.h: Likewise. - * evolution-shell-client.h: Likewise. - * evolution-shell-component.h: Likewise. - * evolution-shell-view.h: Likewise. - * evolution-storage-listener.h: Likewise. - * evolution-storage.h: Likewise. - -2001-02-02 Iain Holmes <iain@ximian.com> - - * importer/evolution-importer-client.c: - (evolution_importer_client_new_from_id): Free the CORBA_Environment. - -2001-01-30 Iain Holmes <iain@ximian.com> - - * importer/importer.c: (start_import): Added a notice if there is no - importer that can handle the file. - (get_iid_for_filetype): Free the list of multiple items before returning. - (importer_timeout_fn): Removed notice. - (import_cb): Removed notice. - -2001-01-30 Iain Holmes <iain@ximian.com> - - * importer/importer.c: Added a nasty hack to change the druids Finish - button to be Import. - - * importer/import.glade: Remove the FIXME warning. - -2001-01-30 Kjartan Maraas <kmaraas@gnome.org> - - * importer/importer.c: Fixed some typos. - -2001-01-28 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-creation-dialog.c (add_storage_set_view): Set the - shadow type to be `GTK_SHADOW_IN' in the EScrollFrame. - -2001-01-27 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (storage_set_view_box_button_release_event_cb): - Don't pop down the folder bar if the button release happens in the - e-paned's handle. - (storage_set_view_box_button_release_event_cb): Changed the return - value to be int. Stupid me. - -2001-01-27 Jason Leach <jasonleach@usa.net> - - * e-shortcuts-view.h: Fix #include to point to gal instead of - widgets/shortcut-bar/ - - * e-shortcuts.c: Here too. - * e-shortcuts-view-model.h: And lastly here. - - * Makefile.am (evolution_LDADD): Don't link with the old - widgets/shortcut-bar/libshortcut-bar.la anymore, gal has the new - shortcut-bar. - -2001-01-27 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (get_pixbuf_for_folder): Don't scale if the - size is the same. `gdk_pixbuf_scale()' seems to be blurring the - image even if the scaling factor is 1.0. - -2001-01-26 Ettore Perazzoli <ettore@ximian.com> - - * e-corba-storage.c: Remove all instances of `__FUNCTION__'. - * e-folder-tree.c: Likewise. - * e-folder-type-registry.c: Likewise. - * e-shell-view.c: Likewise. - * e-shell-view-menu.c: Likewise. - -2001-01-25 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (e_shell_view_construct): Connect the - "updated_folder" with `gtk_signal_connect_while_alive()' so that - it gets disconnected when the shell view dies. - -2001-01-24 Jason Leach <jasonleach@usa.net> - - (Fix #1252: Need a File->Close way to close a view) - - * e-shell-view-menu.c (command_close): New function, destroys the - current view. - - * e-shell.c (view_destroy_cb): Make sure shell settings get saved - when the last view is destroyed. - -2001-01-24 Kjartan Maraas <kmaraas@gnome.org> - - * importer/GNOME_Evolution_Importer.idl: Fix missing ';'. - -2001-01-23 Ettore Perazzoli <ettore@ximian.com> - - * e-corba-storage.c (impl_StorageListener_update_folder): Don't - call `e_storage_updated_folder()' as it's supposed to happen - automatically now. - - * e-storage.c (e_storage_updated_folder): Removed. - (folder_changed_cb): New callback for the "changed" signal on the - EFolders. - (e_storage_new_folder): Connect it. - - * e-folder-tree.c: New member `data_to_path' in `EFolderTree'. - (e_folder_tree_new): Init here. - (e_folder_tree_destroy): Destroy it here. - (e_folder_tree_add): Add to the `data_to_path' hash. Make sure - we are not adding the same folder twice. - (remove_folder): Remove from the `data_to_path' hash. - (e_folder_tree_get_path_for_folder): New. - - * e-shell-view.c (e_shell_view_construct): Don't connect to the - "folder_updated" signal of the local storage anymore. - (folder_updated_cb): Removed. - (updated_folder_cb): New. - (e_shell_view_construct): Connect it to the "updated_folder" - signal. - - * e-local-storage.c: Remove `FOLDER_UPDATED' enum value and the - `signals' variable, as we don't want to define any custom signals - here anymore. - (bonobo_interface_update_folder_cb): No need to emit the - "folder_updated" signal here. The base class will take care of - this already. - (class_init): Don't install the "folder_updated" signal here. - - * e-local-storage.h: Removed signal "folder_updated". It is not - necessary, as we already have an `updated_folder' in `EStorage', - which is the parent class of `ELocalStorage'. - -2001-01-24 Iain Holmes <iain@ximian.com> - - * importer/GNOME_Evolution_Importer.idl: Removed the busy exception. - -2001-01-19 Iain Holmes <iain@ximian.com> - - * importer/GNOME_Evolution_Importer.idl: Make the processItem oneway. - Make the Listener interface inherit from Bonobo::Unknown. - - * importer/evolution-importer-client.[ch]: Remove all the crap to deal - with creating the Listener object. - - * importer/evolution-importer-listener.[ch]: A new bonobo object to - implement the ImporterListener interface. - - * importer/importer.c: Fix it up to use the new Listener object. - -2001-01-18 Iain Holmes <iain@ximian.com> - - * e-shortcuts-view.c (show_new_group_dialog): Don't make the dialog - modal. - -2001-01-16 Iain Holmes <iain@ximian.com> - - * importer/GNOME_Evolution_Importer.idl: Removed the ImporterFactory - interface and put the methods from it into the Importer interface. - - * importer/evolution-importer-factory.[ch]: Removed. - - * importer/evolution-importer.[ch]: Added the new methods. - Added inline documentation for all public functions. - - * importer/evolution-importer-client.[ch]: Added new client support for - the new methods. - Added inline documentation for all public functions. - - * importer/importer.c (create_plugin_menu): Changed the query to look for - IDL:GNOME/Evolution/Importer:1.0. - (start_import): Do all CORBA methods through the EvolutionImporterClient. - (get_iid_for_filetype): Change query to search for - IDL:GNOME/Evolution/Importer:1.0. - -2001-01-19 Dan Winship <danw@ximian.com> - - * evolution-storage.c (evolution_storage_folder_exists): New - function. Obvious. - -2001-01-19 Jason Leach <jasonleach@usa.net> - - (Bug #883: Shortcut bar does not update when a folders display - name changes) - - * e-local-storage.c (class_init): Define a new "folder_updated" - signal here. - (bonobo_interface_update_folder_cb): Emit the new folder_updated - signal here. - - * e-shell-view.c (e_shell_view_construct): Connect the - EShell::ELocalStorage folder_updated signal here. Also connect - the updated_folder signal coming from EShell::EStorageSet to the - new callback. - - * e-shell-view.c (folder_updated_cb): Callback that actually - initiates the shell updating. - - * e-shortcuts.c (e_shortcuts_update_shortcut_by_uri): New - function. Given a URI for a shortcut bar item, we'll update it. - - * e-shortcuts.c (e_shortcuts_remove_shortcut_by_uri): New - function. Given a URI for a shortcut bar item, we'll remove it. - - * e-shortcuts.c (removed_folder_cb): Connect this callback that - will remove a renamed vfolder from the shortcut bar. Temporary - fix to the problem of renaming vfolders and having the shortcut - bar think the old vfolder still exists. - - (Bug #1168: Shortcut bar and icon size persistence) - - * e-shell-view.c (save_shortcut_bar_icon_modes): New static - function, save the icon modes (for all shortcut bar groups, even - though we only have one group now). - (load_shortcut_bar_icon_modes): New static function, load the - saved shortcut bar group icon modes and apply them to our shortcut - bar. - -2001-01-17 Federico Mena Quintero <federico@ximian.com> - - * importer/evolution-importer.h: Use "typedef enum { ... } Blah;" - instead of "typedef enum _Blah Blah; enum _Blah { ... };" so that - gtk-doc can parse it. Sigh. - -2001-01-17 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-folder-selection-dialog.c - (e_shell_folder_selection_dialog_construct): Set the shadow type - for the EScrollFrame. Also, make the EStorageSetView widget grab - the focus. For some reason it doesnt' seem to work, but I'll - blame ETree for now. - -2001-01-17 Ettore Perazzoli <ettore@ximian.com> - - * e-shell-view.c (update_for_current_uri): Display the folder name - before "Evolution" instead of after it. Also, display the - sub-version string if it was defined when configuring. - -2001-01-17 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.c (table_drag_drop): Don't emit the - "dnd_action" signal here. Instead, do a `gtk_drag_get_data()' to - retrieve information about the drop. - (table_drag_data_received): New, implementation for - `ETable::table_drag_data_received'. - (class_init): Install it. - (table_drag_data_get): Use `unsigned int' instead of `guint' for - consistency. - (table_drag_motion): Same here. Also use `int' instead of `gint'. - (table_drag_drop): Likewise. - (treepath_compare): Likewise. - (marshal_NONE__ENUM_STRING_STRING_STRING): Removed. - (marshal_NONE__GDKDRAGACTION_STRING_STRING_STRING): New. - (class_init): Use it; update signal "dnd_action" so that it passes - a `GdkDragAction *' instead of . - - * e-storage-set-view.h: Change signal "::dnd_action" so that it - provides a `GdkDragContext' instead of just a `GdkDragAction'. - -2001-01-16 Michael Meeks <michael@helixcode.com> - - * e-shell-view.c (e_shell_view_construct): set config - path on window. - -2001-01-16 JP Rosevear <jpr@ximian.com> - - * e-shell-folder-title-bar.c (e_shell_folder_title_bar_new): pop the - visual/cm after the construct - -2001-01-15 JP Rosevear <jpr@ximian.com> - - * e-shell-folder-title-bar.c (e_shell_folder_title_bar_new): push/pop - the color map - (e_shell_folder_title_bar_new): and the visual... - -2001-01-15 Iain Holmes <iain@ximian.com> - - * importer/importer.c (import_druid_cancel): Just destroy the wizard. - All other freeing code is moved into import_druid_destroy. - (show_import_wizard): Connect the destroy signal to import_druid_destroy. - (start_import): Connect to the destroy signal of the dialog and the - clicked as well. - (dialog_destroy_cb): Stop the import after the current item has finished. - (dialog_clicked_cb): Stop the import. - (import_cb): Only process the next item if the dialog hasn't been stopped. - Destroy the dialog if it hasn't been destroyed already. - - * e-splash.c (e_splash_construct): Set the window title to Evolution. - -2001-01-13 Jason Leach <jasonleach@usa.net> - - (Fix bug #934: Add Right-click item to hide the shortcut bar) - - * e-shortcuts-view.c (class_init): Create a new hide_requested - signal. - (hide_shortcut_bar_cb): New function that gets called from the - right click menu items, it emits the hide_requested signal. - - * e-shell-view.c (setup_widgets): Connect the hide_requested from - the shortcut bar. - (hide_requested_cb): New function. - -2001-01-13 Ettore Perazzoli <ettore@ximian.com> - - * e-storage-set-view.h: New signal `dnd_action'. - - * e-storage-set-view.c: Renamed `drag_types' to - `source_drag_types' and `num_drag_types' to - `num_source_drag_types'. New variables `destination_drag_types' - and `num_destination_drag_types'. - (e_storage_set_view_construct): Set the ETree as a drag - destination. Allow both GDK_ACTION_MOVE and GDK_ACTION_COPY. - - * e-storage-set-view.c (table_drag_begin): Renamed from - `etable_drag_begin'. - (table_drag_data_get): Renamed from `etable_drag_data_get'. - Changed to be a method override instead of a signal handler. - (table_drag_motion): New; implementation for the - `ETable::table_drag_motion' method. Changed to be a method - override instead of a signal handler. - (table_drag_drop): New, implementation for `::table_drag_drop'. - (cursor_change): Renamed from `on_cursor_change'. - (e_storage_set_view_construct): Don't connect the signals here. - (class_init): Instead, override the methods here. Also, install - our override for `::table_drag_motion' and for - `::table_drag_drop'. - (right_click): Changed to be a method instead of a signal handler. - (cursor_change): Likewise. - -2001-01-13 Miguel de Icaza <miguel@gnu.org> - - * e-shell.c (e_shell_construct): Unref our copy, and then destroy. - - * e-splash.c (e_splash_set_icon_highlight): Do not execute code if - we have been destroyed. - (e_splash_add_icon): ditto. - -2001-01-12 Miguel de Icaza <miguel@gnu.org> - - * e-splash.c (e_splash_construct): Ok, talked to Ettore. Going - back to TOPLEVEL non-POPUP. - (e_splash_construct): Remove nice toplevel window. - -2001-01-12 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component.c: Add member `copy_folder_fn' to - `EvolutionShellComponentPrivate'. - (init): Init to NULL. - (impl_ShellComponent_async_copy_folder): New function, - implementation for `::asyncCopyFolder'. - (evolution_shell_component_construct): New arg @copy_folder_fn. - Set the corresponding member in `EvolutionShellComponentPrivate'. - (evolution_shell_component_new): New arg @copy_folder_fn. Pass it - to `evolution_shell_component_construct'. - - * evolution-shell-component.h: New type - `EvolutionShellComponentCopyFolderFn'. - -2001-01-12 Ettore Perazzoli <ettore@helixcode.com> - - * Evolution-ShellComponent.idl: Add method `::removeFolderAsync'. - -2001-01-12 Ettore Perazzoli <ettore@ximian.com> - - * evolution-shell-component.c (corba_class_init): - s/addFolderAsync/createFolderAsync/. - - * evolution-shell-component-client.c - (evolution_shell_component_client_async_create_folder): - s/addFolderAsync/createFolderAsync/. - - * Evolution-ShellComponent.idl: Rename `addFolder' into - `createFolder'. - -2001-01-12 Dan Winship <danw@ximian.com> - - * importer/.cvsignore: Create - -2001-01-12 Miguel de Icaza <miguel@ximian.com> - - * e-storage-set-view.c: Added translation strings. - - * e-shell-view-menu.c (command_about_box): Update our name - (command_new_mail_message): Remove "window" - from the moniker path. - - * e-splash.c (e_splash_construct): Make the spalsh screen a - toplevel instead of a popup. - -2001-01-11 Dan Winship <danw@ximian.com> - - * e-shell-view.c (show_existing_view): Remove the "Already have - view for..." message. People keep assuming it's an error. - -2001-01-11 Iain Holmes <iain@ximian.com> - - * importer/*: New directory containing the importer framework. - - * e-shell-view-menu.c (file_verbs): Add the FileImporter verb. - -2001-01-10 Miguel de Icaza <miguel@helixcode.com> - - * e-shell-view-menu.c (command_goto_folder): Fix prototype - (command_new_view): ditto. - (command_new_mail_message): Implement command_new_mail_message. - - verbs: Use BONOBO_UI_VERB instead of BONOBO_UI_UNSAFE_VERB - -2001-01-04 Dan Winship <danw@helixcode.com> - - * evolution-storage.c (evolution_storage_update_folder_by_uri): - New function to update a folder given its URI. Plus associated - changes to other functions to keep track of the path<->URI - mappings. - -2000-12-28 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-shell-client.c (user_select_folder): Make sure the - `*uri_return' and `*physical_uri_return' are always initialized on - return, as that's what the caller expects. - -2000-12-23 Jason Leach <jasonleach@usa.net> - - * e-shell-view-menu.c (command_run_bugbuddy): Fix a crash when the - user tries to "Submit bug report" but doesn't have bug-buddy - installed. Bug #633. - -2000-12-23 Jason Leach <jasonleach@usa.net> - - * e-setup.c (copy_default_stuff): Make the "Evolution - installation" dialog resizable. Bug #742. - (check_evolution_directory): Here too. - -2000-12-14 Iain Holmes <iain@helixcode.com> - - * e-shell-folder-selection-dialog.c (dbl_click_cb): Modify to suit the - new double click callback signature. Destroy the dialog after the double - click as well. - -2000-12-14 Ettore Perazzoli <ettore@helixcode.com> - - * main.c (development_warning): Slightly updated the text for the - release. - -2000-12-14 Ettore Perazzoli <ettore@helixcode.com> - - * e-splash.c (ICON_Y): Update for the size of the new splash. - -2000-12-12 Jeffrey Stedfast <fejj@helixcode.com> - - * e-splash.c (button_press_event): Return TRUE as we have handled - the event. - -2000-12-12 Dan Winship <danw@helixcode.com> - - * e-shell-view.c (get_control_for_uri): Pass path+1 rather than - path to get_type_for_storage, to match the convention used by its - other callers. - -2000-12-11 Jeffrey Stedfast <fejj@helixcode.com> - - * e-splash.c (e_splash_construct): Connect a button-press-event - signal on the splash screen so users can click it to hide it. - (button_press_event): New callback to hide the splash screen. - -2000-12-11 Dan Winship <danw@helixcode.com> - - * e-shell-view.c (get_type_for_{folder,storage}): return NULL if - no {folder,storage} is found. - (get_control_for_uri): return NULL if no folder_type is found. - -2000-12-08 Ettore Perazzoli <ettore@helixcode.com> - - * e-shortcuts-view.c (e_shortcuts_view_construct): Ooops. We were - reffing a bogus pointer that was not assigned yet. - - * e-corba-storage-registry.c (impl_StorageRegistry_addStorage): - Updated according to the new IDL. - - * e-local-storage.c (construct): Pass `NULL' to - `e_storage_construct' as the @toplevel_node_type arg. - - * evolution-shell-component-client.c - (evolution_shell_component_client_new_for_objref): New. - (evolution_shell_component_client_new): Refactored to use it. - - * e-corba-storage.c (e_corba_storage_construct): New arg - @toplevel_node_type. Pass it to `e_storage_construct'. - (e_corba_storage_new): New arg @toplevel_node_type. Pass it to - `e_corba_storage_construct'. - - * e-storage.c: New member `toplevel_node_uri_type' in - `EStoragePrivate'. - (init): Init to NULL. - (destroy): Unref. - (e_storage_construct): New arg @toplevel_node_type. Set the - private member value accordingly. - (e_storage_new): New arg @toplevel_node_type. Pass to - `e_storage_construct'. - (e_storage_get_toplevel_node_type): New. - - * e-shell-view.c (get_physical_uri_for_evolution_uri): New arg - @shell_view. - (get_physical_uri_for_storage): Filled in. New arg @shell_view. - (get_physical_uri_for_folder): Filled in. New arg @shell_view. - - * evolution-local-storage.c (evolution_local_storage_construct): - Pass `NULL' as the @toplevel_node_type arg to - `evolution_storage_construct'. - - * evolution-storage.c: New member `toplevel_node_type' in - `EvolutionStoragePrivate'. - (destroy): Free. - (init): Init to NULL. - (evolution_storage_construct): New arg @toplevel_node_handler - to initialize the corresponding field in `->priv'. - (evolution_storage_new): New arg @toplevel_node_type. Pass - it to `evolution_storage_construct'. - (evolution_storage_register): Pass the @toplevel_node_type - arg to `::addStorage'. - - * Evolution-Storage.idl: Add arg @toplevel_node_type to - `StorageRegistry::addStorage'. - - * main.c (new_view_on_running_shell): Deal with an exception in - `::createNewView' gracefully. - - * e-shell-view.c (switch_on_folder_tree_click): New. - (folder_selected_cb): Refactored to use it. - (storage_selected_cb): Use it. - -2000-12-07 Michael Meeks <michael@helixcode.com> - - * Makefile.am (oaf_DATA): update to GNOME_Evolution_Shell.oafinfo - - * e-shell.h: upd. - -2000-12-04 Ettore Perazzoli <ettore@helixcode.com> - - * Evolution-StorageSetView.idl: Arg @uri renamed to @name in - `StorageSetViewListener::notifyStorageSelected'. - - * evolution-storage-set-view.c - (storage_set_view_widget_storage_selected_cb): Renamed arg @uri to - @name. - - * e-storage-set-view.c (on_cursor_change): Only emit the name of - the storage for the "storage_selected" signal [i.e. remove the - leading slash]. - - * e-shell-view.c (storage_selected_cb): New callback for the - "storage_selected" signal on the EStorageSetView used for the - folder tree. - (setup_storage_set_subwindow): Connect it. - - * evolution-local-storage.c (evolution_local_storage_construct): - Pass NULL as the @toplevel_node_uri arg to - `evolution_storage_construct()'. - - * evolution-storage.c: New member `toplevel_node_uri' in - `EvolutionStoragePrivate'. - (init): Init to NULL. - (destroy): Free. - (evolution_storage_construct): New arg @toplevel_node_uri. Set - the @toplevel_node_uri member in the private part to its value. - (evolution_storage_new): New arg @toplevel_node_uri. Pass it to - `evolution_storage_construct()'. - (evolution_storage_register): Pass the @toplevel_node_uri value to - the `::addStorage' CORBA method. - - * e-corba-storage-registry.c (impl_StorageRegistry_addStorage): - New arg @toplevel_node_uri, to go with the IDL change. - - * Evolution-Storage.idl (StorageRegistry::addStorage): New arg - @toplevel_node_uri. - - * e-local-storage.c (construct): Pass NULL as the - @toplevel_node_uri arg to `e_storage_construct()'. - - * e-corba-storage.c (e_corba_storage_construct): New arg - @toplevel_node_uri. Pass it to `e_storage_construct()'. - (e_corba_storage_new): New arg @toplevel_node_uri. Pass it to - `e_corba_storage_construct()'. - - * e-storage.c: New member `toplevel_node_uri' in - `EStoragePrivate'. - (init): Init to NULL. - (destroy): Free. - (e_storage_construct): New arg @toplevel_node_uri. Set the - `toplevel_node_uri' member in the private part to its value. - (e_storage_new): New arg @toplevel_node_uri. Pass it to - `e_storage_construct()'. - (e_storage_get_toplevel_node_uri): New. - - * e-corba-storage-registry.c (impl_StorageRegistry_addStorage): - Renamed from `impl_StorageRegistry_register_storage'. - (impl_StorageRegistry_removeStorageByName): Renamed from - `impl_StorageRegistry_unregister_storage'. - (corba_class_init): Updated accordingly. - -2000-12-04 Ettore Perazzoli <ettore@helixcode.com> - - * main.c (new_view_on_running_shell): Don't crash if the object - returned from `oaf_activate_from_id' is NIL and the exception - isn't set. Just handle this as a normal error condition. - -2000-12-04 Michael Meeks <michael@helixcode.com> - - * e-shell-view.c (get_control_for_uri): return NULL if we can't - create a view. - (setup_evolution_shell_view_interface): add precondition. - -2000-12-04 Ettore Perazzoli <ettore@helixcode.com> - - * e-shortcuts-view.c (e_shortcuts_view_construct): Ref the - shortcuts. - - * main.c (new_view_on_running_shell): New. - (idle_cb): If the shell cannot be created, then call - `new_view_on_running_shell'. - - * e-shell-view.c: New member `shell_view_interface' in - `EShellViewPrivate'. - (init): Init to NULL. - (setup_evolution_shell_view_interface): Set up. - (destroy): Unref. - - * e-shell.c (impl_Shell_getComponentByType): Renamed from - `impl_Shell_get_component_for_type'. - (impl_Shell_selectUserFolder): Renamed from - `impl_Shell_user_select_folder'. - (impl_Shell_getLocalStorage): Renamed from - `impl_Shell_get_local_storage'. - (impl_Shell_createStorageSetView): Renamed from - `impl_Shell_create_storage_set_view'. - (corba_class_init): Updated accordingly. - (impl_Shell_createNewView): New, implementation for the - `createNewView' CORBA method. - (corba_class_init): Install it. - - * Evolution-Shell.idl: New method `::createNewView'. - - * e-shell.c (register_shell): New. - (e_shell_construct): Return value changed to `gboolean'. New arg - @iid. Construct the Bonobo object before displaying the splash, - then try to register it with the specified @iid. If registration - fails, return %FALSE. Otherwise, just do everything normally and - return %TRUE. - (e_shell_new): Pass the OAFIID to `e_shell_construct()'. If it - fails, unref the object and return NULL. - - * evolution.oafinfo: New. - -2000-11-27 JP Rosevear <jpr@helixcode.com> - - * e-shell-view-menu.c (command_about_box): Add myself, anna, jesse - -2000-11-15 Michael Meeks <michael@helixcode.com> - - * e-shell.c (e_shell_component_maybe_crashed): de-register - a component's UI if it dies. - -2000-11-25 Peter Williams <peterw@helixcode.com> - - * Makefile.am (idldir): Install our IDL's into $(datadir)/idl. - -2000-11-25 Federico Mena Quintero <federico@helixcode.com> - - * e-setup.c (check_dir_recur): Plug leaks of the fullname and - fulldefaultname. - (check_evolution_directory): Plug leaks of defaultdir and newfiles - and the list's data; made the code have a single return point. - - * e-shell.c (e_shell_restore_from_settings): Plug leak of prefix. - (corba_class_init): Plug leak; we were not assigning the - vepv->_base_epv. - - * evolution-storage.c (corba_class_init): Likewise. - - * evolution-local-storage.c (corba_class_init): Likewise. - -2000-11-24 Federico Mena Quintero <federico@helixcode.com> - - * evolution-shell-component.c - (impl_ShellComponent__get_supported_types): Plug leak; mark the - CORBA sequence so that it will be released. - -2000-11-14 Michael Meeks <michael@helixcode.com> - - * e-shell-view.c (unmerge_on_error): add - (e_shell_view_construct): hook up to system_exception on - ui_container. - -2000-11-11 Matt Bissiri <bissiri@eecs.umich.edu> - - * e-shell.c: (setup_components), (save_settings_for_component): - * evolution-storage.c: (evolution_storage_register_on_shell): - Update the remaining "IDL:Evolution*" to "IDL:GNOME/Evolution*" - to sync up with yesterday's IDL re-scoping. - -2000-11-06 Michael Meeks <michael@helixcode.com> - - * e-shell-view.c (unrealize): remove. - (e_shell_view_construct): ditto. - -2000-11-09 Christopher James Lahey <clahey@helixcode.com> - - * e-shell-view.c: Make the panes of the EPaned not shrinkable - beyond their minimum size. - -2000-11-08 Matt Bissiri <bissiri@eecs.umich.edu> - - * e-shell-folder-selection-dialog.c: Fix typo in a comment. - -2000-11-06 Dan Winship <danw@helixcode.com> - - * e-storage-set-view.c (insert_folders): Pass full_name, not - folder_name to callback. - -2000-11-06 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-shell-view.c (impl_ShellView_change_current_view): - Constified @uri. - (impl_ShellView_set_title): Constified @title. - -2000-11-06 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell.c: New member `crash_type_names' in `EShellPrivate'. - (init): Init to NULL. - (destroy): Free. - (e_shell_component_maybe_crashed): New. - -2000-11-06 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-shell-component.c (impl_ShellComponent_create_view): - `CORBA_Object_duplicate()' the return value. - -2000-11-06 Kjartan Maraas <kmaraas@gnome.org> - - * e-setup.c: Added #include <config.h> - -2000-11-03 Ettore Perazzoli <ettore@helixcode.com> - - * main.c: New local static variables `evolution_directory', - `no_splash'. - (main): Removed local variable `evolution_directory'. Add a - `--no-splash' command-line option for setting the value of - `no_splash'. - (idle_cb): Use the static `evolution_directory'. Make the newly - created shell show the splash or not according to the value of - `no_splash'. - - * e-shell.c (setup_components): Deal with a NULL @splash - parameter. - (e_shell_construct): New arg `show_splash'. Don't create a splash - screen if FALSE; instead, pass NULL to `setup_components()' as the - @splash arg. - (e_shell_new): New arg `show_splash'. Pass it to - `e_shell_construct()'. - -2000-11-03 Dan Winship <danw@helixcode.com> - - * evolution-storage-listener.c (class_init): Fix the name of the - signal passed to gtk_signal_new so that this actually works. - -2000-11-01 Dan Winship <danw@helixcode.com> - - * evolution-storage.c (evolution_storage_new_folder): Make this - take "highlighted" as well. - - * e-local-storage.c (new_folder): - * e-corba-storage.c (impl_StorageListener_new_folder): set - highlighted on the new folder. - - * e-storage-set-view.c (updated_folder_cb): Remove an unused - variable. - -2000-10-26 Iain Holmes <iain@helixcode.com> - - * Evolution-ShellView.idl: Added a change_current_view method and - a set_title. - - * evolution-shell-view.c (class_init): Added signals for the above methods. - (impl_ShellView_change_current_view), (impl_ShellView_set_title): Implementations - for above methods. - (corba_class_init): Connect the implemenations. - - * e-shell-view.c (shell_view_interface_change_current_view): Change - the display to the new uri. - (shell_view_interface_set_title): Set the window title. - (setup_evolution_shell_view_interface): Connect the signals to the above - functions. - -2000-11-01 Dan Winship <danw@helixcode.com> - - * Evolution-Storage.idl: Add "highligted" field to Folder. Add - update_folder method to StorageListener to change display_name and - highlight status. - - * e-folder.c: Add "highlighted" to EFolder to match the - Evolution::Folder type. - (e_folder_get_highlighted, e_folder_set_highlighted): Added - - * evolution-storage-listener.c - (impl_Evolution_StorageListener_update_folder, etc): - * e-storage.c (e_storage_updated_folder, etc): - * e-corba-storage.c (impl_StorageListener_update_folder, etc): - Implement update_folder. - - * e-storage-set.c (storage_updated_folder_cb, etc): Re-emit - updated_folder signals received from EStorage. - - * e-storage-set-view.c (various): Add another model column to the - ETable and set it up as a bold_column based on - e_folder_get_highligted. - (updated_folder_cb, etc): Listen to EStorageSet update_folder - signal and emit ETree node_changed signals. - - * evolution-storage.c (evolution_storage_update_folder): Client - function to update a folder's display_name and highlighted status. - - * Evolution-LocalStorage.idl: - * evolution-local-storage.c: - * e-local-storage.c: Change set_display_name to update_folder to - match Evolution::StorageListener - -2000-10-25 <jpr@helixcode.com> - - * e-shortcuts-view-model.c (load_group_into_model): Set folder to NULL to - kill warning - -2000-10-23 Dan Winship <danw@helixcode.com> - - * Makefile.am (INCLUDES): Update EVOLUTION_LOCALEDIR - -2000-10-20 Michael Meeks <michael@helixcode.com> - - * evolution-shell-component-client.c - (evolution_shell_component_client_populate_folder_context_menu), - (evolution_shell_component_client_create_view): update to new UI handler - - * e-shell-view-menu.c (command_create_folder): ditto. - - * e-storage-set-view.c (popup_folder_menu): ditto. - - * evolution-shell-component-client.h: kill ui-compat include. - -2000-10-19 Iain Holmes <iain@helixcode.com> - - *e-shell-view.c (e_shell_view_save_settings): If there is no view - save the default uri instead. - (socket_destroy_cb): When a view crashes, change the view to the - default one. - -2000-10-18 Michael Meeks <michael@helixcode.com> - - * evolution-shell-component.c (impl_ShellComponent_populate_folder_context_menu): - update for new UI handler. - -2000-10-18 Iain Holmes <iain@helixcode.com> - - * e-shell-view.c (start_progress_bar): If the widget is not realized - don't do anything, to prevent BadGC's at shut down. - (stop_progress_bar): Don't draw anything if the widget is not realized. - Same reason. - - * e-shell-folder-selection-dialog.c (dbl_click_cb): Emit the - folder-selected signal. - (e_shell_folder_selection_dialog_construct): Connect to the e-table's - double-click signal. - -2000-10-17 Iain Holmes <iain@helixcode.com> - - * e-shell.c (view_deleted_cb): Save the settings before the - view is destroyed. - (e_shell_quit): Don't save the settings when there are no views. - -2000-10-16 Iain Holmes <iain@helixcode.com> - - * e-setup.c (check_evolution_directory): Better dialog. - - * e-splash.c (icon_free): Don't unref the canvas item. - (e_splash_construct): Add a frame round the splash screen. - -2000-10-16 Dan Winship <danw@helixcode.com> - - * evolution-storage-set-view-factory.c - (evolution_storage_set_view_factory_new_view): Add a typecast. - - * e-storage-set-view.c (popup_folder_menu): Move variable - declarations into the #if 0 to kill warnings. - (populate_folder_context_menu_with_common_items, - folder_context_menu_activate_cb): Move these into #if 0 too. - - * e-shell.c: Add prototype. - - * e-shell-view.c (storage_set_view_box_map_cb): - * e-shell-folder-title-bar.c (e_shell_folder_title_bar_construct): - Remove unused variables. - - * e-setup.c: Fix warning caused by e-util -> gal migration. - -2000-10-11 Iain Holmes <iain@helixcode.com> - - * e-setup.c (check_evolution_directory): Check if there are any - files in default_user that are not in ~/evolution and if so - copy them over. - (check_dir_recur): Recursive function to check the directory. - - * e-shell-view-menu.c: Look Maw! I'm an Evolution hacker too. - - * e-shell-view.c: Don't quit on when a view is destroyed. - - * e-shell.c: Save the settings for the remaining views whenever - a view is destroyed. - -2000-10-15 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c (setup_storage_set_subwindow): Use an - EScrollFrame instead of a GtkScrolledWindow. - -2000-10-14 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell.c (e_shell_construct): Display a splash screen. - (setup_components): New arg @splash, pointer to an ESplash. - Display the icons of the components in the splash and highlight - them as the components are activated. - - * e-splash.c: New. - * e-splash.h: New. - -2000-10-13 Anna Marie Dirks <anna@helixcode.com> - - * e-shell-folder-creation-dialog.glade: Added focus to the - folder-name text entry. - -2000-10-11 Christopher James Lahey <clahey@helixcode.com> - - * e-storage-set-view.c: Fixed the spec on this. - -2000-10-11 Christopher James Lahey <clahey@helixcode.com> - - * e-storage-set-view.c: Changed this to use the built in cells. - -2000-10-11 Christopher James Lahey <clahey@helixcode.com> - - * e-storage-set-view.c: Adapted this for the new ETable system. - -2000-10-09 Michael Meeks <michael@helixcode.com> - - * e-shell-view-menu.c: Change paths in such a way as to require - HEAD bonobo. - (command_toggle_folder_bar, command_toggle_shortcut_bar): only - respond to state changes. - -2000-10-07 Matt Wilson <msw@redhat.com> - - * e-shell-view.c (init): initialize priv->sockets to NULL, fixes - startup crash on non-ia32 platforms - -2000-10-06 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c: New member `sockets. - (init): Init to NULL. - (destroy): Free. Also, disconnect the "destroy" signal from them - before the controls get destroyed. - (find_socket): New function. [Thanks Dan.] - (socket_destroy_cb): New callback for the destruction of a socket. - (get_control_for_uri): Get the socket through `find_socket()' and - connect the "destroy" signal to `socket_destroy_cb'. - -2000-10-06 Chris Toshok <toshok@helixcode.com> - - * e-storage-set-view.c (insert_storages): call - _set_compare_function after inserting the storage. - -2000-10-06 Michael Meeks <michael@helixcode.com> - - * e-shell-view.c (e_shell_view_display_uri): add a freeze / thaw - pair to reduce flicker on switching controls. - -2000-10-05 Michael Meeks <michael@helixcode.com> - - * e-shell-view-menu.c (command_xml_dump): fix. - -2000-10-05 Chris Toshok <toshok@helixcode.com> - - * e-shell-folder-creation-dialog.c: #include <gal/widgets/e-gui-utils.h> - - * e-shell-folder-selection-dialog.c: same. - -2000-10-05 Chris Toshok <toshok@helixcode.com> - - * e-shell-folder-selection-dialog.c: add #include for - libgnomeui/gnome-messagebox.h - -2000-10-05 Michael Meeks <michael@helixcode.com> - - * e-shell-view-menu.c (shortcut_bar_mode_changed_cb): upd. - (folder_bar_mode_changed_cb): upd. - (command_xml_dump): clobber. - (e_shell_view_menu_setup): upd. - - * e-shell-view.c (shell_view_interface_set_message_cb): upd. - (shell_view_interface_unset_message_cb): upd. - (e_shell_view_construct): upd. - (get_control_for_uri): upd. - (e_shell_view_get_bonobo_ui_component): upd. - -2000-10-04 Michael Meeks <michael@helixcode.com> - - * e-shell-view.c (setup_progress_bar): remove evil usize set. - -2000-10-03 Matt Bissiri <bissiri@eecs.umich.edu> - - * e-shell-view-menu.c (e_shell_view_menu_setup): Use - `bonobo_ui_component_add_verb_list' instead of - `bonobo_ui_component_add_verb_list_with_data' for help_verbs, - so that `command_help' gets an html filename as user_data, - instead of a ptr to EShellView. - (menu_do_misc): Move DumpXML from help_verbs to here, because - `command_xml_dump' needs to get EShellView as user_data. - -2000-10-02 Ettore Perazzoli <ettore@helixcode.com> - - * e-shortcuts-view.c (show_new_group_dialog): Destroy the dialog - if the user has clicked on "OK" or "Cancel". - -2000-10-02 Chris Toshok <toshok@helixcode.com> - - * e-storage-set-view.c (e_storage_set_view_get_current_folder): if - we're not displaying folders, the current folder is NULL. - (class_init): fix typo. - - * Makefile.am (libeshell_a_SOURCES): - evolution-storage-set-view-listener.[ch] should be here, not - evolution_SOURCES. - -2000-10-02 Chris Toshok <toshok@helixcode.com> - - * evolution-storage-set-view.c: add storage_selected behavior - - loop over the listeners calling _storage_selected. - - * Evolution-StorageSetView.idl: add storage_selected to the - Listener interface. - - * e-storage-set-view.c add storage_selected signal. - (on_cursor_change): if the depth is less than 2, emit - "storage_selected", otherwise emit "folder_selected". - - * e-storage-set-view.h: add storage_selected signal. - - * evolution-storage-set-view-listener.h: add storage_selected - signal. - - * evolution-storage-set-view-listener.c: add storage_selected - signal. - -2000-10-02 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-storage-set-view-listener.c: New. - * evolution-storage-set-view-listener.h: New. - -2000-10-02 Chris Toshok <toshok@helixcode.com> - - * evolution-storage-set-view.c (impl_StorageSetView_add_listener): fix typo. - (impl_StorageSetView_remove_listener): same. - (impl_StorageSetView__get_show_folders): implementation of getter for show_folders. - (impl_StorageSetView__set_show_folders): implementation of setter for show_folders. - (corba_class_init): install _set_show_folders and _get_show_folders. - - * Evolution-StorageSetView.idl: add show_folders attribute to - StorageSetView. - - * e-storage-set-view.h: add prototypes for - e_storage_set_view_{get,set}_show_folders. - - * e-storage-set-view.c (insert_storages): split this code out from - e_storage_set_view_construct so we can call it when "show_folders" - has been changed. - (e_storage_set_view_construct): remove the code to insert - storages. - (e_storage_set_view_set_show_folders): new function. tears down - existing tree and node/path hashtable and calls insert_storages. - (e_storage_set_view_get_show_folders): new function, retrieves - current show_folders state. - -2000-10-02 Chris Toshok <toshok@helixcode.com> - - * evolution-storage-set-view-factory.c - (evolution_storage_set_view_factory_new_view): pass - storage_set_view_interface as second argument to - bonobo_object_add_interface, and call gtk_widget_show on the - storage_set_view widget. - -2000-10-03 Michael Meeks <michael@helixcode.com> - - * e-shell-view.c (setup_bonobo_ui_handler): kill. - - * e-shell-view-menu.c (e_shell_view_menu_setup): strip - out the XML UI merge; move it to - - * e-shell-view.c (e_shell_view_construct): here, + - freeze / thaw pair. - - * e-shell-view.c (setup_progress_bar): impl. - (setup_widgets): hook in. - (progress_bar_timeout_cb): fix. - (start_progress_bar): fix. - (stop_progress_bar): fix. - (e_shell_view_construct): setup ui handler first. - -2000-09-22 Michael Meeks <michael@helixcode.com> - - * e-shell-view-menu.c (e_shell_view_menu_setup): upd. - -2000-10-02 Chris Toshok <toshok@helixcode.com> - - * e-storage-set-view.c (new_folder_cb): set the new node's compare function. - (insert_folders): same. - - (new_storage_cb): remove uunecessary cast. - -2000-10-02 Chris Toshok <toshok@helixcode.com> - - * e-storage-set-view.c (new_storage_cb): track e-tree sort api change. - (treepath_compare): same. - (new_folder_cb): same. - -2000-10-02 Chris Toshok <toshok@helixcode.com> - - * e-storage-set-view.c (e_storage_set_view_construct): pass NULL - for the open/closed pixbuf of the tree renderer. we'll let it - supply the default. - (destroy): remove the expanded/unexpanded pixbuf references. - (new_storage_cb): use e_tree_model_node_insert_id so we can (soon) - save expanded/collapsed state. - (new_folder_cb): same. - (insert_folders): same. - (e_storage_set_view_construct): same. - -2000-10-02 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell.c (impl_Shell_create_storage_set_view): New, - implementation for `::create_storage_set_view'. - (corba_class_init): Install. - - * evolution-storage-set-view-factory.c: New. - * evolution-storage-set-view-factory.h: New. - - * evolution-storage-set-view.c: New. - * evolution-storage-set-view.h: New. - - * Evolution-Shell.idl: New method - `Shell::create_storage_set_view'. - - * Evolution.idl: #include <Evolution-StorageSetView.idl>. - - * Evolution-StorageSetView.idl: New. - -2000-10-02 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-storage.c (find_listener_in_list): New helper - function. - (impl_Storage_remove_listener): New, implementation for - `Storage::remove_listener'. - (remove_listener): Helper function for - `impl_Storage_remove_listener'. - (evolution_storage_get_epv): Install the implementation for - `::remove_listener'. - (add_listener): Return a boolean indicating success or failure. - Reject multiple additions of the same listener. - (impl_Storage_add_listener): Updated accordingly: raise an - exception if `add_listener' fails. - - * Evolution-Storage.idl: Added `Storage::remove_listener'. Added - exception `AlreadyListening' for `::add_listener'. - -2000-09-29 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c (popup_storage_set_view_button_clicked): Renamed - from `popup_storage_set_view_close_button_clicked'. - (storage_set_view_box_map_cb): Updated accordingly. Connect to - "button_clicked" instead of "close_button_clicked". - (disconnect_popup_signals): Updated accordingly. - (e_shell_view_set_folder_bar_mode): Update the button mode of the - title bar according to the folder bar mode. - -2000-09-28 Dan Winship <danw@helixcode.com> - - * e-corba-storage.c (impl_StorageListener_new_folder): Don't print - "Folder registered successfully" if it didn't. (Duh. :) - -2000-09-28 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c: New constant `DEFAULT_URI'. - (e_shell_view_load_settings): If the `DisplayedURI' from - `gnome_config' cannot be displayed, display the `DEFAULT_URI'. - -2000-09-26 Ettore Perazzoli <ettore@helixcode.com> - - * e-shortcuts.c (e_shortcuts_get_group_title): Cast the data - pointer, not the node pointer. - (e_shortcuts_add_group): If @group_num is -1, emit the effective - group number with the "new_group" signal instead of -1, which is - going to confuse the signal handler. - (e_shortcuts_add_shortcut): Likewise with the shortcut. - - * e-shortcuts-view-model.c (shortcuts_new_group_cb): We are @data, - not @shortcuts. - (class_init): Install the `::destroy' handler. - - * e-shortcuts-view.c (e_shortcuts_view_construct): Set - `priv->shortcuts'. - (remove_shortcut_cb): Don't remove the item both on the data and - the model. - (toggle_small_icons_cb): Removed some crufty checks. - (toggle_large_icons_cb): Likewise. - (show_new_group_dialog): New, implementation for the "Create new - shortcut group" dialog. - (destroy_group_cb): Callback for the "Destroy this group" item. - (create_new_group): Callback for the "Create new group" item. - -2000-09-25 Ettore Perazzoli <ettore@helixcode.com> - - * e-shortcuts-view.c (item_selected): Renamed from - `selected_item'. - (class_init): Updated accordingly. - (impl_shortcut_dropped): New function, implementation for - `EShortcutBar::shortcut_dropped'. - (impl_shortcut_dragged): New function, implementation for - `EShortcutBar::shortcut_dragged'. - (e_shortcuts_view_construct): Update to use EShortcutsViewModel. - (class_init): Install them. - - * e-shortcuts.c (e_shortcuts_get_group_title): New. - - * e-shortcuts-view-model.c: New. - * e-shortcuts-view-model.h: New. - -2000-09-24 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell.c (setup_local_storage): Don't unref the local storage. - -2000-09-22 Michael Meeks <michael@helixcode.com> - - * e-shell-view-menu.c (e_shell_view_menu_setup): upd. - -2000-09-21 Federico Mena Quintero <federico@helixcode.com> - - * e-shell-view-menu.c: Fix mis-spelling of "calendar". - -2000-09-21 Michael Meeks <michael@helixcode.com> - - * e-shell-view.c (show_existing_view): upd. - - * Evolution-ShellComponent.idl: upd. - - * evolution-shell-component.c (impl_ShellComponent_populate_folder_context_menu): - upd. - -2000-09-18 Michael Meeks <michael@helixcode.com> - - * e-shell-view-menu.c (command_xml_dump): add xml dump option. - -2000-09-18 Christopher James Lahey <clahey@helixcode.com> - - * Makefile.am: Added $(EXTRA_GNOME_CFLAGS) and - $(EXTRA_GNOME_LIBS). Removed unneeded libraries. - - * e-component-registry.c, e-corba-storage-registry.c, - e-corba-storage.c, e-folder-type-registry.c, e-folder.c, - e-local-folder.c, e-local-storage.c, - e-shell-folder-creation-dialog.c, - e-shell-folder-selection-dialog.c, e-shell-folder-title-bar.c, - e-shell-view.c, e-shell.c, e-shortcuts-view.c, e-shortcuts.c, - e-storage-set-view.c, e-storage-set-view.h, e-storage-set.c, - e-storage.c, evolution-local-storage.c, evolution-session.c, - evolution-shell-client.c, evolution-shell-component-client.c, - evolution-shell-component.c, evolution-shell-view.c, - evolution-storage-listener.c, evolution-storage.c, main.c: Fixed - the #include lines to deal properly with gal. - -2000-09-16 Michael Meeks <michael@helixcode.com> - - * e-shell-view-menu.c (e_shell_view_menu_setup): use datadir. - -2000-09-16 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.h: #include "bonobo-win.h", not "bonobo-app.h". - -2000-09-15 Dan Winship <danw@helixcode.com> - - * e-storage.c (get_path_for_physical_uri_foreach): foreach_data - should be set to the caller-supplied data, not the tree item data. - -2000-09-14 Iain Holmes <iain@helixcode.com> - - * e-shell-folder-title-bar.c (e_shell_folder_title_bar_construct): - Remove the *kludge* so that the button width is set properly. - Fixes bug #XXXX - -2000-09-14 Michael Meeks <michael@helixcode.com> - - * e-shell-view-menu.c: Remove sillies in toggle paths. - -2000-09-14 Michael Meeks <michael@helixcode.com> - - * e-shell-view.c: move fn to bonobo. - -2000-09-14 Christopher James Lahey <clahey@helixcode.com> - - * Makefile.am: Added $(GNOME_PRINT_LIBS) to evolution_LDADD. - -2000-09-14 Michael Meeks <michael@helixcode.com> - - * e-shell-view.c (e_shell_view_construct): prune cruft. - (shell_view_interface_unset_message_cb), - (shell_view_interface_set_message_cb): impl. - -2000-09-14 Michael Meeks <michael@helixcode.com> - - * e-shell-view-menu.c (e_shell_view_menu_setup): re-order to suit and - add freeze / thaw, update paths to toggles, remove warnings - -2000-09-07 Michael Meeks <michael@helixcode.com> - - * e-shell-view-menu.c: Re-hash pretty much the whole file - - * ui.xml: Add. - - * e-shell-view.c (e_shell_view_construct): connect unrealize & delete_event - to theit signals on the window (class_init): remove widget_class bits. - -2000-09-06 Michael Meeks <michael@helixcode.com> - - * e-shell.c (view_destroy_cb, destroy, e_shell_new_view, e_shell_quit): - update to track object type change. - - * e-shell.c (e_shell_restore_from_settings): ditto. - - * main.c (idle_cb): ditto. - - * e-shell-view.c (e_shell_view_new, e_shell_view_construct, setup_widgets): - updated for BonoboApp. - (progress_bar_timeout_cb, start_progress_bar, stop_progress_bar), - (shell_view_interface_set_message_cb, shell_view_interface_unset_message_cb): - emasculated for now. - - * e-storage-set-view.c (popup_folder_menu): disable popup menu for now. - -2000-09-13 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c (popdown_transient_folder_bar): New. - (storage_set_view_box_button_release_event_cb): Rewritten to use - it. - (folder_selected_cb): Pop down the transient folder bar if the - folder bar mode is `TRANSIENT'. - -2000-09-12 Ettore Perazzoli <ettore@helixcode.com> - - * ($(IDL_GENERATED)): Stupid `orbit-idl' wants a space after the - `-I'. - -2000-09-12 Lauris Kaplinski <lauris@helixcode.com> - - * e-shell-view.c (update_folder_title_bar): Translate UTF-8 - -2000-09-12 Ettore Perazzoli <ettore@helixcode.com> - - * Makefile.am: Remove the `ui.xml' stuff. - -2000-09-11 Dan Winship <danw@helixcode.com> - - * main.c (main): Initialize libunicode - -2000-09-11 Christopher James Lahey <clahey@helixcode.com> - - * e-local-storage.c: Fixed some warnings. - -2000-09-11 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-folder-selection-dialog.c (set_default_folder): Work on - the assumption that @default_uri is not NULL. - (e_shell_folder_selection_dialog_construct): Only call if the - @default_uri is not NULL. - -2000-09-11 Ettore Perazzoli <ettore@helixcode.com> - - * e-local-storage.c (new_folder): Removed debugging message. - -2000-09-11 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-storage.c (evolution_storage_new_folder): If - description is NULL, use the empty string instead. - - * e-local-storage.c (new_folder): New utility function to add a - new folder by keeping both the Bonobo interface and the EStorage - up-to-date. - (load_folders): Use it here instead of just - `e_storage_new_folder()'. - (component_async_create_folder_callback): Likewise. - - * e-shell-view.c (update_for_current_uri): Prevent an - EStorageSetView warning if the path is NULL. - - * evolution-storage.c (impl_Storage_add_listener): New, - implementation for `Evolution::Storage::add_listener'. - (evolution_storage_get_epv): Install it. - - * evolution-storage-listener.c - (evolution_storage_listener_corba_objref): New. - (create_servant): Create the servant with `g_new0()' instead of - `g_new()'. - -2000-09-11 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-storage-listener.c - (evolution_storage_listener_construct): Unset the `GTK_FLOATING' - flag as `EvolutionStorageListener' is self-owned. - -2000-09-11 Ettore Perazzoli <ettore@helixcode.com> - - * e-storage.c (impl_list_folders): Removed. - (impl_get_subfolder_paths): New static function, implementation - for `::get_subfolder_paths'. - (class_init): Install it. - (e_storage_get_subfolder_paths): New. - - * e-storage.h: `list_folders' virtual method removed. New virtual - method `list_subfolder_paths'. - - * e-storage-set-view.c (etree_icon_at): If the folder is not - found, return NULL. - - * e-local-storage.c (bonobo_interface_set_display_name_cb): New - function, callback for the `set_display_name' signal on the - EvolutionLocalStorage. - (construct): Connect it. - - * e-storage-set-view.c (folder_changed_cb): New callback for the - "changed" signal emitted by the EFolders. It makes the model emit - the "changed" signal for the appropriate row. - (insert_folders): Connect it. - -2000-09-09 Ettore Perazzoli <ettore@helixcode.com> - - * e-storage-set-view.c (etree_value_at): Return the name of the - folder or the storage instead of just returning the last segment - of the path. - - * e-storage-set.c (e_storage_set_get_folder): If the storage is - not found, just return NULL to avoid a g_warning. - -2000-09-09 Christopher James Lahey <clahey@helixcode.com> - - * e-shell-view.c: Fixed some warnings. - -2000-09-09 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c (update_for_current_uri): Make sure `folder_name' - is always dynamically allocated, as we `g_free()' it. - -2000-09-08 Lauris Kaplinski <lauris@helixcode.com> - - * e-shell-view.c (update_for_current_uri): Translate UTF-8 string - -2000-09-08 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-storage.c (list_through_listener_foreach): Don't crash - on nodes with no data. [The root node has none indeed.] - -2000-09-08 Ettore Perazzoli <ettore@helixcode.com> - - * e-folder-tree.c (e_folder_tree_get_folder): Return NULL if there - is no folder with that @path, instead of segfaulting. - -2000-09-08 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-storage.c: New member `folder_tree' in - `EvolutionStoragePrivate'. - (init): Initialize it. - (destroy): Destroy it. - (list_through_listener): New. - (add_listener): Use it to list all the current folders through the - listener. - (evolution_storage_new_folder): Add the thingie to the - `folder_tree'. - (evolution_storage_removed_folder): Remove the thingie from the - `folder_tree'. - -2000-09-08 Ettore Perazzoli <ettore@helixcode.com> - - * e-storage.c: Replaced the `path_to_folder' GHashTable with an - EFolderTree named `folder_tree'. - (init): Updated accordingly. - (destroy): Updated accordingly. - (free_private): Removed. - (remove_folder): Removed. - (folder_new): Removed. - (folder_remove_subfolder): Removed. - (folder_add_subfolder): Removed. - (folder_destroy): Removed. - (get_parent_path): Removed. - (impl_list_folders): Reimplemented by using the `EFolderTree' - methods. - (e_storage_construct): Don't create the root folder here. - (get_path_for_physical_uri_foreach): Updated to be an - `EFolderTreeForeachFunc'. - (e_storage_get_path_for_physical_uri): Likewise, updated to use - `e_folder_tree_foreach()'. - (e_storage_new_folder): Updated to use the EFolderTree. - (e_storage_removed_folder): Likewise. - (folder_destroy_notify): New function, for the destroy - notification of `EFolder'. - - * evolution-storage-listener.c: Change the `servant' member in - `EvolutionStorageListenerPrivate' into an - `EvolutionStorageListenerServant'. - - * e-folder-tree.c: New. - * e-folder-tree.h: New. - -2000-09-08 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-storage-listener.c (create_servant): Return an - `EvolutionStorageListenerServant' instead of a - `POA_Evolution_StorageListener'. - (evolution_storage_listener_new): Add a cast accordingly. - - * evolution-storage.c (corba_class_init): Remove `NO_WARNINGS' - madness. - -2000-09-08 Christopher James Lahey <clahey@helixcode.com> - - * e-storage-set-view.c: Added base ETableModel functions. - - * evolution-storage-listener.c, evolution-storage.c: Fixed some - warnings. - -2000-09-08 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell.c (set_owner_on_components): New. - (e_shell_construct): Call it after setting up the local storage. - - * e-component-registry.c (register_component): Don't set the owner - here. - - * evolution-shell-client.c - (evolution_shell_client_get_local_storage): New. - -2000-09-08 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-shell-view.c (destroy): Chain to the parent's - destroy method. - - * evolution-shell-component.c (destroy): Chain to the parent's - destroy method. - - * evolution-storage.c: `corba_storage_listener' in - `EvolutionStoragePrivate' replaced with a list of listeners, - `corba_storage_listeners'. - (init): Init to NULL. - (add_listener): New utility function. - (destroy): Destroy all the listeners. - (evolution_storage_new_folder): Notify all the listeners. - (evolution_storage_removed_folder): Likewise. - - * e-local-storage.c: New member `bonobo_interface' in - `ELocalStoragePrivate'. - (init): Init to NULL. - (e_local_storage_get_corba_interface): New. - - * e-shell.c: New member `local_storage' in `EShellPrivate'. - (init): Init to NULL. - (setup_local_storage): Make it point to the newly created local - storage. - (destroy): Unref if not NULL. - (impl_Shell_get_local_storage): New, implementation for - `Evolution::Shell::get_local_storage'. - (corba_class_init): Set it up. - - * evolution-local-storage-client.c: New. - * evolution-local-storage-client.h: New. - * evolution-local-storage.c: New. - * evolution-local-storage.h: New. - * evolution-storage-listener.c: New. - * evolution-storage-listener.h: New. - - * Evolution-Storage.idl: New method `Storage::add_listener'. - - * Evolution-Shell.idl: New method `Shell::get_local_storage'. - - * Evolution-LocalStorage.idl: New. - -2000-09-02 Lauris Kaplinski <lauris@helixcode.com> - - * e-shell-folder-creation-dialog.c: Use e_utf8 wrappers - -2000-09-01 Chris Toshok <toshok@helixcode.com> - - * e-storage-set-view.c (removed_folder_cb): free node_data. - (removed_storage_cb): same. - (new_storage_cb): don't free the path we put in the node's - node_data. - (e_storage_set_view_set_current_folder): remove calls to - set_cursor_row (-1), and clean up a little bit. - -2000-09-01 Christopher James Lahey <clahey@helixcode.com> - - * e-local-storage.c: Strdup path when setting the callback data. - - * evolution-storage.c: Removed an unused variable. - -2000-08-31 Chris Toshok <toshok@helixcode.com> - - * e-shell-view.c (init): initialize delayed_selection = NULL; - -2000-09-01 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-storage.c (evolution_storage_new_folder): Handle @path - as the full path. - - * e-storage.c (e_storage_new_folder): Consider @path to be the - full path, not the parent path. - * e-local-storage.c (load_folders): Updated accordingly. - - * Evolution-Storage.idl: Member `name' of `struct Folder' renamed - to `display_name'. - -2000-08-31 Chris Toshok <toshok@helixcode.com> - - * e-shell-view.c: add delayed_selection to _EShellViewPrivate. - (new_folder_cb): new function. check if the path is our - delayed_selection and if so, select it. - (folder_selected_cb): if the user selects something using a UI - gesture, clear out a pending delayed selection. - (e_shell_view_display_uri): if the uri isn't available, save it in - the delayed_selection field, and set up the new_folder signal. - -2000-08-29 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell-view.c (shell_view_interface_set_message_cb): If the - message contains a newline, only display the part until the - newline, excluding the newline. Otherwise the status bar resizes - nastily. - -2000-08-28 Ettore Perazzoli <ettore@helixcode.com> - - * e-shell.c (setup_components): Removed the hardcoding of the - shell component IDs. Rather, do an OAF query looking for the - `Evolution::ShellComponent' interface and activate all the - components in the result. - (MAIL_COMPONENT_ID): Removed. - (CALENDAR_COMPONENT_ID): Removed. - (ADDRESSBOOK_COMPONENT_ID): Removed. - - * e-storage-set-view.c: Make `sort_model' static. - -2000-08-25 Chris Toshok <toshok@helixcode.com> - - * e-storage-set-view.c: convert to use ETree instead of GtkCTree. - - * e-storage-set-view.h: change superclass from GtkCTree to ETable. - - * main.c (main): call e_cursors_init. - - * Makefile.am (evolution_LDADD): add libetable.a - -2000-08-25 Peter Williams <peterw@helixcode.com> - - Silence some obvious assertions. - - * e-shell.c (e_shell_construct): Ref our shortcut bar to - sink it. Same with the folder_type_registry. - - * e-shell-folder-title-bar.c (destroy): Only attempt to unref - priv->icon if nonnull. - - * e-shell-view.c (update_folder_title_bar): Don't attempt to set - the folder_icon/_name if they're NULL. - -2000-08-24 Ettore Perazzoli <ettore@helixcode.com> - - * evolution-shell-component-client.c - (evolution_shell_component_client_new): Don't abort if the - component cannot be activated. Rather, just return NULL. - -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-Activity.idl b/shell/Evolution-Activity.idl deleted file mode 100644 index de23d2c53b..0000000000 --- a/shell/Evolution-Activity.idl +++ /dev/null @@ -1,106 +0,0 @@ -/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Activity management for Evolution. - * - * Authors: - * Ettore Perazzoli <ettore@ximian.com> - * - * Copyright (C) 2000, 2001 Ximian, Inc. - */ - -module GNOME { -module Evolution { - -interface Activity : Bonobo::Unknown { - typedef long ActivityId; - - enum DialogType { - DIALOG_TYPE_NONE, - DIALOG_TYPE_MESSAGE, - DIALOG_TYPE_WARNING, - DIALOG_TYPE_INPUT, - DIALOG_TYPE_ERROR - }; - - enum DialogAction { - DIALOG_ACTION_ERROR, - DIALOG_ACTION_DISPLAY, - DIALOG_ACTION_POSTPONE - }; - - exception InvalidIcon {}; - exception IdNotFound {}; - - /* Events propagated through the listener: - - - "ShowDetails": The user wants to know details about the - progressing operation. The component should display additional - information about the operation in progress, or raise a pending - alert dialog. - - - "Cancel": The user wants the operation to be cancelled. - */ - - /** - * operationStarted: - * @component_id: Id of the component starting the operation. - * @information: Informative string about the operation being performed. - * @cancellable: Whether this operation should be cancellable by - * the user from the shell view. - * @event_listener: Listener which the events for the activity - * widget will be passed to. - * @activity_id: A unique Id for the activity, to be used to update the - * status of the operation. - * @suggest_display: Whether displaying the dialog might be a nice idea. - */ - void operationStarted (in string component_id, - in AnimatedIcon icon, - in string information, - in boolean cancellable, - in Bonobo::Listener event_listener, - out ActivityId activity_id, - out boolean suggest_display) - raises (InvalidIcon); - - /** - * operationProgressing: - * @activity: The unique Id for the activity whose status we want to update. - * @information: New informative string. If empty, the informative string - * isn't changed. - * @progress: A float from 0.0 to 1.0 indicating the status of completion. - * - * Update the status of the specified @activity. - */ - void operationProgressing (in ActivityId activity, - in string information, - in float progress) - raises (IdNotFound); - - /** - * operationFinished: - * @activity: The unique Id for the activity that has been completed. - * - * Report that the specified @activity has been completed. After this - * method is invoked, @activity is not considered to be a valid Id - * anymore. - */ - void operationFinished (in ActivityId activity); - - /** - * requestDialog: - * - * Inform the shell that the specified @activity requires user input - * from a dialog. The returned value specifies whether the shell wants - * the dialog to be shown now (%DIALOG_ACTION_DISPLAY) or postponed - * (%DIALOG_ACTION_POSTPONE). If the return value is - * %DIALOG_ACTION_POSTPONE, the component should wait for the - * "DisplayDialog" event before proceeding further. In that case, the - * shell will flash the label related to this activity, and emit - * "DisplayDialog" through the event source when the user clicks on it. - */ - DialogAction requestDialog (in ActivityId activity, - in DialogType dialog_type); -}; - -}; -}; diff --git a/shell/Evolution-ConfigControl.idl b/shell/Evolution-ConfigControl.idl deleted file mode 100644 index 059ed6b286..0000000000 --- a/shell/Evolution-ConfigControl.idl +++ /dev/null @@ -1,34 +0,0 @@ -/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Additional interfaces for the Controls used in configuration dialogs. - * - * Authors: - * Ettore Perazzoli <ettore@ximian.com> - * - * Copyright (C) 2002 Ximian, Inc. - */ - -module GNOME { -module Evolution { - interface ConfigControl : Bonobo::Unknown { - /* Apply the current settings. */ - void apply (); - - /* The actual Control. */ - readonly attribute Bonobo::Control control; - - /* Get the event source for this control. */ - readonly attribute Bonobo::EventSource eventSource; - - /* These are the events that get emitted when the properties of - the dialog change: - - - "changed" - - Emitted when the data entered changes, and thus - doesn't match the applied settings anymore. The user must - assume this to be true until ::apply gets invoked. - */ - }; -}; /* module Evolution */ -}; /* module GNOME */ diff --git a/shell/Evolution-Offline.idl b/shell/Evolution-Offline.idl deleted file mode 100644 index 4c3f3f7392..0000000000 --- a/shell/Evolution-Offline.idl +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Interface to allow components to switch between on-line and off-line mode. - * - * Authors: - * Ettore Perazzoli <ettore@ximian.com> - * - * Copyright (C) 2001 Ximian, Inc. - */ - -#include <Bonobo.idl> - -module GNOME { -module Evolution { - -struct Connection { - string hostName; - string type; -}; -typedef sequence<Connection> ConnectionList; - -interface OfflineProgressListener { - /* Update the shell about the progress of going off-line. The - operation is considered completed when the ConnectionList is empty. */ - void updateProgress (in ConnectionList current_active_connections); -}; - -interface SyncFolderProgressListener { - /* Report that syncing has progressed. @progress has to be between 0.0 - and 1.0. */ - void updateProgress (in float progress); - - /* Report that the operation has finished. */ - void reportSuccess (); - - /* Report an error. */ - void reportFailure (in string message); -}; - -interface Offline : Bonobo::Unknown { - exception notPrepared {}; - exception notSyncing {}; - - /* Whether the component is currently off-line. */ - attribute boolean isOffline; - - /* Ask the component to prepare to go into off-line mode. The - component must return a list of the current active connections. - After this call, the shell is expected to: (in order) - - 1. Invoke ::syncFolder for each of the component's folders that - need to be synchronized to disk for offline usage. - - 2. Either invoke ::goOffline (actually complete the operation - and go off-line) or ::goOnline (operation cancelled). - */ - void prepareForOffline (out ConnectionList active_connection_list); - - /* Request the component to sync the specified folder. This has to - happen after ::prepareForOffline. */ - oneway void syncFolder (in Folder folder, - in SyncFolderProgressListener listener); - - /* Request the component to stop syncing the specified folder. This - has to happen after ::syncFolder. */ - oneway void cancelSyncFolder (in Folder folder); - - /* Ask the component to go into off-line mode. This always comes after - a ::prepareForOffline. */ - void goOffline (in OfflineProgressListener listener) - raises (notPrepared); - - /* Tell the component to go into on-line mode. */ - void goOnline (); -}; - -}; -}; diff --git a/shell/Evolution-Session.idl b/shell/Evolution-Session.idl deleted file mode 100644 index 35eb9ea427..0000000000 --- a/shell/Evolution-Session.idl +++ /dev/null @@ -1,41 +0,0 @@ -/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Interface for saving configuration information. - * - * Authors: - * Ettore Perazzoli <ettore@ximian.com> - * - * Copyright (C) 2000, 2001 Ximian, Inc. - */ - -#include <Bonobo.idl> - -module GNOME { -module Evolution { - - interface Session : Bonobo::Unknown { - exception Failed {}; - - /** - * saveConfiguration: - * @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 saveConfiguration (in string prefix) - raises (Failed); - - /** - * loadConfiguration: - * @prefix: A configuration path prefix. - * - * Load the saved configuration at the specified @prefix. - */ - void loadConfiguration (in string prefix) - raises (Failed); - }; - -}; -}; diff --git a/shell/Evolution-Shell.idl b/shell/Evolution-Shell.idl deleted file mode 100644 index 20960ce029..0000000000 --- a/shell/Evolution-Shell.idl +++ /dev/null @@ -1,135 +0,0 @@ -/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Interface for the Evolution shell. - * - * Authors: - * Ettore Perazzoli <ettore@ximian.com> - * - * Copyright (C) 2000, 2001 Ximian, Inc. - */ - -#include <Bonobo.idl> - -module GNOME { -module Evolution { - interface ShellComponent; - - interface FolderSelectionListener; - - interface Shell : Bonobo::Unknown { - exception NotReady {}; - exception NotFound {}; - exception UnsupportedSchema {}; - exception InvalidURI {}; - exception InternalError {}; - exception Busy {}; - - typedef sequence<string> FolderTypeNameList; - - /** - * getComponentByType: - * @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 getComponentByType (in string type) - raises (NotReady, NotFound); - - /** - * getIconByType: - * @type: name of a valid folder type - * @mini: whether or not to get a mini (16x16) icon - * - * Get an icon associated with a specific folder type. - * - * Return value: an Evolution::Icon interface for the - * component that handles @type. - */ - Icon getIconByType (in string type, - in boolean mini) - raises (NotReady, NotFound); - - /** - * createNewView: - * @uri: URI for the view to open - * - * Return value: the new view. - */ - ShellView createNewView (in string uri) - raises (NotReady, NotFound, UnsupportedSchema, InvalidURI, InternalError); - - /** - * handleURI: - * @uri: URI to handle - * - * This handles the specified URI. It is different from - * `::createNewView' as it doesn't necessarily imply creating a - * new ShellView. (For example, a `mailto:' URI will invoke - * the message composer.) - */ - void handleURI (in string uri) - raises (NotReady, NotFound, UnsupportedSchema, InvalidURI, InternalError); - - /** - * selectUserFolder: - * @parent_xid: XID for the parent window (or zero if no parent window). - * @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 selectUserFolder (in long long parent_xid, - in FolderSelectionListener listener, - in string title, - in string default_folder, - in FolderTypeNameList possible_types) - raises (NotReady, Busy); - - /** - * getLocalStorage: - * - * Get the interface to the local storage. - * - * FIXME: Probably we just want to be able to request this to - * the StorageRegistry. This is an ugly kludge. - * - * Return value: the `Evolution::LocalStorage' interface for - * the local storage. */ - Storage getLocalStorage () - raises (NotReady); - - /** - * createStorageSetView: - * - * Create a control for the storage set view. This control - * will also implement the `Evolution::StorageSetView' interface. - * - * Return value: the newly created control. - */ - Bonobo::Control createStorageSetView () - raises (NotReady); - - /** - * setLineStatus: - * - * Set the shell into on-line or off-line mode. - */ - void setLineStatus (in boolean online) - raises (NotReady); - }; - - interface FolderSelectionListener { - void notifySelected (in Folder folder); - void notifyCanceled (); - }; -}; -}; diff --git a/shell/Evolution-ShellComponent.idl b/shell/Evolution-ShellComponent.idl deleted file mode 100644 index 90cd6fa57d..0000000000 --- a/shell/Evolution-ShellComponent.idl +++ /dev/null @@ -1,185 +0,0 @@ -/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Interface for the Evolution components. - * - * Authors: - * Ettore Perazzoli <ettore@ximian.com> - * - * Copyright (C) 2000, 2001, 2002 Ximian, Inc. - */ - -#include <Bonobo.idl> - -module GNOME { -module Evolution { - interface Shell; - - /* URI schemas, e.g. mailto:. */ - typedef string URISchema; - typedef sequence<URISchema> URISchemaList; - - /* A type of item that the component can create when asked by the user, - e.g. a mail message or an appointment. */ - struct UserCreatableItemType { - string id; - string description; - string menuDescription; - string tooltip; - char menuShortcut; - Icon icon; - - // This specifies the folder type for which this user creatable - // type is a default type. - string folderType; - }; - typedef sequence<UserCreatableItemType> UserCreatableItemTypeList; - - /* Definition for a folder type. */ - struct FolderType { - string name; - string iconName; - - string displayName; - string description; - - boolean userCreatable; - - sequence<string> acceptedDndTypes; - sequence<string> exportedDndTypes; - - UserCreatableItemTypeList userCreatableItemTypes; - }; - typedef sequence<FolderType> FolderTypeList; - - interface ShellComponentListener; - - interface ShellComponent : Bonobo::Unknown { - exception AlreadyOwned {}; - exception Busy {}; - exception InternalError {}; - exception NotFound {}; - exception NotOwned {}; - exception OldOwnerHasDied {}; - exception UnsupportedSchema {}; - exception UnsupportedType {}; - exception AlreadyPopulated {}; - exception NotPopulated {}; - - /* List of folders that the component supports. */ - readonly attribute FolderTypeList supportedTypes; - - /* Custom URI schemas that the component supports. - (e.g. mailto, see ::handleExternalURI). */ - readonly attribute URISchemaList externalUriSchemas ; - - /* List of the item that the user can create (see - ::userCreateNewItem). */ - readonly attribute UserCreatableItemTypeList userCreatableItemTypes; - - /* This method is invoked after the components is activated by - the shell to notify the component that the shell is - alive. */ - void setOwner (in Shell shell, in string evolution_homedir) - raises (AlreadyOwned, OldOwnerHasDied); - - /* This is invoked when the shell releases the component. */ - void unsetOwner () - raises (NotOwned); - - /* Notify the component of whether the shell is currently - * running in interactive mode or not. (I.e. basically, - * whether there are any Evolution windows on the screen.) - * @new_view_xid is an X Window ID ("None" if - * @now_interactive is FALSE) */ - void interactive (in boolean now_interactive, - in unsigned long new_view_xid); - - /* Send debugging output to the file specified. */ - void debug (in string log_path); - - /* Create a view for the specified @physical URI. */ - Bonobo::Control createView (in string physical_uri, - in string type, - in string view_info) - raises (NotFound, UnsupportedType, InternalError); - - /* Handle a registered external URI scheme (eg. mailto:). */ - void handleExternalURI (in string external_uri) - raises (NotFound, UnsupportedSchema, InternalError); - - /* Folder operations: */ - - /* 1. Create a folder. */ - void createFolderAsync (in ShellComponentListener listener, - in string physical_uri, - in string type) - raises (Busy); - - /* 2. Remove a folder. */ - void removeFolderAsync (in ShellComponentListener listener, - in string physical_uri, - in string type) - raises (Busy); - - /* 3. Copy/move a folder. */ - void xferFolderAsync (in ShellComponentListener listener, - in string source_physical_uri, - in string destination_physical_uri, - in string type, - in boolean remove_source) - raises (Busy); - - /* Ask the component to populate the UIC with the - folder-specific menu items of the folder at the specified - @physical_uri. */ - void populateFolderContextMenu (in Bonobo::UIContainer uih, - in string physical_uri, - in string type) - raises (AlreadyPopulated); - - /* After you are done, you have to remove the items. This is - because of BonoboUI sucking and not allowing the shell to - remove the items itself. */ - void unpopulateFolderContextMenu (in Bonobo::UIContainer uih, - in string physical_uri, - in string type) - raises (NotPopulated); - - /* Make the component create a new item of the specify @id in - the folder specified by @parent_folder_physical_uri. This - is supposed to pop up a dialog (say, the Addressbook - editor) when necessary. */ - void userCreateNewItem (in string id, - in string parent_folder_physical_uri, - in string parent_folder_type) - raises (UnsupportedType); - - /* Make the component start a Send/Receive operation. If - @show_dialog is true, display a progress dialog for the - operation as well. */ - void sendReceive (in boolean show_dialog); - - /* Request the component to quit. The component should report - through the listener (through OK or CANCEL) whether the - shell can quit safely. (This is meant to be used for - confirmations before quitting.) */ - oneway void requestQuit (in ShellComponentListener listener); - }; - - interface ShellComponentListener { - enum Result { - OK, - CANCEL, - UNSUPPORTED_OPERATION, - UNSUPPORTED_TYPE, - EXISTS, - INVALID_URI, - PERMISSION_DENIED, - HAS_SUBFOLDERS, - NO_SPACE - }; - - void notifyResult (in Result result); - }; -}; -}; diff --git a/shell/Evolution-ShellComponentDnd.idl b/shell/Evolution-ShellComponentDnd.idl deleted file mode 100644 index baf715f0f7..0000000000 --- a/shell/Evolution-ShellComponentDnd.idl +++ /dev/null @@ -1,98 +0,0 @@ -/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Interface for the Evolution components that want to support Drag and Drop - * operations on their folders. - * - * Authors: - * Ettore Perazzoli <ettore@ximian.com> - * - * Copyright (C) 2001 Ximian, Inc. - */ - -#include <Bonobo.idl> - -module GNOME { -module Evolution { -module ShellComponentDnd { - typedef short Action; - const Action ACTION_DEFAULT = 0; - const Action ACTION_COPY = 1 << 1; - const Action ACTION_MOVE = 1 << 2; - const Action ACTION_LINK = 1 << 3; - const Action ACTION_ASK = 1 << 4; - const Action ACTION_ANY = ACTION_COPY | ACTION_MOVE | ACTION_LINK | ACTION_ASK; - - typedef Action ActionSet; // For readability. - - struct Data { - short format; - string target; - sequence <octet> bytes; - }; - - exception NoData {}; - - interface SourceFolder : Bonobo::Unknown { - struct Context { - string physicalUri; - string folderType; - ActionSet possibleActions; - Action suggestedAction; - }; - - /* The user started a drag from this object. If the component - receives this while still in the middle of an existing drag - operation, it should stop the existing drag operation and - start a new one. */ - void beginDrag (in string physical_uri, - in string folder_type, - out ActionSet possible_actions, - out Action suggested_action); - - /* User released the mouse button and dropped the object - somewhere, so we now want to get the data for the current - context. */ - void getData (in Context source_context, - in Action action, - in string dnd_type, - out Data data) - raises (NoData); - - /* The target has finished processing the data, so we can - delete it. */ - void deleteData (in Context source_context); - - /* The drag is over. This should also clean up the data if - there was a `getData()' but no `deleteData()' after it. */ - void endDrag (in Context source_context); - }; - - interface DestinationFolder : Bonobo::Unknown { - struct Context { - string dndType; - ActionSet possibleActions; - Action suggestedAction; - }; - - /* The user is moving a dragged object over our folder. This - will return %FALSE if the specified object cannot be - dropped; otherwise, it will return %TRUE and then set the - @default_action and @non_default_action we want to be - performed when the drop happens. */ - boolean handleMotion (in string physical_uri, - in string folder_type, - in Context destination_context, - out Action suggested_action); - - /* Data is dropped. We are given the data for the dropped - object, and we are supposed to perform the operation - requested. */ - boolean handleDrop (in string physical_uri, - in string folder_type, - in Context destination_context, - in Action action, - in Data data); - }; -}; -}; -}; diff --git a/shell/Evolution-ShellView.idl b/shell/Evolution-ShellView.idl deleted file mode 100644 index 026888913c..0000000000 --- a/shell/Evolution-ShellView.idl +++ /dev/null @@ -1,25 +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@ximian.com> - * - * Copyright (C) 2000, 2001 Ximian, Inc. - */ - -#include <Bonobo.idl> - -module GNOME { -module Evolution { - interface ShellView : Bonobo::Unknown { - void setMessage (in string message, - in boolean busy); - void unsetMessage (); - void changeCurrentView (in string uri); - void setTitle (in string title); - void setFolderBarLabel (in string text); - void showSettings (); - }; -}; -}; diff --git a/shell/Evolution-Shortcuts.idl b/shell/Evolution-Shortcuts.idl deleted file mode 100644 index cf98f47e36..0000000000 --- a/shell/Evolution-Shortcuts.idl +++ /dev/null @@ -1,55 +0,0 @@ -/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Interface for the Evolution shortcuts. - * - * Authors: - * Ettore Perazzoli <ettore@ximian.com> - * - * Copyright (C) 2001 Ximian, Inc. - */ - -#include <Bonobo.idl> - -module GNOME { -module Evolution { - - interface Shortcuts : Bonobo::Unknown { - - struct Shortcut { - string uri; - string name; - string type; - string customIconName; - }; - typedef sequence <Shortcut> ShortcutList; - - struct Group { - string name; - ShortcutList shortcuts; - }; - typedef sequence<Group> GroupList; - - exception NotFound {}; - exception InvalidPosition {}; - exception CannotRemove {}; - - readonly attribute GroupList groups; // FIXME: Could be non-readonly - - void add (in short group_num, in short position, in Shortcut shortcut) - raises (NotFound); - void remove (in short group_num, in short item_num) - raises (NotFound); - Shortcut get (in short group_num, in short item_num) - raises (NotFound); - - void addGroup (in short position, in string name) - raises (InvalidPosition); - void removeGroup (in short group_num) - raises (NotFound, CannotRemove); - Group getGroup (in short group_num) - raises (NotFound); - - }; - -}; -}; diff --git a/shell/Evolution-Storage.idl b/shell/Evolution-Storage.idl deleted file mode 100644 index 2d6928938b..0000000000 --- a/shell/Evolution-Storage.idl +++ /dev/null @@ -1,178 +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@ximian.com> - * - * Copyright (C) 2000, 2001 Ximian, Inc. - */ - -#include <Bonobo.idl> - -module GNOME { -module Evolution { - interface Storage; - interface StorageListener; - - interface Storage : Bonobo::Unknown { - exception AlreadyListening {}; - exception NotFound {}; - - enum Result { - OK, - UNSUPPORTED_OPERATION, - UNSUPPORTED_TYPE, - INVALID_URI, - ALREADY_EXISTS, - DOES_NOT_EXIST, - PERMISSION_DENIED, - NO_SPACE, - NOT_EMPTY, - NOT_ONLINE, - GENERIC_ERROR - }; - - struct FolderResult { - Result result; - string path; - }; - - /* The name of the storage. */ - readonly attribute string name; - - /* Whether the storage has folders from other user's. */ - readonly attribute boolean hasSharedFolders; - - /* Get information for a folder. NOTE: evolutionUri in the - returned Folder is going to be an empty string if you use - this function. */ - Folder getFolderAtPath (in string path) - raises (NotFound); - - /* Flat list of the folders in the storage. */ - readonly attribute FolderList folderList; - - /* The folder property items (for right-click menu etc.). */ - - struct FolderPropertyItem { - string label; - string tooltip; - Icon icon; // Currently unused - }; - typedef sequence<FolderPropertyItem> FolderPropertyItemList; - - readonly attribute FolderPropertyItemList folderPropertyItems; - - /* Folder Operations. */ - - void asyncCreateFolder (in string path, - in string type, - in string description, - in string parent_physical_uri, - in Bonobo::Listener listener); - - void asyncRemoveFolder (in string path, - in string physical_uri, - in Bonobo::Listener listener); - - void asyncXferFolder (in string source_path, - in string destination_path, - in boolean remove_source, - in Bonobo::Listener listener); - - /* Open remote nodes. */ - void asyncOpenFolder (in string path, - in Bonobo::Listener listener); - - /* Set unread count. */ - void updateFolder (in string path, - in long unread_count); - - /* Shared folders. */ - void asyncDiscoverSharedFolder (in string user, - in string folder_name, - in Bonobo::Listener listener); - void cancelDiscoverSharedFolder (in string user, - in string folder_name); - void asyncRemoveSharedFolder (in string path, - in Bonobo::Listener listener); - - /* Listener handling. */ - void addListener (in StorageListener listener) - raises (AlreadyListening); - void removeListener (in StorageListener listener) - raises (NotFound); - - /* (This should probably be in a separate interface, but - creating a new interface in Bonobo is so painful that I'll - just keep it here for now. */ - void showFolderProperties (in string path, - in short itemNumber, - in long parentWindowId); - }; - - interface StorageListener { - exception Exists {}; - exception NotFound {}; - - void notifyDestroyed (); - - /* FIXME exceptions don't make much sense here... */ - - void notifyFolderCreated (in string path, - in Folder folder) - raises (Exists); - - void notifyFolderUpdated (in string path, - in long unread_count) - raises (NotFound); - - void notifyFolderRemoved (in string path) - raises (NotFound); - - void notifyHasSubfolders (in string path, - in string message) - raises (NotFound); - }; - - interface StorageRegistry : Bonobo::Unknown { - exception Exists {}; - exception NotFound {}; - exception AlreadyListening {}; - - typedef sequence<Storage> StorageList; - - enum MessageType { - STORAGE_CREATED, - STORAGE_DESTROYED - }; - - struct NotifyResult { - MessageType type; - string name; - }; - - StorageListener addStorage (in Storage storage, - in string name) - raises (Exists); - - StorageList getStorageList (); - - Storage getStorageByName (in string name) - raises (NotFound); - - void removeStorageByName (in string name) - raises (NotFound); - - void addListener (in Bonobo::Listener listener) - raises (AlreadyListening); - - void removeListener (in Bonobo::Listener listener) - raises (NotFound); - - Folder getFolderByUri (in string uri) - raises (NotFound); - }; -}; -}; diff --git a/shell/Evolution-StorageSetView.idl b/shell/Evolution-StorageSetView.idl deleted file mode 100644 index 9aca41f6ad..0000000000 --- a/shell/Evolution-StorageSetView.idl +++ /dev/null @@ -1,37 +0,0 @@ -/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Interface for the Evolution's StorageSetView control. - * - * Authors: - * Ettore Perazzoli <ettore@ximian.com> - * - * Copyright (C) 2000, 2001, 2002 Ximian, Inc. - */ - -#include <Bonobo.idl> - -module GNOME { -module Evolution { - interface StorageSetViewListener { - void notifyFolderSelected (in string uri); - void notifyFolderToggled (); - }; - - /* FIXME: Maybe we should have a generic Bonobo::Listener interface. */ - interface StorageSetView : Bonobo::Unknown { - exception AlreadyListening {}; - exception NotFound {}; - - attribute boolean showFolders; - attribute boolean showCheckboxes; - - attribute FolderList checkedFolders; - - void addListener (in StorageSetViewListener listener) - raises (AlreadyListening); - - void removeListener (in StorageSetViewListener listener) - raises (NotFound); - }; -}; -}; diff --git a/shell/Evolution-Wizard.idl b/shell/Evolution-Wizard.idl deleted file mode 100644 index 145774f70b..0000000000 --- a/shell/Evolution-Wizard.idl +++ /dev/null @@ -1,42 +0,0 @@ -/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Interface for a wizard done through Bonobo. - * - * Authors: - * Iain Holmes <iain@ximian.com> - * - * Copyright (C) 2000, 2001 Ximian, Inc. - */ - -#include <Bonobo.idl> - -module GNOME { -module Evolution { - - interface Wizard : Bonobo::Unknown { - - struct Page { - string title; - Icon icon; - Bonobo::Control control; - }; - typedef sequence<Page> PageList; - - readonly attribute PageList pages; - - enum Action { - NEXT, - PREPARE, - BACK, - FINISH, - CANCEL, - HELP - }; - - exception NoPage {}; - - void notifyAction (in long pagenumber, in Action action) - raises (NoPage); - }; -}; -}; diff --git a/shell/Evolution-common.idl b/shell/Evolution-common.idl deleted file mode 100644 index 5cc1cf1b5f..0000000000 --- a/shell/Evolution-common.idl +++ /dev/null @@ -1,36 +0,0 @@ -/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Common definitions for the CORBA interface for the Evolution shell. - * - * Authors: - * Ettore Perazzoli <ettore@ximian.com> - * - * Copyright (C) 2000, 2001, 2002 Ximian, Inc. - */ - -module GNOME { -module Evolution { - struct Folder { - string type; - string description; - string displayName; - string physicalUri; - string evolutionUri; - string customIconName; - long unreadCount; - boolean canSyncOffline; - short sortingPriority; - }; - typedef sequence <Folder> FolderList; - - struct Icon { - short width, height; - boolean hasAlpha; - sequence <octet> rgbaData; // Row-by-row, left-to-right, top-to-bottom RGBA bytes - }; - - typedef sequence <Icon> AnimatedIcon; - -}; -}; - diff --git a/shell/Evolution.idl b/shell/Evolution.idl deleted file mode 100644 index 6692bd028d..0000000000 --- a/shell/Evolution.idl +++ /dev/null @@ -1,26 +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@ximian.com> - * - * Copyright (C) 2000, 2001 Ximian, Inc. - */ - -#include <Bonobo.idl> - -#include <Evolution-common.idl> - -#include <Evolution-Activity.idl> -#include <Evolution-ConfigControl.idl> -#include <Evolution-Session.idl> -#include <Evolution-ShellComponent.idl> -#include <Evolution-ShellComponentDnd.idl> -#include <Evolution-Offline.idl> -#include <Evolution-ShellView.idl> -#include <Evolution-Shortcuts.idl> -#include <Evolution-Storage.idl> -#include <Evolution-StorageSetView.idl> -#include <Evolution-Shell.idl> -#include <Evolution-Wizard.idl> diff --git a/shell/GNOME_Evolution_Shell.server.in.in b/shell/GNOME_Evolution_Shell.server.in.in deleted file mode 100644 index 960ae4ee07..0000000000 --- a/shell/GNOME_Evolution_Shell.server.in.in +++ /dev/null @@ -1,51 +0,0 @@ -<oaf_info> - - <oaf_server iid="OAFIID:GNOME_Evolution_Shell" - type="exe" - location="@BINDIR@/evolution-@VERSION@"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/Evolution/Shell:1.0"/> - </oaf_attribute> - - <oaf_attribute name="name" type="string" - _value="Evolution Shell"/> - </oaf_server> - - <oaf_server iid="OAFIID:GNOME_Evolution_Shell_Config_Factory" - type="exe" - location="evolution-exchange-storage"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/GenericFactory:1.0"/> - </oaf_attribute> - </oaf_server> - - <oaf_server iid="OAFIID:GNOME_Evolution_Shell_Config_FolderSettings_Control" - type="factory" - location="OAFIID:GNOME_Evolution_Shell_Config_Factory"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/Evolution/ConfigControl:1.0"/> - </oaf_attribute> - - <oaf_attribute name="evolution:config_item:title" type="string" - _value="Folder Settings"/> - - <oaf_attribute name="evolution:config_item:description" type="string" - _value="Configure special folders and offline folder behavior here"/> - - <oaf_attribute name="evolution:config_item:icon_name" type="string" - value="folder-settings.png"/> - - <oaf_attribute name="evolution:config_item:priority" type="string" value="-9"/> - - <oaf_attribute name="evolution:config_item:type" type="stringv"> - <item value="shell"/> - </oaf_attribute> - - <oaf_attribute name="name" type="string" - _value="Evolution folder settings configuration control"/> - </oaf_server> - -</oaf_info> diff --git a/shell/GNOME_Evolution_TestComponent.server b/shell/GNOME_Evolution_TestComponent.server deleted file mode 100644 index 490489375c..0000000000 --- a/shell/GNOME_Evolution_TestComponent.server +++ /dev/null @@ -1,41 +0,0 @@ -<oaf_info> - -<oaf_server iid="OAFIID:GNOME_Evolution_TestComponent_ShellComponent" - type="factory" - location="GNOME:GNOME_Evolution_TestComponent_ShellComponentFactory"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/Evolution/ShellComponent:1.0"/> - </oaf_attribute> - - <oaf_attribute name="description" type="string" - value="Evolution test component."/> - -</oaf_server> - -<oaf_server iid="OAFIID:GNOME_Evolution_TestComponent_ConfigurationControlFactory" - type="exe" - location="evolution-test-component"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/ObjectFactory:1.0"/> - </oaf_attribute> - - <oaf_attribute name="description" type="string" - value="Factory for the configuration controls for the test component."/> - -</oaf_server> - -<oaf_server iid="OAFIID:GNOME_Evolution_TestComponent_ConfigurationControl" - type="factory" - location="OAFIID:GNOME_Evolution_TestComponent_ConfigurationControlFactory"> - - <oaf_attribute name="evolution:config_item:title" type="string" - value="Test Component configuration"/> - - <oaf_attribute name="evolution:config_item:description" type="string" - value="This allows you to configure the Test Component"/> - -</oaf_server> - -</oaf_info> diff --git a/shell/Makefile.am b/shell/Makefile.am deleted file mode 100644 index 9ec1771914..0000000000 --- a/shell/Makefile.am +++ /dev/null @@ -1,383 +0,0 @@ -SUBDIRS = glade importer - -INCLUDES = \ - -DG_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED \ - -DBONOBO_DISABLE_DEPRECATED -DGNOME_DISABLE_DEPRECATED \ - -I$(top_srcdir)/widgets \ - -I$(top_srcdir)/widgets/misc \ - -I$(top_srcdir)/libical/src/libical \ - -I$(top_builddir)/libical/src/libical \ - -I$(top_srcdir) \ - -DEVOLUTION_IMAGES=\""$(imagesdir)"\" \ - -DEVOLUTION_LOCALEDIR=\""$(localedir)"\" \ - -DEVOLUTION_DATADIR=\""$(datadir)"\" \ - -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \ - -DEVOLUTION_ETSPECDIR=\""$(etspecdir)"\" \ - -DEVOLUTION_UIDIR=\""$(evolutionuidir)"\" \ - -DEVOLUTION_TOOLSDIR=\""$(privlibexecdir)"\" \ - -DPREFIX=\""$(prefix)"\" \ - -DSYSCONFDIR=\""$(sysconfdir)"\" \ - -DDATADIR=\""$(datadir)"\" \ - -DLIBDIR=\""$(datadir)"\" \ - -DG_LOG_DOMAIN=\"evolution-shell\" \ - $(SHELL_CFLAGS) - -noinst_PROGRAMS = evolution evolution-test-component - -# Shell CORBA stuff - -IDLS = \ - Evolution-Activity.idl \ - Evolution-ConfigControl.idl \ - Evolution-Offline.idl \ - Evolution-Session.idl \ - Evolution-Shell.idl \ - Evolution-ShellComponent.idl \ - Evolution-ShellComponentDnd.idl \ - Evolution-ShellView.idl \ - Evolution-Shortcuts.idl \ - Evolution-Storage.idl \ - Evolution-StorageSetView.idl \ - Evolution-Wizard.idl \ - Evolution-common.idl \ - Evolution.idl - -IDL_GENERATED_H = \ - Evolution.h - -IDL_GENERATED_C = \ - Evolution-common.c \ - Evolution-skels.c \ - Evolution-stubs.c - -IDL_GENERATED = $(IDL_GENERATED_H) $(IDL_GENERATED_C) - -$(IDL_GENERATED_H): $(IDLS) - $(ORBIT_IDL) -I $(srcdir) $(IDL_INCLUDES) $(srcdir)/Evolution.idl - -$(IDL_GENERATED_C): $(IDL_GENERATED_H) - - -# SelectNames CORBA stuff - -SELECT_NAMES_IDL = \ - $(top_srcdir)/addressbook/gui/component/select-names/Evolution-Addressbook-SelectNames.idl - -SELECT_NAMES_IDL_GENERATED_H = \ - Evolution-Addressbook-SelectNames.h - -SELECT_NAMES_IDL_GENERATED_C = \ - Evolution-Addressbook-SelectNames-common.c \ - Evolution-Addressbook-SelectNames-skels.c \ - Evolution-Addressbook-SelectNames-stubs.c - -SELECT_NAMES_IDL_GENERATED = $(SELECT_NAMES_IDL_GENERATED_C) $(SELECT_NAMES_IDL_GENERATED_H) - -$(SELECT_NAMES_IDL_GENERATED_H): $(SELECT_NAMES_IDL) - $(ORBIT_IDL) -I $(srcdir) $(IDL_INCLUDES) $(SELECT_NAMES_IDL) - -$(SELECT_NAMES_IDL_GENERATED_C): $(SELECT_NAMES_IDL_GENERATED_H) - - -# Wombat CORBA stuff - -WOMBAT_IDL = \ - $(top_srcdir)/wombat/Evolution-Wombat.idl - -WOMBAT_IDL_GENERATED_H = \ - Evolution-Wombat.h - -WOMBAT_IDL_GENERATED_C = \ - Evolution-Wombat-common.c \ - Evolution-Wombat-skels.c \ - Evolution-Wombat-stubs.c - -WOMBAT_IDL_GENERATED = $(WOMBAT_IDL_GENERATED_C) $(WOMBAT_IDL_GENERATED_H) - -$(WOMBAT_IDL_GENERATED_H): $(WOMBAT_IDL) - $(ORBIT_IDL) -I $(srcdir) $(IDL_INCLUDES) $(WOMBAT_IDL) - -$(WOMBAT_IDL_GENERATED_C): $(WOMBAT_IDL_GENERATED_H) - - -# IDL install - -idl_DATA = $(IDLS) - -# Shell library - -privlib_LTLIBRARIES = \ - libeshell.la - -eshellincludedir = $(privincludedir)/shell - -eshellinclude_HEADERS = \ - Evolution.h \ - e-folder.h \ - e-folder-list.h \ - e-folder-tree.h \ - e-shell-corba-icon-utils.h \ - evolution-activity-client.h \ - evolution-config-control.h \ - evolution-folder-selector-button.h \ - evolution-session.h \ - evolution-shell-client.h \ - evolution-shell-component-client.h \ - evolution-shell-component.h \ - evolution-shell-component-dnd.h \ - evolution-shell-component-utils.h \ - evolution-shell-view.h \ - evolution-storage-listener.h \ - evolution-storage-set-view-listener.h \ - evolution-storage.h \ - evolution-wizard.h - -libeshell_la_SOURCES = \ - $(IDL_GENERATED) \ - e-folder.c \ - e-folder-list.c \ - e-folder-tree.c \ - e-shell-corba-icon-utils.c \ - evolution-activity-client.c \ - evolution-config-control.c \ - evolution-folder-selector-button.c \ - evolution-session.c \ - evolution-shell-client.c \ - evolution-shell-component-client.c \ - evolution-shell-component.c \ - evolution-shell-component-dnd.c \ - evolution-shell-component-utils.c \ - evolution-shell-view.c \ - evolution-storage-listener.c \ - evolution-storage-set-view-listener.c \ - evolution-storage.c \ - evolution-wizard.c \ - e-shell-marshal.c \ - $(eshellinclude_HEADERS) - -libeshell_la_LIBADD = \ - $(top_builddir)/e-util/libeutil.la - -# Evolution executable - -evolution_SOURCES = \ - $(SELECT_NAMES_IDL_GENERATED) \ - $(WOMBAT_IDL_GENERATED) \ - e-activity-handler.c \ - e-activity-handler.h \ - e-component-info.c \ - e-component-info.h \ - e-component-registry.c \ - e-component-registry.h \ - e-config-upgrade.c \ - e-config-upgrade.h \ - e-corba-config-page.c \ - e-corba-config-page.h \ - e-corba-shortcuts.c \ - e-corba-shortcuts.h \ - e-corba-storage-registry.c \ - e-corba-storage-registry.h \ - e-corba-storage.c \ - e-corba-storage.h \ - e-folder-dnd-bridge.c \ - e-folder-dnd-bridge.h \ - e-folder-type-registry.c \ - e-folder-type-registry.h \ - e-history.c \ - e-history.h \ - e-icon-factory.c \ - e-icon-factory.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-about-box.c \ - e-shell-about-box.h \ - e-shell-config.c \ - e-shell-config.h \ - e-shell-config-autocompletion.c \ - e-shell-config-autocompletion.h \ - e-shell-config-offline.c \ - e-shell-config-offline.h \ - e-shell-config-default-folders.c \ - e-shell-config-default-folders.h \ - e-shell-config-folder-settings.c \ - e-shell-config-folder-settings.h \ - e-shell-constants.h \ - e-shell-folder-commands.c \ - e-shell-folder-commands.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-importer.c \ - e-shell-importer.h \ - e-shell-offline-handler.c \ - e-shell-offline-handler.h \ - e-shell-offline-sync.c \ - e-shell-offline-sync.h \ - e-shell-settings-dialog.c \ - e-shell-settings-dialog.h \ - e-shell-shared-folder-picker-dialog.c \ - e-shell-shared-folder-picker-dialog.h \ - e-shell-startup-wizard.c \ - e-shell-startup-wizard.h \ - e-shell-user-creatable-items-handler.c \ - e-shell-user-creatable-items-handler.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-model.c \ - e-shortcuts-view-model.h \ - e-shortcuts-view.c \ - e-shortcuts-view.h \ - e-shortcuts.c \ - e-shortcuts.h \ - e-splash.c \ - e-splash.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 \ - e-task-bar.c \ - e-task-bar.h \ - e-task-widget.c \ - e-task-widget.h \ - e-uri-schema-registry.c \ - e-uri-schema-registry.h \ - evolution-storage-set-view.c \ - evolution-storage-set-view.h \ - evolution-storage-set-view-factory.c \ - evolution-storage-set-view-factory.h \ - main.c - -evolution_LDADD = \ - libeshell.la \ - importer/libevolution-importer.la \ - $(top_builddir)/widgets/e-timezone-dialog/libetimezonedialog.la \ - $(top_builddir)/widgets/misc/libemiscwidgets.la \ - $(top_builddir)/e-util/libeutil.la \ - $(top_builddir)/libical/src/libical/libical-evolution.la \ - $(SHELL_LIBS) - -# Test component - -evolution_test_component_SOURCES = \ - evolution-test-component.c - -evolution_test_component_LDADD = \ - libeshell.la \ - $(SHELL_LIBS) - -install-test-component: evolution-test-component - $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) evolution-test-component $(DESTDIR)$(bindir)/evolution-test-component - $(mkinstalldirs) $(DESTDIR)$(serverdir) - $(INSTALL_DATA) $(srcdir)/GNOME_Evolution_TestComponent.server $(DESTDIR)$(serverdir)/GNOME_Evolution_TestComponent.server - -# Misc stuff - -server_in_files = GNOME_Evolution_Shell.server.in.in -server_DATA = $(server_in_files:.server.in.in=.server) -$(server_in_files:.server.in.in=.server.in): $(server_in_files) - sed -e "s|\@BINDIR\@|$(bindir)|" \ - -e "s|\@VERSION\@|$(BASE_VERSION)|" \ - $< > $@ - -etspec_DATA = e-storage-set-view.etspec - -@INTLTOOL_SERVER_RULE@ - -icons = \ - check-empty.xpm \ - check-filled.xpm \ - check-missing.xpm - -# GConf schemas - -schemadir = $(GCONF_SCHEMA_FILE_DIR) -schema_DATA = apps_evolution_shell.schemas - -install-data-local: - if test -z "$(DESTDIR)" ; then \ - for p in $(schema_DATA) ; do \ - GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(srcdir)/$$p; \ - done \ - fi - -install-evolution: - $(mkinstalldirs) $(DESTDIR)$(bindir) - $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) evolution $(DESTDIR)$(bindir)/evolution-$(BASE_VERSION) - -if HAVE_DTAPPINTEGRATE - -install-exec-local: install-evolution - $(mkinstalldirs) $(DESTDIR)$(libexecdir) - mv $(DESTDIR)$(bindir)/evolution-$(BASE_VERSION) $(DESTDIR)$(libexecdir)/evolution-$(BASE_VERSION) - $(INSTALL_PROGRAM) evolution-nognome $(DESTDIR)$(bindir)/evolution-$(BASE_VERSION) - -else - -install-exec-local: install-evolution - -endif - -# GLib marshalling cruft - -e-shell-marshal.h: e-shell-marshal.list - ( @GLIB_GENMARSHAL@ --prefix=e_shell_marshal e-shell-marshal.list --header > e-shell-marshal.h.tmp \ - && mv e-shell-marshal.h.tmp e-shell-marshal.h ) \ - || ( rm -f e-shell-marshal.h.tmp && exit 1 ) - -e-shell-marshal.c: e-shell-marshal.h - ( @GLIB_GENMARSHAL@ --prefix=e_shell_marshal e-shell-marshal.list --body > e-shell-marshal.c.tmp \ - && mv e-shell-marshal.c.tmp e-shell-marshal.c ) \ - || ( rm -f e-shell-marshal.c.tmp && exit 1 ) - -MARSHAL_GENERATED = e-shell-marshal.c e-shell-marshal.h - -# Extra dist stuff - -EXTRA_DIST = \ - $(IDLS) \ - $(server_in_files) \ - $(server_DATA) \ - $(etspec_DATA) \ - $(schema_DATA) \ - $(icons) \ - GNOME_Evolution_TestComponent.server \ - e-shell-marshal.list \ - evolution-nognome.in - -# 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 - -BUILT_SOURCES = $(IDL_GENERATED) $(SELECT_NAMES_IDL_GENERATED) $(MARSHAL_GENERATED) -CLEANFILES = $(BUILT_SOURCES) - -dist-hook: - cd $(distdir); rm -f $(BUILT_SOURCES) - -noinst_SCRIPTS = evolution-nognome - diff --git a/shell/README b/shell/README deleted file mode 100644 index fc0871eb5d..0000000000 --- a/shell/README +++ /dev/null @@ -1,14 +0,0 @@ -Two things are built in this directory: the shell's executable, named -`evolution', and the shell utility library, `libeshell'. - -The `e-*' files belong to the shell, and their API is not exported at -all. - -The `evolution-*' files, instead, are Bonobo-style wrappers for the -shell's Evolution:: CORBA interfaces. They are all compiled into -`libeshell'; the shell itself links against `libeshell'. - -The `evolution-*-client' files are utility GTK+-style wrappers for the -CORBA methods; the modules whose name does not end with `-client', -instead, are Bonobo-like GTK+ objects wrapping the implementation of -the CORBA server. diff --git a/shell/apps_evolution_shell.schemas b/shell/apps_evolution_shell.schemas deleted file mode 100644 index d8ad7802d7..0000000000 --- a/shell/apps_evolution_shell.schemas +++ /dev/null @@ -1,253 +0,0 @@ -<gconfschemafile> - <schemalist> - - <!-- Evolution config version --> - - <schema> - <key>/schemas/apps/evolution/version</key> - <applyto>/apps/evolution/version</applyto> - <owner>evolution</owner> - <type>string</type> - <locale name="C"> - <short>Evolution configuration version</short> - </locale> - </schema> - - <!-- Default mail folder --> - - <schema> - <key>/schemas/apps/evolution/shell/default_folders/mail_path</key> - <applyto>/apps/evolution/shell/default_folders/mail_path</applyto> - <owner>evolution</owner> - <type>string</type> - <default>evolution:/local/Inbox</default> - <locale name="C"> - <short>Path to the default mail folder</short> - </locale> - </schema> - - <schema> - <key>/schemas/apps/evolution/shell/default_folders/mail_uri</key> - <applyto>/apps/evolution/shell/default_folders/mail_uri</applyto> - <owner>evolution</owner> - <type>string</type> - <default></default> - <locale name="C"> - <short>Physical URI to the default mail folder</short> - </locale> - </schema> - - <!-- Default contacts folder --> - - <schema> - <key>/schemas/apps/evolution/shell/default_folders/contacts_path</key> - <applyto>/apps/evolution/shell/default_folders/contacts_path</applyto> - <owner>evolution</owner> - <type>string</type> - <default>evolution:/local/Contacts</default> - <locale name="C"> - <short>Path to the default contacts folder</short> - </locale> - </schema> - - <schema> - <key>/schemas/apps/evolution/shell/default_folders/contacts_uri</key> - <applyto>/apps/evolution/shell/default_folders/contacts_uri</applyto> - <owner>evolution</owner> - <type>string</type> - <default></default> - <locale name="C"> - <short>Physical URI to the default contacts folder</short> - </locale> - </schema> - - <!-- Default calendar folder --> - - <schema> - <key>/schemas/apps/evolution/shell/default_folders/calendar_path</key> - <applyto>/apps/evolution/shell/default_folders/calendar_path</applyto> - <owner>evolution</owner> - <type>string</type> - <default>evolution:/local/Calendar</default> - <locale name="C"> - <short>Path to the default calendar folder</short> - </locale> - </schema> - - <schema> - <key>/schemas/apps/evolution/shell/default_folders/calendar_uri</key> - <applyto>/apps/evolution/shell/default_folders/calendar_uri</applyto> - <owner>evolution</owner> - <type>string</type> - <default></default> - <locale name="C"> - <short>Physical URI to the default calendar folder</short> - </locale> - </schema> - - <!-- Default tasks folder --> - - <schema> - <key>/schemas/apps/evolution/shell/default_folders/tasks_path</key> - <applyto>/apps/evolution/shell/default_folders/tasks_path</applyto> - <owner>evolution</owner> - <type>string</type> - <default>evolution:/local/Tasks</default> - <locale name="C"> - <short>Path to the default tasks folder</short> - </locale> - </schema> - - <schema> - <key>/schemas/apps/evolution/shell/default_folders/tasks_uri</key> - <applyto>/apps/evolution/shell/default_folders/tasks_uri</applyto> - <owner>evolution</owner> - <type>string</type> - <default></default> - <locale name="C"> - <short>Physical URI to the default tasks folder</short> - </locale> - </schema> - - <!-- Development warning dialog --> - - <schema> - <key>/schemas/apps/evolution/shell/skip_warning_dialog</key> - <applyto>/apps/evolution/shell/skip_warning_dialog</applyto> - <owner>evolution</owner> - <type>bool</type> - <default>false</default> - <locale name="C"> - <short>Whether to skip the development warning dialog</short> - <long> - If set to true, the warning dialog in development versions - of Evolution is not displayed. - </long> - </locale> - </schema> - - <!-- Offline Mode --> - - <schema> - <key>/schemas/apps/evolution/shell/start_offline</key> - <applyto>/apps/evolution/shell/start_offline</applyto> - <owner>evolution</owner> - <type>bool</type> - <default>false</default> - <locale name="C"> - <short>Whether Evolution should start up in offline mode</short> - <long> - If set to true, Evolution will start up in offline mode - instead of online mode. - </long> - </locale> - </schema> - - <schema> - <key>/schemas/apps/evolution/shell/offline/folder_paths</key> - <applyto>/apps/evolution/shell/offline/folder_paths</applyto> - <owner>evolution</owner> - <type>list</type> - <list_type>string</list_type> - <default>[]</default> - <locale name="C"> - <short>List of paths for the folders to be synchronized to disk for offline usage</short> - </locale> - </schema> - - <!-- View defaults --> - - <schema> - <key>/schemas/apps/evolution/shell/view_defaults/width</key> - <applyto>/apps/evolution/shell/view_defaults/width</applyto> - <owner>evolution</owner> - <type>int</type> - <default>640</default> - <locale name="C"> - <short>Default window width</short> - </locale> - </schema> - - <schema> - <key>/schemas/apps/evolution/shell/view_defaults/height</key> - <applyto>/apps/evolution/shell/view_defaults/height</applyto> - <owner>evolution</owner> - <type>int</type> - <locale name="C"> - <default>480</default> - <short>Default window height</short> - </locale> - </schema> - - <schema> - <key>/schemas/apps/evolution/shell/view_defaults/selected_shortcut_group</key> - <applyto>/apps/evolution/shell/view_defaults/selected_shortcut_group</applyto> - <owner>evolution</owner> - <type>int</type> - <default>0</default> - <locale name="C"> - <short>Default shortcut group</short> - </locale> - </schema> - - <schema> - <key>/schemas/apps/evolution/shell/view_defaults/show_folder_bar</key> - <applyto>/apps/evolution/shell/view_defaults/show_folder_bar</applyto> - <owner>evolution</owner> - <type>bool</type> - <default>false</default> - <locale name="C"> - <short>Whether to show the folder bar</short> - </locale> - </schema> - - <schema> - <key>/schemas/apps/evolution/shell/view_defaults/show_shortcut_bar</key> - <applyto>/apps/evolution/shell/view_defaults/show_shortcut_bar</applyto> - <owner>evolution</owner> - <type>bool</type> - <default>true</default> - <locale name="C"> - <short>Whether to show the shortcut bar</short> - </locale> - </schema> - - <schema> - <key>/schemas/apps/evolution/shell/view_defaults/folder_path</key> - <applyto>/apps/evolution/shell/view_defaults/folder_path</applyto> - <owner>evolution</owner> - <type>string</type> - <locale name="C"> - <default>/Summary</default> - <short>Path to the folder to be displayed by default</short> - </locale> - </schema> - - <!-- Folder bar --> - - <schema> - <key>/schemas/apps/evolution/shell/view_defaults/folder_bar/width</key> - <applyto>/apps/evolution/shell/view_defaults/folder_bar/width</applyto> - <owner>evolution</owner> - <type>int</type> - <default>200</default> - <locale name="C"> - <short>Default width of the folder bar pane</short> - </locale> - </schema> - - <!-- Shortcut bar --> - - <schema> - <key>/schemas/apps/evolution/shell/view_defaults/shortcut_bar/width</key> - <applyto>/apps/evolution/shell/view_defaults/shortcut_bar/width</applyto> - <owner>evolution</owner> - <type>int</type> - <default>100</default> - <locale name="C"> - <short>Default width of the shortcut bar pane</short> - </locale> - </schema> - - </schemalist> -</gconfschemafile> diff --git a/shell/check-empty.xpm b/shell/check-empty.xpm deleted file mode 100644 index 746b20234e..0000000000 --- a/shell/check-empty.xpm +++ /dev/null @@ -1,21 +0,0 @@ -/* XPM */ -static const char * check_empty_xpm[] = { -"16 16 2 1", -" c None", -". c #000000", -" ", -" ", -" ............ ", -" . . ", -" . . ", -" . . ", -" . . ", -" . . ", -" . . ", -" . . ", -" . . ", -" . . ", -" . . ", -" ............ ", -" ", -" "}; diff --git a/shell/check-filled.xpm b/shell/check-filled.xpm deleted file mode 100644 index c0468fc25b..0000000000 --- a/shell/check-filled.xpm +++ /dev/null @@ -1,21 +0,0 @@ -/* XPM */ -static const char * check_filled_xpm[] = { -"16 16 2 1", -" c None", -". c #000000", -" ", -" ", -" ............ ", -" . . ", -" . . . ", -" . .. . ", -" . ... . ", -" . . ... . ", -" . .. ... . ", -" . ..... . ", -" . ... . ", -" . . . ", -" . . ", -" ............ ", -" ", -" "}; diff --git a/shell/check-missing.xpm b/shell/check-missing.xpm deleted file mode 100644 index 72bdb7a782..0000000000 --- a/shell/check-missing.xpm +++ /dev/null @@ -1,20 +0,0 @@ -/* XPM */ -static const char * check_missing_xpm[] = { -"16 16 1 1", -" c None", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" ", -" "}; diff --git a/shell/e-activity-handler.c b/shell/e-activity-handler.c deleted file mode 100644 index 023ff59cd5..0000000000 --- a/shell/e-activity-handler.c +++ /dev/null @@ -1,588 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-activity-handler.c - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-activity-handler.h" - -#include "e-shell-corba-icon-utils.h" - -#include <gtk/gtksignal.h> -#include <gdk-pixbuf/gdk-pixbuf.h> - -#include <libgnome/gnome-i18n.h> -#include <libgnomeui/gnome-popup-menu.h> - -#include <gal/util/e-util.h> -#include <gal/widgets/e-popup-menu.h> - -#include <bonobo/bonobo-exception.h> - - -#define PARENT_TYPE bonobo_object_get_type () -static BonoboObjectClass *parent_class = NULL; - - -#define ICON_SIZE 16 - - -struct _ActivityInfo { - char *component_id; - GdkPixbuf *icon_pixbuf; - GNOME_Evolution_Activity_ActivityId id; - CORBA_char *information; - CORBA_boolean cancellable; - Bonobo_Listener event_listener; - CORBA_float progress; - GtkWidget *menu; -}; -typedef struct _ActivityInfo ActivityInfo; - -struct _EActivityHandlerPrivate { - GNOME_Evolution_Activity_ActivityId next_activity_id; - GList *activity_infos; - GSList *task_bars; -}; - - -/* Utility functions. */ - -static unsigned int -get_new_activity_id (EActivityHandler *activity_handler) -{ - EActivityHandlerPrivate *priv; - - priv = activity_handler->priv; - - return priv->next_activity_id ++; -} - -static GList * -lookup_activity (GList *list, - GNOME_Evolution_Activity_ActivityId activity_id, - int *order_number_return) -{ - GList *p; - int i; - - for (p = list, i = 0; p != NULL; p = p->next, i ++) { - ActivityInfo *activity_info; - - activity_info = (ActivityInfo *) p->data; - if (activity_info->id == activity_id) { - *order_number_return = i; - return p; - } - } - - *order_number_return = -1; - return NULL; -} - -#if 0 -static const CORBA_any * -get_corba_null_value (void) -{ - static CORBA_any *null_value = NULL; - - if (null_value == NULL) { - null_value = CORBA_any__alloc (); - null_value->_type = TC_null; - } - - return null_value; -} - -static void -report_task_event (ActivityInfo *activity_info, - const char *event_name) -{ - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - Bonobo_Listener_event (activity_info->event_listener, event_name, get_corba_null_value (), &ev); - if (ev._major != CORBA_NO_EXCEPTION) - g_warning ("EActivityHandler: Cannot event `%s' -- %s", event_name, ev._repo_id); - - CORBA_exception_free (&ev); -} -#endif - - -/* ETaskWidget actions. */ - -#if 0 -static void -task_widget_cancel_callback (GtkWidget *widget, - void *data) -{ - ActivityInfo *activity_info; - - activity_info = (ActivityInfo *) data; - report_task_event (activity_info, "Cancel"); -} - -static void -task_widget_show_details_callback (GtkWidget *widget, - void *data) -{ - ActivityInfo *activity_info; - - activity_info = (ActivityInfo *) data; - report_task_event (activity_info, "ShowDetails"); -} - -static void -show_cancellation_popup (ActivityInfo *activity_info, - GtkWidget *task_widget, - GdkEventButton *button_event) -{ - GtkMenu *popup; - EPopupMenu items[] = { - E_POPUP_MENU (N_("Show Details"), task_widget_show_details_callback, 0), - E_POPUP_SEPARATOR, - E_POPUP_MENU (N_("Cancel Operation"), task_widget_cancel_callback, 0), - E_POPUP_TERMINATOR - }; - - /* FIXME: We should gray out things properly here. */ - popup = e_popup_menu_create (items, 0, 0, activity_info); - - g_assert (activity_info->menu == NULL); - activity_info->menu = GTK_WIDGET (popup); - - gnome_popup_menu_do_popup_modal (GTK_WIDGET (popup), NULL, NULL, button_event, activity_info); - - activity_info->menu = NULL; -} -#endif - -static int -task_widget_button_press_event_callback (GtkWidget *widget, - GdkEventButton *button_event, - void *data) -{ - CORBA_Environment ev; - ActivityInfo *activity_info; - CORBA_any *null_value; - - activity_info = (ActivityInfo *) data; - - if (button_event->button == 3) { - if (! activity_info->cancellable) { - return FALSE; - } else { - /* show_cancellation_popup (activity_info, widget, button_event); */ - /* return TRUE; */ - return TRUE; - } - } - - if (button_event->button != 1) - return FALSE; - - CORBA_exception_init (&ev); - - null_value = CORBA_any__alloc (); - null_value->_type = TC_null; - - Bonobo_Listener_event (activity_info->event_listener, "Clicked", null_value, &ev); - if (BONOBO_EX (&ev) != CORBA_NO_EXCEPTION) - g_warning ("EActivityHandler: Cannot report `Clicked' event -- %s", - BONOBO_EX_REPOID (&ev)); - - CORBA_free (null_value); - - CORBA_exception_free (&ev); - - return TRUE; -} - - -/* Creating and destroying ActivityInfos. */ - -static ActivityInfo * -activity_info_new (const char *component_id, - GNOME_Evolution_Activity_ActivityId id, - GdkPixbuf *icon, - const CORBA_char *information, - CORBA_boolean cancellable, - const Bonobo_Listener event_listener) -{ - ActivityInfo *info; - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - info = g_new (ActivityInfo, 1); - info->component_id = g_strdup (component_id); - info->id = id; - info->icon_pixbuf = g_object_ref (icon); - info->information = CORBA_string_dup (information); - info->cancellable = cancellable; - info->event_listener = CORBA_Object_duplicate (event_listener, &ev); - info->progress = -1.0; /* (Unknown) */ - info->menu = NULL; - - CORBA_exception_free (&ev); - - return info; -} - -static void -activity_info_free (ActivityInfo *info) -{ - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - g_free (info->component_id); - - g_object_unref (info->icon_pixbuf); - CORBA_free (info->information); - CORBA_Object_release (info->event_listener, &ev); - - if (info->menu != NULL) - gtk_widget_destroy (info->menu); - - g_free (info); - - CORBA_exception_free (&ev); -} - -static ETaskWidget * -task_widget_new_from_activity_info (ActivityInfo *activity_info) -{ - GtkWidget *widget; - - widget = e_task_widget_new (activity_info->icon_pixbuf, - activity_info->component_id, - activity_info->information); - gtk_widget_show (widget); - - g_signal_connect (widget, "button_press_event", - G_CALLBACK (task_widget_button_press_event_callback), - activity_info); - - return E_TASK_WIDGET (widget); -} - - -/* Task Bar handling. */ - -static void -setup_task_bar (EActivityHandler *activity_handler, - ETaskBar *task_bar) -{ - EActivityHandlerPrivate *priv; - GList *p; - - priv = activity_handler->priv; - - for (p = g_list_last (priv->activity_infos); p != NULL; p = p->prev) { - e_task_bar_prepend_task (task_bar, - task_widget_new_from_activity_info ((ActivityInfo *) p->data)); - } -} - -static void -task_bar_destroy_notify (void *data, - GObject *task_bar_instance) -{ - EActivityHandler *activity_handler; - EActivityHandlerPrivate *priv; - - activity_handler = E_ACTIVITY_HANDLER (data); - priv = activity_handler->priv; - - priv->task_bars = g_slist_remove (priv->task_bars, task_bar_instance); -} - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - EActivityHandler *handler; - EActivityHandlerPrivate *priv; - GList *p; - GSList *sp; - - handler = E_ACTIVITY_HANDLER (object); - priv = handler->priv; - - for (p = priv->activity_infos; p != NULL; p = p->next) { - ActivityInfo *info; - - info = (ActivityInfo *) p->data; - activity_info_free (info); - } - - g_list_free (priv->activity_infos); - priv->activity_infos = NULL; - - for (sp = priv->task_bars; sp != NULL; sp = sp->next) - g_object_weak_unref (G_OBJECT (sp->data), task_bar_destroy_notify, sp->data); - priv->task_bars = NULL; - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EActivityHandler *handler; - EActivityHandlerPrivate *priv; - - handler = E_ACTIVITY_HANDLER (object); - priv = handler->priv; - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -/* CORBA methods. */ - -static void -impl_operationStarted (PortableServer_Servant servant, - const CORBA_char *component_id, - const GNOME_Evolution_AnimatedIcon *icon, - const CORBA_char *information, - const CORBA_boolean cancellable, - const Bonobo_Listener event_listener, - GNOME_Evolution_Activity_ActivityId *activity_id_return, - CORBA_boolean *suggest_display_return, - CORBA_Environment *ev) -{ - EActivityHandler *activity_handler; - EActivityHandlerPrivate *priv; - ActivityInfo *activity_info; - GdkPixbuf *icon_pixbuf; - unsigned int activity_id; - GSList *p; - - activity_handler = E_ACTIVITY_HANDLER (bonobo_object_from_servant (servant)); - - priv = activity_handler->priv; - - if (icon->_length == 0) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_Activity_InvalidIcon, NULL); - return; - } - - if (icon->_length > 1) - g_warning ("Animated icons are not supported for activities (yet)."); - - icon_pixbuf = e_new_gdk_pixbuf_from_corba_icon (icon->_buffer, ICON_SIZE, ICON_SIZE); - - activity_id = get_new_activity_id (activity_handler); - - activity_info = activity_info_new (component_id, activity_id, icon_pixbuf, information, - cancellable, event_listener); - - for (p = priv->task_bars; p != NULL; p = p->next) - e_task_bar_prepend_task (E_TASK_BAR (p->data), - task_widget_new_from_activity_info (activity_info)); - - g_object_unref (icon_pixbuf); - - priv->activity_infos = g_list_prepend (priv->activity_infos, activity_info); - - *activity_id_return = activity_id; -} - -static void -impl_operationProgressing (PortableServer_Servant servant, - const GNOME_Evolution_Activity_ActivityId activity_id, - const CORBA_char *information, - const CORBA_float progress, - CORBA_Environment *ev) -{ - EActivityHandler *activity_handler; - EActivityHandlerPrivate *priv; - ActivityInfo *activity_info; - GList *p; - GSList *sp; - int order_number; - - /* FIXME? The complexity in this function sucks. */ - - activity_handler = E_ACTIVITY_HANDLER (bonobo_object_from_servant (servant)); - - priv = activity_handler->priv; - - p = lookup_activity (priv->activity_infos, activity_id, &order_number); - if (p == NULL) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_Activity_IdNotFound, NULL); - return; - } - - activity_info = (ActivityInfo *) p->data; - - CORBA_free (activity_info->information); - activity_info->information = CORBA_string_dup (information); - - activity_info->progress = progress; - - for (sp = priv->task_bars; sp != NULL; sp = sp->next) { - ETaskBar *task_bar; - ETaskWidget *task_widget; - - task_bar = E_TASK_BAR (sp->data); - task_widget = e_task_bar_get_task_widget (task_bar, order_number); - - e_task_widget_update (task_widget, information, progress); - } -} - -static void -impl_operationFinished (PortableServer_Servant servant, - const GNOME_Evolution_Activity_ActivityId activity_id, - CORBA_Environment *ev) -{ - EActivityHandler *activity_handler; - EActivityHandlerPrivate *priv; - GList *p; - GSList *sp; - int order_number; - - activity_handler = E_ACTIVITY_HANDLER (bonobo_object_from_servant (servant)); - - priv = activity_handler->priv; - - p = lookup_activity (priv->activity_infos, activity_id, &order_number); - - activity_info_free ((ActivityInfo *) p->data); - priv->activity_infos = g_list_remove_link (priv->activity_infos, p); - - for (sp = priv->task_bars; sp != NULL; sp = sp->next) { - ETaskBar *task_bar; - - task_bar = E_TASK_BAR (sp->data); - e_task_bar_remove_task (task_bar, order_number); - } -} - -static GNOME_Evolution_Activity_DialogAction -impl_requestDialog (PortableServer_Servant servant, - const GNOME_Evolution_Activity_ActivityId activity_id, - const GNOME_Evolution_Activity_DialogType dialog_type, - CORBA_Environment *ev) -{ - EActivityHandler *activity_handler; - - activity_handler = E_ACTIVITY_HANDLER (bonobo_object_from_servant (servant)); - - /* FIXME implement. */ - g_warning ("Evolution::Activity::requestDialog not implemented"); - - return GNOME_Evolution_Activity_DIALOG_ACTION_DISPLAY; -} - - -/* GTK+ type stuff. */ - -static void -e_activity_handler_class_init (GObjectClass *object_class) -{ - EActivityHandlerClass *handler_class; - - parent_class = g_type_class_ref(PARENT_TYPE); - - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - handler_class = E_ACTIVITY_HANDLER_CLASS (object_class); - handler_class->epv.operationStarted = impl_operationStarted; - handler_class->epv.operationProgressing = impl_operationProgressing; - handler_class->epv.operationFinished = impl_operationFinished; - handler_class->epv.requestDialog = impl_requestDialog; -} - -static void -e_activity_handler_init (EActivityHandler *activity_handler) -{ - EActivityHandlerPrivate *priv; - - priv = g_new (EActivityHandlerPrivate, 1); - priv->next_activity_id = 0; - priv->activity_infos = NULL; - priv->task_bars = NULL; - - activity_handler->priv = priv; -} - - -void -e_activity_handler_construct (EActivityHandler *activity_handler) -{ - g_return_if_fail (activity_handler != NULL); - g_return_if_fail (E_IS_ACTIVITY_HANDLER (activity_handler)); - - /* Nothing to do here. */ -} - -EActivityHandler * -e_activity_handler_new (void) -{ - EActivityHandler *activity_handler; - - activity_handler = g_object_new (e_activity_handler_get_type (), 0); - e_activity_handler_construct (activity_handler); - - return activity_handler; -} - - -void -e_activity_handler_attach_task_bar (EActivityHandler *activity_handler, - ETaskBar *task_bar) -{ - EActivityHandlerPrivate *priv; - - g_return_if_fail (activity_handler != NULL); - g_return_if_fail (E_IS_ACTIVITY_HANDLER (activity_handler)); - g_return_if_fail (task_bar != NULL); - g_return_if_fail (E_IS_TASK_BAR (task_bar)); - - priv = activity_handler->priv; - - g_object_weak_ref (G_OBJECT (task_bar), task_bar_destroy_notify, activity_handler); - - priv->task_bars = g_slist_prepend (priv->task_bars, task_bar); - - setup_task_bar (activity_handler, task_bar); -} - - -BONOBO_TYPE_FUNC_FULL (EActivityHandler, - GNOME_Evolution_Activity, - PARENT_TYPE, - e_activity_handler) diff --git a/shell/e-activity-handler.h b/shell/e-activity-handler.h deleted file mode 100644 index b69c360765..0000000000 --- a/shell/e-activity-handler.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-activity-handler.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifndef _E_ACTIVITY_HANDLER_H_ -#define _E_ACTIVITY_HANDLER_H_ - -#include "Evolution.h" - -#include "e-task-bar.h" - -#include <bonobo/bonobo-object.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_ACTIVITY_HANDLER (e_activity_handler_get_type ()) -#define E_ACTIVITY_HANDLER(obj) (GTK_CHECK_CAST ((obj), E_TYPE_ACTIVITY_HANDLER, EActivityHandler)) -#define E_ACTIVITY_HANDLER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_ACTIVITY_HANDLER, EActivityHandlerClass)) -#define E_IS_ACTIVITY_HANDLER(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_ACTIVITY_HANDLER)) -#define E_IS_ACTIVITY_HANDLER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_ACTIVITY_HANDLER)) - - -typedef struct _EActivityHandler EActivityHandler; -typedef struct _EActivityHandlerPrivate EActivityHandlerPrivate; -typedef struct _EActivityHandlerClass EActivityHandlerClass; - -struct _EActivityHandler { - BonoboObject parent; - - EActivityHandlerPrivate *priv; -}; - -struct _EActivityHandlerClass { - BonoboObjectClass parent_class; - - POA_GNOME_Evolution_Activity__epv epv; -}; - - -GtkType e_activity_handler_get_type (void); -void e_activity_handler_construct (EActivityHandler *activity_hanlder); -EActivityHandler *e_activity_handler_new (void); - -void e_activity_handler_attach_task_bar (EActivityHandler *activity_hanlder, - ETaskBar *task_bar); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_ACTIVITY_HANDLER_H_ */ diff --git a/shell/e-component-info.c b/shell/e-component-info.c deleted file mode 100644 index a89647c8a1..0000000000 --- a/shell/e-component-info.c +++ /dev/null @@ -1,288 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-component-info.c - Load/save information about Evolution components. - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-component-info.h" - -#include "e-util/e-lang-utils.h" - -#include <libxml/parser.h> -#include <libxml/xmlmemory.h> - -#include <string.h> -#include <stdlib.h> - - -static char * -get_value_for_node (xmlNode *node) -{ - xmlChar *xml_value; - char *glib_value; - - xml_value = xmlNodeGetContent (node); - glib_value = g_strdup (xml_value); - xmlFree (xml_value); - - return glib_value; -} - -static xmlNode * -lookup_node (xmlNode *parent_node, - const char *node_name) -{ - xmlNode *p; - - for (p = parent_node->children; p != NULL; p = p->next) { - if (strcmp ((const char *) p->name, node_name) == 0) - return p; - } - - return NULL; -} - -static char * -get_value (xmlNode *parent_node, - const char *node_name) -{ - xmlNode *node; - - node = lookup_node (parent_node, node_name); - if (node == NULL) - return NULL; - - return get_value_for_node (node); -} - -static xmlNode * -lookup_node_for_language (xmlNode *parent_node, - const char *node_name, - const char *language_id) -{ - xmlNode *p; - - for (p = parent_node->children; p != NULL; p = p->next) { - xmlChar *node_language_id; - - if (strcmp ((const char *) p->name, node_name) != 0) - continue; - - node_language_id = xmlNodeGetLang (p); - if (node_language_id == NULL) - continue; - - if (strcmp (node_language_id, language_id) == 0) { - xmlFree (node_language_id); - return p; - } - } - - return NULL; -} - -static char * -get_i18n_value (xmlNode *parent_node, - const char *node_name, - GSList *language_list) -{ - GSList *p; - - for (p = language_list; p != NULL; p = p->next) { - xmlNode *node; - const char *language_id; - - language_id = (const char *) p->data; - node = lookup_node_for_language (parent_node, node_name, language_id); - - if (node != NULL) { - xmlChar *xml_value; - char *glib_value; - - xml_value = xmlNodeGetContent (node); - glib_value = g_strdup (xml_value); - xmlFree (xml_value); - - return glib_value; - } - } - - return get_value (parent_node, node_name); -} - - -static void -add_folder_type (EComponentInfo *info, - xmlNode *parent_node, - GSList *language_list) -{ - EComponentInfoFolderType *folder_type; - char *user_creatable_string; - - folder_type = g_new (EComponentInfoFolderType, 1); - - folder_type->name = get_value (parent_node, "name"); - folder_type->icon_file_name = get_value (parent_node, "icon_file_name"); - folder_type->display_name = get_i18n_value (parent_node, "display_name", language_list); - folder_type->description = get_i18n_value (parent_node, "description", language_list); - - /* FIXME dnd types. */ - - folder_type->accepted_dnd_types = NULL; - folder_type->exported_dnd_types = NULL; - - user_creatable_string = get_value (parent_node, "user_creatable"); - if (user_creatable_string == NULL || atoi (user_creatable_string) == 0) - folder_type->is_user_creatable = FALSE; - else - folder_type->is_user_creatable = TRUE; - - info->folder_types = g_slist_prepend (info->folder_types, folder_type); -} - -static void -add_user_creatable_item_type (EComponentInfo *info, - xmlNode *parent_node, - GSList *language_list) -{ - EComponentInfoUserCreatableItemType *type; - - type = g_new (EComponentInfoUserCreatableItemType, 1); - - type->id = get_value (parent_node, "id"); - type->description = get_i18n_value (parent_node, "description", language_list); - type->icon_file_name = get_value (parent_node, "icon_file_name"); - type->menu_description = get_i18n_value (parent_node, "menu_description", language_list); - type->menu_shortcut = get_value (parent_node, "menu_shortcut"); - - info->user_creatable_item_types = g_slist_prepend (info->user_creatable_item_types, type); -} - -static void -add_uri_schema (EComponentInfo *info, - xmlNode *parent_node) -{ - info->uri_schemas = g_slist_prepend (info->uri_schemas, get_value_for_node (parent_node)); -} - - -EComponentInfo * -e_component_info_load (const char *file_name) -{ - EComponentInfo *new; - xmlDoc *doc; - xmlNode *root; - xmlNode *p; - GSList *language_list; - - g_return_val_if_fail (file_name != NULL, NULL); - - doc = xmlParseFile (file_name); - if (doc == NULL) - return NULL; - - root = xmlDocGetRootElement (doc); - if (root == NULL || strcmp (root->name, "evolution_component") != 0) { - xmlFreeDoc (doc); - return NULL; - } - - language_list = e_get_language_list (); - - new = g_new (EComponentInfo, 1); - - new->id = get_value (root, "id"); - new->description = get_i18n_value (root, "description", language_list); - new->icon_file_name = get_value (root, "icon_file_name"); - - new->folder_types = NULL; - new->uri_schemas = NULL; - new->user_creatable_item_types = NULL; - - for (p = root->children; p != NULL; p = p->next) { - if (strcmp ((char *) p->name, "folder_type") == 0) - add_folder_type (new, p, language_list); - else if (strcmp ((char *) p->name, "user_creatable_item_type") == 0) - add_user_creatable_item_type (new, p, language_list); - else if (strcmp ((char *) p->name, "uri_schema") == 0) - add_uri_schema (new, p); - } - - xmlFreeDoc (doc); - e_free_language_list (language_list); - - return new; -} - -void -e_component_info_free (EComponentInfo *component_info) -{ - GSList *p; - - g_return_if_fail (component_info != NULL); - - g_free (component_info->id); - g_free (component_info->description); - g_free (component_info->icon_file_name); - - for (p = component_info->folder_types; p != NULL; p = p->next) { - EComponentInfoFolderType *folder_type; - GSList *q; - - folder_type = (EComponentInfoFolderType *) p->data; - g_free (folder_type->name); - g_free (folder_type->icon_file_name); - g_free (folder_type->display_name); - g_free (folder_type->description); - - for (q = folder_type->accepted_dnd_types; q != NULL; q = q->next) - g_free ((char *) q->data); - g_slist_free (folder_type->accepted_dnd_types); - - for (q = folder_type->exported_dnd_types; q != NULL; q = q->next) - g_free ((char *) q->data); - g_slist_free (folder_type->exported_dnd_types); - - g_free (folder_type); - } - g_free (component_info->folder_types); - - for (p = component_info->uri_schemas; p != NULL; p = p->next) - g_free ((char *) p->data); - g_slist_free (component_info->uri_schemas); - - for (p = component_info->user_creatable_item_types; p != NULL; p = p->next) { - EComponentInfoUserCreatableItemType *type; - - type = (EComponentInfoUserCreatableItemType *) p->data; - - g_free (type->id); - g_free (type->description); - g_free (type->icon_file_name); - g_free (type->menu_description); - g_free (type->menu_shortcut); - } - g_slist_free (component_info->user_creatable_item_types); - - g_free (component_info); -} diff --git a/shell/e-component-info.h b/shell/e-component-info.h deleted file mode 100644 index e991631284..0000000000 --- a/shell/e-component-info.h +++ /dev/null @@ -1,66 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-component-info.h - Load/save information about Evolution components. - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifndef E_COMPONENT_INFO_H -#define E_COMPONENT_INFO_H - -#include <glib.h> - -struct _EComponentInfoFolderType { - char *name; - char *icon_file_name; - char *display_name; - char *description; - - GSList *accepted_dnd_types; /* <char *> */ - GSList *exported_dnd_types; /* <char *> */ - - unsigned int is_user_creatable : 1; -}; -typedef struct _EComponentInfoFolderType EComponentInfoFolderType; - -struct _EComponentInfoUserCreatableItemType { - char *id; - char *description; - char *icon_file_name; - - char *menu_description; - char *menu_shortcut; -}; -typedef struct _EComponentInfoUserCreatableItemType EComponentInfoUserCreatableItemType; - -struct _EComponentInfo { - char *id; - char *description; - char *icon_file_name; - - GSList *folder_types; /* <EComponentInfoFolderType> */ - GSList *uri_schemas; /* <char *> */ - GSList *user_creatable_item_types; /* <EComponentInfoUserCreatableItemType> */ -}; -typedef struct _EComponentInfo EComponentInfo; - - -EComponentInfo *e_component_info_load (const char *file_name); -void e_component_info_free (EComponentInfo *info); - -#endif /* E_COMPONENT_INFO_H */ diff --git a/shell/e-component-registry.c b/shell/e-component-registry.c deleted file mode 100644 index d0a8cc146a..0000000000 --- a/shell/e-component-registry.c +++ /dev/null @@ -1,525 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-component-registry.c - * - * Copyright (C) 2000, 2001, 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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-component-registry.h" - -#include <glib.h> -#include <gtk/gtktypeutils.h> - -#include <gal/util/e-util.h> - -#include <bonobo-activation/bonobo-activation.h> - -#include "Evolution.h" - -#include "e-shell-utils.h" -#include "evolution-shell-component-client.h" - - -#define PARENT_TYPE G_TYPE_OBJECT -static GObjectClass *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; -}; - - -/* Utility functions. */ - -static int -sleep_with_g_main_loop_timeout_callback (void *data) -{ - GMainLoop *loop; - - loop = (GMainLoop *) data; - g_main_loop_quit (loop); - - return FALSE; -} - -/* This function is like `sleep()', but it uses the GMainLoop so CORBA - invocations can get through. */ -static void -sleep_with_g_main_loop (int num_seconds) -{ - GMainLoop *loop; - - loop = g_main_loop_new (NULL, TRUE); - g_timeout_add (1000 * num_seconds, sleep_with_g_main_loop_timeout_callback, loop); - g_main_loop_run (loop); - g_main_loop_unref (loop); -} - -static void -wait_for_corba_object_to_die (Bonobo_Unknown corba_objref, - const char *id) -{ - gboolean alive; - int count; - - count = 1; - while (1) { - alive = bonobo_unknown_ping (corba_objref, NULL); - if (! alive) - break; - - g_print ("Waiting for component to die -- %s (%d)\n", id, count); - sleep_with_g_main_loop (1); - count ++; - } -} - - -/* Component information handling. */ - -static Component * -component_new (const char *id, - EvolutionShellComponentClient *client) -{ - Component *new; - - g_object_ref (client); - - new = g_new (Component, 1); - new->id = g_strdup (id); - new->folder_type_names = NULL; - new->client = client; - - return new; -} - -static gboolean -component_free (Component *component) -{ - GNOME_Evolution_ShellComponent corba_shell_component; - CORBA_Environment ev; - gboolean retval; - - CORBA_exception_init (&ev); - - corba_shell_component = evolution_shell_component_client_corba_objref (component->client); - corba_shell_component = CORBA_Object_duplicate (corba_shell_component, &ev); - - GNOME_Evolution_ShellComponent_unsetOwner (corba_shell_component, &ev); - if (ev._major == CORBA_NO_EXCEPTION) - retval = TRUE; - else - retval = FALSE; - CORBA_exception_free (&ev); - - g_object_unref (component->client); - - /* If the component is out-of-proc, wait for the process to die first. */ - if (bonobo_object (ORBit_small_get_servant (corba_shell_component)) == NULL) - wait_for_corba_object_to_die ((Bonobo_Unknown) corba_shell_component, component->id); - - CORBA_Object_release (corba_shell_component, &ev); - - e_free_string_list (component->folder_type_names); - g_free (component->id); - - g_free (component); - - return retval; -} - -static gboolean -register_type (EComponentRegistry *component_registry, - const char *name, - const char *icon_name, - const char *display_name, - const char *description, - gboolean user_creatable, - int num_exported_dnd_types, - const char **exported_dnd_types, - int num_accepted_dnd_types, - const char **accepted_dnd_types, - Component *handler, - gboolean override_duplicate) -{ - 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 (override_duplicate - && e_folder_type_registry_type_registered (folder_type_registry, name)) - e_folder_type_registry_unregister_type (folder_type_registry, name); - - if (! e_folder_type_registry_register_type (folder_type_registry, - name, icon_name, - display_name, description, - user_creatable, - num_exported_dnd_types, - exported_dnd_types, - num_accepted_dnd_types, - accepted_dnd_types)) { - 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, - gboolean override_duplicate, - CORBA_Environment *ev) -{ - EComponentRegistryPrivate *priv; - GNOME_Evolution_ShellComponent component_corba_interface; - GNOME_Evolution_Shell shell_corba_interface; - GNOME_Evolution_FolderTypeList *supported_types; - GNOME_Evolution_URISchemaList *supported_schemas; - Component *component; - EvolutionShellComponentClient *client; - CORBA_Environment my_ev; - CORBA_unsigned_long i; - - priv = component_registry->priv; - - if (! override_duplicate && 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, ev); - if (client == NULL) - return FALSE; - - /* FIXME we could use the EvolutionShellComponentClient API here instead, but for - now we don't care. */ - - component_corba_interface = evolution_shell_component_client_corba_objref (client); - shell_corba_interface = BONOBO_OBJREF (priv->shell); - - CORBA_exception_init (&my_ev); - - /* Register the supported folder types. */ - - supported_types = GNOME_Evolution_ShellComponent__get_supportedTypes (component_corba_interface, &my_ev); - if (my_ev._major != CORBA_NO_EXCEPTION || supported_types->_length == 0) { - g_object_unref (client); - CORBA_exception_free (&my_ev); - return FALSE; - } - - CORBA_exception_free (&my_ev); - - component = component_new (id, client); - g_hash_table_insert (priv->component_id_to_component, component->id, component); - g_object_unref (client); - - for (i = 0; i < supported_types->_length; i++) { - const GNOME_Evolution_FolderType *type; - - type = supported_types->_buffer + i; - - if (! register_type (component_registry, - type->name, type->iconName, - type->displayName, type->description, - type->userCreatable, - type->exportedDndTypes._length, - (const char **) type->exportedDndTypes._buffer, - type->acceptedDndTypes._length, - (const char **) type->acceptedDndTypes._buffer, - component, - override_duplicate)) { - g_warning ("Cannot register type `%s' for component %s", - type->name, component->id); - } - } - - CORBA_free (supported_types); - - /* Register the supported external URI schemas. */ - - supported_schemas = GNOME_Evolution_ShellComponent__get_externalUriSchemas (component_corba_interface, &my_ev); - if (my_ev._major == CORBA_NO_EXCEPTION) { - EUriSchemaRegistry *uri_schema_registry; - - uri_schema_registry = e_shell_get_uri_schema_registry (priv->shell); - - for (i = 0; i < supported_schemas->_length; i++) { - const CORBA_char *schema; - - schema = supported_schemas->_buffer[i]; - e_uri_schema_registry_set_handler_for_schema (uri_schema_registry, schema, component->client); - } - - CORBA_free (supported_schemas); - } - - return TRUE; -} - - -/* GObject methods. */ - -static void -component_id_foreach_free (void *key, - void *value, - void *user_data) -{ - Component *component; - - component = (Component *) value; - component_free (component); -} - -static void -impl_dispose (GObject *object) -{ - EComponentRegistry *component_registry; - EComponentRegistryPrivate *priv; - - component_registry = E_COMPONENT_REGISTRY (object); - priv = component_registry->priv; - - if (priv->component_id_to_component != NULL) { - g_hash_table_foreach (priv->component_id_to_component, component_id_foreach_free, NULL); - g_hash_table_destroy (priv->component_id_to_component); - priv->component_id_to_component = NULL; - } - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EComponentRegistry *component_registry; - EComponentRegistryPrivate *priv; - - component_registry = E_COMPONENT_REGISTRY (object); - priv = component_registry->priv; - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -class_init (EComponentRegistryClass *klass) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - parent_class = g_type_class_ref(PARENT_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; - 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 = g_object_new (e_component_registry_get_type (), NULL); - e_component_registry_construct (component_registry, shell); - - return component_registry; -} - - -gboolean -e_component_registry_register_component (EComponentRegistry *component_registry, - const char *id, - CORBA_Environment *ev) -{ - 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, FALSE, ev); -} - - -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; -} - - -EvolutionShellComponentClient * -e_component_registry_restart_component (EComponentRegistry *component_registry, - const char *id, - CORBA_Environment *ev) -{ - EComponentRegistryPrivate *priv; - Component *component; - CORBA_Environment my_ev; - CORBA_Object corba_objref; - - 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; - - CORBA_exception_init (&my_ev); - - g_hash_table_remove (priv->component_id_to_component, id); - - corba_objref = CORBA_Object_duplicate (evolution_shell_component_client_corba_objref (component->client), &my_ev); - - component_free (component); - - wait_for_corba_object_to_die (corba_objref, id); - - CORBA_exception_free (&my_ev); - - if (! register_component (component_registry, id, TRUE, ev)) - return NULL; - - return e_component_registry_get_component_by_id (component_registry, id); -} - - -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 856a24f093..0000000000 --- a/shell/e-component-registry.h +++ /dev/null @@ -1,80 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-component-registry.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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__ - -#include <gtk/gtkobject.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; - -#include "e-shell.h" -#include "evolution-shell-component-client.h" - -struct _EComponentRegistry { - GObject parent; - - EComponentRegistryPrivate *priv; -}; - -struct _EComponentRegistryClass { - GObjectClass 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, - CORBA_Environment *ev); - -GList *e_component_registry_get_id_list (EComponentRegistry *component_registry); - -EvolutionShellComponentClient *e_component_registry_get_component_by_id (EComponentRegistry *component_registry, - const char *id); - -EvolutionShellComponentClient *e_component_registry_restart_component (EComponentRegistry *component_registry, - const char *id, - CORBA_Environment *ev); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __E_COMPONENT_REGISTRY_H__ */ diff --git a/shell/e-config-upgrade.c b/shell/e-config-upgrade.c deleted file mode 100644 index 48f141bde8..0000000000 --- a/shell/e-config-upgrade.c +++ /dev/null @@ -1,1879 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-upgrade.c - upgrade previous config versions - * - * Copyright (C) 2003 Ximian, Inc. - * - * Authors: Michael Zucchi <notzed@ximian.com> - * Jeffery Stedfast <fejj@ximian.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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. - * - */ - -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <unistd.h> - -#include <stdio.h> -#include <errno.h> -#include <regex.h> -#include <string.h> -#include <ctype.h> - -#include <glib.h> -#include <gconf/gconf.h> -#include <gconf/gconf-client.h> - -#include <libxml/xmlmemory.h> -#include <libxml/parser.h> -#include <libxml/tree.h> - -#include "e-config-upgrade.h" - -#define d(x) - -/* output revision of configuration */ -#define CONF_MAJOR (1) -#define CONF_MINOR (3) -#define CONF_REVISION (1) - -/* major/minor/revision of existing config */ -static unsigned int major = -1; -static unsigned int minor = -1; -static unsigned int revision = -1; - -/* 1.0 details, if required */ -static GHashTable *accounts_1_0 = NULL; -static GHashTable *accounts_name_1_0 = NULL; - -/* where files are stored */ -static const char *evolution_dir; - -static char hexnib[256] = { - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1, - -1,10,11,12,13,14,15,16,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,10,11,12,13,14,15,16,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -}; - -static char *hex_decode(const char *val) -{ - char *o, *res; - const unsigned char *p = (const unsigned char *)val; - - o = res = g_malloc(strlen(val)/2 + 1); - for (p=val;(p[0] && p[1]);p+=2) - *o++ = (hexnib[p[0]] << 4) | hexnib[p[1]]; - *o = 0; - - return res; -} - -static char *url_decode(const char *val) -{ - char *o, *res, c; - const unsigned char *p = (const unsigned char *)val; - - o = res = g_malloc(strlen(val) + 1); - while (*p) { - c = *p++; - if (c == '%' - && hexnib[p[0]] != -1 && hexnib[p[1]] != -1) { - *o++ = (hexnib[p[0]] << 4) | hexnib[p[1]]; - p+=2; - } else - *o++ = c; - } - *o = 0; - - return res; -} - -/* so we dont need camel, just copy here */ -static int -camel_file_util_decode_uint32 (FILE *in, guint32 *dest) -{ - guint32 value = 0; - int v; - - /* until we get the last byte, keep decoding 7 bits at a time */ - while ( ((v = fgetc (in)) & 0x80) == 0 && v!=EOF) { - value |= v; - value <<= 7; - } - if (v == EOF) { - *dest = value >> 7; - return -1; - } - *dest = value | (v & 0x7f); - - return 0; -} - -static int -camel_file_util_decode_string (FILE *in, char **str) -{ - guint32 len; - register char *ret; - - if (camel_file_util_decode_uint32 (in, &len) == -1) { - *str = NULL; - return -1; - } - - len--; - if (len > 65536) { - *str = NULL; - return -1; - } - - ret = g_malloc (len+1); - if (len > 0 && fread (ret, len, 1, in) != 1) { - g_free (ret); - *str = NULL; - return -1; - } - - ret[len] = 0; - *str = ret; - return 0; -} - -/* For 1.0.8 conversion */ - -/* as much info as we have on a given account */ -struct _account_info { - char *name; - char *uri; - char *base_uri; - union { - struct { - /* for imap */ - char *namespace; - char *namespace_full; - guint32 capabilities; - GHashTable *folders; - char dir_sep; - } imap; - } u; -}; - -struct _imap_folder_info { - char *folder; - /* encoded? decoded? canonicalised? */ - char dir_sep; -}; - -static char *parse_lsub(const char *lsub, char *dir_sep) -{ - static int comp; - static regex_t pat; - regmatch_t match[3]; - char *m = "^\\* LSUB \\([^)]*\\) \"?([^\" ]+)\"? \"?(.*)\"?$"; - - if (!comp) { - if (regcomp(&pat, m, REG_EXTENDED|REG_ICASE) == -1) { - g_warning("reg comp '%s' failed: %s", m, g_strerror(errno)); - return NULL; - } - comp = 1; - } - - if (regexec(&pat, lsub, 3, match, 0) == 0) { - if (match[1].rm_so != -1 && match[2].rm_so != -1) { - if (dir_sep) - *dir_sep = (match[1].rm_eo - match[1].rm_so == 1) ? lsub[match[1].rm_so] : 0; - return g_strndup(lsub + match[2].rm_so, match[2].rm_eo - match[2].rm_so); - } - } - - return NULL; -} - -static int read_imap_storeinfo(struct _account_info *si) -{ - FILE *storeinfo; - guint32 tmp; - char *buf, *folder, dir_sep, *path, *name, *p; - struct _imap_folder_info *fi; - - si->u.imap.folders = g_hash_table_new(g_str_hash, g_str_equal); - - /* get details from uri first */ - name = strstr(si->uri, ";override_namespace"); - if (name) { - name = strstr(si->uri, ";namespace="); - if (name) { - char *end; - - name += strlen(";namespace="); - if (*name == '\"') { - name++; - end = strchr(name, '\"'); - } else { - end = strchr(name, ';'); - } - - if (end) { - /* try get the dir_sep from the namespace */ - si->u.imap.namespace = g_strndup(name, end-name); - - p = si->u.imap.namespace; - while ((dir_sep = *p++)) { - if (dir_sep < '0' - || (dir_sep > '9' && dir_sep < 'A') - || (dir_sep > 'Z' && dir_sep < 'a') - || (dir_sep > 'z')) { - si->u.imap.dir_sep = dir_sep; - break; - } - p++; - } - } - } - } - - /* now load storeinfo if it exists */ - path = g_build_filename(evolution_dir, "mail/imap", si->base_uri+7, "storeinfo", NULL); - storeinfo = fopen(path, "r"); - g_free(path); - if (storeinfo == NULL) { - g_warning("could not find imap store info '%s'", path); - return -1; - } - - /* ignore version */ - camel_file_util_decode_uint32(storeinfo, &tmp); - camel_file_util_decode_uint32(storeinfo, &si->u.imap.capabilities); - g_free(si->u.imap.namespace); - camel_file_util_decode_string (storeinfo, &si->u.imap.namespace); - camel_file_util_decode_uint32 (storeinfo, &tmp); - si->u.imap.dir_sep = tmp; - /* strip trailing dir_sep or / */ - if (si->u.imap.namespace - && (si->u.imap.namespace[strlen(si->u.imap.namespace)-1] == si->u.imap.dir_sep - || si->u.imap.namespace[strlen(si->u.imap.namespace)-1] == '/')) { - si->u.imap.namespace[strlen(si->u.imap.namespace)-1] = 0; - } - - d(printf("namespace '%s' dir_sep '%c'\n", si->u.imap.namespace, si->u.imap.dir_sep?si->u.imap.dir_sep:'?')); - - while (camel_file_util_decode_string (storeinfo, &buf) == 0) { - folder = parse_lsub(buf, &dir_sep); - if (folder) { - fi = g_malloc0(sizeof(*fi)); - fi->folder = folder; - fi->dir_sep = dir_sep; -#if d(!)0 - printf(" add folder '%s' ", folder); - if (dir_sep) - printf("'%c'\n", dir_sep); - else - printf("NIL\n"); -#endif - g_hash_table_insert(si->u.imap.folders, fi->folder, fi); - } else { - g_warning("Could not parse LIST result '%s'\n", buf); - } - } - fclose(storeinfo); - - return 0; -} - -static char *get_base_uri(const char *val) -{ - const char *tmp; - - tmp = strchr(val, ':'); - if (tmp) { - tmp++; - if (strncmp(tmp, "//", 2) == 0) - tmp += 2; - tmp = strchr(tmp, '/'); - } - - if (tmp) - return g_strndup(val, tmp-val); - else - return g_strdup(val); -} - -static char *upgrade_uri(const char *uri) -{ - char *out = NULL; - - /* upgrades camel uri's */ - - if (major <=1 && minor < 2) { - if (strncmp(uri, "imap:", 5) == 0) { - char *base_uri, dir_sep, *folder, *p; - struct _account_info *ai; - - /* add namespace, canonicalise dir_sep to / */ - base_uri = get_base_uri(uri); - ai = g_hash_table_lookup(accounts_1_0, base_uri); - - if (ai == NULL) { - g_free(base_uri); - return NULL; - } - - dir_sep = ai->u.imap.dir_sep; - if (dir_sep == 0) { - /* no dir_sep listed, try get it from the namespace, if set */ - if (ai->u.imap.namespace != NULL) { - p = ai->u.imap.namespace; - while ((dir_sep = *p++)) { - if (dir_sep < '0' - || (dir_sep > '9' && dir_sep < 'A') - || (dir_sep > 'Z' && dir_sep < 'a') - || (dir_sep > 'z')) { - break; - } - p++; - } - } - - /* give up ... */ - if (dir_sep == 0) { - g_free(base_uri); - return NULL; - } - } - - folder = g_strdup(uri + strlen(base_uri)+1); - - /* Add the namespace before the mailbox name, unless the mailbox is INBOX */ - if (ai->u.imap.namespace && strcmp(folder, "INBOX") != 0) - out = g_strdup_printf("%s/%s/%s", base_uri, ai->u.imap.namespace, folder); - else - out = g_strdup_printf("%s/%s", base_uri, folder); - - p = out; - while (*p) { - if (*p == dir_sep) - *p = '/'; - p++; - } - - g_free(folder); - g_free(base_uri); - } else if (strncmp(uri, "exchange:", 9) == 0) { - char *base_uri, *folder, *p; - - /* exchange://user@host/exchange/ * -> exchange://user@host/personal/ * */ - /* Any url encoding (%xx) in the folder name is also removed */ - base_uri = get_base_uri(uri); - uri += strlen(base_uri) + 1; - if (strncmp(uri, "exchange/", 9) == 0) { - folder = url_decode(uri+9); - p = strchr(folder, '/'); - out = g_strdup_printf("%s/personal%s", base_uri, p?p:"/"); - g_free(folder); - } - } else if (strncmp(uri, "exchanget:", 10) == 0) { - /* these should be converted in the accounts table when it is loaded */ - g_warning("exchanget: uri not converted: '%s'", uri); - } - } - - return out; -} - -static char *upgrade_evolution_uri(const char *uri) -{ - char *out = NULL; - - if (!strcmp (uri, "evolution:/local/Inbox")) { - return g_strdup("default:mail"); - } else if (!strcmp (uri, "evolution:/local/Calendar")) { - return g_strdup("default:calendar"); - } else if (!strcmp (uri, "evolution:/local/Contacts")) { - return g_strdup("default:contacts"); - } else if (!strcmp (uri, "evolution:/local/Tasks")) { - return g_strdup("default:tasks"); - } if (!strncmp(uri, "evolution:/", 11)) { - char *account, *tmp, *folder, *p; - struct _account_info *ai; - - d(printf("convert url '%s'\n", uri)); - tmp = strchr(uri+11, '/'); - if (tmp == NULL) - return NULL; - - folder = *tmp?tmp+1:tmp; - account = g_strndup(uri+11, tmp-uri-11); - d(printf(" looking for account '%s'\n", account)); - ai = g_hash_table_lookup(accounts_name_1_0, account); - if (ai && !strncmp(ai->base_uri, "imap:", 5)) { - /* Add namespace to evolution url's of imap accounts, if the account uses a namespace */ - d(printf("found account ... '%s', folder = '%s'\n", ai->name, folder)); - - if (ai->u.imap.namespace && strcmp(folder, "INBOX") != 0) - out = g_strdup_printf("evolution:/%s/%s/%s", account, ai->u.imap.namespace, folder); - else - out = g_strdup_printf("evolution:/%s/%s", account, folder); - - if (ai->u.imap.dir_sep) { - p = out + strlen("evolution://") + strlen(account); - while (*p) { - if (*p == ai->u.imap.dir_sep) - *p = '/'; - p++; - } - } - } else if (ai && !strncmp(ai->base_uri, "exchange:", 9)) { - /* add personal to exchange url's */ - folder = url_decode(folder); - out = g_strdup_printf("evolution:/%s/personal/%s", account, folder); - g_free(folder); - } - g_free(account); - } - - return out; -} - -static char *upgrade_type(const char *type) -{ - char *res = NULL; - - /* - <item type="ldap-contacts ...> - to - <item type="contacts/ldap ...> - */ - - if (strcmp(type, "ldap-contacts") == 0) - res = g_strdup("contacts/ldap"); - - return res; -} - -enum { - CONVERT_CONTENT, - CONVERT_ARG, -}; - -struct _convert { - int type; - char *tag; - char *arg; - char *(*convert)(const char *val); -} convert_table [] = { - /* fix evolution uri's in shortcuts file */ - { CONVERT_CONTENT, "item", NULL, upgrade_evolution_uri }, - /* ldap item/type's converted from ldap-contacts to contacts/ldap */ - { CONVERT_ARG, "item", "type", upgrade_type }, - /* fix folder uri's in filters/vfolders */ - { CONVERT_ARG, "folder", "uri", upgrade_uri }, -}; - -#define CONVERT_SIZEOF (sizeof(convert_table)/sizeof(convert_table[0])) - -static int upgrade_xml_1_0_rec(xmlNodePtr node) -{ - int i; - struct _convert *ct; - int scan = TRUE; - int work = FALSE; - char *txt, *newtxt; - - for (i=0;i<CONVERT_SIZEOF;i++) { - ct = &convert_table[i]; - if (!strcmp(node->name, ct->tag)) { - switch(ct->type) { - case CONVERT_CONTENT: - txt = xmlNodeGetContent(node); - newtxt = ct->convert(txt); - d(printf("Upgrade content '%s': '%s' -> '%s'\n", ct->tag, txt, newtxt?newtxt:"unchanged")); - xmlFree(txt); - if (newtxt) { - xmlNodeSetContent(node, newtxt); - g_free(newtxt); - work = TRUE; - } - scan = FALSE; - break; - case CONVERT_ARG: - txt = xmlGetProp(node, ct->arg); - if (txt) { - newtxt = ct->convert(txt); - d(printf("Upgrade prop '%s' '%s': '%s' -> '%s'\n", ct->tag, ct->arg, txt, newtxt?newtxt:"unchanged")); - xmlFree(txt); - if (newtxt) { - xmlSetProp(node, ct->arg, newtxt); - g_free(newtxt); - work = TRUE; - } - } - break; - } - } - } - - if (scan) { - node = node->children; - while (node) { - work |= upgrade_xml_1_0_rec(node); - node = node->next; - } - } - - return work; -} - -/* ********************************************************************** */ -/* XML 1 content encoding */ - -static int -is_xml1encoded(const char *txt) -{ - const unsigned char *p; - int isxml1 = FALSE; - int is8bit = FALSE; - - p = (const unsigned char *)txt; - while (*p) { - if (p[0] == '\\' && p[1] == 'U' && p[2] == '+' - && isxdigit(p[3]) && isxdigit(p[4]) && isxdigit(p[5]) && isxdigit(p[6]) - && p[7] == '\\') { - isxml1 = TRUE; - p+=7; - } else if (p[0] >= 0x80) - is8bit = TRUE; - p++; - } - - /* check for invalid utf8 that needs cleaning */ - if (is8bit && (!isxml1)) - isxml1 = !g_utf8_validate(txt, -1, NULL); - - return isxml1; -} - -static char * -decode_xml1(const char *txt) -{ - GString *out = g_string_new(""); - const unsigned char *p; - char *res; - - /* convert: - \U+XXXX\ -> utf8 - 8 bit characters -> utf8 (iso-8859-1) */ - - p = (const unsigned char *)txt; - while (*p) { - if (p[0] > 0x80 - || (p[0] == '\\' && p[1] == 'U' && p[2] == '+' - && isxdigit(p[3]) && isxdigit(p[4]) && isxdigit(p[5]) && isxdigit(p[6]) - && p[7] == '\\')) { - char utf8[8]; - gunichar u; - - if (p[0] == '\\') { - memcpy(utf8, p+3, 4); - utf8[4] = 0; - u = strtoul(utf8, NULL, 16); - p+=7; - } else - u = p[0]; - utf8[g_unichar_to_utf8(u, utf8)] = 0; - g_string_append(out, utf8); - } else { - g_string_append_c(out, *p); - } - p++; - } - - res = out->str; - g_string_free(out, FALSE); - - return res; -} - -static int -upgrade_xml_1_2_rec(xmlNodePtr node) -{ - const char *value_tags[] = { "string", "address", "regex", "file", "command", NULL }; - const char *rule_tags[] = { "title", NULL }; - const struct { - char *name; - const char **tags; - } tags[] = { - { "value", value_tags }, - { "rule", rule_tags }, - { 0 }, - }; - int changed = 0; - xmlNodePtr work; - int i,j; - char *txt, *tmp; - - /* upgrades the content of a node, if the node has a specific parent/node name */ - - for (i=0;tags[i].name;i++) { - if (!strcmp(node->name, tags[i].name)) { - work = node->children; - while (work) { - for (j=0;tags[i].tags[j];j++) { - if (!strcmp(work->name, tags[i].tags[j])) { - txt = xmlNodeGetContent(work); - if (is_xml1encoded(txt)) { - tmp = decode_xml1(txt); - d(printf("upgrading xml node %s/%s '%s' -> '%s'\n", tags[i].name, tags[i].tags[j], txt, tmp)); - xmlNodeSetContent(work, tmp); - changed = 1; - g_free(tmp); - } - xmlFree(txt); - } - } - work = work->next; - } - break; - } - } - - node = node->children; - while (node) { - changed |= upgrade_xml_1_2_rec(node); - node = node->next; - } - - return changed; -} - -/* ********************************************************************** */ - -static int upgrade_xml_file(const char *filename, int (*upgrade_rec)(xmlNodePtr root)) -{ - xmlDocPtr doc; - char *savename; - struct stat st; - int res; - - /* FIXME: do something nicer with the errors */ - - savename = alloca(strlen(filename)+64); - sprintf(savename, "%s.save-%u.%u.%u", filename, major, minor, revision); - if (stat(savename, &st) == 0) { - fprintf(stderr, "xml file `%s' already upgraded\n", filename); - return 0; - } - - /* no file, no error */ - if (stat(filename, &st) == -1) - return 0; - - doc = xmlParseFile (filename); - if (!doc || !doc->xmlRootNode) { - fprintf (stderr, "Failed to load %s\n", filename); - return -1; - } - - if (!upgrade_rec(doc->xmlRootNode)) { - xmlFreeDoc(doc); - printf("file %s contains nothing to upgrade\n", filename); - return 0; - } - - d(printf("backing up %s to %s\n", filename, savename)); - - if (rename(filename, savename) == -1) { - xmlFreeDoc(doc); - fprintf(stderr, "could not rename '%s' to '%s': %s\n", filename, savename, strerror(errno)); - return -1; - } - - res = xmlSaveFormatFile(filename, doc, 1); - - xmlFreeDoc(doc); - - return res; -} - -/* ********************************************************************** */ -/* Tables for converting flat bonobo conf -> gconf xml blob */ -/* ********************************************************************** */ - -/* for remapping bonobo-conf account data into the new xml blob format */ -/* These are used in build_xml, and order must match the lookup_table */ -enum _map_t { - MAP_END = 0, /* end of line*/ - MAP_BOOL, /* bool -> prop of name 'to' value true or false */ - MAP_LONG, /* long -> prop of name 'to' value a long */ - MAP_STRING, /* string -> prop of name 'to' */ - MAP_ENUM, /* long/bool -> prop of name 'to', with the value indexed into the child map table's from field */ - MAP_CHILD, /* a new child of name 'to' */ - MAP_MASK = 0x3f, - MAP_URI_UPGRADE = 0x40, /* if from 1.0.x, upgrade any uri's present */ - MAP_CONTENT = 0x80, /* if set, create a new node of name 'to' instead of a property */ -}; - -struct _map_table { - char *from; - char *to; - int type; - struct _map_table *child; -}; - -/* Mail/Accounts/ * */ -struct _map_table cc_map[] = { - { "account_always_cc_%i", "always", MAP_BOOL }, - { "account_always_cc_addrs_%i", "recipients", MAP_STRING|MAP_CONTENT }, - { NULL }, -}; - -struct _map_table bcc_map[] = { - { "account_always_cc_%i", "always", MAP_BOOL }, - { "account_always_bcc_addrs_%i", "recipients", MAP_STRING|MAP_CONTENT }, - { NULL }, -}; - -struct _map_table pgp_map[] = { - { "account_pgp_encrypt_to_self_%i", "encrypt-to-self", MAP_BOOL }, - { "account_pgp_always_trust_%i", "always-trust", MAP_BOOL }, - { "account_pgp_always_sign_%i", "always-sign", MAP_BOOL }, - { "account_pgp_no_imip_sign_%i", "no-imip-sign", MAP_BOOL }, - { "account_pgp_key_%i", "key-id", MAP_STRING|MAP_CONTENT }, - { NULL }, -}; - -struct _map_table smime_map[] = { - { "account_smime_encrypt_to_self_%i", "encrypt-to-self", MAP_BOOL }, - { "account_smime_always_sign_%i", "always-sign", MAP_BOOL }, - { "account_smime_key_%i", "key-id", MAP_STRING|MAP_CONTENT }, - { NULL }, -}; - -struct _map_table identity_sig_map[] = { - { "identity_autogenerated_signature_%i", "auto", MAP_BOOL }, - { "identity_def_signature_%i", "default", MAP_LONG }, - { NULL }, -}; - -struct _map_table identity_map[] = { - { "identity_name_%i", "name", MAP_STRING|MAP_CONTENT }, - { "identity_address_%i", "addr-spec", MAP_STRING|MAP_CONTENT }, - { "identity_reply_to_%i", "reply-to", MAP_STRING|MAP_CONTENT }, - { "identity_organization_%i", "organization", MAP_STRING|MAP_CONTENT }, - { NULL, "signature", MAP_CHILD, identity_sig_map }, - { NULL }, -}; - -struct _map_table source_map[] = { - { "source_save_passwd_%i", "save-passwd", MAP_BOOL }, - { "source_keep_on_server_%i", "keep-on-server", MAP_BOOL }, - { "source_auto_check_%i", "auto-check", MAP_BOOL }, - { "source_auto_check_time_%i", "auto-check-timeout", MAP_LONG }, - { "source_url_%i", "url", MAP_STRING|MAP_CONTENT }, - { NULL }, -}; - -struct _map_table transport_map[] = { - { "transport_save_passwd_%i", "save-passwd", MAP_BOOL }, - { "transport_url_%i", "url", MAP_STRING|MAP_CONTENT|MAP_URI_UPGRADE }, - { NULL }, -}; - -struct _map_table account_map[] = { - { "account_name_%i", "name", MAP_STRING }, - { "source_enabled_%i", "enabled", MAP_BOOL }, - { NULL, "identity", MAP_CHILD, identity_map }, - { NULL, "source", MAP_CHILD, source_map }, - { NULL, "transport", MAP_CHILD, transport_map }, - { "account_drafts_folder_uri_%i", "drafts-folder", MAP_STRING|MAP_CONTENT|MAP_URI_UPGRADE }, - { "account_sent_folder_uri_%i", "sent-folder", MAP_STRING|MAP_CONTENT|MAP_URI_UPGRADE }, - { NULL, "auto-cc", MAP_CHILD, cc_map }, - { NULL, "auto-bcc", MAP_CHILD, bcc_map }, - { NULL, "pgp", MAP_CHILD, pgp_map }, - { NULL, "smime", MAP_CHILD, smime_map }, - { NULL }, -}; - -/* /Mail/Signatures/ * */ -struct _map_table signature_format_map[] = { - { "text/plain", }, - { "text/html", }, - { NULL } -}; - -struct _map_table signature_map[] = { - { "name_%i", "name", MAP_STRING }, - { "html_%i", "format", MAP_ENUM, signature_format_map }, - { "filename_%i", "filename", MAP_STRING|MAP_CONTENT }, - { "script_%i", "script", MAP_STRING|MAP_CONTENT }, - { NULL }, -}; - - -static char *get_name(const char *in, int index) -{ - char c, *res; - GString *out = g_string_new(""); - - while ( (c = *in++) ) { - if (c == '%') { - c = *in++; - switch(c) { - case '%': - g_string_append_c(out, '%'); - break; - case 'i': - g_string_append_printf(out, "%d", index); - break; - } - } else { - g_string_append_c(out, c); - } - } - - res = out->str; - g_string_free(out, FALSE); - - return res; -} - -static xmlNodePtr lookup_bconf_entry(xmlNodePtr source, const char *name) -{ - xmlNodePtr node = source->children; - int found; - char *val; - - while (node) { - if (!strcmp(node->name, "entry")) { - val = xmlGetProp(node, "name"); - found = val && strcmp(val, name) == 0; - xmlFree(val); - if (found) - break; - } - node = node->next; - } - - return node; -} - -static char *lookup_bconf_value(xmlNodePtr source, const char *name) -{ - xmlNodePtr node = lookup_bconf_entry(source, name); - - if (node) - return xmlGetProp(node, "value"); - else - return NULL; -} - -static xmlNodePtr lookup_bconf_path(xmlDocPtr doc, const char *path) -{ - xmlNodePtr root; - char *val; - int found; - - root = doc->children; - if (strcmp(root->name, "bonobo-config") != 0) { - g_warning("not bonobo-config xml file\n"); - return NULL; - } - - root = root->children; - while (root) { - if (!strcmp(root->name, "section")) { - val = xmlGetProp(root, "path"); - found = val && strcmp(val, path) == 0; - xmlFree(val); - if (found) - break; - } - root = root->next; - } - - return root; -} - - -static char *lookup_bool(xmlNodePtr source, const char *name, struct _map_table *map) -{ - char *val, *res; - - val = lookup_bconf_value(source, name); - if (val) { - res = g_strdup(val[0] == '1'?"true":"false"); - xmlFree(val); - } else - res = NULL; - - return res; -} - -static char *lookup_long(xmlNodePtr source, const char *name, struct _map_table *map) -{ - char *val, *res; - - val = lookup_bconf_value(source, name); - if (val) { - res = g_strdup(val); - xmlFree(val); - } else - res = NULL; - - return res; -} - -static char *lookup_string(xmlNodePtr source, const char *name, struct _map_table *map) -{ - char *val, *res; - - val = lookup_bconf_value(source, name); - if (val) { - res = hex_decode(val); - xmlFree(val); - } else - res = NULL; - - return res; -} - -static char *lookup_enum(xmlNodePtr source, const char *name, struct _map_table *map) -{ - char *val; - int index = 0, i; - - val = lookup_bconf_value(source, name); - if (val) { - index = atoi(val); - xmlFree(val); - } - - for (i=0;map->child[i].from;i++) - if (i == index) - return g_strdup(map->child[i].from); - - return NULL; -} - -typedef char * (*lookup_func) (xmlNodePtr, const char *, struct _map_table *); - -static void -build_xml(xmlNodePtr root, struct _map_table *map, int index, xmlNodePtr source) -{ - char *name, *value; - xmlNodePtr node; - lookup_func lookup_table[] = { lookup_bool, lookup_long, lookup_string, lookup_enum }; - - while (map->type != MAP_END) { - if ((map->type & MAP_MASK) == MAP_CHILD) { - node = xmlNewChild(root, NULL, map->to, NULL); - build_xml(node, map->child, index, source); - } else { - name = get_name(map->from, index); - value = lookup_table[(map->type&MAP_MASK)-1](source, name, map); - - d(printf("key '%s=%s' -> ", name, value)); - - if (map->type & MAP_URI_UPGRADE) { - char *tmp = value; - - value = upgrade_uri(tmp); - if (value) - g_free(tmp); - else - value = tmp; - } - - d(printf("'%s=%s'\n", map->to, value)); - - if (map->type & MAP_CONTENT) { - if (value && value[0]) - xmlNewTextChild(root, NULL, map->to, value); - } else { - xmlSetProp(root, map->to, value); - } - g_free(value); - g_free(name); - } - map++; - } -} - -static int convert_xml_blob(GConfClient *gconf, xmlDocPtr doc, struct _map_table *map, const char *path, const char *outpath, const char *name, const char *idparam) -{ - xmlNodePtr source; - int count = 0, i; - GSList *list, *l; - char *val; - - source = lookup_bconf_path(doc, path); - if (source) { - list = NULL; - val = lookup_bconf_value(source, "num"); - if (val) { - count = atoi(val); - xmlFree(val); - } - - d(printf("Found %d blobs at %s\n", count, path)); - - for (i = 0; i<count;i++) { - xmlDocPtr docout; - xmlChar *xmlbuf; - int n; - xmlNodePtr root; - - docout = xmlNewDoc ("1.0"); - root = xmlNewDocNode (docout, NULL, name, NULL); - xmlDocSetRootElement (docout, root); - - /* This could be set with a MAP_UID type ... */ - if (idparam) { - char buf[16]; - - sprintf(buf, "%d", i); - xmlSetProp(root, idparam, buf); - } - - build_xml(root, map, i, source); - - xmlDocDumpMemory (docout, &xmlbuf, &n); - xmlFreeDoc (docout); - - list = g_slist_append(list, xmlbuf); - } - - gconf_client_set_list(gconf, outpath, GCONF_VALUE_STRING, list, NULL); - while (list) { - l = list->next; - xmlFree(list->data); - g_slist_free_1(list); - list = l; - } - } else { - g_warning("could not find '%s' in old config database, skipping", path); - } - - return 0; -} - -/* ********************************************************************** */ -/* Tables for bonobo conf -> gconf conversion */ -/* ********************************************************************** */ - -/* order important here, used to index a few tables below */ -enum { - BMAP_BOOL, - BMAP_BOOLNOT, - BMAP_INT, - BMAP_STRING, - BMAP_SIMPLESTRING, /* a non-encoded string */ - BMAP_COLOUR, - BMAP_FLOAT, /* bloody floats, who uses floats ... idiots */ - BMAP_STRLIST, /* strings separated to !<-->! -> gconf list */ - BMAP_ANYLIST, /* corba sequence corba string -> gconf list */ - BMAP_MASK = 0x7f, - BMAP_LIST = 0x80 /* from includes a %i field for the index of the key, to be converted to a list of type BMAP_* */ -}; - -struct _gconf_map { - char *from; - char *to; - int type; -}; - -/* ********************************************************************** */ - -static struct _gconf_map mail_accounts_map[] = { - /* /Mail/Accounts - most entries are processed via the xml blob routine */ - /* This also works because the initial uid mapping is 1:1 with the list order */ - { "default_account", "mail/default_account", BMAP_SIMPLESTRING }, - { 0 }, -}; - -static struct _gconf_map mail_display_map[] = { - /* /Mail/Display */ - { "thread_list", "mail/display/thread_list", BMAP_BOOL }, - { "thread_subject", "mail/display/thread_subject", BMAP_BOOL }, - { "hide_deleted", "mail/display/show_deleted", BMAP_BOOLNOT }, - { "preview_pane", "mail/display/show_preview", BMAP_BOOL }, - { "paned_size", "mail/display/paned_size", BMAP_INT }, - { "seen_timeout", "mail/display/mark_seen_timeout", BMAP_INT }, - { "do_seen_timeout", "mail/display/mark_seen", BMAP_BOOL }, - { "http_images", "mail/display/load_http_images", BMAP_INT }, - { "citation_highlight", "mail/display/mark_citations", BMAP_BOOL }, - { "citation_color", "mail/display/citation_colour", BMAP_COLOUR }, - { "x_mailer_display_style", "mail/display/xmailer_mask", BMAP_INT }, - { 0 }, -}; - -static struct _gconf_map mail_format_map[] = { - /* /Mail/Format */ - { "message_display_style", "mail/display/message_style", BMAP_INT }, - { "send_html", "mail/composer/send_html", BMAP_BOOL }, - { "default_reply_style", "mail/format/reply_style", BMAP_INT }, - { "default_forward_style", "mail/format/forward_style", BMAP_INT }, - { "default_charset", "mail/composer/charset", BMAP_STRING }, - { "confirm_unwanted_html", "mail/prompts/unwanted_html", BMAP_BOOL }, - { 0 }, -}; - -static struct _gconf_map mail_trash_map[] = { - /* /Mail/Trash */ - { "empty_on_exit", "mail/trash/empty_on_exit", BMAP_BOOL }, - { 0 }, -}; - -static struct _gconf_map mail_prompts_map[] = { - /* /Mail/Prompts */ - { "confirm_expunge", "mail/prompts/expunge", BMAP_BOOL }, - { "empty_subject", "mail/prompts/empty_subject", BMAP_BOOL }, - { "only_bcc", "mail/prompts/only_bcc", BMAP_BOOL }, - { 0 } -}; - -static struct _gconf_map mail_filters_map[] = { - /* /Mail/Filters */ - { "log", "mail/filters/log", BMAP_BOOL }, - { "log_path", "mail/filters/logfile", BMAP_STRING }, - { 0 } -}; - -static struct _gconf_map mail_notify_map[] = { - /* /Mail/Notify */ - { "new_mail_notification", "mail/notify/type", BMAP_INT }, - { "new_mail_notification_sound_file", "mail/notify/sound", BMAP_STRING }, - { 0 } -}; - -static struct _gconf_map mail_filesel_map[] = { - /* /Mail/Filesel */ - { "last_filesel_dir", "mail/save_dir", BMAP_STRING }, - { 0 } -}; - -static struct _gconf_map mail_composer_map[] = { - /* /Mail/Composer */ - { "ViewFrom", "mail/composer/view/From", BMAP_BOOL }, - { "ViewReplyTo", "mail/composer/view/ReplyTo", BMAP_BOOL }, - { "ViewCC", "mail/composer/view/Cc", BMAP_BOOL }, - { "ViewBCC", "mail/composer/view/Bcc", BMAP_BOOL }, - { "ViewSubject", "mail/composer/view/Subject", BMAP_BOOL }, - { 0 }, -}; - -/* ********************************************************************** */ - -static struct _gconf_map importer_elm_map[] = { - /* /Importer/Elm */ - { "mail", "importer/elm/mail", BMAP_BOOL }, - { "mail-imported", "importer/elm/mail-imported", BMAP_BOOL }, - { 0 }, -}; - -static struct _gconf_map importer_pine_map[] = { - /* /Importer/Pine */ - { "mail", "importer/elm/mail", BMAP_BOOL }, - { "address", "importer/elm/address", BMAP_BOOL }, - { 0 }, -}; - -static struct _gconf_map importer_netscape_map[] = { - /* /Importer/Netscape */ - { "mail", "importer/netscape/mail", BMAP_BOOL }, - { "settings", "importer/netscape/settings", BMAP_BOOL }, - { "filters", "importer/netscape/filters", BMAP_BOOL }, - { 0 }, -}; - -/* ********************************************************************** */ - -static struct _gconf_map myev_mail_map[] = { - /* /My-Evolution/Mail */ - { "show_full_path", "summary/mail/show_full_paths", BMAP_BOOL }, - { 0 }, -}; - -static struct _gconf_map myev_rdf_map[] = { - /* /My-Evolution/RDF */ - { "rdf_urls", "summary/rdf/uris", BMAP_STRLIST }, - { "rdf_refresh_time", "summary/rdf/refresh_time", BMAP_INT }, - { "limit", "summary/rdf/max_items", BMAP_INT }, - { 0 }, -}; - -static struct _gconf_map myev_weather_map[] = { - /* /My-Evolution/Weather */ - { "stations", "summary/weather/stations", BMAP_STRLIST }, - { "units", "summary/weather/use_metric", BMAP_BOOL }, /* this is use_metric bool in 1.3? */ - { "weather_refresh_time", "summary/weather/refresh_time", BMAP_INT }, - { 0 }, -}; - -static struct _gconf_map myev_schedule_map[] = { - /* /My-Evolution/Shedule */ - { "show_tasks", "summary/tasks/show_all", BMAP_BOOL }, /* this is show_all bool in 1.3? */ - { 0 }, -}; - -/* ********************************************************************** */ - -/* This grabs the defaults from the first view ... (?) */ -static struct _gconf_map shell_views_map[] = { - /* /Shell/Views/0 */ - { "Width", "shell/view_defaults/width", BMAP_INT }, - { "Height", "shell/view_defaults/height", BMAP_INT }, - { "CurrentShortcutsGroupNum", "shell/view_defaults/selected_shortcut_group", BMAP_INT }, - { "FolderBarShown", "shell/view_defaults/show_folder_bar", BMAP_BOOL }, - { "ShortcutBarShown", "shell/view_defaults/show_shortcut_bar", BMAP_BOOL }, - { "HPanedPosition", "shell/view_defaults/shortcut_bar/width", BMAP_INT }, - { "ViewPanedPosition", "shell/view_defaults/folder_bar/width", BMAP_INT }, - { "DisplayedURI", "shell/view_defaults/folder_path", BMAP_STRING }, - { 0 }, -}; - -static struct _gconf_map offlinefolders_map[] = { - /* /OfflineFolders */ - { "paths", "shell/offline/folder_paths", BMAP_ANYLIST }, - { 0 }, -}; - -static struct _gconf_map defaultfolders_map[] = { - /* /DefaultFolders */ - { "mail_path", "shell/default_folders/mail_path", BMAP_STRING }, - { "mail_uri", "shell/default_folders/mail_uri", BMAP_STRING }, - { "contacts_path", "shell/default_folders/contacts_path", BMAP_STRING }, - { "contacts_uri", "shell/default_folders/contacts_uri", BMAP_STRING }, - { "calendar_path", "shell/default_folders/calendar_path", BMAP_STRING }, - { "calendar_uri", "shell/default_folders/calendar_uri", BMAP_STRING }, - { "tasks_path", "shell/default_folders/tasks_path", BMAP_STRING }, - { "tasks_uri", "shell/default_folders/tasks_uri", BMAP_STRING }, - { 0 }, -}; - -static struct _gconf_map shell_map[] = { - /* /Shell */ - { "StartOffline", "shell/start_offline", BMAP_BOOL }, - { 0 }, -}; - -/* ********************************************************************** */ - -static struct _gconf_map addressbook_map[] = { - /* /Addressbook */ - { "select_names_uri", "addressbook/select_names/last_used_uri", BMAP_STRING }, - { 0 }, -}; - -static struct _gconf_map addressbook_completion_map[] = { - /* /Addressbook/Completion */ - { "uris", "addressbook/completion/uris", BMAP_STRING }, - { 0 }, -}; - -/* ********************************************************************** */ - -static struct _gconf_map calendar_display_map[] = { - /* /Calendar/Display */ - { "Timezone", "calendar/display/timezone", BMAP_STRING }, - { "Use24HourFormat", "calendar/display/use_24hour_format", BMAP_BOOL }, - { "WeekStartDay", "calendar/display/week_start_day", BMAP_INT }, - { "DayStartHour", "calendar/display/day_start_hour", BMAP_INT }, - { "DayStartMinute", "calendar/display/day_start_minute", BMAP_INT }, - { "DayEndHour", "calendar/display/day_end_hour", BMAP_INT }, - { "DayEndMinute", "calendar/display/day_end_minute", BMAP_INT }, - { "TimeDivisions", "calendar/display/time_divisions", BMAP_INT }, - { "View", "calendar/display/default_view", BMAP_INT }, - { "HPanePosition", "calendar/display/hpane_position", BMAP_FLOAT }, - { "VPanePosition", "calendar/display/vpane_position", BMAP_FLOAT }, - { "MonthHPanePosition", "calendar/display/month_hpane_position", BMAP_FLOAT }, - { "MonthVPanePosition", "calendar/display/month_vpane_position", BMAP_FLOAT }, - { "CompressWeekend", "calendar/display/compress_weekend", BMAP_BOOL }, - { "ShowEventEndTime", "calendar/display/show_event_end", BMAP_BOOL }, - { "WorkingDays", "calendar/display/working_days", BMAP_INT }, - { 0 }, -}; - -static struct _gconf_map calendar_tasks_map[] = { - /* /Calendar/Tasks */ - { "HideCompletedTasks", "calendar/tasks/hide_completed", BMAP_BOOL }, - { "HideCompletedTasksUnits", "calendar/tasks/hide_completed_units", BMAP_STRING }, - { "HideCompletedTasksValue", "calendar/tasks/hide_completed_value", BMAP_INT }, - { 0 }, -}; - -static struct _gconf_map calendar_tasks_colours_map[] = { - /* /Calendar/Tasks/Colors */ - { "TasksDueToday", "calendar/tasks/colors/due_today", BMAP_STRING }, - { "TasksOverDue", "calendar/tasks/colors/overdue", BMAP_STRING }, - { "TasksDueToday", "calendar/tasks/colors/due_today", BMAP_STRING }, - { 0 }, -}; - -static struct _gconf_map calendar_other_map[] = { - /* /Calendar/Other */ - { "ConfirmDelete", "calendar/prompts/confirm_delete", BMAP_BOOL }, - { "ConfirmExpunge", "calendar/prompts/confirm_expunge", BMAP_BOOL }, - { "UseDefaultReminder", "calendar/other/use_default_reminder", BMAP_BOOL }, - { "DefaultReminderInterval", "calendar/other/default_reminder_interval", BMAP_INT }, - { "DefaultReminderUnits", "calendar/other/default_reminder_units", BMAP_STRING }, - { 0 }, -}; - -static struct _gconf_map calendar_datenavigator_map[] = { - /* /Calendar/DateNavigator */ - { "ShowWeekNumbers", "calendar/date_navigator/show_week_numbers", BMAP_BOOL }, - { 0 }, -}; - -static struct _gconf_map calendar_alarmnotify_map[] = { - /* /Calendar/AlarmNotify */ - { "LastNotificationTime", "calendar/notify/last_notification_time", BMAP_INT }, - { "CalendarToLoad%i", "calendar/notify/calendars", BMAP_STRING|BMAP_LIST }, - { "BlessedProgram%i", "calendar/notify/programs", BMAP_STRING|BMAP_LIST }, - { 0 }, -}; - -/* ********************************************************************** */ - -static struct { - char *root; - struct _gconf_map *map; -} gconf_remap_list[] = { - { "/Mail/Accounts", mail_accounts_map }, - { "/Mail/Display", mail_display_map }, - { "/Mail/Format", mail_format_map }, - { "/Mail/Trash", mail_trash_map }, - { "/Mail/Prompts", mail_prompts_map }, - { "/Mail/Filters", mail_filters_map }, - { "/Mail/Notify", mail_notify_map }, - { "/Mail/Filesel", mail_filesel_map }, - { "/Mail/Composer", mail_composer_map }, - - { "/Importer/Elm", importer_elm_map }, - { "/Importer/Pine", importer_pine_map }, - { "/Importer/Netscape", importer_netscape_map }, - - { "My-Evolution/Mail", myev_mail_map }, - { "My-Evolution/RDF", myev_rdf_map }, - { "My-Evolution/Weather", myev_weather_map }, - { "My-Evolution/Schedule", myev_schedule_map }, - - { "/Shell", shell_map }, - { "/Shell/Views/0", shell_views_map }, - { "/OfflineFolders", offlinefolders_map }, - { "/DefaultFolders", defaultfolders_map }, - - { "/Addressbook", addressbook_map }, - { "/Addressbook/Completion", addressbook_completion_map }, - - { "/Calendar/Display", calendar_display_map }, - { "/Calendar/Tasks", calendar_tasks_map }, - { "/Calendar/Tasks/Colors", calendar_tasks_colours_map }, - { "/Calendar/Other/Map", calendar_other_map }, - { "/Calendar/DateNavigator", calendar_datenavigator_map }, - { "/Calendar/AlarmNotify", calendar_alarmnotify_map }, - - { 0 }, -}; - -#define N_(x) x - -struct { - char *label; - char *colour; -} label_default[5] = { - { N_("Important"), "#ff0000" }, /* red */ - { N_("Work"), "#ff8c00" }, /* orange */ - { N_("Personal"), "#008b00" }, /* forest green */ - { N_("To Do"), "#0000ff" }, /* blue */ - { N_("Later"), "#8b008b" } /* magenta */ -}; - -/* remaps mail config from bconf to gconf */ -static int import_bonobo_config(xmlDocPtr config_doc, GConfClient *gconf) -{ - xmlNodePtr source; - int i, j, k; - struct _gconf_map *map; - char *path, *val, *tmp; - GSList *list, *l; - char buf[32]; - - /* process all flat config */ - for (i=0;gconf_remap_list[i].root;i++) { - d(printf("Path: %s\n", gconf_remap_list[i].root)); - source = lookup_bconf_path(config_doc, gconf_remap_list[i].root); - if (source == NULL) - continue; - map = gconf_remap_list[i].map; - for (j=0;map[j].from;j++) { - if (map[j].type & BMAP_LIST) { - /* collapse a multi-entry indexed field into a list */ - list = NULL; - k = 0; - do { - path = get_name(map[j].from, k); - val = lookup_bconf_value(source, path); - d(printf("finding path '%s' = '%s'\n", path, val)); - g_free(path); - if (val) { - switch(map[j].type & BMAP_MASK) { - case BMAP_BOOL: - case BMAP_INT: - list = g_slist_append(list, GINT_TO_POINTER(atoi(val))); - break; - case BMAP_STRING: - d(printf(" -> '%s'\n", hex_decode(val))); - list = g_slist_append(list, hex_decode(val)); - break; - } - xmlFree(val); - k++; - } - } while (val); - - if (list) { - const int gconf_type[] = { GCONF_VALUE_BOOL, GCONF_VALUE_BOOL, GCONF_VALUE_INT, GCONF_VALUE_STRING, GCONF_VALUE_STRING }; - - path = g_strdup_printf("/apps/evolution/%s", map[j].to); - gconf_client_set_list(gconf, path, gconf_type[map[j].type & BMAP_MASK], list, NULL); - g_free(path); - if ((map[j].type & BMAP_MASK) == BMAP_STRING) - g_slist_foreach(list, (GFunc)g_free, NULL); - g_slist_free(list); - } - - continue; - } else if (map[j].type == BMAP_ANYLIST) - val = NULL; - else { - val = lookup_bconf_value(source, map[j].from); - if (val == NULL) - continue; - } - d(printf(" %s = '%s' -> %s [%d]\n", - map[j].from, - val == NULL ? "(null)" : val, - map[j].to, - map[j].type)); - path = g_strdup_printf("/apps/evolution/%s", map[j].to); - switch(map[j].type) { - case BMAP_BOOL: - gconf_client_set_bool(gconf, path, atoi(val), NULL); - break; - case BMAP_BOOLNOT: - gconf_client_set_bool(gconf, path, !atoi(val), NULL); - break; - case BMAP_INT: - gconf_client_set_int(gconf, path, atoi(val), NULL); - break; - case BMAP_STRING: - tmp = hex_decode(val); - gconf_client_set_string(gconf, path, tmp, NULL); - g_free(tmp); - break; - case BMAP_SIMPLESTRING: - gconf_client_set_string(gconf, path, val, NULL); - break; - case BMAP_FLOAT: - gconf_client_set_float(gconf, path, strtod(val, NULL), NULL); - break; - case BMAP_STRLIST:{ - char *v = hex_decode(val); - char **t = g_strsplit (v, " !<-->! ", 8196); - - list = NULL; - for (k=0;t[k];k++) { - list = g_slist_append(list, t[k]); - d(printf(" [%d] = '%s'\n", k, t[k])); - } - gconf_client_set_list(gconf, path, GCONF_VALUE_STRING, list, NULL); - g_slist_free(list); - g_strfreev(t); - g_free(v); - break;} - case BMAP_ANYLIST:{ - xmlNodePtr node = source->children; - list = NULL; - - /* find the entry node */ - while (node) { - if (!strcmp(node->name, "entry")) { - int found; - - tmp = xmlGetProp(node, "name"); - if (tmp) { - found = strcmp(tmp, map[j].from) == 0; - xmlFree(tmp); - if (found) - break; - } - } - node = node->next; - } - - /* find the the any block */ - if (node) { - node = node->children; - while (node) { - if (strcmp(node->name, "any") == 0) - break; - node = node->next; - } - } - - /* skip to the value inside it */ - if (node) { - node = node->children; - while (node) { - if (strcmp(node->name, "value") == 0) - break; - node = node->next; - } - } - - if (node) { - node = node->children; - while (node) { - if (strcmp(node->name, "value") == 0) - list = g_slist_append(list, xmlNodeGetContent(node)); - node = node->next; - } - } - - /* & store */ - if (list) { - gconf_client_set_list(gconf, path, GCONF_VALUE_STRING, list, NULL); - while (list) { - l = list->next; - xmlFree(list->data); - g_slist_free_1(list); - list = l; - } - } - - break;} - case BMAP_COLOUR: - sprintf(buf, "#%06x", atoi(val) & 0xffffff); - gconf_client_set_string(gconf, path, buf, NULL); - break; - } - /* FIXME: handle errors */ - g_free(path); - xmlFree(val); - } - } - - /* Labels: - label string + label colour as integer - -> label string:# colour as hex */ - source = lookup_bconf_path(config_doc, "/Mail/Labels"); - if (source) { - list = NULL; - for (i=0;i<5;i++) { - char labx[16], colx[16]; - char *lab, *col; - - sprintf(labx, "label_%d", i); - sprintf(colx, "color_%d", i); - lab = lookup_string(source, labx, NULL); - col = lookup_bconf_value(source, colx); - if (col) { - sprintf(colx, "#%06x", atoi(col) & 0xffffff); - xmlFree(col); - } else - strcpy(colx, label_default[i].colour); - val = g_strdup_printf("%s:%s", lab?lab:label_default[i].label, colx); - list = g_slist_append(list, val); - g_free(lab); - } - - gconf_client_set_list(gconf, "/apps/evolution/mail/labels", GCONF_VALUE_STRING, list, NULL); - while (list) { - l = list->next; - g_free(list->data); - g_slist_free_1(list); - list = l; - } - } else { - g_warning("could not find /Mail/Labels in old config database, skipping"); - } - - /* Accounts: The flat bonobo-config structure is remapped to a list of xml blobs. Upgrades as necessary */ - convert_xml_blob(gconf, config_doc, account_map, "/Mail/Accounts", "/apps/evolution/mail/accounts", "account", "uid"); - /* Same for signatures */ - convert_xml_blob(gconf, config_doc, signature_map, "/Mail/Signatures", "/apps/evolution/mail/signatures", "signature", NULL); - - /* My-Evolution folder lists */ - source = lookup_bconf_path(config_doc, "My-Evolution/Mail"); - if (source) { - char **t; - - list = NULL; - l = NULL; - - val = lookup_string(source, "display_folders-1.2", NULL); - /* FIXME: what needs upgrading here? Anything? */ - if (val == NULL) - val = lookup_string(source, "display_folders", NULL); - - if (val) { - t = g_strsplit (val, " !<-->! ", 8196); - for (i=0;t[i] && t[i+1];i+=2) { - list = g_slist_append(list, t[i]); - l = g_slist_append(l, t[i+1]); - d(printf(" [%d] = euri: '%s', puri: '%s'\n", i, t[i], t[i+1])); - } - if (list) { - gconf_client_set_list(gconf, "/apps/evolution/summary/mail/folder_evolution_uris", GCONF_VALUE_STRING, list, NULL); - g_slist_free(list); - } - if (l) { - gconf_client_set_list(gconf, "/apps/evolution/summary/mail/folder_physical_uris", GCONF_VALUE_STRING, l, NULL); - g_slist_free(l); - } - g_strfreev(t); - } - } - - return 0; -} - - -static int load_accounts_1_0(xmlDocPtr doc) -{ - xmlNodePtr source; - char *val, *tmp; - int count = 0, i; - char key[32]; - - source = lookup_bconf_path(doc, "/Mail/Accounts"); - if (source == NULL) - return 0; - - val = lookup_bconf_value(source, "num"); - if (val) { - count = atoi(val); - xmlFree(val); - } - - /* load account upgrade info for each account */ - for (i=0;i<count;i++) { - struct _account_info *ai; - char *rawuri; - - sprintf(key, "source_url_%d", i); - rawuri = lookup_bconf_value(source, key); - if (rawuri == NULL) - continue; - ai = g_malloc0(sizeof(*ai)); - ai->uri = hex_decode(rawuri); - ai->base_uri = get_base_uri(ai->uri); - sprintf(key, "account_name_%d", i); - ai->name = lookup_string(source, key, NULL); - - d(printf("load account '%s'\n", ai->uri)); - - if (!strncmp(ai->uri, "imap:", 5)) { - read_imap_storeinfo(ai); - } else if (!strncmp(ai->uri, "exchange:", 9)) { - xmlNodePtr node; - - d(printf(" upgrade exchange account\n")); - /* small hack, poke the source_url into the transport_url for exchanget: transports - - this will be picked up later in the conversion */ - sprintf(key, "transport_url_%d", i); - node = lookup_bconf_entry(source, key); - if (node - && (val = xmlGetProp(node, "value"))) { - tmp = hex_decode(val); - xmlFree(val); - if (strncmp(tmp, "exchanget:", 10) == 0) - xmlSetProp(node, "value", rawuri); - g_free(tmp); - } else { - d(printf(" couldn't find transport uri?\n")); - } - } - xmlFree(rawuri); - - g_hash_table_insert(accounts_1_0, ai->base_uri, ai); - if (ai->name) - g_hash_table_insert(accounts_name_1_0, ai->name, ai); - } - - return 0; -} - -/** - * e_config_upgrade: - * @edir: - * - * Upgrade evolution configuration from prior versions of evolution to - * the current one. - * - * No work is performed if the configuration version is up to date. - * - * The tracked version is upgraded to the latest even if no - * configuration upgrades are required for that version. - * - * Further information about how this is intended to work: - * - * There are 3 basic steps, numbered in the comments below. - * 1. Determine the current config verison - * 2. Upgrade to the current source version - * 3. Save the version number, as defined by CONF_MAJOR, CONF_MINOR, - * CONF_REVISION. These are all treated as integers, so 10 is - * greater than 9. - * - * 1 and 3 should not need changing. After an upgrade to 1.3.x and - * until the config system changes again (!), step one becomes - * trivial. Any changes to part 2 should be added to the end of the - * section, or as required. This allows for very fine-grained version - * upgrades, including pre-release and patch-level changes to fix - * config problems which may have lasted for a single version or - * patch, in which case CONF_REVISION can be bumped. - * - * At any time, the CONF_VERSION/MAJOR/REVISION can be increased to - * match the source release, even if no new configuration changes will - * be required from the previous version. This should be done at each - * release in case bugs in that configuration version are required to - * be fixed at any time in the future. - * - * Return value: -1 on an error. - **/ -int -e_config_upgrade(const char *edir) -{ - xmlNodePtr source; - xmlDocPtr config_doc = NULL; - int i; - char *val, *tmp; - GConfClient *gconf; - int res = -1; - struct stat st; - - evolution_dir = edir; - - /* 1. determine existing version */ - gconf = gconf_client_get_default(); - val = gconf_client_get_string(gconf, "/apps/evolution/version", NULL); - if (val) { - sscanf(val, "%u.%u.%u", &major, &minor, &revision); - g_free(val); - } else { - char *filename = g_build_filename(evolution_dir, "config.xmldb", NULL); - - if (lstat(filename, &st) == 0 - && S_ISREG(st.st_mode)) - config_doc = xmlParseFile (filename); - g_free(filename); - - tmp = NULL; - if ( config_doc - && (source = lookup_bconf_path(config_doc, "/Shell")) - && (tmp = lookup_bconf_value(source, "upgrade_from_1_0_to_1_2_performed")) - && tmp[0] == '1' ) { - major = 1; - minor = 2; - revision = 0; - } else { - major = 1; - minor = 0; - revision = 0; - } - if (tmp) - xmlFree(tmp); - } - - /* 2. Now perform any upgrade duties */ - - d(printf("current config version is '%u.%u.%u'\n", major, minor, revision)); - - /* For 1.0.x we need to load the accounts first, as data it initialises is used elsewhere */ - if (major <=1 && minor < 2) { - char *xml_files[] = { "vfolders.xml", "filters.xml", "shortcuts.xml" }; - - /* load in 1.0 info */ - if (config_doc) { - accounts_1_0 = g_hash_table_new(g_str_hash, g_str_equal); - accounts_name_1_0 = g_hash_table_new(g_str_hash, g_str_equal); - load_accounts_1_0(config_doc); - } - - /* upgrade xml uri fields */ - for (i=0;i<sizeof(xml_files)/sizeof(xml_files[0]);i++) { - char *path; - - path = g_build_filename(evolution_dir, xml_files[i], NULL); - if (upgrade_xml_file(path, upgrade_xml_1_0_rec) == -1) - g_warning("Could not upgrade xml file %s", xml_files[i]); - - g_free(path); - } - } - - if (config_doc && major <=1 && minor < 3) { - /* move bonobo config to gconf */ - if (import_bonobo_config(config_doc, gconf) == -1) { - g_warning("Could not move config from bonobo-conf to gconf"); - goto error; - } - } - - if (major <=1 && minor <=3 && revision < 1) { - /* check for xml 1 encoding from version 1.2 upgrade or from a previous previous 1.3.0 upgrade */ - char *xml_files[] = { "vfolders.xml", "filters.xml" }; - - d(printf("Checking for xml1 format xml files\n")); - - for (i=0;i<sizeof(xml_files)/sizeof(xml_files[0]);i++) { - char *path; - - path = g_build_filename(evolution_dir, xml_files[i], NULL); - if (upgrade_xml_file(path, upgrade_xml_1_2_rec) == -1) - g_warning("Could not upgrade xml file %s", xml_files[i]); - - g_free(path); - } - } - - /* 3. we're done, update our version info if its changed */ - if (major < CONF_MAJOR - || minor < CONF_MINOR - || revision < CONF_REVISION) { - val = g_strdup_printf("%u.%u.%u", CONF_MAJOR, CONF_MINOR, CONF_REVISION); - gconf_client_set_string(gconf, "/apps/evolution/version", val, NULL); - /* TODO: should this be translatable? */ - g_message("Evolution configuration upgraded to version: %s", val); - g_free(val); - gconf_client_suggest_sync(gconf, NULL); - } - - res = 0; - -error: - if (config_doc) - xmlFreeDoc(config_doc); - - return res; -} diff --git a/shell/e-config-upgrade.h b/shell/e-config-upgrade.h deleted file mode 100644 index c012e30526..0000000000 --- a/shell/e-config-upgrade.h +++ /dev/null @@ -1,28 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-config-upgrade.h - * - * Copyright (C) 2003 Ximian, Inc. - * - * Author: Michael Zucchi <notzed@ximian.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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. - */ - -#ifndef _E_CONFIG_UPGRADE_H -#define _E_CONFIG_UPGRADE_H - -int e_config_upgrade(const char *edir); - -#endif /* _E_CONFIG_UPGRADE_H */ diff --git a/shell/e-corba-config-page.c b/shell/e-corba-config-page.c deleted file mode 100644 index e594a5a89d..0000000000 --- a/shell/e-corba-config-page.c +++ /dev/null @@ -1,265 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-corba-config-page.c - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-corba-config-page.h" - -#include "Evolution.h" - -#include <string.h> -#include <gal/util/e-util.h> - -#include <bonobo/bonobo-widget.h> -#include <bonobo/bonobo-exception.h> -#include <bonobo/bonobo-object.h> -#include <bonobo/bonobo-listener.h> - - -#define PARENT_TYPE e_config_page_get_type () -static EConfigPageClass *parent_class = NULL; - -struct _ECorbaConfigPagePrivate { - GNOME_Evolution_ConfigControl config_control_interface; - - BonoboListener *listener; - - Bonobo_EventSource event_source; -}; - - -/* ::ConfigControl interface handling. */ - -static void -listener_event_callback (BonoboListener *listener, - const char *event_name, - const CORBA_any *any, - CORBA_Environment *ev, - void *data) -{ - ECorbaConfigPage *corba_config_page; - - corba_config_page = E_CORBA_CONFIG_PAGE (data); - - if (strcmp (event_name, "changed") == 0) - e_config_page_changed (E_CONFIG_PAGE (corba_config_page)); -} - -static void -setup_listener (ECorbaConfigPage *corba_config_page, - GNOME_Evolution_ConfigControl config_control_interface) -{ - ECorbaConfigPagePrivate *priv; - Bonobo_EventSource event_source; - CORBA_Environment ev; - - priv = corba_config_page->priv; - - CORBA_exception_init (&ev); - - event_source = GNOME_Evolution_ConfigControl__get_eventSource (config_control_interface, &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Cannot get eventSource interface for ConfigPage -- %s", BONOBO_EX_REPOID (&ev)); - } else { - priv->listener = bonobo_listener_new (listener_event_callback, corba_config_page); - Bonobo_EventSource_addListener (event_source, - bonobo_object_corba_objref (BONOBO_OBJECT (priv->listener)), - &ev); - - if (! BONOBO_EX (&ev)) { - priv->config_control_interface = config_control_interface; - priv->event_source = event_source; - } else { - g_warning ("Cannot add listener for ConfigPage -- %s", BONOBO_EX_REPOID (&ev)); - - bonobo_object_unref (BONOBO_OBJECT (priv->listener)); - priv->listener = NULL; - } - } - - CORBA_exception_free (&ev); -} - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - ECorbaConfigPage *corba_config_page; - ECorbaConfigPagePrivate *priv; - CORBA_Environment ev; - - corba_config_page = E_CORBA_CONFIG_PAGE (object); - priv = corba_config_page->priv; - - CORBA_exception_init (&ev); - - if (priv->config_control_interface != CORBA_OBJECT_NIL) { - bonobo_object_release_unref (priv->config_control_interface, &ev); - priv->config_control_interface = CORBA_OBJECT_NIL; - } - - if (priv->listener != NULL) { - Bonobo_EventSource_removeListener (priv->event_source, - bonobo_object_corba_objref (BONOBO_OBJECT (priv->listener)), - &ev); - - bonobo_object_unref (BONOBO_OBJECT (priv->listener)); - bonobo_object_release_unref (priv->event_source, &ev); - - priv->event_source = CORBA_OBJECT_NIL; - priv->listener = NULL; - } - - CORBA_exception_free (&ev); - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - ECorbaConfigPage *corba_config_page; - ECorbaConfigPagePrivate *priv; - - corba_config_page = E_CORBA_CONFIG_PAGE (object); - priv = corba_config_page->priv; - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -/* EConfigPage methods. */ - -static void -impl_apply (EConfigPage *config_page) -{ - ECorbaConfigPage *corba_config_page; - ECorbaConfigPagePrivate *priv; - CORBA_Environment ev; - - corba_config_page = E_CORBA_CONFIG_PAGE (config_page); - priv = corba_config_page->priv; - - CORBA_exception_init (&ev); - - GNOME_Evolution_ConfigControl_apply (priv->config_control_interface, &ev); - - if (BONOBO_EX (&ev)) - g_warning ("Cannot apply settings -- %s", BONOBO_EX_REPOID (&ev)); - - CORBA_exception_free (&ev); -} - - -/* GTK+ ctors. */ - -static void -class_init (ECorbaConfigPageClass *class) -{ - GObjectClass *object_class; - EConfigPageClass *config_page_class; - - object_class = G_OBJECT_CLASS (class); - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - config_page_class = E_CONFIG_PAGE_CLASS (class); - config_page_class->apply = impl_apply; - - parent_class = g_type_class_ref(PARENT_TYPE); -} - -static void -init (ECorbaConfigPage *corba_config_page) -{ - ECorbaConfigPagePrivate *priv; - - priv = g_new (ECorbaConfigPagePrivate, 1); - priv->config_control_interface = CORBA_OBJECT_NIL; - priv->listener = NULL; - priv->event_source = CORBA_OBJECT_NIL; - - corba_config_page->priv = priv; -} - - -gboolean -e_corba_config_page_construct (ECorbaConfigPage *corba_config_page, - GNOME_Evolution_ConfigControl corba_object) -{ - Bonobo_Control control; - GtkWidget *control_widget; - CORBA_Environment ev; - - g_return_val_if_fail (E_IS_CORBA_CONFIG_PAGE (corba_config_page), FALSE); - g_return_val_if_fail (corba_object != CORBA_OBJECT_NIL, FALSE); - - CORBA_exception_init (&ev); - - control = GNOME_Evolution_ConfigControl__get_control (corba_object, &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Can't get control from ::ConfigControl -- %s", BONOBO_EX_REPOID (&ev)); - CORBA_exception_init (&ev); - return FALSE; - } - - control_widget = bonobo_widget_new_control_from_objref (control, CORBA_OBJECT_NIL); - gtk_widget_show (control_widget); - gtk_container_add (GTK_CONTAINER (corba_config_page), control_widget); - gtk_container_set_border_width (GTK_CONTAINER (corba_config_page), 6); - - setup_listener (corba_config_page, corba_object); - - /* Notice we *don't* unref the corba_object here as - bonobo_widget_new_control_from_objref() effectively takes ownership - for the object that we get from ::__get_control. */ - - CORBA_exception_free (&ev); - - return TRUE; -} - -GtkWidget * -e_corba_config_page_new_from_objref (GNOME_Evolution_ConfigControl corba_object) -{ - ECorbaConfigPage *corba_config_page; - - g_return_val_if_fail (corba_object != CORBA_OBJECT_NIL, NULL); - g_return_val_if_fail (corba_object != CORBA_OBJECT_NIL, NULL); - - corba_config_page = g_object_new (e_corba_config_page_get_type (), NULL); - if (! e_corba_config_page_construct (corba_config_page, corba_object)) { - gtk_widget_destroy (GTK_WIDGET (corba_config_page)); - return NULL; - } - - return GTK_WIDGET (corba_config_page); -} - - -E_MAKE_TYPE (e_corba_config_page, "ECorbaConfigPgae", ECorbaConfigPage, class_init, init, PARENT_TYPE) diff --git a/shell/e-corba-config-page.h b/shell/e-corba-config-page.h deleted file mode 100644 index 5e3d4276a8..0000000000 --- a/shell/e-corba-config-page.h +++ /dev/null @@ -1,68 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-corba-config-page.h - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifndef _E_CORBA_CONFIG_PAGE_H_ -#define _E_CORBA_CONFIG_PAGE_H_ - -#include "e-config-page.h" - -#include "Evolution.h" - -#include <bonobo/bonobo-object.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_CORBA_CONFIG_PAGE (e_corba_config_page_get_type ()) -#define E_CORBA_CONFIG_PAGE(obj) (GTK_CHECK_CAST ((obj), E_TYPE_CORBA_CONFIG_PAGE, ECorbaConfigPage)) -#define E_CORBA_CONFIG_PAGE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_CORBA_CONFIG_PAGE, ECorbaConfigPageClass)) -#define E_IS_CORBA_CONFIG_PAGE(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_CORBA_CONFIG_PAGE)) -#define E_IS_CORBA_CONFIG_PAGE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_CORBA_CONFIG_PAGE)) - - -typedef struct _ECorbaConfigPage ECorbaConfigPage; -typedef struct _ECorbaConfigPagePrivate ECorbaConfigPagePrivate; -typedef struct _ECorbaConfigPageClass ECorbaConfigPageClass; - -struct _ECorbaConfigPage { - EConfigPage parent; - - ECorbaConfigPagePrivate *priv; -}; - -struct _ECorbaConfigPageClass { - EConfigPageClass parent_class; -}; - - -GtkType e_corba_config_page_get_type (void); -GtkWidget *e_corba_config_page_new_from_objref (GNOME_Evolution_ConfigControl objref); -gboolean e_corba_config_page_construct (ECorbaConfigPage *corba_config_page, - GNOME_Evolution_ConfigControl objref); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_CORBA_CONFIG_PAGE_H_ */ diff --git a/shell/e-corba-shortcuts.c b/shell/e-corba-shortcuts.c deleted file mode 100644 index 46bebb2249..0000000000 --- a/shell/e-corba-shortcuts.c +++ /dev/null @@ -1,349 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-corba-shortcuts.c - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -/* FIXME: Doesn't throw exceptions properly. */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-corba-shortcuts.h" - -#include "e-util/e-corba-utils.h" - -#include <gal/util/e-util.h> - - -#define PARENT_TYPE bonobo_object_get_type () -static BonoboObjectClass *parent_class = NULL; - -struct _ECorbaShortcutsPrivate { - EShortcuts *shortcuts; -}; - - -/* Utility functions. */ - -static const char * -string_from_corba (CORBA_char *corba_string) -{ - if (corba_string[0] == '\0') - return NULL; - - return corba_string; -} - -static void -shortcut_list_to_corba (const GSList *shortcut_list, - GNOME_Evolution_Shortcuts_ShortcutList *shortcut_list_return) -{ - GNOME_Evolution_Shortcuts_Shortcut *buffer; - const GSList *p; - int num_shortcuts; - int i; - - num_shortcuts = g_slist_length ((GSList *) shortcut_list); /* safe cast, GLib sucks */ - - shortcut_list_return->_maximum = num_shortcuts; - shortcut_list_return->_length = num_shortcuts; - - buffer = CORBA_sequence_GNOME_Evolution_Shortcuts_Shortcut_allocbuf (num_shortcuts); - shortcut_list_return->_buffer = buffer; - - for (p = shortcut_list, i = 0; p != NULL; p = p->next, i++) { - const EShortcutItem *item; - - item = (const EShortcutItem *) p->data; - - buffer[i].uri = CORBA_string_dup (e_safe_corba_string (item->uri)); - buffer[i].name = CORBA_string_dup (e_safe_corba_string (item->name)); - buffer[i].type = CORBA_string_dup (e_safe_corba_string (item->type)); - buffer[i].customIconName = CORBA_string_dup (e_safe_corba_string (item->custom_icon_name)); - } - - CORBA_sequence_set_release (shortcut_list_return, TRUE); -} - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - ECorbaShortcuts *corba_shortcuts; - ECorbaShortcutsPrivate *priv; - - corba_shortcuts = E_CORBA_SHORTCUTS (object); - priv = corba_shortcuts->priv; - - if (priv->shortcuts != NULL) { - g_object_unref (priv->shortcuts); - priv->shortcuts = NULL; - } - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - ECorbaShortcuts *corba_shortcuts; - - corba_shortcuts = E_CORBA_SHORTCUTS (object); - - g_free (corba_shortcuts->priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -/* Evolution::Shortcuts CORBA methods. */ - -static void -impl_add (PortableServer_Servant servant, - const CORBA_short group_num, - const CORBA_short position, - const GNOME_Evolution_Shortcuts_Shortcut *shortcut, - CORBA_Environment *ev) -{ - ECorbaShortcuts *corba_shortcuts; - ECorbaShortcutsPrivate *priv; - - corba_shortcuts = E_CORBA_SHORTCUTS (bonobo_object_from_servant (servant)); - priv = corba_shortcuts->priv; - - e_shortcuts_add_shortcut (priv->shortcuts, group_num, position, - string_from_corba (shortcut->uri), - string_from_corba (shortcut->name), - 0, - string_from_corba (shortcut->type), - string_from_corba (shortcut->customIconName)); -} - -static void -impl_remove (PortableServer_Servant servant, - const CORBA_short group_num, - const CORBA_short item_num, - CORBA_Environment *ev) -{ - ECorbaShortcuts *corba_shortcuts; - ECorbaShortcutsPrivate *priv; - - corba_shortcuts = E_CORBA_SHORTCUTS (bonobo_object_from_servant (servant)); - priv = corba_shortcuts->priv; - - e_shortcuts_remove_shortcut (priv->shortcuts, group_num, item_num); -} - -static GNOME_Evolution_Shortcuts_Shortcut * -impl_get (PortableServer_Servant servant, - const CORBA_short group_num, - const CORBA_short item_num, - CORBA_Environment *ev) -{ - ECorbaShortcuts *corba_shortcuts; - ECorbaShortcutsPrivate *priv; - GNOME_Evolution_Shortcuts_Shortcut *retval; - const EShortcutItem *item; - - corba_shortcuts = E_CORBA_SHORTCUTS (bonobo_object_from_servant (servant)); - priv = corba_shortcuts->priv; - - item = e_shortcuts_get_shortcut (priv->shortcuts, group_num, item_num); - if (item == NULL) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_Shortcuts_NotFound, NULL); - return NULL; - } - - retval = GNOME_Evolution_Shortcuts_Shortcut__alloc (); - retval->uri = CORBA_string_dup (e_safe_corba_string (item->uri)); - retval->name = CORBA_string_dup (e_safe_corba_string (item->name)); - retval->type = CORBA_string_dup (e_safe_corba_string (item->type)); - retval->customIconName = CORBA_string_dup (e_safe_corba_string (item->custom_icon_name)); - - return retval; -} - -static void -impl_addGroup (PortableServer_Servant servant, - const CORBA_short position, - const CORBA_char *name, - CORBA_Environment *ev) -{ - ECorbaShortcuts *corba_shortcuts; - ECorbaShortcutsPrivate *priv; - - corba_shortcuts = E_CORBA_SHORTCUTS (bonobo_object_from_servant (servant)); - priv = corba_shortcuts->priv; - - if (position == 0) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_Shortcuts_InvalidPosition, NULL); - return; - } - - e_shortcuts_add_group (priv->shortcuts, position, name); -} - -static void -impl_removeGroup (PortableServer_Servant servant, - const CORBA_short group_num, - CORBA_Environment *ev) -{ - ECorbaShortcuts *corba_shortcuts; - ECorbaShortcutsPrivate *priv; - - corba_shortcuts = E_CORBA_SHORTCUTS (bonobo_object_from_servant (servant)); - priv = corba_shortcuts->priv; - - if (group_num == 0) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_Shortcuts_CannotRemove, NULL); - return; - } - - e_shortcuts_remove_group (priv->shortcuts, group_num); -} - -static GNOME_Evolution_Shortcuts_Group * -impl_getGroup (PortableServer_Servant servant, - const CORBA_short group_num, - CORBA_Environment *ev) -{ - ECorbaShortcuts *corba_shortcuts; - ECorbaShortcutsPrivate *priv; - GNOME_Evolution_Shortcuts_Group *group; - const GSList *list; - - corba_shortcuts = E_CORBA_SHORTCUTS (bonobo_object_from_servant (servant)); - priv = corba_shortcuts->priv; - - list = e_shortcuts_get_shortcuts_in_group (priv->shortcuts, group_num); - - group = GNOME_Evolution_Shortcuts_Group__alloc (); - - group->name = CORBA_string_dup (e_shortcuts_get_group_title (priv->shortcuts, group_num)); - - shortcut_list_to_corba (list, & group->shortcuts); - - return group; -} - -static CORBA_sequence_GNOME_Evolution_Shortcuts_Group * -impl__get_groups (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - GNOME_Evolution_Shortcuts_GroupList *list; - ECorbaShortcuts *corba_shortcuts; - ECorbaShortcutsPrivate *priv; - GSList *group_titles; - const GSList *p; - int i; - - corba_shortcuts = E_CORBA_SHORTCUTS (bonobo_object_from_servant (servant)); - priv = corba_shortcuts->priv; - - list = GNOME_Evolution_Shortcuts_GroupList__alloc (); - list->_length = e_shortcuts_get_num_groups (priv->shortcuts); - list->_maximum = list->_length; - list->_buffer = CORBA_sequence_GNOME_Evolution_Shortcuts_Group_allocbuf (list->_maximum); - - CORBA_sequence_set_release (list, TRUE); - - group_titles = e_shortcuts_get_group_titles (priv->shortcuts); - for (p = group_titles, i = 0; p != NULL; p = p->next, i ++) { - char *group_title; - const GSList *shortcuts; - - group_title = (char *) p->data; - - shortcuts = e_shortcuts_get_shortcuts_in_group (priv->shortcuts, i); - - list->_buffer[i].name = CORBA_string_dup (group_title); - shortcut_list_to_corba (shortcuts, &list->_buffer[i].shortcuts); - - g_free (group_title); - } - - g_slist_free (group_titles); - - return list; -} - - -static void -e_corba_shortcuts_class_init (GObjectClass *object_class) -{ - ECorbaShortcutsClass *corba_shortcuts_class; - POA_GNOME_Evolution_Shortcuts__epv *epv; - - parent_class = g_type_class_ref(PARENT_TYPE); - - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - corba_shortcuts_class = E_CORBA_SHORTCUTS_CLASS (object_class); - - epv = & corba_shortcuts_class->epv; - epv->add = impl_add; - epv->remove = impl_remove; - epv->get = impl_get; - epv->addGroup = impl_addGroup; - epv->removeGroup = impl_removeGroup; - epv->getGroup = impl_getGroup; - epv->_get_groups = impl__get_groups; -} - -static void -e_corba_shortcuts_init (ECorbaShortcuts *corba_shortcuts) -{ - ECorbaShortcutsPrivate *priv; - - priv = g_new (ECorbaShortcutsPrivate, 1); - priv->shortcuts = NULL; - - corba_shortcuts->priv = priv; -} - - -ECorbaShortcuts * -e_corba_shortcuts_new (EShortcuts *shortcuts) -{ - ECorbaShortcuts *corba_shortcuts; - - g_return_val_if_fail (shortcuts != NULL, NULL); - g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), NULL); - - corba_shortcuts = g_object_new (e_corba_shortcuts_get_type (), NULL); - - g_object_ref (shortcuts); - corba_shortcuts->priv->shortcuts = shortcuts; - - return corba_shortcuts; -} - - -BONOBO_TYPE_FUNC_FULL (ECorbaShortcuts, - GNOME_Evolution_Shortcuts, - PARENT_TYPE, - e_corba_shortcuts) diff --git a/shell/e-corba-shortcuts.h b/shell/e-corba-shortcuts.h deleted file mode 100644 index 8d6ff97adc..0000000000 --- a/shell/e-corba-shortcuts.h +++ /dev/null @@ -1,66 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-corba-shortcuts.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifndef _E_CORBA_SHORTCUTS_H_ -#define _E_CORBA_SHORTCUTS_H_ - -#include "e-shortcuts.h" - -#include <bonobo/bonobo-object.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_CORBA_SHORTCUTS (e_corba_shortcuts_get_type ()) -#define E_CORBA_SHORTCUTS(obj) (GTK_CHECK_CAST ((obj), E_TYPE_CORBA_SHORTCUTS, ECorbaShortcuts)) -#define E_CORBA_SHORTCUTS_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_CORBA_SHORTCUTS, ECorbaShortcutsClass)) -#define E_IS_CORBA_SHORTCUTS(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_CORBA_SHORTCUTS)) -#define E_IS_CORBA_SHORTCUTS_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_CORBA_SHORTCUTS)) - - -typedef struct _ECorbaShortcuts ECorbaShortcuts; -typedef struct _ECorbaShortcutsPrivate ECorbaShortcutsPrivate; -typedef struct _ECorbaShortcutsClass ECorbaShortcutsClass; - -struct _ECorbaShortcuts { - BonoboObject parent; - - ECorbaShortcutsPrivate *priv; -}; - -struct _ECorbaShortcutsClass { - BonoboObjectClass parent_class; - - POA_GNOME_Evolution_Shortcuts__epv epv; -}; - - -GtkType e_corba_shortcuts_get_type (void); -ECorbaShortcuts *e_corba_shortcuts_new (EShortcuts *shortcuts); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_CORBA_SHORTCUTS_H_ */ diff --git a/shell/e-corba-storage-registry.c b/shell/e-corba-storage-registry.c deleted file mode 100644 index bfffdb6981..0000000000 --- a/shell/e-corba-storage-registry.c +++ /dev/null @@ -1,494 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-corba-storage-registry.c - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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-local-storage.h" -#include "e-corba-storage.h" -#include "e-corba-storage-registry.h" -#include "e-shell-constants.h" - -#include "e-util/e-corba-utils.h" - -#include <bonobo/bonobo-exception.h> -#include <gal/util/e-util.h> - -#include <string.h> - - -#define PARENT_TYPE BONOBO_OBJECT_TYPE -static BonoboObjectClass *parent_class = NULL; - -struct _ECorbaStorageRegistryPrivate { - EStorageSet *storage_set; - - GSList *listeners; -}; - - -/* CORBA interface implementation. */ - -static void -listener_notify (Bonobo_Listener listener, - GNOME_Evolution_StorageRegistry_MessageType type, - const char *name) -{ - CORBA_any any; - GNOME_Evolution_StorageRegistry_NotifyResult nr; - CORBA_Environment ev; - - nr.type = type; - nr.name = CORBA_string_dup (name ? name : ""); - - any._type = (CORBA_TypeCode) TC_GNOME_Evolution_StorageRegistry_NotifyResult; - any._value = &nr; - - CORBA_exception_init (&ev); - Bonobo_Listener_event (listener, - "Evolution::StorageRegistry::NotifyResult", - &any, &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Could not send notify event for %s\n%s", name, - CORBA_exception_id (&ev)); - } - - CORBA_exception_free (&ev); -} - -static GNOME_Evolution_StorageListener -impl_StorageRegistry_addStorage (PortableServer_Servant servant, - const GNOME_Evolution_Storage storage_interface, - const CORBA_char *name, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - ECorbaStorageRegistry *storage_registry; - ECorbaStorageRegistryPrivate *priv; - EStorage *storage; - GNOME_Evolution_StorageListener listener_interface; - GSList *iter; - - 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_GNOME_Evolution_StorageRegistry_Exists, - NULL); - return CORBA_OBJECT_NIL; - } - - g_object_unref (storage); - - - /* FIXME: if we remove a listener while looping through the list we can - * crash. Yay CORBA reentrancy. */ - for (iter = priv->listeners; iter; iter = iter->next) { - listener_notify (iter->data, - GNOME_Evolution_StorageRegistry_STORAGE_CREATED, - name); - } - - listener_interface = CORBA_Object_duplicate (e_corba_storage_get_StorageListener - (E_CORBA_STORAGE (storage)), ev); - - return listener_interface; -} - -static GNOME_Evolution_StorageRegistry_StorageList * -impl_StorageRegistry_getStorageList (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - ECorbaStorageRegistry *storage_registry; - ECorbaStorageRegistryPrivate *priv; - GNOME_Evolution_StorageRegistry_StorageList *storage_list; - GList *sl, *l; - - bonobo_object = bonobo_object_from_servant (servant); - storage_registry = E_CORBA_STORAGE_REGISTRY (bonobo_object); - priv = storage_registry->priv; - - sl = e_storage_set_get_storage_list (priv->storage_set); - - storage_list = GNOME_Evolution_StorageRegistry_StorageList__alloc (); - storage_list->_maximum = g_list_length (sl); - storage_list->_length = 0; - storage_list->_buffer = CORBA_sequence_GNOME_Evolution_Storage_allocbuf (storage_list->_maximum); - for (l = sl; l != NULL; l = l->next) { - EStorage *storage; - GNOME_Evolution_Storage corba_storage; - CORBA_Environment ev2; - - CORBA_exception_init (&ev2); - - storage = l->data; - if (E_IS_LOCAL_STORAGE (storage)) { - corba_storage = e_local_storage_get_corba_interface (E_LOCAL_STORAGE (storage)); - } else if (E_IS_CORBA_STORAGE (storage)) { - corba_storage = e_corba_storage_get_corba_objref (E_CORBA_STORAGE (storage)); - } else { - continue; - } - - corba_storage = CORBA_Object_duplicate (corba_storage, &ev2); - if (BONOBO_EX (&ev2)) { - CORBA_exception_free (&ev2); - continue; - } - storage_list->_buffer[storage_list->_length] = corba_storage; - storage_list->_length++; - } - - CORBA_sequence_set_release (storage_list, TRUE); - - return storage_list; -} - -static GNOME_Evolution_Storage -impl_StorageRegistry_getStorageByName (PortableServer_Servant servant, - const CORBA_char *name, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - ECorbaStorageRegistry *storage_registry; - ECorbaStorageRegistryPrivate *priv; - GNOME_Evolution_Storage corba_storage; - 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_GNOME_Evolution_StorageRegistry_NotFound, - NULL); - return CORBA_OBJECT_NIL; - } - - corba_storage = CORBA_Object_duplicate (e_corba_storage_get_corba_objref - (E_CORBA_STORAGE (storage)), ev); - - return corba_storage; -} - -static void -impl_StorageRegistry_removeStorageByName (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_GNOME_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); -} - -static void -storage_set_foreach (EStorageSet *set, - Bonobo_Listener listener) -{ - GList *storage_list, *p; - - storage_list = e_storage_set_get_storage_list (set); - for (p = storage_list; p; p = p->next) { - const char *name; - - name = e_storage_get_name (E_STORAGE (p->data)); - - listener_notify (listener, GNOME_Evolution_StorageRegistry_STORAGE_CREATED, name); - g_object_unref (p->data); - } - - g_list_free (storage_list); -} - -static GSList * -find_listener (GSList *p, - Bonobo_Listener listener) -{ - CORBA_Environment ev; - - CORBA_exception_init (&ev); - for (; p; p = p->next) { - if (CORBA_Object_is_equivalent (p->data, listener, &ev) == TRUE) { - CORBA_exception_free (&ev); - return p; - } - } - - CORBA_exception_free (&ev); - return NULL; -} - -static void -impl_StorageRegistry_addListener (PortableServer_Servant servant, - Bonobo_Listener listener, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - ECorbaStorageRegistry *storage_registry; - ECorbaStorageRegistryPrivate *priv; - Bonobo_Listener listener_copy; - CORBA_Environment ev2; - - bonobo_object = bonobo_object_from_servant (servant); - storage_registry = E_CORBA_STORAGE_REGISTRY (bonobo_object); - priv = storage_registry->priv; - - if (find_listener (priv->listeners, listener) != NULL) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_StorageRegistry_AlreadyListening, - NULL); - return; - } - - CORBA_exception_init (&ev2); - listener_copy = CORBA_Object_duplicate ((CORBA_Object) listener, &ev2); - if (BONOBO_EX (&ev2)) { - g_warning ("EvolutionStorageRegistry -- Cannot duplicate listener."); - CORBA_exception_free (&ev2); - return; - } - - CORBA_exception_free (&ev2); - priv->listeners = g_slist_prepend (priv->listeners, listener_copy); - storage_set_foreach (priv->storage_set, listener_copy); -} - -static void -impl_StorageRegistry_removeListener (PortableServer_Servant servant, - Bonobo_Listener listener, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - ECorbaStorageRegistry *storage_registry; - ECorbaStorageRegistryPrivate *priv; - CORBA_Environment ev2; - GSList *p; - - bonobo_object = bonobo_object_from_servant (servant); - storage_registry = E_CORBA_STORAGE_REGISTRY (bonobo_object); - priv = storage_registry->priv; - - p = find_listener (priv->listeners, listener); - if (p == NULL) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_StorageRegistry_NotFound, - NULL); - return; - } - - CORBA_exception_init (&ev2); - CORBA_Object_release ((CORBA_Object) p->data, &ev2); - CORBA_exception_free (&ev2); - - priv->listeners = g_slist_remove_link (priv->listeners, p); - g_slist_free (p); -} - -static GNOME_Evolution_Folder * -impl_StorageRegistry_getFolderByUri (PortableServer_Servant servant, - const CORBA_char *uri, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - ECorbaStorageRegistry *storage_registry; - GNOME_Evolution_Folder *corba_folder; - EStorageSet *storage_set; - EFolder *folder; - char *path; - CORBA_char *corba_evolution_uri; - - bonobo_object = bonobo_object_from_servant (servant); - storage_registry = E_CORBA_STORAGE_REGISTRY (bonobo_object); - storage_set = storage_registry->priv->storage_set; - - if (!strncmp (uri, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN)) { - corba_evolution_uri = CORBA_string_dup (uri); - path = (char *)uri + E_SHELL_URI_PREFIX_LEN; - folder = e_storage_set_get_folder (storage_set, path); - } else { - path = e_storage_set_get_path_for_physical_uri (storage_set, uri); - if (path) { - corba_evolution_uri = CORBA_string_alloc (strlen (path) + E_SHELL_URI_PREFIX_LEN + 1); - strcpy (corba_evolution_uri, E_SHELL_URI_PREFIX); - strcat (corba_evolution_uri, path); - folder = e_storage_set_get_folder (storage_set, path); - g_free (path); - } else { - corba_evolution_uri = NULL; - folder = NULL; - } - } - - if (!folder) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_StorageRegistry_NotFound, - NULL); - return CORBA_OBJECT_NIL; - } - - corba_folder = GNOME_Evolution_Folder__alloc (); - - corba_folder->displayName = CORBA_string_dup (e_folder_get_name (folder)); - - corba_folder->description = CORBA_string_dup (e_safe_corba_string (e_folder_get_description (folder))); - corba_folder->type = CORBA_string_dup (e_folder_get_type_string (folder)); - corba_folder->physicalUri = CORBA_string_dup (e_safe_corba_string (e_folder_get_physical_uri (folder))); - corba_folder->customIconName = CORBA_string_dup (e_safe_corba_string (e_folder_get_custom_icon_name (folder))); - corba_folder->evolutionUri = corba_evolution_uri; - corba_folder->unreadCount = e_folder_get_unread_count (folder); - corba_folder->sortingPriority = e_folder_get_sorting_priority (folder); - - return corba_folder; -} - - -/* GObject methods. */ - -static void -impl_dispose (GObject *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) { - g_object_unref (priv->storage_set); - priv->storage_set = NULL; - } - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - ECorbaStorageRegistry *corba_storage_registry; - ECorbaStorageRegistryPrivate *priv; - - corba_storage_registry = E_CORBA_STORAGE_REGISTRY (object); - priv = corba_storage_registry->priv; - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -/* Initialization. */ - -static void -e_corba_storage_registry_class_init (ECorbaStorageRegistryClass *klass) -{ - GObjectClass *object_class; - POA_GNOME_Evolution_StorageRegistry__epv *epv; - - object_class = G_OBJECT_CLASS (klass); - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - epv = & klass->epv; - epv->addStorage = impl_StorageRegistry_addStorage; - epv->getStorageList = impl_StorageRegistry_getStorageList; - epv->getStorageByName = impl_StorageRegistry_getStorageByName; - epv->removeStorageByName = impl_StorageRegistry_removeStorageByName; - epv->addListener = impl_StorageRegistry_addListener; - epv->removeListener = impl_StorageRegistry_removeListener; - epv->getFolderByUri = impl_StorageRegistry_getFolderByUri; - - parent_class = g_type_class_ref(PARENT_TYPE); -} - -static void -e_corba_storage_registry_init (ECorbaStorageRegistry *corba_storage_registry) -{ - ECorbaStorageRegistryPrivate *priv; - - priv = g_new (ECorbaStorageRegistryPrivate, 1); - priv->storage_set = NULL; - priv->listeners = NULL; - - corba_storage_registry->priv = priv; -} - - -void -e_corba_storage_registry_construct (ECorbaStorageRegistry *corba_storage_registry, - EStorageSet *storage_set) -{ - ECorbaStorageRegistryPrivate *priv; - - g_return_if_fail (E_IS_CORBA_STORAGE_REGISTRY (corba_storage_registry)); - - priv = corba_storage_registry->priv; - - g_object_ref (storage_set); - priv->storage_set = storage_set; -} - -ECorbaStorageRegistry * -e_corba_storage_registry_new (EStorageSet *storage_set) -{ - ECorbaStorageRegistry *corba_storage_registry; - - g_return_val_if_fail (storage_set != NULL, NULL); - g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), NULL); - - corba_storage_registry = g_object_new (e_corba_storage_registry_get_type (), NULL); - - e_corba_storage_registry_construct (corba_storage_registry, storage_set); - - return corba_storage_registry; -} - - -BONOBO_TYPE_FUNC_FULL (ECorbaStorageRegistry, - GNOME_Evolution_StorageRegistry, - PARENT_TYPE, - e_corba_storage_registry) diff --git a/shell/e-corba-storage-registry.h b/shell/e-corba-storage-registry.h deleted file mode 100644 index f75db6dd90..0000000000 --- a/shell/e-corba-storage-registry.h +++ /dev/null @@ -1,69 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-corba-storage-registry.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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__ - -#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; - - POA_GNOME_Evolution_StorageRegistry__epv epv; -}; - - -GtkType e_corba_storage_registry_get_type (void); -void e_corba_storage_registry_construct (ECorbaStorageRegistry *corba_storage_registry, - 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 b7ab36c3f8..0000000000 --- a/shell/e-corba-storage.c +++ /dev/null @@ -1,1074 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-corba-storage.c - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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-corba-storage.h" - -#include "e-shell-constants.h" - -#include "Evolution.h" - -#include <glib.h> -#include <gal/util/e-util.h> - -#include <bonobo/bonobo-main.h> -#include <bonobo/bonobo-exception.h> -#include <bonobo/bonobo-listener.h> - -#include <gdk/gdkx.h> -#include <gtk/gtkmain.h> - -#include <string.h> - - -#define PARENT_TYPE E_TYPE_STORAGE -static EStorageClass *parent_class = NULL; - -typedef struct _StorageListenerServant StorageListenerServant; - -struct _ECorbaStoragePrivate { - GNOME_Evolution_Storage storage_interface; - - /* The Evolution::StorageListener interface we expose. */ - GNOME_Evolution_StorageListener storage_listener_interface; - StorageListenerServant *storage_listener_servant; - - GList *pending_opens; -}; - - -/* Implementation of the CORBA Evolution::StorageListener interface. */ - -static POA_GNOME_Evolution_StorageListener__vepv storage_listener_vepv; - -struct _StorageListenerServant { - POA_GNOME_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; - - g_object_ref (corba_storage); - servant->storage = E_STORAGE (corba_storage); - - return servant; -} - -static void -storage_listener_servant_free (StorageListenerServant *servant) -{ - g_object_unref (servant->storage); - - g_free (servant); -} - -#if 0 -static void -impl_StorageListener_destroy (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - /* FIXME */ -} -#endif - -static void -impl_StorageListener_notifyFolderCreated (PortableServer_Servant servant, - const CORBA_char *path, - const GNOME_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->displayName, folder->type, folder->description); - - e_folder_set_physical_uri (e_folder, folder->physicalUri); - e_folder_set_unread_count (e_folder, folder->unreadCount); - e_folder_set_can_sync_offline (e_folder, folder->canSyncOffline); - e_folder_set_sorting_priority (e_folder, folder->sortingPriority); - - if (folder->customIconName[0] != '\0') - e_folder_set_custom_icon (e_folder, folder->customIconName); - - if (! e_storage_new_folder (storage, path, e_folder)) { - g_warning ("Cannot register folder -- %s %s\n", path, folder->displayName); - CORBA_exception_set (ev, - CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_StorageListener_Exists, - NULL); - g_object_unref (e_folder); - return; - } -} - -static void -impl_StorageListener_notifyFolderUpdated (PortableServer_Servant servant, - const CORBA_char *path, - CORBA_long unread_count, - 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_storage_get_folder (storage, path); - if (e_folder == NULL) { - CORBA_exception_set (ev, - CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_StorageListener_NotFound, - NULL); - return; - } - - e_folder_set_unread_count (e_folder, unread_count); -} - -static void -impl_StorageListener_notifyFolderRemoved (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_GNOME_Evolution_StorageListener_NotFound, - NULL); -} - -static void -impl_StorageListener_notifyHasSubfolders (PortableServer_Servant servant, - const CORBA_char *path, - const CORBA_char *message, - CORBA_Environment *ev) -{ - StorageListenerServant *storage_listener_servant; - EStorage *storage; - - storage_listener_servant = (StorageListenerServant *) servant; - storage = storage_listener_servant->storage; - - if (! e_storage_declare_has_subfolders (storage, path, message)) { - g_warning ("Cannot register subfolder tree -- %s\n", path); - CORBA_exception_set (ev, - CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_StorageListener_Exists, - NULL); - } -} - - -static gboolean -setup_storage_listener (ECorbaStorage *corba_storage) -{ - StorageListenerServant *servant; - ECorbaStoragePrivate *priv; - GNOME_Evolution_StorageListener storage_listener_interface; - CORBA_Environment ev; - - priv = corba_storage->priv; - - servant = storage_listener_servant_new (corba_storage); - - CORBA_exception_init (&ev); - - POA_GNOME_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; -} - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - CORBA_Environment ev; - ECorbaStorage *corba_storage; - ECorbaStoragePrivate *priv; - - corba_storage = E_CORBA_STORAGE (object); - priv = corba_storage->priv; - - 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); - priv->storage_interface = CORBA_OBJECT_NIL; - } - - if (priv->storage_listener_interface != CORBA_OBJECT_NIL) { - CORBA_Object_release (priv->storage_listener_interface, &ev); - priv->storage_listener_interface = CORBA_OBJECT_NIL; - } - - 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); - - CORBA_free (object_id); - - priv->storage_listener_servant = NULL; - } - - CORBA_exception_free (&ev); - - if (priv->pending_opens != NULL) { - g_warning ("destroying ECorbaStorage with pending async ops"); - priv->pending_opens = NULL; - } - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - ECorbaStorage *corba_storage; - - corba_storage = E_CORBA_STORAGE (object); - - g_free (corba_storage->priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -/* EStorage methods. */ - -static void -get_folder_cb (EStorage *storage, EStorageResult result, - const char *path, gpointer data) -{ - gboolean *done = data; - - *done = TRUE; -} - -static EFolder * -get_folder (EStorage *storage, const char *path) -{ - EFolder *folder; - char *path_dup, *p; - - folder = (* E_STORAGE_CLASS (parent_class)->get_folder) (storage, path); - if (folder) - return folder; - - /* If @path points to a part of the storage that hasn't been - * opened yet, do that. - */ - path_dup = g_strdup (path); - p = strchr (path_dup + 1, '/'); - while (p) { - *p = '\0'; - if (e_storage_get_has_subfolders (storage, path_dup)) { - gboolean done = FALSE; - - e_storage_async_open_folder (storage, path_dup, - get_folder_cb, &done); - while (!done) - gtk_main_iteration (); - } - *p = '/'; - p = strchr (p + 1, '/'); - } - - return (* E_STORAGE_CLASS (parent_class)->get_folder) (storage, path); -} - -struct async_folder_closure { - EStorageResultCallback callback; - EStorage *storage; - void *data; -}; - -static void -async_folder_cb (BonoboListener *listener, - const char *event_name, - const CORBA_any *any, - CORBA_Environment *ev, - gpointer user_data) -{ - struct async_folder_closure *closure = user_data; - GNOME_Evolution_Storage_Result *corba_result; - EStorageResult result; - - corba_result = any->_value; - result = e_corba_storage_corba_result_to_storage_result (*corba_result); - - (* closure->callback) (closure->storage, result, closure->data); - bonobo_object_unref (BONOBO_OBJECT (listener)); - - g_object_unref (closure->storage); - g_free (closure); -} - - -struct async_create_open_closure { - EStorage *storage; - char *path, *type, *description; - EStorageResultCallback callback; - void *data; -}; - -static void -async_create_open_cb (EStorage *storage, EStorageResult result, - const char *path, void *data) -{ - struct async_create_open_closure *closure = data; - - if (result != E_STORAGE_OK) { - (* closure->callback) (closure->storage, result, - closure->data); - } else { - e_storage_async_create_folder (closure->storage, - closure->path, closure->type, - closure->description, - closure->callback, - closure->data); - } - - g_object_unref (closure->storage); - g_free (closure->path); - g_free (closure->type); - g_free (closure->description); - g_free (closure); -} - -static void -async_create_folder (EStorage *storage, const char *path, - const char *type, const char *description, - EStorageResultCallback callback, void *data) -{ - ECorbaStorage *corba_storage; - ECorbaStoragePrivate *priv; - const char *parent_uri; - char *p; - BonoboListener *listener; - Bonobo_Listener corba_listener; - CORBA_Environment ev; - struct async_folder_closure *closure; - - corba_storage = E_CORBA_STORAGE (storage); - priv = corba_storage->priv; - - p = strrchr (path, '/'); - if (p && p != path) { - EFolder *parent; - char *parent_path; - - parent_path = g_strndup (path, p - path); - parent = e_storage_get_folder (storage, parent_path); - parent_uri = e_folder_get_physical_uri (parent); - - if (e_folder_get_has_subfolders (parent)) { - struct async_create_open_closure *open_closure; - - /* Force the parent folder to resolve its - * children before creating the new folder. - */ - open_closure = g_new (struct async_create_open_closure, 1); - open_closure->storage = storage; - g_object_ref (storage); - open_closure->path = g_strdup (path); - open_closure->type = g_strdup (type); - open_closure->description = g_strdup (description); - open_closure->callback = callback; - open_closure->data = data; - e_storage_async_open_folder (storage, parent_path, - async_create_open_cb, - open_closure); - return; - } - } else - parent_uri = ""; - - closure = g_new (struct async_folder_closure, 1); - closure->callback = callback; - closure->storage = storage; - g_object_ref (storage); - closure->data = data; - listener = bonobo_listener_new (async_folder_cb, closure); - corba_listener = bonobo_object_corba_objref (BONOBO_OBJECT (listener)); - - CORBA_exception_init (&ev); - GNOME_Evolution_Storage_asyncCreateFolder (priv->storage_interface, - path, type, description, - parent_uri, - corba_listener, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - (* callback) (storage, E_STORAGE_GENERICERROR, data); - bonobo_object_unref (BONOBO_OBJECT (listener)); - g_object_unref (storage); - g_free (closure); - } - CORBA_exception_free (&ev); -} - -static void -async_remove_folder (EStorage *storage, - const char *path, - EStorageResultCallback callback, - void *data) -{ - ECorbaStorage *corba_storage; - ECorbaStoragePrivate *priv; - EFolder *folder; - BonoboListener *listener; - Bonobo_Listener corba_listener; - CORBA_Environment ev; - struct async_folder_closure *closure; - - corba_storage = E_CORBA_STORAGE (storage); - priv = corba_storage->priv; - - folder = e_storage_get_folder (storage, path); - if (e_folder_get_is_stock (folder)) { - (* callback) (storage, E_STORAGE_CANTCHANGESTOCKFOLDER, data); - return; - } - if (e_folder_get_physical_uri (folder) == NULL) { - (* callback) (storage, E_STORAGE_GENERICERROR, data); - return; - } - - closure = g_new (struct async_folder_closure, 1); - closure->callback = callback; - closure->storage = storage; - g_object_ref (storage); - closure->data = data; - listener = bonobo_listener_new (async_folder_cb, closure); - corba_listener = bonobo_object_corba_objref (BONOBO_OBJECT (listener)); - - CORBA_exception_init (&ev); - GNOME_Evolution_Storage_asyncRemoveFolder (priv->storage_interface, - path, - e_folder_get_physical_uri (folder), - corba_listener, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - (* callback) (storage, E_STORAGE_GENERICERROR, data); - bonobo_object_unref (BONOBO_OBJECT (listener)); - g_object_unref (storage); - g_free (closure); - } - CORBA_exception_free (&ev); -} - -static void -async_xfer_folder (EStorage *storage, - const char *source_path, - const char *destination_path, - gboolean remove_source, - EStorageResultCallback callback, - void *data) -{ - ECorbaStorage *corba_storage; - ECorbaStoragePrivate *priv; - EFolder *folder; - BonoboListener *listener; - Bonobo_Listener corba_listener; - CORBA_Environment ev; - struct async_folder_closure *closure; - - corba_storage = E_CORBA_STORAGE (storage); - priv = corba_storage->priv; - - folder = e_storage_get_folder (storage, source_path); - if (e_folder_get_is_stock (folder) && remove_source) - (* callback) (storage, E_STORAGE_CANTCHANGESTOCKFOLDER, data); - - closure = g_new (struct async_folder_closure, 1); - closure->callback = callback; - closure->storage = storage; - g_object_ref (storage); - closure->data = data; - listener = bonobo_listener_new (async_folder_cb, closure); - corba_listener = bonobo_object_corba_objref (BONOBO_OBJECT (listener)); - - CORBA_exception_init (&ev); - GNOME_Evolution_Storage_asyncXferFolder (priv->storage_interface, - source_path, destination_path, - remove_source, corba_listener, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - (* callback) (storage, E_STORAGE_GENERICERROR, data); - bonobo_object_unref (BONOBO_OBJECT (listener)); - g_object_unref (storage); - g_free (closure); - } - CORBA_exception_free (&ev); -} - -struct async_open_closure { - EStorageDiscoveryCallback callback; - EStorage *storage; - void *data; - char *path; -}; - -static void -async_open_cb (BonoboListener *listener, const char *event_name, - const CORBA_any *any, CORBA_Environment *ev, - gpointer user_data) -{ - struct async_open_closure *orig_closure = user_data, *closure; - GNOME_Evolution_Storage_Result *corba_result; - ECorbaStoragePrivate *priv; - EStorageResult result; - GList *p; - - corba_result = any->_value; - result = e_corba_storage_corba_result_to_storage_result (*corba_result); - bonobo_object_unref (BONOBO_OBJECT (listener)); - - priv = E_CORBA_STORAGE (orig_closure->storage)->priv; - p = priv->pending_opens; - while (p) { - closure = p->data; - if (!strcmp (closure->path, orig_closure->path)) { - (* closure->callback) (closure->storage, result, - closure->path, closure->data); - if (closure != orig_closure) { - g_object_unref (orig_closure->storage); - g_free (closure->path); - g_free (closure); - } - priv->pending_opens = g_list_remove (priv->pending_opens, p->data); - p = priv->pending_opens; - } else - p = p->next; - } - - g_object_unref (orig_closure->storage); - g_free (orig_closure->path); - g_free (orig_closure); -} - -static gboolean -async_open_folder_idle (gpointer data) -{ - struct async_open_closure *closure = data, *old_closure; - EStorage *storage = closure->storage; - ECorbaStorage *corba_storage; - ECorbaStoragePrivate *priv; - BonoboListener *listener; - Bonobo_Listener corba_listener; - CORBA_Environment ev; - GList *p; - - corba_storage = E_CORBA_STORAGE (storage); - priv = corba_storage->priv; - - for (p = priv->pending_opens; p; p = p->next) { - old_closure = p->data; - if (!strcmp (closure->path, old_closure->path)) { - priv->pending_opens = g_list_prepend (priv->pending_opens, closure); - return FALSE; - } - } - - listener = bonobo_listener_new (async_open_cb, closure); - corba_listener = bonobo_object_corba_objref (BONOBO_OBJECT (listener)); - - priv->pending_opens = g_list_prepend (priv->pending_opens, closure); - - CORBA_exception_init (&ev); - GNOME_Evolution_Storage_asyncOpenFolder (priv->storage_interface, - closure->path, - corba_listener, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - (* closure->callback) (storage, E_STORAGE_GENERICERROR, - closure->path, closure->data); - bonobo_object_unref (BONOBO_OBJECT (listener)); - g_object_unref (closure->storage); - g_free (closure->path); - g_free (closure); - - priv->pending_opens = g_list_delete_link (priv->pending_opens, - priv->pending_opens); - } - CORBA_exception_free (&ev); - - return FALSE; -} - -static void -async_open_folder (EStorage *storage, - const char *path, - EStorageDiscoveryCallback callback, - void *data) -{ - struct async_open_closure *closure; - - closure = g_new (struct async_open_closure, 1); - closure->callback = callback; - closure->storage = storage; - g_object_ref (storage); - closure->data = data; - closure->path = g_strdup (path); - - g_idle_add (async_open_folder_idle, closure); -} - - -/* Shared folders. */ - -static gboolean -supports_shared_folders (EStorage *storage) -{ - GNOME_Evolution_Storage storage_iface; - CORBA_boolean has_shared_folders; - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - storage_iface = e_corba_storage_get_corba_objref (E_CORBA_STORAGE (storage)); - g_assert (storage_iface != CORBA_OBJECT_NIL); - - has_shared_folders = GNOME_Evolution_Storage__get_hasSharedFolders (storage_iface, &ev); - if (BONOBO_EX (&ev)) - has_shared_folders = FALSE; - - CORBA_exception_free (&ev); - - return has_shared_folders; -} - -static void -async_folder_discovery_cb (BonoboListener *listener, - const char *event_name, - const CORBA_any *any, - CORBA_Environment *ev, - gpointer user_data) -{ - struct async_folder_closure *closure = user_data; - GNOME_Evolution_Storage_FolderResult *corba_result; - EStorageDiscoveryCallback callback; - EStorageResult result; - char *path; - - corba_result = any->_value; - result = e_corba_storage_corba_result_to_storage_result (corba_result->result); - if (result == E_STORAGE_OK) - path = corba_result->path; - else - path = NULL; - - callback = (EStorageDiscoveryCallback)closure->callback; - (* callback) (closure->storage, result, path, closure->data); - - bonobo_object_unref (BONOBO_OBJECT (listener)); - g_object_unref (closure->storage); - g_free (closure); -} - -static void -async_discover_shared_folder (EStorage *storage, - const char *owner, - const char *folder_name, - EStorageDiscoveryCallback callback, - void *data) -{ - ECorbaStorage *corba_storage; - ECorbaStoragePrivate *priv; - BonoboListener *listener; - Bonobo_Listener corba_listener; - CORBA_Environment ev; - struct async_folder_closure *closure; - - corba_storage = E_CORBA_STORAGE (storage); - priv = corba_storage->priv; - - closure = g_new (struct async_folder_closure, 1); - closure->callback = (EStorageResultCallback)callback; - closure->storage = storage; - g_object_ref (storage); - closure->data = data; - listener = bonobo_listener_new (async_folder_discovery_cb, closure); - corba_listener = bonobo_object_corba_objref (BONOBO_OBJECT (listener)); - - CORBA_exception_init (&ev); - GNOME_Evolution_Storage_asyncDiscoverSharedFolder (priv->storage_interface, - owner, folder_name, - corba_listener, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - (* callback) (storage, E_STORAGE_GENERICERROR, NULL, data); - bonobo_object_unref (BONOBO_OBJECT (listener)); - g_object_unref (storage); - g_free (closure); - } - CORBA_exception_free (&ev); -} - -static void -cancel_discover_shared_folder (EStorage *storage, - const char *owner, - const char *folder_name) -{ - ECorbaStorage *corba_storage; - ECorbaStoragePrivate *priv; - CORBA_Environment ev; - - corba_storage = E_CORBA_STORAGE (storage); - priv = corba_storage->priv; - - CORBA_exception_init (&ev); - GNOME_Evolution_Storage_cancelDiscoverSharedFolder (priv->storage_interface, - owner, folder_name, &ev); - if (BONOBO_EX (&ev)) - g_warning ("Error invoking cancelDiscoverSharedFolder -- %s", BONOBO_EX_REPOID (&ev)); - CORBA_exception_free (&ev); -} - -static void -async_remove_shared_folder (EStorage *storage, - const char *path, - EStorageResultCallback callback, - void *data) -{ - ECorbaStorage *corba_storage; - ECorbaStoragePrivate *priv; - BonoboListener *listener; - Bonobo_Listener corba_listener; - CORBA_Environment ev; - struct async_folder_closure *closure; - - corba_storage = E_CORBA_STORAGE (storage); - priv = corba_storage->priv; - - closure = g_new (struct async_folder_closure, 1); - closure->callback = callback; - closure->storage = storage; - g_object_ref (storage); - closure->data = data; - listener = bonobo_listener_new (async_folder_cb, closure); - corba_listener = bonobo_object_corba_objref (BONOBO_OBJECT (listener)); - - CORBA_exception_init (&ev); - GNOME_Evolution_Storage_asyncRemoveSharedFolder (priv->storage_interface, - path, corba_listener, - &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - (* callback) (storage, E_STORAGE_GENERICERROR, data); - bonobo_object_unref (BONOBO_OBJECT (listener)); - g_object_unref (storage); - g_free (closure); - } - CORBA_exception_free (&ev); -} - - -static void -corba_class_init (void) -{ - POA_GNOME_Evolution_StorageListener__vepv *vepv; - POA_GNOME_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_GNOME_Evolution_StorageListener__epv, 1); - epv->notifyFolderCreated = impl_StorageListener_notifyFolderCreated; - epv->notifyFolderUpdated = impl_StorageListener_notifyFolderUpdated; - epv->notifyFolderRemoved = impl_StorageListener_notifyFolderRemoved; - epv->notifyHasSubfolders = impl_StorageListener_notifyHasSubfolders; - - vepv = &storage_listener_vepv; - vepv->_base_epv = base_epv; - vepv->GNOME_Evolution_StorageListener_epv = epv; -} - -static void -class_init (ECorbaStorageClass *klass) -{ - GObjectClass *object_class; - EStorageClass *storage_class; - - object_class = G_OBJECT_CLASS (klass); - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - storage_class = E_STORAGE_CLASS (klass); - storage_class->get_folder = get_folder; - storage_class->async_create_folder = async_create_folder; - storage_class->async_remove_folder = async_remove_folder; - storage_class->async_xfer_folder = async_xfer_folder; - storage_class->async_open_folder = async_open_folder; - storage_class->supports_shared_folders = supports_shared_folders; - storage_class->async_discover_shared_folder = async_discover_shared_folder; - storage_class->cancel_discover_shared_folder = cancel_discover_shared_folder; - storage_class->async_remove_shared_folder = async_remove_shared_folder; - - corba_class_init (); - - parent_class = g_type_class_ref(PARENT_TYPE); -} - -static void -init (ECorbaStorage *corba_storage) -{ - ECorbaStoragePrivate *priv; - - priv = g_new (ECorbaStoragePrivate, 1); - priv->storage_interface = CORBA_OBJECT_NIL; - priv->pending_opens = NULL; - - corba_storage->priv = priv; -} - - -/* FIXME: OK to have a boolean construct function? */ -void -e_corba_storage_construct (ECorbaStorage *corba_storage, - const GNOME_Evolution_Storage storage_interface, - const char *name) -{ - ECorbaStoragePrivate *priv; - CORBA_Environment ev; - EFolder *root_folder; - - 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); - - /* FIXME: Need separate name and display name. */ - root_folder = e_folder_new (name, "noselect", ""); - e_storage_construct (E_STORAGE (corba_storage), name, root_folder); - - priv = corba_storage->priv; - - CORBA_exception_init (&ev); - - Bonobo_Unknown_ref (storage_interface, &ev); - if (ev._major != CORBA_NO_EXCEPTION) - g_warning ("e_corba_storage_construct() -- Cannot reference Bonobo object"); - 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 GNOME_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 = g_object_new (e_corba_storage_get_type (), NULL); - - e_corba_storage_construct (E_CORBA_STORAGE (new), - storage_interface, name); - - return new; -} - - -const GNOME_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; -} - -GNOME_Evolution_Storage -e_corba_storage_get_corba_objref (ECorbaStorage *corba_storage) -{ - g_return_val_if_fail (corba_storage != NULL, CORBA_OBJECT_NIL); - g_return_val_if_fail (E_IS_CORBA_STORAGE (corba_storage), CORBA_OBJECT_NIL); - - return corba_storage->priv->storage_interface; -} - - -GSList * -e_corba_storage_get_folder_property_items (ECorbaStorage *corba_storage) -{ - GNOME_Evolution_Storage_FolderPropertyItemList *corba_items; - CORBA_Environment ev; - GSList *list; - int i; - - g_return_val_if_fail (E_IS_CORBA_STORAGE (corba_storage), NULL); - - CORBA_exception_init (&ev); - - corba_items = GNOME_Evolution_Storage__get_folderPropertyItems (corba_storage->priv->storage_interface, - &ev); - - if (BONOBO_EX (&ev)) { - CORBA_exception_free (&ev); - return NULL; - } - - list = NULL; - for (i = 0; i < corba_items->_length; i ++) { - ECorbaStoragePropertyItem *item; - - item = g_new (ECorbaStoragePropertyItem, 1); - item->label = g_strdup (corba_items->_buffer[i].label); - item->tooltip = g_strdup (corba_items->_buffer[i].tooltip); - item->icon = NULL; /* We don't care for now -- FIXME */ - - list = g_slist_prepend (list, item); - } - list = g_slist_reverse (list); - - CORBA_free (corba_items); - CORBA_exception_free (&ev); - - return list; -} - -void -e_corba_storage_free_property_items_list (GSList *list) -{ - GSList *p; - - for (p = list; p != NULL; p = p->next) { - ECorbaStoragePropertyItem *item; - - item = (ECorbaStoragePropertyItem *) p->data; - - if (item->icon != NULL) - g_object_unref (item->icon); - g_free (item->label); - g_free (item->tooltip); - g_free (item); - } - - g_slist_free (list); -} - -void -e_corba_storage_show_folder_properties (ECorbaStorage *corba_storage, - const char *path, - int property_item_id, - GdkWindow *parent_window) -{ - CORBA_Environment ev; - - g_return_if_fail (E_IS_CORBA_STORAGE (corba_storage)); - g_return_if_fail (path != NULL && path[0] == E_PATH_SEPARATOR); - - CORBA_exception_init (&ev); - - GNOME_Evolution_Storage_showFolderProperties (corba_storage->priv->storage_interface, - path, property_item_id, - GDK_WINDOW_XWINDOW (parent_window), - &ev); - if (BONOBO_EX (&ev)) - g_warning ("Error in Storage::showFolderProperties -- %s", BONOBO_EX_REPOID (&ev)); - - CORBA_exception_free (&ev); -} - -EStorageResult -e_corba_storage_corba_result_to_storage_result (GNOME_Evolution_Storage_Result corba_result) -{ - switch (corba_result) { - case GNOME_Evolution_Storage_OK: - return E_STORAGE_OK; - case GNOME_Evolution_Storage_UNSUPPORTED_OPERATION: - return E_STORAGE_UNSUPPORTEDOPERATION; - case GNOME_Evolution_Storage_UNSUPPORTED_TYPE: - return E_STORAGE_UNSUPPORTEDTYPE; - case GNOME_Evolution_Storage_INVALID_URI: - return E_STORAGE_INVALIDNAME; - case GNOME_Evolution_Storage_ALREADY_EXISTS: - return E_STORAGE_EXISTS; - case GNOME_Evolution_Storage_DOES_NOT_EXIST: - return E_STORAGE_NOTFOUND; - case GNOME_Evolution_Storage_PERMISSION_DENIED: - return E_STORAGE_PERMISSIONDENIED; - case GNOME_Evolution_Storage_NO_SPACE: - return E_STORAGE_NOSPACE; - case GNOME_Evolution_Storage_NOT_EMPTY: - return E_STORAGE_NOTEMPTY; - case GNOME_Evolution_Storage_NOT_ONLINE: - return E_STORAGE_NOTONLINE; - case GNOME_Evolution_Storage_GENERIC_ERROR: - default: - return E_STORAGE_GENERICERROR; - } -} - - -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 da62ab628b..0000000000 --- a/shell/e-corba-storage.h +++ /dev/null @@ -1,89 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-corba-storage.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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__ - -#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; -}; - - -struct _ECorbaStoragePropertyItem { - char *label; - char *tooltip; - GdkPixbuf *icon; -}; -typedef struct _ECorbaStoragePropertyItem ECorbaStoragePropertyItem; - - -GtkType e_corba_storage_get_type (void); -void e_corba_storage_construct (ECorbaStorage *corba_storage, - const GNOME_Evolution_Storage storage_interface, - const char *name); -EStorage *e_corba_storage_new (const GNOME_Evolution_Storage storage_interface, - const char *name); - -GNOME_Evolution_Storage e_corba_storage_get_corba_objref (ECorbaStorage *corba_storage); - -const GNOME_Evolution_StorageListener e_corba_storage_get_StorageListener (ECorbaStorage *corba_storage); - -GSList *e_corba_storage_get_folder_property_items (ECorbaStorage *corba_storage); -void e_corba_storage_free_property_items_list (GSList *list); - -void e_corba_storage_show_folder_properties (ECorbaStorage *corba_storage, - const char *path, - int property_item_id, - GdkWindow *parent_window); -EStorageResult e_corba_storage_corba_result_to_storage_result (GNOME_Evolution_Storage_Result corba_result); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __E_CORBA_STORAGE_H__ */ diff --git a/shell/e-folder-dnd-bridge.c b/shell/e-folder-dnd-bridge.c deleted file mode 100644 index c72322f476..0000000000 --- a/shell/e-folder-dnd-bridge.c +++ /dev/null @@ -1,487 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-folder-dnd-bridge.c - Utility functions for handling dnd to Evolution - * folders using the ShellComponentDnd interface. - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-folder-dnd-bridge.h" - -#include "Evolution.h" -#include "e-storage-set-view.h" -#include "e-shell-constants.h" - -#include "e-util/e-dialog-utils.h" - -#include <libgnome/gnome-i18n.h> -#include <libgnome/gnome-util.h> - -#include <string.h> - - -/* Callbacks for folder operations. */ - -static void -folder_xfer_callback (EStorageSet *storage_set, - EStorageResult result, - void *data) -{ - GtkWindow *parent; - - if (result == E_STORAGE_OK) - return; - - parent = GTK_WINDOW (data); - e_notice (parent, GTK_MESSAGE_ERROR, _("Cannot transfer folder:\n%s"), - e_storage_result_to_string (result)); -} - - -/* Utility functions. */ - -static GNOME_Evolution_ShellComponentDnd_ActionSet -convert_gdk_drag_action_set_to_corba (GdkDragAction action) -{ - GNOME_Evolution_ShellComponentDnd_Action retval; - - retval = GNOME_Evolution_ShellComponentDnd_ACTION_DEFAULT; - - if (action & GDK_ACTION_COPY) - retval |= GNOME_Evolution_ShellComponentDnd_ACTION_COPY; - if (action & GDK_ACTION_MOVE) - retval |= GNOME_Evolution_ShellComponentDnd_ACTION_MOVE; - if (action & GDK_ACTION_LINK) - retval |= GNOME_Evolution_ShellComponentDnd_ACTION_LINK; - if (action & GDK_ACTION_ASK) - retval |= GNOME_Evolution_ShellComponentDnd_ACTION_ASK; - - return retval; -} - -static GNOME_Evolution_ShellComponentDnd_ActionSet -convert_gdk_drag_action_to_corba (GdkDragAction action) -{ - if (action == GDK_ACTION_COPY) - return GNOME_Evolution_ShellComponentDnd_ACTION_COPY; - else if (action == GDK_ACTION_MOVE) - return GNOME_Evolution_ShellComponentDnd_ACTION_MOVE; - else if (action == GDK_ACTION_LINK) - return GNOME_Evolution_ShellComponentDnd_ACTION_LINK; - else if (action == GDK_ACTION_ASK) - return GNOME_Evolution_ShellComponentDnd_ACTION_ASK; - else { - g_warning ("Unknown GdkDragAction %d", action); - return GNOME_Evolution_ShellComponentDnd_ACTION_DEFAULT; - } -} - -static GdkDragAction -convert_corba_drag_action_to_gdk (GNOME_Evolution_ShellComponentDnd_ActionSet action) -{ - if (action == GNOME_Evolution_ShellComponentDnd_ACTION_COPY) - return GDK_ACTION_COPY; - else if (action == GNOME_Evolution_ShellComponentDnd_ACTION_MOVE) - return GDK_ACTION_MOVE; - else if (action == GNOME_Evolution_ShellComponentDnd_ACTION_LINK) - return GDK_ACTION_LINK; - else if (action == GNOME_Evolution_ShellComponentDnd_ACTION_ASK) - return GDK_ACTION_ASK; - else { - g_warning ("unknown GNOME_Evolution_ShellComponentDnd_ActionSet %d", action); - return GDK_ACTION_DEFAULT; - } -} - -static EvolutionShellComponentClient * -get_component_at_path (EStorageSet *storage_set, - const char *path) -{ - EvolutionShellComponentClient *component_client; - EFolderTypeRegistry *folder_type_registry; - EFolder *folder; - - folder = e_storage_set_get_folder (storage_set, path); - if (folder == NULL) - return NULL; - - folder_type_registry = e_storage_set_get_folder_type_registry (storage_set); - g_assert (folder_type_registry != NULL); - - component_client = e_folder_type_registry_get_handler_for_type (folder_type_registry, - e_folder_get_type_string (folder)); - - return component_client; -} - -/* This will look for the targets in @drag_context, choose one that matches - with the allowed types at @path, and return its name. The EVOLUTION_PATH - type always matches. */ -static const char * -find_matching_target_for_drag_context (EStorageSet *storage_set, - const char *path, - GdkDragContext *drag_context, - GdkAtom *atom_return) -{ - EFolderTypeRegistry *folder_type_registry; - EFolder *folder; - GList *accepted_types; - GList *p, *q; - - folder_type_registry = e_storage_set_get_folder_type_registry (storage_set); - - folder = e_storage_set_get_folder (storage_set, path); - if (folder == NULL) - return E_FOLDER_DND_PATH_TARGET_TYPE; - - accepted_types = e_folder_type_registry_get_accepted_dnd_types_for_type (folder_type_registry, - e_folder_get_type_string (folder)); - - for (p = drag_context->targets; p != NULL; p = p->next) { - char *possible_type; - - possible_type = gdk_atom_name (p->data); - if (strcmp (possible_type, E_FOLDER_DND_PATH_TARGET_TYPE) == 0) { - g_free (possible_type); - - if (atom_return != NULL) - *atom_return = p->data; - - return E_FOLDER_DND_PATH_TARGET_TYPE; - } - - for (q = accepted_types; q != NULL; q = q->next) { - const char *accepted_type; - - accepted_type = (const char *) q->data; - if (strcmp (possible_type, accepted_type) == 0) { - g_free (possible_type); - - if (atom_return != NULL) - *atom_return = p->data; - - return accepted_type; - } - } - - g_free (possible_type); - } - - if (atom_return != NULL) - *atom_return = 0; - - return NULL; -} - -static gboolean -handle_evolution_path_drag_motion (EStorageSet *storage_set, - const char *path, - GdkDragContext *context, - unsigned int time) -{ - GdkModifierType modifiers; - GdkDragAction action; - - gdk_window_get_pointer (NULL, NULL, NULL, &modifiers); - - if ((modifiers & GDK_CONTROL_MASK) != 0) { - action = GDK_ACTION_COPY; - } else { - GtkWidget *source_widget; - - action = GDK_ACTION_MOVE; - - source_widget = gtk_drag_get_source_widget (context); - if (source_widget != NULL - && E_IS_STORAGE_SET_VIEW (source_widget)) { - const char *source_path; - - source_path = e_storage_set_view_get_current_folder (E_STORAGE_SET_VIEW (source_widget)); - if (source_path != NULL) { - EFolder *folder; - int source_path_len; - char *destination_path; - char *base_name; - - folder = e_storage_set_get_folder (storage_set, source_path); - if (folder != NULL && e_folder_get_is_stock (folder)) - return FALSE; - - source_path_len = strlen (path); - if (strcmp (path, source_path) == 0) - return FALSE; - - base_name = g_path_get_basename (source_path); - destination_path = g_strconcat (path, "/", base_name, NULL); - g_free (base_name); - - if (strncmp (destination_path, source_path, source_path_len) == 0) { - g_free (destination_path); - return FALSE; - } - - g_free (destination_path); - } - } - } - - gdk_drag_status (context, action, time); - return TRUE; -} - - -/* Bridge for the DnD motion event. */ - -gboolean -e_folder_dnd_bridge_motion (GtkWidget *widget, - GdkDragContext *context, - unsigned int time, - EStorageSet *storage_set, - const char *path) -{ - EvolutionShellComponentClient *component_client; - GNOME_Evolution_ShellComponentDnd_DestinationFolder destination_folder_interface; - GNOME_Evolution_ShellComponentDnd_DestinationFolder_Context corba_context; - GNOME_Evolution_ShellComponentDnd_Action suggested_action; - CORBA_Environment ev; - CORBA_boolean can_handle; - EFolder *folder; - const char *dnd_type; - - g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); - g_return_val_if_fail (context != NULL, FALSE); - g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), FALSE); - g_return_val_if_fail (path != NULL, FALSE); - - dnd_type = find_matching_target_for_drag_context (storage_set, path, context, NULL); - if (dnd_type == NULL) - return FALSE; - - if (strcmp (dnd_type, E_FOLDER_DND_PATH_TARGET_TYPE) == 0) - return handle_evolution_path_drag_motion (storage_set, path, context, time); - - component_client = get_component_at_path (storage_set, path); - if (component_client == NULL) - return FALSE; - - destination_folder_interface = evolution_shell_component_client_get_dnd_destination_interface (component_client); - if (destination_folder_interface == NULL) - return FALSE; - - CORBA_exception_init (&ev); - - corba_context.dndType = (char *) dnd_type; /* (Safe cast, as we don't actually free the corba_context.) */ - corba_context.possibleActions = convert_gdk_drag_action_set_to_corba (context->actions); - corba_context.suggestedAction = convert_gdk_drag_action_to_corba (context->suggested_action); - - folder = e_storage_set_get_folder (storage_set, path); - - can_handle = GNOME_Evolution_ShellComponentDnd_DestinationFolder_handleMotion (destination_folder_interface, - e_folder_get_physical_uri (folder), - e_folder_get_type_string (folder), - &corba_context, - &suggested_action, - &ev); - if (ev._major != CORBA_NO_EXCEPTION || ! can_handle) { - CORBA_exception_free (&ev); - return FALSE; - } - - CORBA_exception_free (&ev); - - gdk_drag_status (context, convert_corba_drag_action_to_gdk (suggested_action), time); - return TRUE; -} - - -/* Bridge for the drop event. */ - -gboolean -e_folder_dnd_bridge_drop (GtkWidget *widget, - GdkDragContext *context, - unsigned int time, - EStorageSet *storage_set, - const char *path) -{ - GdkAtom atom; - - g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); - g_return_val_if_fail (context != NULL, FALSE); - g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), FALSE); - g_return_val_if_fail (path != NULL, FALSE); - - if (context->targets == NULL) - return FALSE; - - if (find_matching_target_for_drag_context (storage_set, path, context, &atom) == NULL) - return FALSE; - - gtk_drag_get_data (widget, context, atom, time); - - return FALSE; -} - - -/* Bridge for the data_received event. */ - -static gboolean -handle_data_received_path (GdkDragContext *context, - GtkSelectionData *selection_data, - EStorageSet *storage_set, - const char *path, - GtkWindow *toplevel_window) -{ - const char *source_path; - char *destination_path; - char *base_name; - gboolean handled; - - source_path = (const char *) selection_data->data; - - /* (Basic sanity checks.) */ - if (source_path == NULL || source_path[0] != E_PATH_SEPARATOR || source_path[1] == '\0') - return FALSE; - - base_name = g_path_get_basename (source_path); - destination_path = g_build_filename (path, base_name, NULL); - g_free (base_name); - - switch (context->action) { - case GDK_ACTION_MOVE: - e_storage_set_async_xfer_folder (storage_set, - source_path, - destination_path, - TRUE, - folder_xfer_callback, - toplevel_window); - handled = TRUE; - break; - case GDK_ACTION_COPY: - e_storage_set_async_xfer_folder (storage_set, - source_path, - destination_path, - FALSE, - folder_xfer_callback, - toplevel_window); - handled = TRUE; - break; - default: - handled = FALSE; - g_warning ("EStorageSetView: Unknown action %d", context->action); - } - - g_free (destination_path); - - return handled; -} - -static gboolean -handle_data_received_non_path (GdkDragContext *context, - GtkSelectionData *selection_data, - EStorageSet *storage_set, - const char *path, - const char *target_type) -{ - GNOME_Evolution_ShellComponentDnd_DestinationFolder destination_folder_interface; - GNOME_Evolution_ShellComponentDnd_DestinationFolder_Context corba_context; - GNOME_Evolution_ShellComponentDnd_Data corba_data; - EvolutionShellComponentClient *component_client; - EFolder *folder; - CORBA_Environment ev; - - component_client = get_component_at_path (storage_set, path); - if (component_client == NULL) - return FALSE; - - destination_folder_interface = evolution_shell_component_client_get_dnd_destination_interface (component_client); - if (destination_folder_interface == NULL) - return FALSE; - - CORBA_exception_init (&ev); - - folder = e_storage_set_get_folder (storage_set, path); - - corba_context.dndType = (char *) target_type; - corba_context.possibleActions = convert_gdk_drag_action_set_to_corba (context->actions); - corba_context.suggestedAction = convert_gdk_drag_action_to_corba (context->suggested_action); - - corba_data.format = selection_data->format; - corba_data.target = gdk_atom_name (selection_data->target); - - corba_data.bytes._release = FALSE; - - if (selection_data->data == NULL) { - /* If data is NULL the length is -1 and this would mess things - up so we handle it separately. */ - corba_data.bytes._length = 0; - corba_data.bytes._buffer = NULL; - } else { - corba_data.bytes._length = selection_data->length; - corba_data.bytes._buffer = selection_data->data; - } - - /* pass off the data to the component's DestinationFolderInterface */ - return GNOME_Evolution_ShellComponentDnd_DestinationFolder_handleDrop (destination_folder_interface, - e_folder_get_physical_uri (folder), - e_folder_get_type_string (folder), - &corba_context, - convert_gdk_drag_action_to_corba (context->action), - &corba_data, - &ev); -} - -void -e_folder_dnd_bridge_data_received (GtkWidget *widget, - GdkDragContext *context, - GtkSelectionData *selection_data, - unsigned int time, - EStorageSet *storage_set, - const char *path) -{ - char *target_type; - gboolean handled; - - g_return_if_fail (GTK_IS_WIDGET (widget)); - g_return_if_fail (context != NULL); - g_return_if_fail (E_IS_STORAGE_SET (storage_set)); - g_return_if_fail (path != NULL); - - if (selection_data->data == NULL && selection_data->length == -1) - return; - - target_type = gdk_atom_name (selection_data->target); - - if (strcmp (target_type, E_FOLDER_DND_PATH_TARGET_TYPE) != 0) { - handled = handle_data_received_non_path (context, selection_data, storage_set, - path, target_type); - } else { - GtkWindow *toplevel_window; - - toplevel_window = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (widget))); - handled = handle_data_received_path (context, selection_data, storage_set, path, - toplevel_window); - } - - g_free (target_type); - gtk_drag_finish (context, handled, FALSE, time); -} - diff --git a/shell/e-folder-dnd-bridge.h b/shell/e-folder-dnd-bridge.h deleted file mode 100644 index 77cfcd5181..0000000000 --- a/shell/e-folder-dnd-bridge.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-component-dnd-bridge.h - Utility functions for handling dnd to Evolution - * folders using the ShellComponentDnd interface. - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -/* The purpose of this file is to share the logic for dropping objects into - folders between different widgets that handle the display of EStorageSets - (namely, the shortcut bar and the folder bar). */ - -#ifndef E_FOLDER_BAR_DND_BRIDGE_H -#define E_FOLDER_BAR_DND_BRIDGE_H - -#include "e-storage-set.h" - -#include <gtk/gtkwidget.h> -#include <gtk/gtkdnd.h> - -#define E_FOLDER_DND_PATH_TARGET_TYPE "_EVOLUTION_PRIVATE_PATH" - -gboolean e_folder_dnd_bridge_motion (GtkWidget *widget, - GdkDragContext *context, - unsigned int time, - EStorageSet *storage_set, - const char *path); -gboolean e_folder_dnd_bridge_drop (GtkWidget *widget, - GdkDragContext *context, - unsigned int time, - EStorageSet *storage_set, - const char *path); -void e_folder_dnd_bridge_data_received (GtkWidget *widget, - GdkDragContext *context, - GtkSelectionData *selection_data, - unsigned int time, - EStorageSet *storage_set, - const char *path); - -#endif /* E_FOLDER_BAR_DND_BRIDGE_H */ diff --git a/shell/e-folder-list.c b/shell/e-folder-list.c deleted file mode 100644 index fb199be2a9..0000000000 --- a/shell/e-folder-list.c +++ /dev/null @@ -1,692 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-folder-list.c - * Copyright 2000, 2001, Ximian, Inc. - * - * Authors: - * Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License, version 2, as published by the Free Software Foundation. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library 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. - */ - -#include <config.h> - -#include <string.h> - -#include <gtk/gtkframe.h> - -#include <libgnome/gnome-i18n.h> - -#include <libxml/parser.h> -#include <libxml/xmlmemory.h> - -#include <glade/glade.h> - -#include <gal/e-table/e-table-memory-store.h> -#include <gal/util/e-xml-utils.h> -#include <gal/widgets/e-gui-utils.h> -#include <gal/widgets/e-option-menu.h> - -#include "e-folder-list.h" -#include "e-shell-marshal.h" - -#include "Evolution.h" - -static GtkVBoxClass *parent_class = NULL; -#define PARENT_TYPE (gtk_vbox_get_type ()) - -enum { - CHANGED, - OPTION_MENU_CHANGED, - LAST_SIGNAL -}; - -static guint signals [LAST_SIGNAL] = { 0, }; - -/* The arguments we take */ -enum { - PROP_0, - PROP_TITLE, - PROP_POSSIBLE_TYPES, -}; - -struct _EFolderListPrivate { - GladeXML *gui; - - ETableScrolled *scrolled_table; - char *title; - GtkFrame *frame; - ETableMemoryStore *model; - EvolutionShellClient *client; - GNOME_Evolution_StorageRegistry corba_storage_registry; - EOptionMenu *option_menu; - - char **possible_types; -}; - - -static GNOME_Evolution_Folder * -get_folder_for_uri (EFolderList *efl, - const char *uri) -{ - EFolderListPrivate *priv = efl->priv; - CORBA_Environment ev; - GNOME_Evolution_Folder *folder; - - CORBA_exception_init (&ev); - folder = GNOME_Evolution_StorageRegistry_getFolderByUri ( - priv->corba_storage_registry, uri, &ev); - if (ev._major != CORBA_NO_EXCEPTION) - folder = CORBA_OBJECT_NIL; - CORBA_exception_free (&ev); - - return folder; -} - -static char * -create_display_string (EFolderList *efl, char *folder_uri, char *folder_name) -{ - char *storage_lname, *p; - char *label_text; - - storage_lname = NULL; - p = strchr (folder_uri, '/'); - if (p) { - p = strchr (p + 1, '/'); - if (p) { - GNOME_Evolution_Folder *storage_folder; - char *storage_uri; - - storage_uri = g_strndup (folder_uri, - p - folder_uri); - storage_folder = get_folder_for_uri (efl, storage_uri); - storage_lname = g_strdup (storage_folder->displayName); - CORBA_free (storage_folder); - g_free (storage_uri); - } - } - - if (storage_lname) { - label_text = g_strdup_printf (_("\"%s\" in \"%s\""), folder_name, - storage_lname); - g_free (storage_lname); - } else - label_text = g_strdup_printf ("\"%s\"", folder_name); - - return label_text; -} - - - -static void -e_folder_list_changed (EFolderList *efl) -{ - g_signal_emit (efl, signals[CHANGED], 0); -} - -static void -e_folder_list_dispose (GObject *object) -{ - EFolderList *efl = E_FOLDER_LIST (object); - - if (efl->priv != NULL) { - g_object_unref (efl->priv->gui); - g_object_unref (efl->priv->client); - g_free (efl->priv); - efl->priv = NULL; - } - - if (G_OBJECT_CLASS (parent_class)->dispose) - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -set_frame_label (EFolderList *efl) -{ - GtkFrame *frame = efl->priv->frame; - char *title = efl->priv->title; - if (frame) { - if (title) { - gtk_frame_set_label (frame, title); - gtk_frame_set_shadow_type (frame, GTK_SHADOW_ETCHED_IN); - } else { - gtk_frame_set_label (frame, ""); - gtk_frame_set_shadow_type (frame, GTK_SHADOW_NONE); - } - } -} - -static void -e_folder_list_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - EFolderList *efl = E_FOLDER_LIST(object); - - switch (property_id) { - case PROP_TITLE: - g_free (efl->priv->title); - efl->priv->title = g_strdup (g_value_get_string (value)); - set_frame_label (efl); - break; - case PROP_POSSIBLE_TYPES: - g_strfreev (efl->priv->possible_types); - efl->priv->possible_types = e_strdupv (g_value_get_pointer (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -static void -e_folder_list_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - EFolderList *efl = E_FOLDER_LIST(object); - - switch (property_id) { - case PROP_TITLE: - g_value_set_string (value, efl->priv->title); - break; - case PROP_POSSIBLE_TYPES: - g_value_set_pointer (value, e_strdupv ((const gchar **) efl->priv->possible_types)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -static void -e_folder_list_class_init (EFolderListClass *klass) -{ - GObjectClass *object_class; - GtkVBoxClass *vbox_class; - - object_class = (GObjectClass*) klass; - vbox_class = (GtkVBoxClass *) klass; - parent_class = g_type_class_ref (PARENT_TYPE); - - glade_init(); - - object_class->set_property = e_folder_list_set_property; - object_class->get_property = e_folder_list_get_property; - object_class->dispose = e_folder_list_dispose; - - klass->changed = NULL; - klass->option_menu_changed = NULL; - - signals [OPTION_MENU_CHANGED] = - g_signal_new ("option_menu_changed", - E_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EFolderListClass, option_menu_changed), - NULL, NULL, - e_shell_marshal_NONE__INT, - G_TYPE_NONE, 1, - G_TYPE_INT); - - signals [CHANGED] = - g_signal_new ("changed", - E_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EFolderListClass, changed), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - E_OBJECT_CLASS_ADD_SIGNALS (object_class, signals, LAST_SIGNAL); - - g_object_class_install_property (object_class, PROP_TITLE, - g_param_spec_string ("title", - NULL, - NULL, - NULL, - G_PARAM_READWRITE)); - g_object_class_install_property (object_class, PROP_POSSIBLE_TYPES, - g_param_spec_pointer ("possible_types", - NULL, - NULL, - G_PARAM_READWRITE)); -} - -#define SPEC "<ETableSpecification cursor-mode=\"line\"" \ - " selection-mode=\"browse\"" \ - " no-headers=\"true\"" \ - ">" \ - " <ETableColumn model_col=\"0\"" \ - " expansion=\"0.0\"" \ - " cell=\"pixbuf\"" \ - " minimum_width=\"18\"" \ - " resizable=\"false\"" \ - " _title=\"icon\"" \ - " compare=\"string\"" \ - " search=\"string\"/>" \ - " <ETableColumn model_col=\"1\"" \ - " expansion=\"1.0\"" \ - " cell=\"string\"" \ - " minimum_width=\"32\"" \ - " resizable=\"true\"" \ - " _title=\"blah\"" \ - " compare=\"string\"" \ - " search=\"string\"/>" \ - " <ETableState>" \ - " <column source=\"0\"/>" \ - " <column source=\"1\"/>" \ - " <grouping>" \ - " </grouping>" \ - " </ETableState>" \ - "</ETableSpecification>" - - -static ETableMemoryStoreColumnInfo columns[] = { - E_TABLE_MEMORY_STORE_PIXBUF, - E_TABLE_MEMORY_STORE_STRING, - E_TABLE_MEMORY_STORE_STRING, - E_TABLE_MEMORY_STORE_STRING, - E_TABLE_MEMORY_STORE_STRING, - E_TABLE_MEMORY_STORE_TERMINATOR -}; - -GtkWidget * -create_custom_optionmenu (char *name, char *string1, char *string2, int int1, int int2); - -GtkWidget * -create_custom_optionmenu (char *name, char *string1, char *string2, int int1, int int2) -{ - return e_option_menu_new (NULL); -} - -GtkWidget * -create_custom_folder_list (char *name, char *string1, char *string2, int int1, int int2); - -GtkWidget * -create_custom_folder_list (char *name, char *string1, char *string2, int int1, int int2) -{ - ETableModel *model; - GtkWidget *scrolled; - - model = e_table_memory_store_new (columns); - scrolled = e_table_scrolled_new (model, NULL, SPEC, NULL); - g_object_set_data (G_OBJECT (scrolled), "table-model", model); - return scrolled; -} - -static void -add_clicked (GtkButton *button, EFolderList *efl) -{ - GNOME_Evolution_Folder *folder; - - evolution_shell_client_user_select_folder (efl->priv->client, - GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (efl))), - _("Add a Folder"), - "", - (const gchar **) efl->priv->possible_types, - &folder); - - if (folder != NULL) { - GdkPixbuf *pixbuf; - char *display_string = create_display_string (efl, folder->evolutionUri, folder->displayName); - - pixbuf = evolution_shell_client_get_pixbuf_for_type (efl->priv->client, folder->type, TRUE); - e_table_memory_store_insert (efl->priv->model, -1, NULL, pixbuf, display_string, - folder->displayName, folder->evolutionUri, folder->physicalUri); - e_folder_list_changed (efl); - g_object_unref (pixbuf); - g_free (display_string); - } -} - -static void -make_list (int model_row, gpointer closure) -{ - GList **list = closure; - *list = g_list_prepend (*list, GINT_TO_POINTER (model_row)); -} - -static void -remove_row (gpointer data, gpointer user_data) -{ - ETableMemoryStore *etms = user_data; - int row = GPOINTER_TO_INT (data); - - e_table_memory_store_remove (etms, row); -} - -static void -remove_clicked (GtkButton *button, EFolderList *efl) -{ - GList *list = NULL; - ETable *table; - - table = e_table_scrolled_get_table (efl->priv->scrolled_table); - - e_table_selected_row_foreach (table, make_list, &list); - - g_list_foreach (list, remove_row, efl->priv->model); - - g_list_free (list); - - e_folder_list_changed (efl); -} - -static void -optionmenu_changed (EOptionMenu *option_menu, int value, EFolderList *efl) -{ - g_signal_emit (efl, signals[OPTION_MENU_CHANGED], 0, value); -} - -static void -update_buttons (EFolderList *efl) -{ - int cursor_row; - int selection_count; - ETable *table; - - table = e_table_scrolled_get_table (efl->priv->scrolled_table); - cursor_row = e_table_get_cursor_row (table); - selection_count = e_table_selected_count (table); - - e_glade_xml_set_sensitive (efl->priv->gui, "button-remove", selection_count >= 1); -} - -static void -cursor_changed (ESelectionModel *selection_model, int row, int col, EFolderList *efl) -{ - update_buttons (efl); -} - -static void -selection_changed (ESelectionModel *selection_model, EFolderList *efl) -{ - update_buttons (efl); -} - -static void -e_folder_list_init (EFolderList *efl) -{ - GladeXML *gui; - ESelectionModel *selection_model; - - efl->priv = g_new (EFolderListPrivate, 1); - - gui = glade_xml_new (EVOLUTION_GLADEDIR "/e-folder-list.glade", NULL, NULL); - efl->priv->gui = gui; - - efl->priv->title = NULL; - efl->priv->frame = GTK_FRAME (glade_xml_get_widget(gui, "frame-toplevel")); - if (efl->priv->frame == NULL) - return; - - gtk_widget_reparent(GTK_WIDGET (efl->priv->frame), - GTK_WIDGET (efl)); - - efl->priv->option_menu = E_OPTION_MENU(glade_xml_get_widget (gui, "custom-optionmenu")); - e_folder_list_set_option_menu_strings (efl, NULL); - efl->priv->scrolled_table = E_TABLE_SCROLLED(glade_xml_get_widget(gui, "custom-folder-list")); - efl->priv->model = E_TABLE_MEMORY_STORE (g_object_get_data (G_OBJECT (efl->priv->scrolled_table), "table-model")); - - e_glade_xml_connect_widget (gui, "button-add", "clicked", - G_CALLBACK (add_clicked), efl); - e_glade_xml_connect_widget (gui, "button-remove", "clicked", - G_CALLBACK (remove_clicked), efl); - e_glade_xml_connect_widget (gui, "custom-optionmenu", "changed", - G_CALLBACK (optionmenu_changed), efl); - - selection_model = e_table_get_selection_model (e_table_scrolled_get_table (efl->priv->scrolled_table)); - - g_signal_connect (selection_model, "selection_changed", - G_CALLBACK (selection_changed), efl); - g_signal_connect (selection_model, "cursor_changed", - G_CALLBACK (cursor_changed), efl); - - /* XXX libglade2 seems to not show custom widgets even when - they're flagged Visible.*/ - gtk_widget_show_all (GTK_WIDGET (efl->priv->scrolled_table)); - - efl->priv->possible_types = NULL; - set_frame_label (efl); -} - -EFolderListItem * -e_folder_list_parse_xml (const char *xml) -{ - xmlDoc *doc = NULL; - xmlNode *root; - xmlNode *node; - int i; - EFolderListItem *items; - - if (xml && *xml) { - doc = xmlParseMemory (xml, strlen (xml)); - if (!doc) - g_warning ("malformed EFolderList xml"); - } - - if (!doc) { - items = g_new (EFolderListItem, 1); - items[0].uri = NULL; - items[0].physical_uri = NULL; - items[0].display_name = NULL; - return items; - } - - root = xmlDocGetRootElement (doc); - - for (node = root->xmlChildrenNode, i = 0; node; node = node->next, i++) - /* Intentionally empty */; - - items = g_new (EFolderListItem, i + 1); - - for (node = root->xmlChildrenNode, i = 0; node; node = node->next) { - if (node->name && !strcmp (node->name, "folder")) { - items[i].uri = e_xml_get_string_prop_by_name_with_default (node, "uri", ""); - items[i].physical_uri = e_xml_get_string_prop_by_name_with_default (node, "physical-uri", ""); - items[i].display_name = e_xml_get_string_prop_by_name_with_default (node, "display-name", ""); - i++; - } - } - items[i].uri = NULL; - items[i].physical_uri = NULL; - items[i].display_name = NULL; - - xmlFreeDoc (doc); - - return items; -} - -char * -e_folder_list_create_xml (EFolderListItem *items) -{ - xmlDoc *doc; - xmlNode *root; - char *xml; - xmlChar *temp; - int length; - int i; - - doc = xmlNewDoc ("1.0"); - - root = xmlNewDocNode (doc, NULL, "EvolutionFolderList", NULL); - - xmlDocSetRootElement (doc, root); - - for (i = 0; items[i].uri; i++) { - xmlNode *node = xmlNewChild (root, NULL, "folder", NULL); - e_xml_set_string_prop_by_name (node, "uri", items[i].uri); - e_xml_set_string_prop_by_name (node, "physical-uri", items[i].physical_uri); - e_xml_set_string_prop_by_name (node, "display-name", items[i].display_name); - } - - xmlDocDumpMemory (doc, &temp, &length); - - xml = g_strdup (temp); - - xmlFree (temp); - xmlFreeDoc (doc); - - return xml; -} - -void -e_folder_list_free_items (EFolderListItem *items) -{ - int i; - for (i = 0; items[i].uri; i++) { - g_free (items[i].uri); - g_free (items[i].physical_uri); - g_free (items[i].display_name); - } - g_free (items); -} - -GtkWidget* -e_folder_list_new (EvolutionShellClient *client, const char *xml) -{ - GtkWidget *widget = GTK_WIDGET (g_object_new (e_folder_list_get_type (), NULL)); - - e_folder_list_construct (E_FOLDER_LIST (widget), client, xml); - return widget; -} - -GtkWidget* -e_folder_list_construct (EFolderList *efl, EvolutionShellClient *client, const char *xml) -{ - g_object_ref (client); - efl->priv->client = client; - - efl->priv->corba_storage_registry = evolution_shell_client_get_storage_registry_interface (client); - e_folder_list_set_xml (efl, xml); - return GTK_WIDGET (efl); -} - -void -e_folder_list_set_items (EFolderList *efl, EFolderListItem *items) -{ - int i; - e_table_memory_store_clear (efl->priv->model); - for (i = 0; items[i].uri; i++) { - GNOME_Evolution_Folder *folder; - GdkPixbuf *pixbuf; - char *display_string; - - folder = get_folder_for_uri (efl, items[i].uri); - if (!folder) - continue; - display_string = create_display_string (efl, items[i].uri, items[i].display_name); - - pixbuf = evolution_shell_client_get_pixbuf_for_type (efl->priv->client, folder->type, TRUE); - - e_table_memory_store_insert (efl->priv->model, -1, NULL, - pixbuf, display_string, - items[i].display_name, items[i].uri, items[i].physical_uri); - CORBA_free (folder); - g_object_unref (pixbuf); - g_free (display_string); - } -} - -EFolderListItem * -e_folder_list_get_items (EFolderList *efl) -{ - EFolderListItem *items; - int count; - int i; - - count = e_table_model_row_count (E_TABLE_MODEL (efl->priv->model)); - - items = g_new (EFolderListItem, count + 1); - - for (i = 0; i < count; i++) { - items[i].display_name = g_strdup (e_table_model_value_at (E_TABLE_MODEL (efl->priv->model), 2, i)); - items[i].uri = g_strdup (e_table_model_value_at (E_TABLE_MODEL (efl->priv->model), 3, i)); - items[i].physical_uri = g_strdup (e_table_model_value_at (E_TABLE_MODEL (efl->priv->model), 4, i)); - } - items[i].uri = NULL; - items[i].physical_uri = NULL; - - return items; -} - -void -e_folder_list_set_xml (EFolderList *efl, const char *xml) -{ - EFolderListItem *items; - - items = e_folder_list_parse_xml (xml); - e_folder_list_set_items (efl, items); - e_folder_list_free_items (items); -} - -char * -e_folder_list_get_xml (EFolderList *efl) -{ - EFolderListItem *items; - char *xml; - - items = e_folder_list_get_items (efl); - xml = e_folder_list_create_xml (items); - e_folder_list_free_items (items); - - return xml; -} - -void -e_folder_list_set_option_menu_strings_from_array (EFolderList *efl, const char **strings) -{ - e_option_menu_set_strings_from_array (efl->priv->option_menu, strings); - if (strings && *strings) - gtk_widget_show (GTK_WIDGET (efl->priv->option_menu)); - else - gtk_widget_hide (GTK_WIDGET (efl->priv->option_menu)); -} - -void -e_folder_list_set_option_menu_strings (EFolderList *efl, const char *first_label, ...) -{ - GPtrArray *labels; - va_list args; - char *s; - - labels = g_ptr_array_new (); - - va_start (args, first_label); - for (s = (char *)first_label; s; s = va_arg (args, char *)) - g_ptr_array_add (labels, s); - va_end (args); - - e_folder_list_set_option_menu_strings_from_array (efl, (const char **)labels->pdata); - - g_ptr_array_free (labels, TRUE); -} - -int -e_folder_list_get_option_menu_value (EFolderList *efl) -{ - return e_option_menu_get_value (efl->priv->option_menu); -} - -void -e_folder_list_set_option_menu_value (EFolderList *efl, int value) -{ - gtk_option_menu_set_history (GTK_OPTION_MENU (efl->priv->option_menu), value); -} - - -E_MAKE_TYPE (e_folder_list, "EFolderList", EFolderList, e_folder_list_class_init, e_folder_list_init, PARENT_TYPE) diff --git a/shell/e-folder-list.h b/shell/e-folder-list.h deleted file mode 100644 index 5e7ce3493d..0000000000 --- a/shell/e-folder-list.h +++ /dev/null @@ -1,115 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-folder-list.h - * Copyright 2000, 2001, Ximian, Inc. - * - * Authors: - * Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License, version 2, as published by the Free Software Foundation. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library 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. - */ - -#ifndef __E_FOLDER_LIST_H__ -#define __E_FOLDER_LIST_H__ - -#include <gal/e-table/e-table-scrolled.h> - -#include <gtk/gtkvbox.h> - -#include "evolution-shell-client.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -/* EFolderList - A dialog displaying information about a contact. - * - * The following arguments are available: - * - * name type read/write description - * -------------------------------------------------------------------------------- - */ - -#define E_FOLDER_LIST_TYPE (e_folder_list_get_type ()) -#define E_FOLDER_LIST(obj) (GTK_CHECK_CAST ((obj), E_FOLDER_LIST_TYPE, EFolderList)) -#define E_FOLDER_LIST_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_FOLDER_LIST_TYPE, EFolderListClass)) -#define E_IS_FOLDER_LIST(obj) (GTK_CHECK_TYPE ((obj), E_FOLDER_LIST_TYPE)) -#define E_IS_FOLDER_LIST_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_FOLDER_LIST_TYPE)) - - -typedef struct _EFolderListPrivate EFolderListPrivate; -typedef struct _EFolderList EFolderList; -typedef struct _EFolderListClass EFolderListClass; - -struct _EFolderList -{ - GtkVBox parent; - - /* item specific fields */ - EFolderListPrivate *priv; -}; - -struct _EFolderListClass -{ - GtkVBoxClass parent_class; - - void (*changed) (EFolderList *efl); - void (*option_menu_changed) (EFolderList *efl, int value); -}; - -typedef struct { - char *uri; - char *physical_uri; - char *display_name; -} EFolderListItem; - - -EFolderListItem *e_folder_list_parse_xml (const char *xml); -char *e_folder_list_create_xml (EFolderListItem *items); -void e_folder_list_free_items (EFolderListItem *items); - -/* Standard functions */ -GtkType e_folder_list_get_type (void); -GtkWidget *e_folder_list_new (EvolutionShellClient *client, - const char *xml); -GtkWidget *e_folder_list_construct (EFolderList *efl, - EvolutionShellClient *client, - const char *xml); - -/* data access functions */ -void e_folder_list_set_items (EFolderList *efl, - EFolderListItem *items); -EFolderListItem *e_folder_list_get_items (EFolderList *efl); -void e_folder_list_set_xml (EFolderList *efl, - const char *xml); -char *e_folder_list_get_xml (EFolderList *efl); - -/* Option Menu functions */ -void e_folder_list_set_option_menu_strings_from_array (EFolderList *efl, - const char **strings); -void e_folder_list_set_option_menu_strings (EFolderList *efl, - const char *first_label, - ...); -int e_folder_list_get_option_menu_value (EFolderList *efl); -void e_folder_list_set_option_menu_value (EFolderList *efl, - int value); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* __E_FOLDER_LIST_H__ */ diff --git a/shell/e-folder-tree.c b/shell/e-folder-tree.c deleted file mode 100644 index f6decb4fc0..0000000000 --- a/shell/e-folder-tree.c +++ /dev/null @@ -1,460 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-folder-set.c - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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-folder-tree.h" - -#include "e-shell-constants.h" - -#include <string.h> -#include <glib.h> - - -struct _Folder { - struct _Folder *parent; - char *path; - void *data; - GList *subfolders; -}; -typedef struct _Folder Folder; - -struct _EFolderTree { - GHashTable *path_to_folder; - GHashTable *data_to_path; - - EFolderDestroyNotify folder_destroy_notify; - void *folder_destroy_notify_closure; -}; - - -/* Utility functions. */ - -static char * -get_parent_path (const char *path) -{ - const char *last_separator; - - g_assert (g_path_is_absolute (path)); - - last_separator = strrchr (path, E_PATH_SEPARATOR); - - if (last_separator == path) - return g_strdup (E_PATH_SEPARATOR_S); - - return g_strndup (path, last_separator - path); -} - -static void -traverse_subtree (EFolderTree *tree, - Folder *root_folder, - EFolderTreeForeachFunc foreach_func, - void *data) -{ - GList *p; - - g_assert (foreach_func != NULL); - - (* foreach_func) (tree, root_folder->path, root_folder->data, data); - - for (p = root_folder->subfolders; p != NULL; p = p->next) { - Folder *folder; - - folder = (Folder *) p->data; - traverse_subtree (tree, folder, foreach_func, data); - } -} - - -/* Folder handling. */ - -static Folder * -folder_new (const char *path, - void *data) -{ - Folder *folder; - - folder = g_new (Folder, 1); - folder->parent = NULL; - folder->path = g_strdup (path); - folder->data = data; - folder->subfolders = NULL; - - return folder; -} - -static void -folder_remove_subfolder (Folder *folder, - Folder *subfolder) -{ - folder->subfolders = g_list_remove (folder->subfolders, subfolder); - subfolder->parent = NULL; -} - -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); - - g_free (folder); -} - -static void -remove_folder (EFolderTree *folder_tree, - Folder *folder) -{ - if (folder->subfolders != NULL) { - GList *p; - - for (p = folder->subfolders; p != NULL; p = p->next) { - Folder *subfolder; - - subfolder = (Folder *) p->data; - subfolder->parent = NULL; - remove_folder (folder_tree, subfolder); - } - - g_list_free (folder->subfolders); - folder->subfolders = NULL; - } - - g_hash_table_remove (folder_tree->path_to_folder, folder->path); - g_hash_table_remove (folder_tree->data_to_path, folder->data); - - if (folder_tree->folder_destroy_notify != NULL) - (* folder_tree->folder_destroy_notify) (folder_tree, - folder->path, - folder->data, - folder_tree->folder_destroy_notify_closure); - - folder_destroy (folder); -} - - -/** - * e_folder_tree_new: - * @folder_destroy_notify: Function to be called when a folder gets removed from the tree - * @closure: Additional data to pass to @folder_destroy_notify - * - * Create a new EFolderTree. - * - * Return value: A pointer to the newly created EFolderTree. - **/ -EFolderTree * -e_folder_tree_new (EFolderDestroyNotify folder_destroy_notify, - void *closure) -{ - EFolderTree *new; - - new = g_new (EFolderTree, 1); - - new->folder_destroy_notify = folder_destroy_notify; - new->folder_destroy_notify_closure = closure; - - new->path_to_folder = g_hash_table_new (g_str_hash, g_str_equal); - new->data_to_path = g_hash_table_new (g_direct_hash, g_direct_equal); - - e_folder_tree_add (new, E_PATH_SEPARATOR_S, NULL); - - return new; -} - -/** - * e_folder_tree_destroy: - * @folder_tree: A pointer to an EFolderTree - * - * Destroy @folder_tree. - **/ -void -e_folder_tree_destroy (EFolderTree *folder_tree) -{ - Folder *root_folder; - - g_return_if_fail (folder_tree != NULL); - - root_folder = g_hash_table_lookup (folder_tree->path_to_folder, E_PATH_SEPARATOR_S); - remove_folder (folder_tree, root_folder); - - g_hash_table_destroy (folder_tree->path_to_folder); - g_hash_table_destroy (folder_tree->data_to_path); - - g_free (folder_tree); -} - -/** - * e_folder_tree_add: - * @folder_tree: A pointer to an EFolderTree - * @path: Path at which the new folder must be added - * @data: Data associated with the new folder - * - * Insert a new folder at @path, with the specified @data. - * - * Return value: %TRUE if successful, %FALSE if failed. - **/ -gboolean -e_folder_tree_add (EFolderTree *folder_tree, - const char *path, - void *data) -{ - Folder *parent_folder; - Folder *folder; - const char *existing_path; - char *parent_path; - - g_return_val_if_fail (folder_tree != NULL, FALSE); - g_return_val_if_fail (path != NULL, FALSE); - g_return_val_if_fail (g_path_is_absolute (path), FALSE); - - /* Can only "add" a new root folder if the tree is empty */ - if (! strcmp (path, E_PATH_SEPARATOR_S)) { - folder = g_hash_table_lookup (folder_tree->path_to_folder, path); - if (folder) { - if (folder->subfolders) { - g_warning ("e_folder_tree_add() -- Trying to change root folder after adding children"); - return FALSE; - } - remove_folder (folder_tree, folder); - } - - folder = folder_new (path, data); - g_hash_table_insert (folder_tree->path_to_folder, folder->path, folder); - g_hash_table_insert (folder_tree->data_to_path, data, folder->path); - return TRUE; - } - - parent_path = get_parent_path (path); - - parent_folder = g_hash_table_lookup (folder_tree->path_to_folder, parent_path); - if (parent_folder == NULL) { - g_warning ("e_folder_tree_add() -- Trying to add a subfolder to a path that does not exist yet -- %s", - parent_path); - return FALSE; - } - - folder = g_hash_table_lookup (folder_tree->path_to_folder, path); - if (folder != NULL) { - g_warning ("e_folder_tree_add() -- Trying to add a subfolder for a path that already exists -- %s", - path); - return FALSE; - } - - existing_path = g_hash_table_lookup (folder_tree->data_to_path, data); - if (existing_path != NULL) { - g_warning ("e_folder_tree_add() -- Trying to add a folder with duplicate data -- %s", - path); - return FALSE; - } - - folder = folder_new (path, data); - folder_add_subfolder (parent_folder, folder); - - g_hash_table_insert (folder_tree->path_to_folder, folder->path, folder); - g_hash_table_insert (folder_tree->data_to_path, data, folder->path); - - g_free (parent_path); - - return TRUE; -} - -/** - * e_folder_tree_remove: - * @folder_tree: A pointer to an EFolderTree - * @path: Path of the folder to remove - * - * Remove the folder at @path from @folder_tree. - * - * Return value: %TRUE if successful, %FALSE if failed. - **/ -gboolean -e_folder_tree_remove (EFolderTree *folder_tree, - const char *path) -{ - Folder *folder; - - g_return_val_if_fail (folder_tree != NULL, FALSE); - g_return_val_if_fail (path != NULL, FALSE); - g_return_val_if_fail (g_path_is_absolute (path), FALSE); - - folder = g_hash_table_lookup (folder_tree->path_to_folder, path); - if (folder == NULL) - return FALSE; - - remove_folder (folder_tree, folder); - return TRUE; -} - -static void -count_nodes (EFolderTree *tree, - const char *path, - void *data, - void *closure) -{ - int *count = closure; - - (*count)++; -} - -/** - * e_folder_tree_get_count: - * @folder_tree: A pointer to an EFolderTree - * - * Gets the number of folders in the tree - * - * Return value: The number of folders in the tree - **/ -int -e_folder_tree_get_count (EFolderTree *folder_tree) -{ - int count = 0; - - e_folder_tree_foreach (folder_tree, count_nodes, &count); - - return count; -} - -/** - * e_folder_tree_get_folder: - * @folder_tree: A pointer to an EFolderTree - * @path: Path of the folder for which we want to get the data - * - * Get the data for the folder at @path. - * - * Return value: The pointer to the data for the folder at @path. - **/ -void * -e_folder_tree_get_folder (EFolderTree *folder_tree, - const char *path) -{ - Folder *folder; - - g_return_val_if_fail (folder_tree != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - g_return_val_if_fail (g_path_is_absolute (path), NULL); - - folder = g_hash_table_lookup (folder_tree->path_to_folder, path); - if (folder == NULL) - return NULL; - - return folder->data; -} - -/** - * e_folder_tree_get_subfolders: - * @folder_tree: A pointer to an EFolderTree - * @path: A path in @folder_tree - * - * Get a list of the paths of the subfolders of @path. - * - * Return value: A list of pointers to the paths of the subfolders. The list - * and the strings must be freed by the caller. - **/ -GList * -e_folder_tree_get_subfolders (EFolderTree *folder_tree, - const char *path) -{ - Folder *folder; - GList *list; - GList *p; - - g_return_val_if_fail (folder_tree != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - g_return_val_if_fail (g_path_is_absolute (path), NULL); - - folder = g_hash_table_lookup (folder_tree->path_to_folder, path); - if (folder == NULL) - return NULL; - - list = NULL; - for (p = folder->subfolders; p != NULL; p = p->next) { - const Folder *folder; - - folder = (const Folder *) p->data; - list = g_list_prepend (list, g_strdup (folder->path)); - } - - return list; -} - - -/** - * e_folder_tree_foreach: - * @folder_tree: - * @foreach_func: - * @data: - * - * Call @foreach_func with the specified @data for all the folders - * in @folder_tree, starting at the root node. - **/ -void -e_folder_tree_foreach (EFolderTree *folder_tree, - EFolderTreeForeachFunc foreach_func, - void *data) -{ - Folder *root_node; - - g_return_if_fail (folder_tree != NULL); - g_return_if_fail (foreach_func != NULL); - - root_node = g_hash_table_lookup (folder_tree->path_to_folder, - E_PATH_SEPARATOR_S); - if (root_node == NULL) { - g_warning ("e_folder_tree_foreach -- What?! No root node!?"); - return; - } - - traverse_subtree (folder_tree, root_node, foreach_func, data); -} - - -/** - * e_folder_tree_get_path_for_data: - * @folder_tree: A pointer to an EFolderTree - * @data: The data for the folder for which the path is needed - * - * Look up the path for the specified @data. - * - * Return value: The path for the folder that holds that @data. - **/ -const char * -e_folder_tree_get_path_for_data (EFolderTree *folder_tree, - const void *data) -{ - g_return_val_if_fail (folder_tree != NULL, NULL); - g_return_val_if_fail (data != NULL, NULL); - - return (const char *) g_hash_table_lookup (folder_tree->data_to_path, data); -} diff --git a/shell/e-folder-tree.h b/shell/e-folder-tree.h deleted file mode 100644 index bb2f29702a..0000000000 --- a/shell/e-folder-tree.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-folder-tree.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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_TREE_H_ -#define _E_FOLDER_TREE_H_ - -#include <glib.h> - - -typedef struct _EFolderTree EFolderTree; - -typedef void (* EFolderDestroyNotify) (EFolderTree *tree, const char *path, void *data, void *closure); -typedef void (* EFolderTreeForeachFunc) (EFolderTree *tree, const char *path, void *data, void *closure); - - -EFolderTree *e_folder_tree_new (EFolderDestroyNotify folder_destroy_notify, - void *closure); - -void e_folder_tree_destroy (EFolderTree *folder_tree); - -gboolean e_folder_tree_add (EFolderTree *folder_tree, - const char *path, - void *data); -gboolean e_folder_tree_remove (EFolderTree *folder_tree, - const char *path); - -int e_folder_tree_get_count (EFolderTree *folder_tree); - -void *e_folder_tree_get_folder (EFolderTree *folder_tree, - const char *path); -GList *e_folder_tree_get_subfolders (EFolderTree *folder_tree, - const char *path); - -void e_folder_tree_foreach (EFolderTree *folder_tree, - EFolderTreeForeachFunc foreach_func, - void *data); - -const char *e_folder_tree_get_path_for_data (EFolderTree *folder_tree, - const void *data); - -#endif /* _E_FOLDER_TREE_H_ */ diff --git a/shell/e-folder-type-registry.c b/shell/e-folder-type-registry.c deleted file mode 100644 index 81cb18796e..0000000000 --- a/shell/e-folder-type-registry.c +++ /dev/null @@ -1,536 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-folder-type-registry.c - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <gal/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; - - char *display_name; - char *description; - - gboolean user_creatable; - - GList *exported_dnd_types; /* char * */ - GList *accepted_dnd_types; /* char * */ - - 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, - const char *display_name, - const char *description, - gboolean user_creatable, - int num_exported_dnd_types, - const char **exported_dnd_types, - int num_accepted_dnd_types, - const char **accepted_dnd_types) -{ - FolderType *new; - char *icon_path; - int i; - - new = g_new (FolderType, 1); - - new->name = g_strdup (name); - new->icon_name = g_strdup (icon_name); - new->display_name = g_strdup (display_name); - new->description = g_strdup (description); - - new->user_creatable = user_creatable; - - new->exported_dnd_types = NULL; - for (i = 0; i < num_exported_dnd_types; i++) - new->exported_dnd_types = g_list_prepend (new->exported_dnd_types, - g_strdup (exported_dnd_types[i])); - new->exported_dnd_types = g_list_reverse (new->exported_dnd_types); - - new->accepted_dnd_types = NULL; - for (i = 0; i < num_accepted_dnd_types; i++) - new->accepted_dnd_types = g_list_prepend (new->accepted_dnd_types, - g_strdup (accepted_dnd_types[i])); - new->accepted_dnd_types = g_list_reverse (new->accepted_dnd_types); - - 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, NULL); - - 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, NULL); - } else { - if (new->icon_pixbuf != NULL) - new->mini_icon_pixbuf = g_object_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); - g_free (folder_type->display_name); - g_free (folder_type->description); - - if (folder_type->icon_pixbuf != NULL) - g_object_unref (folder_type->icon_pixbuf); - if (folder_type->mini_icon_pixbuf != NULL) - g_object_unref (folder_type->mini_icon_pixbuf); - - if (folder_type->handler != NULL) - g_object_unref (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, - const char *display_name, - const char *description, - gboolean user_creatable, - int num_exported_dnd_types, - const char **exported_dnd_types, - int num_accepted_dnd_types, - const char **accepted_dnd_types) -{ - 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, - display_name, description, - user_creatable, - num_exported_dnd_types, exported_dnd_types, - num_accepted_dnd_types, accepted_dnd_types); - 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) - return FALSE; - - g_object_ref (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 -impl_finalize (GObject *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); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -class_init (EFolderTypeRegistryClass *class) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (class); - object_class->finalize = impl_finalize; - - parent_class = g_type_class_ref(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 = g_object_new (e_folder_type_registry_get_type (), NULL); - - 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, - const char *display_name, - const char *description, - gboolean user_creatable, - int num_exported_dnd_types, - const char **exported_dnd_types, - int num_accepted_dnd_types, - const char **accepted_dnd_types) -{ - 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, - display_name, description, user_creatable, - num_exported_dnd_types, exported_dnd_types, - num_accepted_dnd_types, accepted_dnd_types); -} - -gboolean -e_folder_type_registry_set_handler_for_type (EFolderTypeRegistry *folder_type_registry, - const char *type_name, - EvolutionShellComponentClient *handler) -{ - g_return_val_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry), FALSE); - g_return_val_if_fail (EVOLUTION_IS_SHELL_COMPONENT_CLIENT (handler), FALSE); - - return set_handler (folder_type_registry, type_name, handler); -} - - -gboolean -e_folder_type_registry_type_registered (EFolderTypeRegistry *folder_type_registry, - const char *type_name) -{ - EFolderTypeRegistryPrivate *priv; - - 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); - - priv = folder_type_registry->priv; - - if (get_folder_type (folder_type_registry, type_name) == NULL) - return FALSE; - - return TRUE; -} - -void -e_folder_type_registry_unregister_type (EFolderTypeRegistry *folder_type_registry, - const char *type_name) -{ - EFolderTypeRegistryPrivate *priv; - FolderType *folder_type; - - g_return_if_fail (folder_type_registry != NULL); - g_return_if_fail (E_IS_FOLDER_TYPE_REGISTRY (folder_type_registry)); - g_return_if_fail (type_name != NULL); - - priv = folder_type_registry->priv; - - folder_type = get_folder_type (folder_type_registry, type_name); - if (folder_type == NULL) - return; - - g_hash_table_remove (priv->name_to_type, folder_type->name); - folder_type_free (folder_type); -} - - -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) - 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) - 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) - return NULL; - - return folder_type->handler; -} - -gboolean -e_folder_type_registry_type_is_user_creatable (EFolderTypeRegistry *folder_type_registry, - const char *type_name) -{ - const FolderType *folder_type; - - 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); - - folder_type = get_folder_type (folder_type_registry, type_name); - if (folder_type == NULL) - return FALSE; - - return folder_type->user_creatable; -} - -const char * -e_folder_type_registry_get_display_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) - return FALSE; - - return folder_type->display_name; -} - -const char * -e_folder_type_registry_get_description_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) - return FALSE; - - return folder_type->description; -} - - -GList * -e_folder_type_registry_get_exported_dnd_types_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) - return NULL; - - return folder_type->exported_dnd_types; -} - -GList * -e_folder_type_registry_get_accepted_dnd_types_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) - return NULL; - - return folder_type->accepted_dnd_types; -} - - -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 628a5d7d39..0000000000 --- a/shell/e-folder-type-registry.h +++ /dev/null @@ -1,107 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-folder-type-registry.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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_ - -#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, - const char *display_name, - const char *description, - gboolean user_creatable, - int num_exported_dnd_types, - const char **exported_dnd_types, - int num_accepted_dnd_types, - const char **accepted_dnd_types); -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); - -gboolean e_folder_type_registry_type_registered (EFolderTypeRegistry *folder_type_registry, - const char *type_name); -void e_folder_type_registry_unregister_type (EFolderTypeRegistry *folder_type_registry, - const char *type_name); - -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); -gboolean e_folder_type_registry_type_is_user_creatable (EFolderTypeRegistry *folder_type_registry, - const char *type_name); -const char *e_folder_type_registry_get_display_name_for_type (EFolderTypeRegistry *folder_type_registry, - const char *type_name); -const char *e_folder_type_registry_get_description_for_type (EFolderTypeRegistry *folder_type_registry, - const char *type_name); - -GList *e_folder_type_registry_get_exported_dnd_types_for_type (EFolderTypeRegistry *folder_type_registry, - const char *type_name); -GList *e_folder_type_registry_get_accepted_dnd_types_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 8226170e92..0000000000 --- a/shell/e-folder.c +++ /dev/null @@ -1,552 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-folder.c - * - * Copyright (C) 2000, 2001, 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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-folder.h" -#include "e-shell-marshal.h" - -#include "e-util/e-corba-utils.h" - -#include <string.h> -#include <glib.h> -#include <gtk/gtksignal.h> -#include <gal/util/e-util.h> - - -#define PARENT_TYPE GTK_TYPE_OBJECT -static GtkObjectClass *parent_class = NULL; - -struct _EFolderPrivate { - char *name; - char *type; - char *description; - char *physical_uri; - - int child_highlight; - int unread_count; - - /* Folders have a default sorting priority of zero; when deciding the - sort order in the Evolution folder tree, folders with the same - priority value are compared by name, while folders with a higher - priority number always come after the folders with a lower priority - number. */ - int sorting_priority; - - unsigned int self_highlight : 1; - unsigned int is_stock : 1; - unsigned int can_sync_offline : 1; - unsigned int has_subfolders : 1; - - /* Custom icon for this folder; if NULL the folder will just use the - icon for its type. */ - char *custom_icon_name; -}; - -#define EF_CLASS(obj) \ - E_FOLDER_CLASS (GTK_OBJECT (obj)->klass) - - -enum { - CHANGED, - NAME_CHANGED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - - -/* EFolder methods. */ - -static gboolean -impl_save_info (EFolder *folder) -{ - g_warning ("`%s' does not implement `EFolder::save_info()'", - G_OBJECT_TYPE_NAME (folder)); - return FALSE; -} - -static gboolean -impl_load_info (EFolder *folder) -{ - g_warning ("`%s' does not implement `EFolder::load_info()'", - G_OBJECT_TYPE_NAME (folder)); - return FALSE; -} - -static gboolean -impl_remove (EFolder *folder) -{ - g_warning ("`%s' does not implement `EFolder::remove()'", - G_OBJECT_TYPE_NAME (folder)); - return FALSE; -} - -static const char * -impl_get_physical_uri (EFolder *folder) -{ - return folder->priv->physical_uri; -} - - -/* GObject methods. */ - -static void -impl_finalize (GObject *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->custom_icon_name); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -class_init (EFolderClass *klass) -{ - GObjectClass *object_class; - - parent_class = g_type_class_ref(gtk_object_get_type ()); - - object_class = G_OBJECT_CLASS (klass); - object_class->finalize = impl_finalize; - - signals[CHANGED] = g_signal_new ("changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EFolderClass, changed), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - signals[NAME_CHANGED] = g_signal_new ("name_changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EFolderClass, name_changed), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - klass->save_info = impl_save_info; - klass->load_info = impl_load_info; - klass->remove = impl_remove; - klass->get_physical_uri = impl_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; - priv->child_highlight = 0; - priv->unread_count = 0; - priv->sorting_priority = 0; - priv->self_highlight = FALSE; - priv->is_stock = FALSE; - priv->can_sync_offline = FALSE; - priv->has_subfolders = FALSE; - priv->custom_icon_name = NULL; - - folder->priv = priv; - - GTK_OBJECT_UNSET_FLAGS (GTK_OBJECT (folder), GTK_FLOATING); -} - - -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); - - 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 = g_object_new (E_TYPE_FOLDER, NULL); - - 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; -} - -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; -} - -int -e_folder_get_unread_count (EFolder *folder) -{ - g_return_val_if_fail (folder != NULL, FALSE); - g_return_val_if_fail (E_IS_FOLDER (folder), FALSE); - - return folder->priv->unread_count; -} - -gboolean -e_folder_get_highlighted (EFolder *folder) -{ - g_return_val_if_fail (folder != NULL, FALSE); - g_return_val_if_fail (E_IS_FOLDER (folder), FALSE); - - return folder->priv->child_highlight || folder->priv->unread_count; -} - -gboolean -e_folder_get_is_stock (EFolder *folder) -{ - g_return_val_if_fail (folder != NULL, FALSE); - g_return_val_if_fail (E_IS_FOLDER (folder), FALSE); - - return folder->priv->is_stock; -} - -gboolean -e_folder_get_can_sync_offline (EFolder *folder) -{ - g_return_val_if_fail (E_IS_FOLDER (folder), FALSE); - - return folder->priv->can_sync_offline; -} - -gboolean -e_folder_get_has_subfolders (EFolder *folder) -{ - g_return_val_if_fail (E_IS_FOLDER (folder), FALSE); - - return folder->priv->has_subfolders; -} - -/** - * e_folder_get_custom_icon: - * @folder: An EFolder - * - * Get the name of the custom icon for @folder, or NULL if no custom icon is - * associated with it. - **/ -const char * -e_folder_get_custom_icon_name (EFolder *folder) -{ - g_return_val_if_fail (E_IS_FOLDER (folder), NULL); - - return folder->priv->custom_icon_name; -} - -/** - * e_folder_get_sorting_priority: - * @folder: An EFolder - * - * Get the sorting priority for @folder. - * - * Return value: Sorting priority value for @folder. - **/ -int -e_folder_get_sorting_priority (EFolder *folder) -{ - g_return_val_if_fail (E_IS_FOLDER (folder), 0); - - return folder->priv->sorting_priority; -} - - -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); - - if (folder->priv->name == name) - return; - - g_free (folder->priv->name); - folder->priv->name = g_strdup (name); - - g_signal_emit (folder, signals[NAME_CHANGED], 0); - g_signal_emit (folder, signals[CHANGED], 0); -} - -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); - - g_signal_emit (folder, signals[CHANGED], 0); -} - -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); - - g_signal_emit (folder, signals[CHANGED], 0); -} - -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); - - if (folder->priv->physical_uri == physical_uri) - return; - - g_free (folder->priv->physical_uri); - folder->priv->physical_uri = g_strdup (physical_uri); - - g_signal_emit (folder, signals[CHANGED], 0); -} - -void -e_folder_set_unread_count (EFolder *folder, - gint unread_count) -{ - g_return_if_fail (folder != NULL); - g_return_if_fail (E_IS_FOLDER (folder)); - - folder->priv->unread_count = unread_count; - - g_signal_emit (folder, signals[CHANGED], 0); -} - -void -e_folder_set_child_highlight (EFolder *folder, - gboolean highlighted) -{ - g_return_if_fail (folder != NULL); - g_return_if_fail (E_IS_FOLDER (folder)); - - if (highlighted) - folder->priv->child_highlight++; - else - folder->priv->child_highlight--; - - g_signal_emit (folder, signals[CHANGED], 0); -} - -void -e_folder_set_is_stock (EFolder *folder, - gboolean is_stock) -{ - g_return_if_fail (folder != NULL); - g_return_if_fail (E_IS_FOLDER (folder)); - - folder->priv->is_stock = !! is_stock; - - g_signal_emit (folder, signals[CHANGED], 0); -} - -void -e_folder_set_can_sync_offline (EFolder *folder, - gboolean can_sync_offline) -{ - g_return_if_fail (E_IS_FOLDER (folder)); - - folder->priv->can_sync_offline = !! can_sync_offline; - - g_signal_emit (folder, signals[CHANGED], 0); -} - -void -e_folder_set_has_subfolders (EFolder *folder, - gboolean has_subfolders) -{ - g_return_if_fail (E_IS_FOLDER (folder)); - - folder->priv->has_subfolders = !! has_subfolders; - - g_signal_emit (folder, signals[CHANGED], 0); -} - -/** - * e_folder_set_custom_icon_name: - * @folder: An EFolder - * @icon_name: Name of the icon to be set (to be found in the standard - * Evolution icon dir) - * - * Set a custom icon for @folder (thus overriding the default icon, which is - * the one associated to the type of the folder). - **/ -void -e_folder_set_custom_icon (EFolder *folder, - const char *icon_name) -{ - g_return_if_fail (E_IS_FOLDER (folder)); - - if (icon_name == folder->priv->custom_icon_name) - return; - - if (folder->priv->custom_icon_name == NULL - || (icon_name != NULL && strcmp (icon_name, folder->priv->custom_icon_name) != 0)) { - g_free (folder->priv->custom_icon_name); - folder->priv->custom_icon_name = g_strdup (icon_name); - - g_signal_emit (folder, signals[CHANGED], 0); - } -} - -/** - * e_folder_set_sorting_priority: - * @folder: An EFolder - * @sorting_priority: A sorting priority number - * - * Set the sorting priority for @folder. Folders have a default sorting - * priority of zero; when deciding the sort order in the Evolution folder tree, - * folders with the same priority value are compared by name, while folders - * with a higher priority number always come after the folders with a lower - * priority number. - **/ -void -e_folder_set_sorting_priority (EFolder *folder, - int sorting_priority) -{ - g_return_if_fail (E_IS_FOLDER (folder)); - - if (folder->priv->sorting_priority == sorting_priority) - return; - - folder->priv->sorting_priority = sorting_priority; - - g_signal_emit (folder, signals[CHANGED], 0); -} - - -/* Gotta love CORBA. */ - -static CORBA_char * -safe_corba_string_dup (const char *s) -{ - if (s == NULL) - return CORBA_string_dup (""); - - return CORBA_string_dup (s); -} - -void -e_folder_to_corba (EFolder *folder, - const char *evolution_uri, - GNOME_Evolution_Folder *folder_return) -{ - g_return_if_fail (E_IS_FOLDER (folder)); - g_return_if_fail (folder_return != NULL); - - folder_return->type = safe_corba_string_dup (e_folder_get_type_string (folder)); - folder_return->description = safe_corba_string_dup (e_folder_get_description (folder)); - folder_return->displayName = safe_corba_string_dup (e_folder_get_name (folder)); - folder_return->physicalUri = safe_corba_string_dup (e_folder_get_physical_uri (folder)); - folder_return->evolutionUri = safe_corba_string_dup (evolution_uri); - folder_return->customIconName = safe_corba_string_dup (e_folder_get_custom_icon_name (folder)); - folder_return->unreadCount = e_folder_get_unread_count (folder); - folder_return->canSyncOffline = e_folder_get_can_sync_offline (folder); - folder_return->sortingPriority = e_folder_get_sorting_priority (folder); -} - - -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 53308fb62f..0000000000 --- a/shell/e-folder.h +++ /dev/null @@ -1,108 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-folder.h - * - * Copyright (C) 2000, 2001, 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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_ - -#include "Evolution.h" - -#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); - void (* name_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_name (EFolder *folder); -const char *e_folder_get_type_string (EFolder *folder); -const char *e_folder_get_description (EFolder *folder); -const char *e_folder_get_physical_uri (EFolder *folder); -int e_folder_get_unread_count (EFolder *folder); -gboolean e_folder_get_highlighted (EFolder *folder); -gboolean e_folder_get_is_stock (EFolder *folder); -gboolean e_folder_get_can_sync_offline (EFolder *folder); -gboolean e_folder_get_has_subfolders (EFolder *folder); -const char *e_folder_get_custom_icon_name (EFolder *folder); -int e_folder_get_sorting_priority (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); -void e_folder_set_unread_count (EFolder *folder, int unread_count); -void e_folder_set_child_highlight (EFolder *folder, gboolean highlighted); -void e_folder_set_is_stock (EFolder *folder, gboolean is_stock); -void e_folder_set_can_sync_offline (EFolder *folder, gboolean can_sync_offline); -void e_folder_set_has_subfolders (EFolder *folder, gboolean has_subfolders); -void e_folder_set_custom_icon (EFolder *folder, const char *icon_name); -void e_folder_set_sorting_priority (EFolder *folder, int sorting_priority); - -void e_folder_to_corba (EFolder *folder, - const char *evolution_uri, - GNOME_Evolution_Folder *folder_return); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_FOLDER_H_ */ diff --git a/shell/e-history.c b/shell/e-history.c deleted file mode 100644 index d12a933241..0000000000 --- a/shell/e-history.c +++ /dev/null @@ -1,261 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-history.c - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-history.h" - -#include <gal/util/e-util.h> - - -#define PARENT_TYPE gtk_object_get_type () -static GtkObjectClass *parent_class = NULL; - -struct _EHistoryPrivate { - EHistoryItemFreeFunc item_free_function; - - GList *items; - GList *current_item; -}; - - -/* GObject methods. */ - -static void -impl_finalize (GObject *object) -{ - EHistory *history; - EHistoryPrivate *priv; - GList *p; - - history = E_HISTORY (object); - priv = history->priv; - - for (p = priv->items; p != NULL; p = p->next) - (* priv->item_free_function) (p->data); - - g_list_free (priv->items); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -class_init (GObjectClass *object_class) -{ - parent_class = g_type_class_ref(PARENT_TYPE); - - object_class->finalize = impl_finalize; -} - -static void -init (EHistory *history) -{ - EHistoryPrivate *priv; - - priv = g_new (EHistoryPrivate, 1); - priv->items = NULL; - priv->current_item = NULL; - - history->priv = priv; - - GTK_OBJECT_UNSET_FLAGS (history, GTK_FLOATING); -} - - -void -e_history_construct (EHistory *history, - EHistoryItemFreeFunc item_free_function) -{ - EHistoryPrivate *priv; - - g_return_if_fail (history != NULL); - g_return_if_fail (E_IS_HISTORY (history)); - - priv = history->priv; - - priv->item_free_function = item_free_function; -} - -EHistory * -e_history_new (EHistoryItemFreeFunc item_free_function) -{ - EHistory *history; - - history = g_object_new (e_history_get_type (), NULL); - e_history_construct (history, item_free_function); - - return history; -} - -void * -e_history_prev (EHistory *history) -{ - EHistoryPrivate *priv; - - g_return_val_if_fail (history != NULL, NULL); - g_return_val_if_fail (E_IS_HISTORY (history), NULL); - - priv = history->priv; - - if (! e_history_has_prev (history)) - return NULL; - - priv->current_item = priv->current_item->prev; - return e_history_get_current (history); -} - -gboolean -e_history_has_prev (EHistory *history) -{ - EHistoryPrivate *priv; - - g_return_val_if_fail (history != NULL, FALSE); - g_return_val_if_fail (E_IS_HISTORY (history), FALSE); - - priv = history->priv; - - if (priv->current_item == NULL) - return FALSE; - - if (priv->current_item->prev == NULL) - return FALSE; - else - return TRUE; -} - -void * -e_history_next (EHistory *history) -{ - EHistoryPrivate *priv; - - g_return_val_if_fail (history != NULL, NULL); - g_return_val_if_fail (E_IS_HISTORY (history), NULL); - - priv = history->priv; - - if (! e_history_has_next (history)) - return NULL; - - priv->current_item = priv->current_item->next; - return e_history_get_current (history); -} - -gboolean -e_history_has_next (EHistory *history) -{ - EHistoryPrivate *priv; - - g_return_val_if_fail (history != NULL, FALSE); - g_return_val_if_fail (E_IS_HISTORY (history), FALSE); - - priv = history->priv; - - if (priv->current_item == NULL) - return FALSE; - - if (priv->current_item->next == NULL) - return FALSE; - else - return TRUE; -} - -void * -e_history_get_current (EHistory *history) -{ - EHistoryPrivate *priv; - - g_return_val_if_fail (history != NULL, NULL); - g_return_val_if_fail (E_IS_HISTORY (history), NULL); - - priv = history->priv; - - if (priv->current_item == NULL) - return NULL; - - return priv->current_item->data; -} - -void -e_history_add (EHistory *history, - void *data) -{ - EHistoryPrivate *priv; - - g_return_if_fail (history != NULL); - g_return_if_fail (E_IS_HISTORY (history)); - - priv = history->priv; - - if (priv->current_item == NULL) { - priv->items = g_list_prepend (priv->items, data); - priv->current_item = priv->items; - - return; - } - - if (priv->current_item->next != NULL) { - GList *p; - - for (p = priv->current_item->next; p != NULL; p = p->next) - (* priv->item_free_function) (p->data); - - priv->current_item->next->prev = NULL; - g_list_free (priv->current_item->next); - - priv->current_item->next = NULL; - } - - g_list_append (priv->current_item, data); - priv->current_item = priv->current_item->next; -} - -void -e_history_remove_matching (EHistory *history, - const void *data, - GCompareFunc compare_func) -{ - EHistoryPrivate *priv; - GList *p; - - g_return_if_fail (history != NULL); - g_return_if_fail (E_IS_HISTORY (history)); - g_return_if_fail (compare_func != NULL); - - priv = history->priv; - - for (p = priv->items; p != NULL; p = p->next) { - if ((* compare_func) (data, p->data) == 0) { - if (priv->items == priv->current_item) - priv->items = priv->current_item = g_list_remove_link (priv->items, p); - else - priv->items = g_list_remove_link (priv->items, p); - } - } -} - - -E_MAKE_TYPE (e_history, "EHistory", EHistory, class_init, init, GTK_TYPE_OBJECT) diff --git a/shell/e-history.h b/shell/e-history.h deleted file mode 100644 index 8d68c149fd..0000000000 --- a/shell/e-history.h +++ /dev/null @@ -1,83 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-history.h - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifndef _E_HISTORY_H_ -#define _E_HISTORY_H_ - -#include <gnome.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_HISTORY (e_history_get_type ()) -#define E_HISTORY(obj) (GTK_CHECK_CAST ((obj), E_TYPE_HISTORY, EHistory)) -#define E_HISTORY_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_HISTORY, EHistoryClass)) -#define E_IS_HISTORY(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_HISTORY)) -#define E_IS_HISTORY_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_HISTORY)) - - -typedef struct _EHistory EHistory; -typedef struct _EHistoryPrivate EHistoryPrivate; -typedef struct _EHistoryClass EHistoryClass; - -struct _EHistory { - GtkObject parent; - - EHistoryPrivate *priv; -}; - -struct _EHistoryClass { - GtkObjectClass parent_class; -}; - - -typedef void (* EHistoryItemFreeFunc) (void *data); - - -GtkType e_history_get_type (void); - -void e_history_construct (EHistory *history, - EHistoryItemFreeFunc item_free_function); -EHistory *e_history_new (EHistoryItemFreeFunc item_free_function); - -void *e_history_prev (EHistory *history); -gboolean e_history_has_prev (EHistory *history); - -void *e_history_next (EHistory *history); -gboolean e_history_has_next (EHistory *history); - -void *e_history_get_current (EHistory *history); - -void e_history_add (EHistory *history, - void *data); - -void e_history_remove_matching (EHistory *history, - const void *data, - GCompareFunc compare_func); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_HISTORY_H_ */ diff --git a/shell/e-icon-factory.c b/shell/e-icon-factory.c deleted file mode 100644 index c0fceafc42..0000000000 --- a/shell/e-icon-factory.c +++ /dev/null @@ -1,162 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-icon-factory.c - Icon factory for the Evolution shell. - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-icon-factory.h" - -#include "e-shell-constants.h" - - -/* One icon. Keep both a small (16x16) and a large (48x48) version around. */ -struct _Icon { - char *name; - GdkPixbuf *small_pixbuf; - GdkPixbuf *large_pixbuf; -}; -typedef struct _Icon Icon; - -/* Hash of all the icons. */ -static GHashTable *name_to_icon = NULL; - - -/* Creating and destroying icons. */ - -static Icon * -icon_new (const char *name, - GdkPixbuf *small_pixbuf, - GdkPixbuf *large_pixbuf) -{ - Icon *icon; - - icon = g_new (Icon, 1); - icon->name = g_strdup (name); - icon->small_pixbuf = small_pixbuf; - icon->large_pixbuf = large_pixbuf; - - if (small_pixbuf != NULL) - g_object_ref (small_pixbuf); - if (large_pixbuf != NULL) - g_object_ref (large_pixbuf); - - return icon; -} - -#if 0 - -/* (This is not currently used since we never prune icons out of the - cache.) */ -static void -icon_free (Icon *icon) -{ - g_free (icon->name); - - if (icon->large_pixbuf != NULL) - g_object_unref (icon->large_pixbuf); - if (icon->small_pixbuf != NULL) - g_object_unref (icon->small_pixbuf); - - g_free (icon); -} - -#endif - - -/* Loading icons. */ - -static Icon * -load_icon (const char *icon_name) -{ - GdkPixbuf *small_pixbuf; - GdkPixbuf *large_pixbuf; - Icon *icon; - char *path; - - path = g_strconcat (EVOLUTION_IMAGES, "/", icon_name, "-mini.png", NULL); - small_pixbuf = gdk_pixbuf_new_from_file (path, NULL); - g_free (path); - - path = g_strconcat (EVOLUTION_IMAGES, "/", icon_name, ".png", NULL); - large_pixbuf = gdk_pixbuf_new_from_file (path, NULL); - g_free (path); - - if (large_pixbuf == NULL || small_pixbuf == NULL) - return NULL; - - icon = icon_new (icon_name, small_pixbuf, large_pixbuf); - - g_object_unref (small_pixbuf); - g_object_unref (large_pixbuf); - - return icon; -} - - -/* Public API. */ - -void -e_icon_factory_init (void) -{ - if (name_to_icon != NULL) { - /* Already initialized. */ - return; - } - - name_to_icon = g_hash_table_new (g_str_hash, g_str_equal); -} - -GdkPixbuf * -e_icon_factory_get_icon (const char *icon_name, - gboolean mini) -{ - Icon *icon; - - g_return_val_if_fail (icon_name != NULL, NULL); - - icon = g_hash_table_lookup (name_to_icon, icon_name); - if (icon == NULL) { - icon = load_icon (icon_name); - if (icon == NULL) { - g_warning ("Icon not found -- %s", icon_name); - - /* Create an empty icon so that we don't keep spitting - out the same warning over and over, every time this - icon is requested. */ - - icon = icon_new (icon_name, NULL, NULL); - g_hash_table_insert (name_to_icon, icon->name, icon); - return NULL; - } - - g_hash_table_insert (name_to_icon, icon->name, icon); - } - - if (mini) { - g_object_ref (icon->small_pixbuf); - return icon->small_pixbuf; - } else { - g_object_ref (icon->large_pixbuf); - return icon->large_pixbuf; - } -} diff --git a/shell/e-icon-factory.h b/shell/e-icon-factory.h deleted file mode 100644 index 072cd4e222..0000000000 --- a/shell/e-icon-factory.h +++ /dev/null @@ -1,33 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-icon-factory.h - Icon factory for the Evolution shell. - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifndef _E_ICON_FACTORY_H_ -#define _E_ICON_FACTORY_H_ - -#include <gdk-pixbuf/gdk-pixbuf.h> - -void e_icon_factory_init (void); - -GdkPixbuf *e_icon_factory_get_icon (const char *icon_name, - gboolean mini); - -#endif /* _E_ICON_FACTORY_H_ */ diff --git a/shell/e-local-folder.c b/shell/e-local-folder.c deleted file mode 100644 index 1df96734f9..0000000000 --- a/shell/e-local-folder.c +++ /dev/null @@ -1,560 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-local-folder.c - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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> - - <name>Inbox</name> - <name locale="it">Posta in Arrivo</name> - - <description>This is the default folder for incoming messages</description> - <description locale="it">Cartella che contiene i messaggi in arrivo</description> - - <homepage>http://www.somewhere.net</homepage> - </efolder> - - FIXME: Do we want to use a namespace for this? - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <string.h> -#include <unistd.h> - -#include <libxml/parser.h> -#include <libxml/xmlmemory.h> - -#include <libgnome/gnome-util.h> - -#include <gal/util/e-util.h> -#include <gal/util/e-xml-utils.h> - -#include <libgnome/gnome-util.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 - -/* This provides the name and the description for a specific locale. */ -struct _I18nInfo { - char *language_id; - char *name; - char *description; -}; -typedef struct _I18nInfo I18nInfo; - -struct _ELocalFolderPrivate { - GHashTable *language_id_to_i18n_info; -}; - - -/* Locale information. */ - -static char *global_language_id = NULL; - - -/* I18nInfo handling. */ - -static I18nInfo * -i18n_info_new (const char *language_id, - const char *name, - const char *description) -{ - I18nInfo *info; - - info = g_new (I18nInfo, 1); - info->language_id = g_strdup (language_id); - info->name = g_strdup (name); - info->description = g_strdup (description); - - return info; -} - -static void -i18n_info_free (I18nInfo *info) -{ - g_free (info->language_id); - g_free (info->name); - g_free (info->description); - - g_free (info); -} - - -/* Language ID -> I18nInfo hash table handling. */ - -static void -add_i18n_info_to_hash (GHashTable *language_id_to_i18n_info_hash, - I18nInfo *i18n_info) -{ - I18nInfo *existing_i18n_info; - - existing_i18n_info = (I18nInfo *) g_hash_table_lookup (language_id_to_i18n_info_hash, - i18n_info->language_id); - if (existing_i18n_info != NULL) { - g_hash_table_remove (language_id_to_i18n_info_hash, - i18n_info->language_id); - i18n_info_free (existing_i18n_info); - } - - g_hash_table_insert (language_id_to_i18n_info_hash, i18n_info->language_id, i18n_info); -} - -static void -language_id_to_i18n_info_hash_foreach_free (void *key, - void *value, - void *data) -{ - i18n_info_free ((I18nInfo *) value); -} - -static I18nInfo * -get_i18n_info_for_language (ELocalFolder *local_folder, - const char *language_id) -{ - ELocalFolderPrivate *priv; - I18nInfo *i18n_info; - - priv = local_folder->priv; - - if (language_id == NULL) - language_id = global_language_id; - - i18n_info = g_hash_table_lookup (priv->language_id_to_i18n_info, language_id); - - /* For locale info like `en_UK@yadda', we try to use `en' as a backup. */ - /* Note: this is exactly the same thing that gnome-config does with the - I18N value handling. I hope it works. */ - if (i18n_info == NULL) { - size_t n; - - n = strcspn (language_id, "@_"); - if (language_id[n] != '\0') { - char *simplified_language_id; - - simplified_language_id = g_strndup (language_id, n); - i18n_info = g_hash_table_lookup (priv->language_id_to_i18n_info, - simplified_language_id); - } - } - - return i18n_info; -} - - -/* Locale handling. */ - -static void -setup_global_language_id (void) -{ - /* FIXME: Implement. */ - global_language_id = "C"; -} - -/* Update the EFolder attributes according to the current locale. */ -static void -update_for_global_locale (ELocalFolder *local_folder) -{ - I18nInfo *i18n_info; - - i18n_info = get_i18n_info_for_language (local_folder, NULL); - - if (i18n_info == NULL) - i18n_info = get_i18n_info_for_language (local_folder, "C"); - - g_assert (i18n_info != NULL); - - e_folder_set_name (E_FOLDER (local_folder), i18n_info->name); - e_folder_set_description (E_FOLDER (local_folder), i18n_info->description); -} - - -/* XML tree handling. */ - -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, TRUE); - retval = g_strdup ((char *) xml_string); - xmlFree (xml_string); - - return retval; -} - -static void -retrieve_info_item (ELocalFolder *local_folder, - xmlNode *node) -{ - xmlChar *lang; - char *name; - char *description; - - lang = xmlGetProp (node, "lang"); - name = get_string_value (node, "name"); - description = get_string_value (node, "description"); - - if (lang == NULL) { - e_local_folder_add_i18n_info (local_folder, "C", name, description); - } else { - e_local_folder_add_i18n_info (local_folder, lang, name, description); - xmlFree (lang); - } - - g_free (name); - g_free (description); -} - -static void -retrieve_info (ELocalFolder *local_folder, - xmlNode *root_xml_node) -{ - ELocalFolderPrivate *priv; - xmlNode *p; - - priv = local_folder->priv; - - for (p = root_xml_node->children; p != NULL; p = p->next) { - if (xmlStrcmp (p->name, "info") == 0) - retrieve_info_item (local_folder, p); - } -} - -static gboolean -construct_loading_metadata (ELocalFolder *local_folder, - const char *path) -{ - EFolder *folder; - xmlDoc *doc; - xmlNode *root; - char *base_name; - char *type; - char *metadata_path; - char *physical_uri; - - folder = E_FOLDER (local_folder); - - metadata_path = g_build_filename (path, E_LOCAL_FOLDER_METADATA_FILE_NAME, NULL); - - doc = xmlParseFile (metadata_path); - if (doc == NULL) { - g_free (metadata_path); - return FALSE; - } - - root = xmlDocGetRootElement (doc); - if (root == NULL || root->name == NULL || strcmp (root->name, "efolder") != 0) { - g_free (metadata_path); - xmlFreeDoc (doc); - return FALSE; - } - - type = get_string_value (root, "type"); - if (type == NULL) { - g_free (metadata_path); - xmlFreeDoc (doc); - return FALSE; - } - - base_name = g_path_get_basename (path); - e_local_folder_construct (local_folder, base_name, type, NULL); - g_free (base_name); - g_free (type); - - retrieve_info (local_folder, root); - - 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) - xmlNewTextChild (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_build_filename (physical_directory, E_LOCAL_FOLDER_METADATA_FILE_NAME, NULL); - - 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 -impl_finalize (GObject *object) -{ - ELocalFolder *local_folder; - ELocalFolderPrivate *priv; - - local_folder = E_LOCAL_FOLDER (object); - priv = local_folder->priv; - - g_hash_table_foreach (priv->language_id_to_i18n_info, - language_id_to_i18n_info_hash_foreach_free, - NULL); - g_hash_table_destroy (priv->language_id_to_i18n_info); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -class_init (ELocalFolderClass *klass) -{ - GObjectClass *object_class; - - parent_class = g_type_class_ref(e_folder_get_type ()); - - object_class = G_OBJECT_CLASS (klass); - object_class->finalize = impl_finalize; - - setup_global_language_id (); -} - -static void -init (ELocalFolder *local_folder) -{ - ELocalFolderPrivate *priv; - - priv = g_new (ELocalFolderPrivate, 1); - priv->language_id_to_i18n_info = g_hash_table_new (g_str_hash, g_str_equal); - - local_folder->priv = priv; -} - - -void -e_local_folder_construct (ELocalFolder *local_folder, - const char *name, - const char *type, - const char *description) -{ - ELocalFolderPrivate *priv; - I18nInfo *i18n_info; - - 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); - - priv = local_folder->priv; - - e_folder_construct (E_FOLDER (local_folder), name, type, description); - - i18n_info = i18n_info_new ("C", name, description); - add_i18n_info_to_hash (priv->language_id_to_i18n_info, i18n_info); -} - -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 = g_object_new (e_local_folder_get_type (), NULL); - - 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 = g_object_new (e_local_folder_get_type (), NULL); - - if (! construct_loading_metadata (E_LOCAL_FOLDER (folder), path)) { - g_object_unref (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_local_folder_add_i18n_info: - * @local_folder: A pointer to an ELocalFolder object - * @language_id: An I1I8N locale ID - * @name: Name for @local_folder in the specified @language_id - * @description: Description for @local_folder in the specified @language_id - * - * Set the @name and @description for the specified @language_id locale. - **/ -void -e_local_folder_add_i18n_info (ELocalFolder *local_folder, - const char *language_id, - const char *name, - const char *description) -{ - ELocalFolderPrivate *priv; - I18nInfo *info; - - g_return_if_fail (local_folder != NULL); - g_return_if_fail (E_IS_LOCAL_FOLDER (local_folder)); - g_return_if_fail (language_id != NULL); - g_return_if_fail (name != NULL || description != NULL); - - priv = local_folder->priv; - - info = i18n_info_new (language_id, name, description); - add_i18n_info_to_hash (priv->language_id_to_i18n_info, info); - - update_for_global_locale (local_folder); -} - -/** - * e_local_folder_get_i18n_info: - * @local_folder: A pointer to an ELocalFolder object - * @language_id: The ID of the language whose locale we want to retrieve name - * and description for - * @language_id_return: The actual locale ID that the name and description are - * saved under (e.g. if you ask for an "en_UK@yadda", we might give you the - * info for just "en") - * @name_return: A pointer to a pointer that will point to the i18nized name on - * return. Can be NULL. - * @description_return: A pointer to a pointer that will point to the i18n - * description on return. Can be NULL. - * - * Retrieve the name and description for @local_folder in the specified locale. - * - * Return value: %TRUE if some info is found for that @language_id, %FALSE - * otherwise. - **/ -gboolean -e_local_folder_get_i18n_info (ELocalFolder *local_folder, - const char *language_id, - const char **language_id_return, - const char **name_return, - const char **description_return) -{ - ELocalFolderPrivate *priv; - I18nInfo *i18n_info; - - 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 (language_id != NULL, FALSE); - - priv = local_folder->priv; - - i18n_info = get_i18n_info_for_language (local_folder, language_id); - - if (i18n_info == NULL) { - if (language_id_return != NULL) - *language_id_return = NULL; - if (name_return != NULL) - *name_return = NULL; - if (description_return != NULL) - *description_return = NULL; - - return FALSE; - } - - if (language_id_return != NULL) - *language_id_return = i18n_info->language_id; - if (name_return != NULL) - *name_return = i18n_info->name; - if (description_return != NULL) - *description_return = i18n_info->description; - - return TRUE; -} - - -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 ca3cf6c364..0000000000 --- a/shell/e-local-folder.h +++ /dev/null @@ -1,84 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-local-folder.h - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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_ - -#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)) - -#define E_LOCAL_FOLDER_METADATA_FILE_NAME "folder-metadata.xml" -#define E_LOCAL_FOLDER_METADATA_FILE_NAME_LEN 19 - -typedef struct _ELocalFolder ELocalFolder; -typedef struct _ELocalFolderClass ELocalFolderClass; -typedef struct _ELocalFolderPrivate ELocalFolderPrivate; - -struct _ELocalFolder { - EFolder parent; - - ELocalFolderPrivate *priv; -}; - -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); - -void e_local_folder_add_i18n_info (ELocalFolder *local_folder, - const char *language_id, - const char *name, - const char *description); -gboolean e_local_folder_get_i18n_info (ELocalFolder *local_folder, - const char *language_id, - const char **language_id_return, - const char **name_return, - const char **description_return); - -#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 8ce9f87189..0000000000 --- a/shell/e-local-storage.c +++ /dev/null @@ -1,1236 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-local-storage.c - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <errno.h> -#include <string.h> -#include <sys/param.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> -#include <dirent.h> - -#include <gtk/gtksignal.h> - -#include <libgnome/gnome-i18n.h> -#include <libgnome/gnome-util.h> - -#include <gal/util/e-util.h> - -#include "e-util/e-path.h" -#include "e-local-folder.h" -#include "e-shell-constants.h" - -#include "evolution-storage.h" - -#include "e-local-storage.h" - -#include <bonobo/bonobo-exception.h> - -#define PARENT_TYPE E_TYPE_STORAGE -static EStorageClass *parent_class = NULL; - -struct _ELocalStoragePrivate { - EFolderTypeRegistry *folder_type_registry; - char *base_path; - EvolutionStorage *bonobo_interface; -}; - - -/* EStorageResult <-> errno mapping. */ - -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; - } -} - - -/* Utility functions. */ - -static void -new_folder (ELocalStorage *local_storage, - const char *path, - EFolder *folder) -{ - ELocalStoragePrivate *priv; - - priv = local_storage->priv; - - e_storage_new_folder (E_STORAGE (local_storage), path, folder); - - evolution_storage_new_folder (EVOLUTION_STORAGE (priv->bonobo_interface), - path, - e_folder_get_name (folder), - e_folder_get_type_string (folder), - e_folder_get_physical_uri (folder), - e_folder_get_description (folder), - e_folder_get_custom_icon_name (folder), - e_folder_get_unread_count (folder), - FALSE, - 0); -} - -static gboolean -setup_folder_as_stock (ELocalStorage *local_storage, - const char *path, - const char *name, - const char *custom_icon_name) -{ - EFolder *folder; - - folder = e_storage_get_folder (E_STORAGE (local_storage), path); - if (folder == NULL) - return FALSE; - - e_folder_set_name (folder, name); - e_folder_set_is_stock (folder, TRUE); - e_folder_set_custom_icon (folder, custom_icon_name); - - return TRUE; -} - -static void -setup_stock_folders (ELocalStorage *local_storage) -{ - setup_folder_as_stock (local_storage, "/Calendar", _("Calendar"), NULL); - setup_folder_as_stock (local_storage, "/Contacts", _("Contacts"), NULL); - setup_folder_as_stock (local_storage, "/Drafts", _("Drafts"), NULL); - setup_folder_as_stock (local_storage, "/Inbox", _("Inbox"), "inbox"); - setup_folder_as_stock (local_storage, "/Outbox", _("Outbox"), "outbox"); - setup_folder_as_stock (local_storage, "/Sent", _("Sent"), NULL); - setup_folder_as_stock (local_storage, "/Tasks", _("Tasks"), NULL); - setup_folder_as_stock (local_storage, "/Trash", _("Trash"), NULL); -} - -static gboolean -load_folder (const char *physical_path, - const char *path, - void *data) -{ - ELocalStorage *local_storage; - EFolder *folder; - - local_storage = E_LOCAL_STORAGE (data); - - folder = e_local_folder_new_from_path (physical_path); - if (folder == NULL) { - /* g_warning ("No folder metadata in %s... ignoring", physical_path); FIXME */ - return TRUE; - } - - e_storage_new_folder ((EStorage *)local_storage, path, folder); - return TRUE; -} - -static void -setup_corba_storage (ELocalStorage *local_storage, - const char *path) -{ - GList *subfolder_paths; - EFolder *folder; - GList *p; - - folder = e_storage_get_folder (E_STORAGE (local_storage), path); - - if (folder != NULL) - evolution_storage_new_folder (EVOLUTION_STORAGE (local_storage->priv->bonobo_interface), - path, - e_folder_get_name (folder), - e_folder_get_type_string (folder), - e_folder_get_physical_uri (folder), - e_folder_get_description (folder), - e_folder_get_custom_icon_name (folder), - e_folder_get_unread_count (folder), - FALSE, - 0); - - subfolder_paths = e_storage_get_subfolder_paths (E_STORAGE (local_storage), path); - - for (p = subfolder_paths; p != NULL; p = p->next) - setup_corba_storage (local_storage, (const char *) p->data); - - e_free_string_list (subfolder_paths); -} - -static gboolean -load_all_folders (ELocalStorage *local_storage) -{ - const char *base_path; - - base_path = e_local_storage_get_base_path (local_storage); - - /* Ignore errors, so we set up the local storage even if there is stale - data that we don't understand in ~/evolution. */ - e_path_find_folders (base_path, load_folder, local_storage); - - setup_stock_folders (local_storage); - - setup_corba_storage (local_storage, "/"); - - return TRUE; -} - -static EStorageResult -storage_result_from_component_result (EvolutionShellComponentResult result) -{ - switch (result) { - case EVOLUTION_SHELL_COMPONENT_PERMISSIONDENIED: - return E_STORAGE_PERMISSIONDENIED; - case EVOLUTION_SHELL_COMPONENT_NOSPACE: - return E_STORAGE_NOSPACE; - default: - return E_STORAGE_GENERICERROR; - } -} - - -/* Callbacks for the async methods invoked on the `Evolution::ShellComponent's. */ - -static void -notify_listener (const Bonobo_Listener listener, - EStorageResult result, - const char *physical_path) -{ - CORBA_any any; - GNOME_Evolution_Storage_FolderResult folder_result; - CORBA_Environment ev; - - folder_result.result = result; - folder_result.path = CORBA_string_dup (physical_path ? physical_path : ""); - any._type = TC_GNOME_Evolution_Storage_FolderResult; - any._value = &folder_result; - - CORBA_exception_init (&ev); - Bonobo_Listener_event (listener, "evolution-shell:folder_created", - &any, &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Exception notifing listener: %s\n", - CORBA_exception_id (&ev)); - } - CORBA_exception_free (&ev); -} - -struct _AsyncCreateFolderCallbackData { - EStorage *storage; - Bonobo_Listener listener; - - char *path; - char *display_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; - EStorageResult storage_result; - - callback_data = (AsyncCreateFolderCallbackData *) data; - - storage_result = shell_component_result_to_storage_result (result); - - 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->display_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))) { - new_folder (E_LOCAL_STORAGE (callback_data->storage), - callback_data->path, folder); - } else { - rmdir (callback_data->physical_path); - g_object_unref (folder); - storage_result = E_STORAGE_IOERROR; - } - } - - g_object_unref (shell_component_client); - - if (callback_data->listener != CORBA_OBJECT_NIL) - notify_listener (callback_data->listener, storage_result, - callback_data->physical_path); - - if (callback_data->callback != NULL) - (* callback_data->callback) (callback_data->storage, - storage_result, - callback_data->callback_data); - - g_free (callback_data->path); - g_free (callback_data->display_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); -} - - -/* Implementation for the folder operations. */ - -static EStorageResult -create_folder_directory (ELocalStorage *local_storage, - const char *path, - const char *type, - const char *description, - char **physical_path_return) -{ - EStorage *storage; - ELocalStoragePrivate *priv; - char *parent_path; - char *physical_path; - - storage = E_STORAGE (local_storage); - priv = local_storage->priv; - - *physical_path_return = NULL; - g_assert (g_path_is_absolute (path)); - - parent_path = g_path_get_dirname(path); - - if (strlen(parent_path) > 1) { - char *subfolders_directory_physical_path; - char *parent; - - /* Create the `subfolders' subdirectory under the parent. */ - parent = g_strdup_printf ("%s/", parent_path); - subfolders_directory_physical_path = e_path_to_physical (priv->base_path, parent); - - if (mkdir (subfolders_directory_physical_path, 0700) == -1 && errno != EEXIST) { - g_free (subfolders_directory_physical_path); - g_free (parent); - return errno_to_storage_result (); - } - - g_free (subfolders_directory_physical_path); - g_free (parent); - } - - g_free (parent_path); - - physical_path = e_path_to_physical (priv->base_path, path); - - /* Create the directory that holds the folder. */ - - *physical_path_return = physical_path; - if (mkdir (physical_path, 0700) == -1) { - return errno_to_storage_result (); - } - - return E_STORAGE_OK; -} - -static void -create_folder (ELocalStorage *local_storage, - const Bonobo_Listener listener, - const char *path, - const char *type, - const char *description, - EStorageResultCallback callback, - void *data) -{ - EStorage *storage; - ELocalStoragePrivate *priv; - EvolutionShellComponentClient *component_client; - AsyncCreateFolderCallbackData *callback_data; - EStorageResult result; - char *folder_name; - char *physical_path; - char *physical_uri; - - storage = E_STORAGE (local_storage); - priv = local_storage->priv; - component_client = e_folder_type_registry_get_handler_for_type (priv->folder_type_registry, - type); - if (component_client == NULL) { - if (listener != CORBA_OBJECT_NIL) - notify_listener (listener, E_STORAGE_INVALIDTYPE, NULL); - if (callback != NULL) - (* callback) (storage, E_STORAGE_INVALIDTYPE, data); - return; - } - - g_assert (g_path_is_absolute (path)); - - result = create_folder_directory (local_storage, path, type, description, &physical_path); - if (result != E_STORAGE_OK) { - if (callback != NULL) - (* callback) (storage, result, data); - if (listener != CORBA_OBJECT_NIL) - notify_listener (listener, result, NULL); - - g_free (physical_path); - return; - } - - folder_name = g_path_get_basename (path); - - /* 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 = E_STORAGE (local_storage); - callback_data->path = g_strdup (path); - callback_data->display_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->listener = listener; - callback_data->callback = callback; - callback_data->callback_data = data; - - g_object_ref (component_client); - - evolution_shell_component_client_async_create_folder (component_client, - physical_uri, - type, - component_async_create_folder_callback, - callback_data); - - g_free (folder_name); -} - -struct _AsyncRemoveFolderCallbackData { - EStorage *storage; - GList *next_paths_to_delete; -}; -typedef struct _AsyncRemoveFolderCallbackData AsyncRemoveFolderCallbackData; - -static EStorageResult -remove_folder_directory (ELocalStorage *local_storage, - const char *path) -{ - EStorage *storage; - ELocalStoragePrivate *priv; - char *folder_name; - char *file_name; - char *physical_path; - - priv = local_storage->priv; - - storage = E_STORAGE (local_storage); - folder_name = g_path_get_basename (path); - - /* Delete the metadata file associated with this folder. */ - physical_path = e_path_to_physical (priv->base_path, path); - file_name = g_build_filename (physical_path, E_LOCAL_FOLDER_METADATA_FILE_NAME, NULL); - unlink (file_name); - g_free (file_name); - - /* Delete the physical directory. */ - if (rmdir (physical_path) == -1) { - g_free (physical_path); - g_free (folder_name); - return E_STORAGE_GENERICERROR; - } - - g_free (physical_path); - - /* Delete the 'subfolders' directory that this folder lies in */ - if (folder_name != path + 1) { - char *subfolders_directory_physical_path; - char *parent_path; - - parent_path = g_strndup (path, strlen (path) - strlen (folder_name)); - subfolders_directory_physical_path = e_path_to_physical (priv->base_path, parent_path); - g_free (parent_path); - - rmdir (subfolders_directory_physical_path); - g_free (subfolders_directory_physical_path); - } - - g_free (folder_name); - return E_STORAGE_OK; -} - -static gboolean remove_folder_step (AsyncRemoveFolderCallbackData *callback_data); - -static void -component_async_remove_folder_callback (EvolutionShellComponentClient *shell_component_client, - EvolutionShellComponentResult result, - void *data) -{ - ELocalStoragePrivate *priv; - AsyncRemoveFolderCallbackData *callback_data; - EStorageResult storage_result; - gboolean success; - const char *path; - - callback_data = (AsyncRemoveFolderCallbackData *) data; - priv = E_LOCAL_STORAGE (callback_data->storage)->priv; - path = (const char *) callback_data->next_paths_to_delete->data; - - storage_result = shell_component_result_to_storage_result (result); - - if (result == EVOLUTION_SHELL_COMPONENT_OK) { - result = remove_folder_directory (E_LOCAL_STORAGE (callback_data->storage), path); - e_storage_removed_folder (E_STORAGE (callback_data->storage), path); - evolution_storage_removed_folder (EVOLUTION_STORAGE (priv->bonobo_interface), path); - } else { - /* FIXME: Handle errors. */ - g_print ("...Error removing %s!\n", path); - } - - g_object_unref (shell_component_client); - - /* Now go on and delete the next subfolder in the list that still - exists, deallocating the elements in the list in the process. */ - do { - char *path; - - path = callback_data->next_paths_to_delete->data; - g_free (path); - - callback_data->next_paths_to_delete - = g_list_remove_link (callback_data->next_paths_to_delete, - callback_data->next_paths_to_delete); - - /* Check if we are done. */ - if (callback_data->next_paths_to_delete == NULL) { - g_free (callback_data); - return; - } - - /* Remove the folder; if the folder has disappeared from the - tree for some reason (this is an async callback!), just go - on with the next one. */ - success = remove_folder_step (callback_data); - } while (! success); -} - -static gboolean -remove_folder_step (AsyncRemoveFolderCallbackData *callback_data) -{ - EvolutionShellComponentClient *client; - ELocalStoragePrivate *priv; - EFolder *folder; - const char *path; - const char *type; - char *physical_path; - char *physical_uri; - - g_assert (callback_data->next_paths_to_delete != NULL); - path = (const char *) callback_data->next_paths_to_delete->data; - - folder = e_storage_get_folder (callback_data->storage, path); - if (folder == NULL) - return FALSE; - - priv = E_LOCAL_STORAGE (callback_data->storage)->priv; - - physical_path = e_path_to_physical (priv->base_path, path); - physical_uri = g_strconcat ("file://", physical_path, NULL); - - type = e_folder_get_type_string (folder); - client = e_folder_type_registry_get_handler_for_type (priv->folder_type_registry, type); - - g_object_ref (client); - - evolution_shell_component_client_async_remove_folder (client, physical_uri, type, - component_async_remove_folder_callback, - callback_data); - - g_free (physical_path); - g_free (physical_uri); - - return TRUE; -} - -static GList * -create_subfolder_list (ELocalStorage *local_storage, - const char *path) -{ - GList *subfolders; - GList *list; - GList *p; - - subfolders = e_storage_get_subfolder_paths (E_STORAGE (local_storage), path); - - list = NULL; - for (p = subfolders; p != NULL; p = p->next) { - char *path; - - path = (char *) p->data; - - list = g_list_concat (list, create_subfolder_list (local_storage, path)); - list = g_list_append (list, path); - } - - g_list_free (subfolders); - - return list; -} - -static EStorageResult -remove_folder (ELocalStorage *local_storage, - const char *path) -{ - ELocalStoragePrivate *priv; - EStorage *storage; - AsyncRemoveFolderCallbackData *callback_data; - EvolutionShellComponentClient *component_client; - EFolder *folder; - GList *next_paths_to_delete; - - priv = local_storage->priv; - - storage = E_STORAGE (local_storage); - folder = e_storage_get_folder (storage, path); - - if (e_folder_get_is_stock (folder)) - return E_STORAGE_CANTCHANGESTOCKFOLDER; - - component_client = e_folder_type_registry_get_handler_for_type (priv->folder_type_registry, - e_folder_get_type_string (folder)); - if (component_client == NULL) - return E_STORAGE_INVALIDTYPE; - - next_paths_to_delete = create_subfolder_list (E_LOCAL_STORAGE (storage), path); - next_paths_to_delete = g_list_append (next_paths_to_delete, g_strdup (path)); - - callback_data = g_new (AsyncRemoveFolderCallbackData, 1); - callback_data->storage = E_STORAGE (local_storage); - callback_data->next_paths_to_delete = next_paths_to_delete; - - if (! remove_folder_step (callback_data)) { - /* Eek, something wacky happened. */ - return EVOLUTION_SHELL_COMPONENT_UNKNOWNERROR; - } - - return EVOLUTION_SHELL_COMPONENT_OK; -} - - -/* GtkObject methods. */ - -static void -impl_dispose (GObject *object) -{ - ELocalStorage *local_storage; - ELocalStoragePrivate *priv; - CORBA_Environment ev; - - local_storage = E_LOCAL_STORAGE (object); - priv = local_storage->priv; - - CORBA_exception_init (&ev); - - if (priv->folder_type_registry != NULL) { - g_object_unref (priv->folder_type_registry); - priv->folder_type_registry = NULL; - } - - if (priv->bonobo_interface != NULL) { - bonobo_object_unref (BONOBO_OBJECT (priv->bonobo_interface)); - priv->bonobo_interface = NULL; - } - - CORBA_exception_free (&ev); - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - ELocalStorage *local_storage; - ELocalStoragePrivate *priv; - - local_storage = E_LOCAL_STORAGE (object); - priv = local_storage->priv; - - g_free (priv->base_path); - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -/* Creating folders. */ - -static void -impl_async_create_folder (EStorage *storage, - const char *path, - const char *type, - const char *description, - EStorageResultCallback callback, - void *data) -{ - ELocalStorage *local_storage; - - local_storage = E_LOCAL_STORAGE (storage); - - create_folder (local_storage, CORBA_OBJECT_NIL, path, type, description, callback, data); -} - - -/* Removing folders. */ - -static void -impl_async_remove_folder (EStorage *storage, - const char *path, - EStorageResultCallback callback, - void *data) -{ - ELocalStorage *local_storage; - EStorageResult result; - - local_storage = E_LOCAL_STORAGE (storage); - - result = remove_folder (local_storage, path); - - if (callback != NULL) - (* callback) (E_STORAGE (local_storage), result, data); -} - - - -/* Transferring folders. */ - -struct _XferItem { - char *source_path; - char *destination_path; -}; -typedef struct _XferItem XferItem; - -static XferItem * -xfer_item_new (char *source_path, - char *destination_path) -{ - XferItem *new; - - new = g_new (XferItem, 1); - new->source_path = source_path; - new->destination_path = destination_path; - - return new; -} - -static void -xfer_item_free (XferItem *item) -{ - g_free (item->source_path); - g_free (item->destination_path); - g_free (item); -} - -static void -append_xfer_item_list (EStorage *storage, - char *source_path, - char *destination_path, - GList **list) -{ - GList *subfolders; - GList *p; - - *list = g_list_prepend (*list, xfer_item_new (source_path, destination_path)); - - subfolders = e_storage_get_subfolder_paths (storage, source_path); - for (p = subfolders; p != NULL; p = p->next) { - char *base_name; - char *source_subpath; - char *destination_subpath; - - source_subpath = g_strdup ((const char *) p->data); - base_name = g_path_get_basename (source_subpath); - destination_subpath = g_build_filename (destination_path, base_name, NULL); - append_xfer_item_list (storage, source_subpath, destination_subpath, list); - g_free (base_name); - } - - e_free_string_list (subfolders); -} - -struct _XferData { - /* The storage on which we are performing the xfer operation. */ - ELocalStorage *local_storage; - - /* List of source/destination path couples to copy, in the right - order. */ - GList *folder_items; - - /* Pointer into `folder_items'. The folder item pointed by this is the - one handled by the previous CORBA invocation. */ - GList *current_folder_item; - - /* Whether we want to remove the source too. */ - gboolean remove_source; - - /* The callback, with its data. */ - EStorageResultCallback callback; - void *callback_data; -}; -typedef struct _XferData XferData; - -static void -async_xfer_folder_step (ELocalStorage *local_storage, - const char *source_path, - const char *destination_path, - gboolean remove_source, - EvolutionShellComponentClientCallback component_client_callback, - void *component_client_callback_data) -{ - ELocalStoragePrivate *priv; - EFolder *source_folder; - EvolutionShellComponentClient *component_client; - char *physical_path; - char *physical_uri; - - priv = local_storage->priv; - - source_folder = e_storage_get_folder (E_STORAGE (local_storage), source_path); - g_assert (source_folder != NULL); - - create_folder_directory (local_storage, destination_path, - e_folder_get_type_string (source_folder), - e_folder_get_description (source_folder), - &physical_path); - - physical_uri = g_strconcat ("file://", physical_path, NULL); - g_free (physical_path); - - component_client = e_folder_type_registry_get_handler_for_type (priv->folder_type_registry, - e_folder_get_type_string (source_folder)); - g_assert (component_client != NULL); - - evolution_shell_component_client_async_xfer_folder (component_client, - e_folder_get_physical_uri (source_folder), - physical_uri, - e_folder_get_type_string (source_folder), - remove_source, - component_client_callback, - component_client_callback_data); - g_free (physical_uri); -} - -static void -async_xfer_folder_complete (XferData *xfer_data, - gboolean success) -{ - ELocalStorage *local_storage; - GList *p; - - local_storage = xfer_data->local_storage; - - if (success && xfer_data->remove_source) { - EStorageResult result; - - /* Remove all the source physical directories, and also the - corresponding folders from the folder tree. */ - - for (p = g_list_last (xfer_data->folder_items); p != NULL; p = p->prev) { - XferItem *item; - - item = (XferItem *) p->data; - - result = remove_folder_directory (local_storage, item->source_path); - - /* FIXME handle failure differently? This should be n - unlikely situation. */ - if (result == E_STORAGE_OK) { - e_storage_removed_folder (E_STORAGE (local_storage), item->source_path); - - evolution_storage_removed_folder (EVOLUTION_STORAGE (local_storage->priv->bonobo_interface), - item->source_path); - } - } - } - - /* Free the data. */ - - for (p = xfer_data->folder_items; p != NULL; p = p->next) { - XferItem *item; - - item = (XferItem *) p->data; - xfer_item_free (item); - } - g_list_free (xfer_data->folder_items); - - g_free (xfer_data); -} - -static void -async_xfer_folder_callback (EvolutionShellComponentClient *shell_component_client, - EvolutionShellComponentResult result, - void *callback_data) -{ - XferData *xfer_data; - XferItem *item; - EFolder *source_folder; - EFolder *destination_folder; - char *dest_physical_path; - char *new_physical_uri; - - xfer_data = (XferData *) callback_data; - - item = (XferItem *) xfer_data->current_folder_item->data; - - if (result != EVOLUTION_SHELL_COMPONENT_OK) { - (* xfer_data->callback) (E_STORAGE (xfer_data->local_storage), - storage_result_from_component_result (result), - xfer_data->callback_data); - async_xfer_folder_complete (xfer_data, FALSE); - return; - } - - source_folder = e_storage_get_folder (E_STORAGE (xfer_data->local_storage), item->source_path); - destination_folder = e_local_folder_new (e_folder_get_name (source_folder), - e_folder_get_type_string (source_folder), - e_folder_get_description (source_folder)); - - dest_physical_path = e_path_to_physical (xfer_data->local_storage->priv->base_path, item->destination_path); - new_physical_uri = g_strconcat ("file://", dest_physical_path, NULL); - g_free (dest_physical_path); - e_folder_set_physical_uri (destination_folder, new_physical_uri); - g_free (new_physical_uri); - - e_local_folder_save (E_LOCAL_FOLDER (destination_folder)); /* FIXME check for errors */ - new_folder (xfer_data->local_storage, item->destination_path, destination_folder); - - xfer_data->current_folder_item = xfer_data->current_folder_item->next; - if (xfer_data->current_folder_item == NULL) { - (* xfer_data->callback) (E_STORAGE (xfer_data->local_storage), E_STORAGE_OK, xfer_data->callback_data); - async_xfer_folder_complete (xfer_data, TRUE); - return; - } - - item = (XferItem *) xfer_data->current_folder_item->data; - - async_xfer_folder_step (xfer_data->local_storage, - item->source_path, - item->destination_path, - xfer_data->remove_source, - async_xfer_folder_callback, - xfer_data); -} - -static void -impl_async_xfer_folder (EStorage *storage, - const char *source_path, - const char *destination_path, - gboolean remove_source, - EStorageResultCallback callback, - void *callback_data) -{ - ELocalStorage *local_storage; - ELocalStoragePrivate *priv; - XferData *xfer_data; - GList *folder_items; /* <XferItem> */ - XferItem *first_item; - - local_storage = E_LOCAL_STORAGE (storage); - priv = local_storage->priv; - - if (remove_source && e_folder_get_is_stock (e_storage_get_folder (storage, source_path))) { - (* callback) (storage, E_STORAGE_CANTCHANGESTOCKFOLDER, callback_data); - return; - } - - folder_items = NULL; - append_xfer_item_list (storage, g_strdup (source_path), g_strdup (destination_path), &folder_items); - folder_items = g_list_reverse (folder_items); /* lame */ - - xfer_data = g_new (XferData, 1); - xfer_data->local_storage = local_storage; - xfer_data->folder_items = folder_items; - xfer_data->current_folder_item = folder_items; - xfer_data->remove_source = remove_source; - xfer_data->callback = callback; - xfer_data->callback_data = callback_data; - - first_item = (XferItem *) xfer_data->folder_items->data; - - async_xfer_folder_step (E_LOCAL_STORAGE (storage), - first_item->source_path, - first_item->destination_path, - remove_source, - async_xfer_folder_callback, - xfer_data); -} - - -/* Callbacks for the `Evolution::Storage' interface we are exposing to the outside world. */ -static void -bonobo_interface_create_folder_cb (EvolutionStorage *storage, - const Bonobo_Listener listener, - const char *path, - const char *type, - const char *description, - const char *parent_physical_uri, - void *data) -{ - ELocalStorage *local_storage; - - local_storage = E_LOCAL_STORAGE (data); - - create_folder (local_storage, listener, path, type, description, NULL, NULL); -} - -static int -bonobo_interface_remove_folder_cb (EvolutionStorage *storage, - const Bonobo_Listener listener, - const char *path, - const char *physical_uri, - void *data) -{ - ELocalStorage *local_storage; - - local_storage = E_LOCAL_STORAGE (data); - - return remove_folder (local_storage, path); -} - -static void -bonobo_interface_update_folder_cb (EvolutionStorage *storage, - const char *path, - int unread_count, - void *data) -{ - ELocalStorage *local_storage; - EFolder *folder; - - local_storage = E_LOCAL_STORAGE (data); - - folder = e_storage_get_folder (E_STORAGE (local_storage), path); - if (folder == NULL) - return; - - e_folder_set_unread_count (folder, unread_count); - return; -} - - -/* Initialization. */ - -static void -class_init (ELocalStorageClass *class) -{ - EStorageClass *storage_class; - GObjectClass *object_class; - - parent_class = g_type_class_ref(e_storage_get_type ()); - - object_class = G_OBJECT_CLASS (class); - storage_class = E_STORAGE_CLASS (class); - - object_class->finalize = impl_finalize; - object_class->dispose = impl_dispose; - - storage_class->async_create_folder = impl_async_create_folder; - storage_class->async_remove_folder = impl_async_remove_folder; - storage_class->async_xfer_folder = impl_async_xfer_folder; -} - -static void -init (ELocalStorage *local_storage) -{ - ELocalStoragePrivate *priv; - - priv = g_new (ELocalStoragePrivate, 1); - - priv->base_path = NULL; - priv->folder_type_registry = NULL; - priv->bonobo_interface = NULL; - - local_storage->priv = priv; -} - - -static gboolean -construct (ELocalStorage *local_storage, - EFolderTypeRegistry *folder_type_registry, - const char *base_path) -{ - ELocalStoragePrivate *priv; - EFolder *root_folder; - int base_path_len; - char *uri; - - root_folder = e_folder_new (_("Local Folders"), "noselect", ""); - uri = g_strdup_printf("file://%s;noselect", base_path); - e_folder_set_physical_uri(root_folder, uri); - g_free(uri); - e_storage_construct (E_STORAGE (local_storage), - E_LOCAL_STORAGE_NAME, - root_folder); - - priv = local_storage->priv; - - base_path_len = strlen (base_path); - while (base_path_len > 0 && base_path[base_path_len - 1] == E_PATH_SEPARATOR) - base_path_len--; - - g_return_val_if_fail (base_path_len != 0, FALSE); - - g_assert (priv->folder_type_registry == NULL); - g_object_ref (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); - - g_assert (priv->bonobo_interface == NULL); - priv->bonobo_interface = evolution_storage_new (E_LOCAL_STORAGE_NAME, FALSE); - - g_signal_connect (priv->bonobo_interface, "create_folder", - G_CALLBACK (bonobo_interface_create_folder_cb), - local_storage); - g_signal_connect (priv->bonobo_interface, "remove_folder", - G_CALLBACK (bonobo_interface_remove_folder_cb), - local_storage); - g_signal_connect (priv->bonobo_interface, "update_folder", - G_CALLBACK (bonobo_interface_update_folder_cb), - local_storage); - - 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 = g_object_new (e_local_storage_get_type (), NULL); - - if (! construct (E_LOCAL_STORAGE (new), folder_type_registry, base_path)) { - g_object_unref (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; -} - - -const GNOME_Evolution_Storage -e_local_storage_get_corba_interface (ELocalStorage *local_storage) -{ - ELocalStoragePrivate *priv; - GNOME_Evolution_Storage corba_interface; - - g_return_val_if_fail (local_storage != NULL, NULL); - g_return_val_if_fail (E_IS_LOCAL_STORAGE (local_storage), NULL); - - priv = local_storage->priv; - corba_interface = bonobo_object_corba_objref (BONOBO_OBJECT (priv->bonobo_interface)); - - return corba_interface; -} - - -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 c640c29b70..0000000000 --- a/shell/e-local-storage.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-local-storage.h - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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_ - -#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); - -const GNOME_Evolution_Storage e_local_storage_get_corba_interface (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 ce9389b781..0000000000 --- a/shell/e-setup.c +++ /dev/null @@ -1,333 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-setup.c - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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. */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-setup.h" - -#include "e-local-folder.h" -#include "e-shell-config.h" -#include "e-shell-constants.h" - -#include "e-util/e-dialog-utils.h" -#include "e-util/e-path.h" - -#include <gconf/gconf-client.h> - -#include <gtk/gtklabel.h> - -#include <libgnome/gnome-i18n.h> -#include <libgnome/gnome-util.h> - -#include <errno.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <dirent.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -#define DEFAULT_USER_PATH EVOLUTION_DATADIR "/evolution/" BASE_VERSION "/default_user" - - -static GList * -check_dir_recur (const char *evolution_directory, - const char *current_directory) -{ - DIR *def; - GList *newfiles = NULL; - struct dirent *current; - - def = opendir (current_directory); - if (def == NULL) - return NULL; - - current = readdir (def); - while (current != NULL) { - struct stat buf; - char *fullname, *fulldefaultname; - - if (current->d_name[0] == '.' && - (current->d_name[1] == '\0' || - (current->d_name[1] == '.' && current->d_name[2] == '\0'))) { - current = readdir (def); - continue; - } - - /* Hack to not copy the old Executive-Summary dir */ - if (strcmp (current->d_name, "Executive-Summary") == 0) { - current = readdir (def); - continue; - } - - fullname = g_build_filename (evolution_directory, current->d_name, NULL); - fulldefaultname = g_build_filename (current_directory, current->d_name, NULL); - - if (stat (fullname, &buf) == -1) { - char *name; - - name = g_strdup (fulldefaultname); - newfiles = g_list_append (newfiles, name); - } else { - if (S_ISDIR (buf.st_mode)) { - newfiles = g_list_concat (newfiles, - check_dir_recur (fullname, - fulldefaultname)); - } - } - - g_free (fulldefaultname); - g_free (fullname); - current = readdir (def); - } - - closedir (def); - return newfiles; -} - -static gboolean -check_evolution_directory (const char *evolution_directory) -{ - gboolean retval; - GList *newfiles, *l; - - newfiles = g_list_concat (NULL, check_dir_recur (evolution_directory, DEFAULT_USER_PATH)); - - if (newfiles == NULL) { - retval = TRUE; - goto out; - } - - retval = TRUE; - for (l = newfiles; l; l = l->next) { - char *command; - char *shortpath; - - shortpath = l->data + strlen (DEFAULT_USER_PATH); - command = g_strconcat ("cp -r ", - l->data, " ", - evolution_directory, "/", - shortpath, - NULL); - - if (system (command) != 0) { - retval = FALSE; - } else { - retval = (retval && TRUE); - } - - g_free (command); - } - - if (retval == FALSE) - e_notice (NULL, GTK_MESSAGE_ERROR, - _("Could not update files correctly")); - - out: - - for (l = newfiles; l; l = l->next) - g_free (l->data); - - g_list_free (newfiles); - - return retval; -} - - -static gboolean -copy_default_stuff (const char *evolution_directory) -{ - gboolean retval; - char *command; - - if (mkdir (evolution_directory, 0700)) { - e_notice (NULL, GTK_MESSAGE_ERROR, - _("Cannot create the directory\n%s\nError: %s"), - evolution_directory, - g_strerror (errno)); - return FALSE; - } - - command = g_strconcat ("cp -r " DEFAULT_USER_PATH "/* ", evolution_directory, NULL); - - if (system (command) != 0) { - /* FIXME: Give more help. */ - e_notice (NULL, GTK_MESSAGE_ERROR, - _("An error occurred in copying files into\n`%s'."), evolution_directory); - retval = FALSE; - } else { - retval = TRUE; - } - - g_free (command); - - return retval; -} - -static void -e_shell_rm_dir (const char *path) -{ - DIR *base; - struct stat statbuf; - struct dirent *contents; - - stat (path, &statbuf); - if (!S_ISDIR (statbuf.st_mode)) { - /* Not a directory */ - g_message ("Removing: %s", path); - unlink (path); - return; - } else { - g_message ("Opening: %s", path); - base = opendir (path); - - if (base == NULL) - return; - - contents = readdir (base); - while (contents != NULL) { - char *fullpath; - - if (strcmp (contents->d_name, ".") == 0|| - strcmp (contents->d_name, "..") ==0) { - contents = readdir (base); - continue; - } - - fullpath = g_build_filename (path, contents->d_name, NULL); - e_shell_rm_dir (fullpath); - g_free (fullpath); - - contents = readdir (base); - } - - closedir (base); - rmdir (path); - } -} - - -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, GTK_MESSAGE_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; - } - - file = g_strdup_printf ("%s/searches.xml", evolution_directory); - if (stat (file, &statinfo) != 0) { - e_notice (NULL, GTK_MESSAGE_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); - - /* User has evolution directory... - Check if it is up to date. */ - return check_evolution_directory (evolution_directory); -} - - -static void -set_default_folder_physical_uri_from_path (GConfClient *client, - const char *evolution_directory, - const char *path_key_name) -{ - char *gconf_path; - char *path_value; - - gconf_path = g_strconcat ("/apps/evolution/shell/default_folders/", path_key_name, NULL); - path_value = gconf_client_get_string (client, gconf_path, NULL); - g_free (gconf_path); - - if (path_value != NULL - && strncmp (path_value, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN) == 0 - && strncmp (path_value + E_SHELL_URI_PREFIX_LEN, "/local/", 7) == 0) { - char *key_prefix; - char *local_physical_uri; - char *file_uri_prefix; - - key_prefix = g_strndup (path_key_name, strchr (path_key_name, '_') - path_key_name); - gconf_path = g_strconcat ("/apps/evolution/shell/default_folders/", key_prefix, "_uri", NULL); - file_uri_prefix = g_strconcat ("file://", evolution_directory, "/local", NULL); - local_physical_uri = e_path_to_physical (file_uri_prefix, path_value + E_SHELL_URI_PREFIX_LEN + 6); - - gconf_client_set_string (client, gconf_path, local_physical_uri, NULL); - - g_free (gconf_path); - g_free (key_prefix); - g_free (local_physical_uri); - g_free (file_uri_prefix); - } -} - -void -e_setup_check_config (const char *evolution_directory) -{ - GConfClient *client; - char *tmp; - gboolean present = FALSE; - - client = gconf_client_get_default (); - - tmp = gconf_client_get_string (client, "/apps/evolution/shell/default_folders/mail_uri", NULL); - if (tmp != NULL) { - if (*tmp != 0) - present = TRUE; - g_free (tmp); - } - - if (present) { - g_object_unref (client); - return; - } - - /* The following ugliness is to initially set up the physical URIs - based on the default path values (which come from GConf). Of - course, this way of configuring the default folders is a bit of a - mess and needs to be cleaned up... */ - - set_default_folder_physical_uri_from_path (client, evolution_directory, "mail_path"); - set_default_folder_physical_uri_from_path (client, evolution_directory, "contacts_path"); - set_default_folder_physical_uri_from_path (client, evolution_directory, "calendar_path"); - set_default_folder_physical_uri_from_path (client, evolution_directory, "tasks_path"); - - g_object_unref (client); -} diff --git a/shell/e-setup.h b/shell/e-setup.h deleted file mode 100644 index 214dbcdd9e..0000000000 --- a/shell/e-setup.h +++ /dev/null @@ -1,32 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-setup.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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); - -void e_setup_check_config (const char *evolution_directory); - -#endif /* _E_SETUP_H */ diff --git a/shell/e-shell-about-box.c b/shell/e-shell-about-box.c deleted file mode 100644 index 3ebf247609..0000000000 --- a/shell/e-shell-about-box.c +++ /dev/null @@ -1,426 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-about-box.c - * - * Copyright (C) 2001, 2002, 2003 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-shell-about-box.h" - -#include <gal/util/e-util.h> - -#include <gtk/gtkeventbox.h> -#include <gdk-pixbuf/gdk-pixbuf.h> - - -#define PARENT_TYPE gtk_event_box_get_type () -static GtkEventBoxClass *parent_class = NULL; - -static const char *text[] = { - "", - "Evolution " VERSION, - "Copyright 1999 - 2003 Ximian, Inc.", - "", - N_("Brought to you by"), - "", - "Seth Alves", - "Jacob Berkman", - "Kevin Breit", - "Anders Carlsson", - "Damon Chaplin", - "Zbigniew Chyla", - "Clifford R. Conover", - "Anna Dirks", - "Bob Doan", - "Miguel de Icaza", - "Radek Doul\xC3\xADk", - "Arturo Espinoza", - "Larry Ewing", - "Nat Friedman", - "Alex Graveley", - "Bertrand Guiheneuf", - "Heath Harrelson", - "Iain Holmes", - "Mike Kestner", - "Tuomas Kuosmanen", - "Christopher J. Lahey", - "Miles Lane", - "Jason Leach", - "Timothy Lee", - "Matthew Loper", - "Michael MacDonald", - "Kjartan Maraas", - "Gerardo Marin", - "Michael Meeks", - "Federico Mena", - "Michael M. Morrison", - "Rodrigo Moya", - "Eskil Heyn Olsen", - "Gediminas Paulauskas", - "Jesse Pavel", - "Ettore Perazzoli", - "JP Rosevear", - "Jeffrey Stedfast", - "Jakub Steiner", - "Russell Steinthal", - "Peter Teichman", - "Chris Toshok", - "Jon Trowbridge", - "Luis Villa", - "Aaron Weber", - "Peter Williams", - "Dan Winship", - "Michael Zucchi" -}; -#define NUM_TEXT_LINES (sizeof (text) / sizeof (*text)) - -struct _EShellAboutBoxPrivate { - GdkPixmap *pixmap; - GdkPixmap *text_background_pixmap; - GdkGC *clipped_gc; - int text_y_offset; - int timeout_id; - const gchar **permuted_text; -}; - - -#define ANIMATION_DELAY 40 - -#define WIDTH 400 -#define HEIGHT 200 - -#define TEXT_Y_OFFSET 57 -#define TEXT_X_OFFSET 60 -#define TEXT_WIDTH (WIDTH - 2 * TEXT_X_OFFSET) -#define TEXT_HEIGHT 90 - -#define IMAGE_PATH EVOLUTION_IMAGES "/about-box.png" - - - -static void -permute_names (EShellAboutBox *about_box) -{ - EShellAboutBoxPrivate *priv = about_box->priv; - gint i, j; - - srandom (time (NULL)); - - for (i = 6; i < NUM_TEXT_LINES-1; ++i) { - const gchar *tmp; - j = i + random () % (NUM_TEXT_LINES - i); - if (i != j) { - tmp = priv->permuted_text[i]; - priv->permuted_text[i] = priv->permuted_text[j]; - priv->permuted_text[j] = tmp; - } - } -} - -/* The callback. */ - -static int -timeout_callback (void *data) -{ - EShellAboutBox *about_box; - EShellAboutBoxPrivate *priv; - GdkRectangle redraw_rect; - GtkWidget *widget; - PangoContext *context; - PangoFontMetrics *metrics; - PangoLayout *layout; - int line_height; - int first_line; - int y; - int i; - - about_box = E_SHELL_ABOUT_BOX (data); - priv = about_box->priv; - - widget = GTK_WIDGET (about_box); - - context = gtk_widget_get_pango_context (widget); - metrics = pango_context_get_metrics (context, gtk_widget_get_style (GTK_WIDGET (about_box))->font_desc, - pango_context_get_language (context)); - line_height = PANGO_PIXELS (pango_font_metrics_get_ascent (metrics) - + pango_font_metrics_get_descent (metrics)); - pango_font_metrics_unref (metrics); - - if (priv->text_y_offset < TEXT_HEIGHT) { - y = TEXT_Y_OFFSET + (TEXT_HEIGHT - priv->text_y_offset); - first_line = 0; - } else { - y = TEXT_Y_OFFSET - ((priv->text_y_offset - TEXT_HEIGHT) % line_height); - first_line = (priv->text_y_offset - TEXT_HEIGHT) / line_height; - } - - gdk_draw_pixmap (priv->pixmap, priv->clipped_gc, priv->text_background_pixmap, - 0, 0, - TEXT_X_OFFSET, TEXT_Y_OFFSET, TEXT_WIDTH, TEXT_HEIGHT); - - layout = pango_layout_new (context); - - for (i = 0; i < TEXT_HEIGHT / line_height + 3; i ++) { - const char *line; - int width; - int x; - - if (first_line + i >= NUM_TEXT_LINES) - break; - - if (*priv->permuted_text[first_line + i] == '\0') - line = ""; - else - line = _(priv->permuted_text[first_line + i]); - - pango_layout_set_text (layout, line, -1); - pango_layout_get_pixel_size (layout, &width, NULL); - x = TEXT_X_OFFSET + (TEXT_WIDTH - width) / 2; - gdk_draw_layout (priv->pixmap, priv->clipped_gc, x, y, layout); - - y += line_height; - } - - redraw_rect.x = TEXT_X_OFFSET; - redraw_rect.y = TEXT_Y_OFFSET; - redraw_rect.width = TEXT_WIDTH; - redraw_rect.height = TEXT_HEIGHT; - gdk_window_invalidate_rect (widget->window, &redraw_rect, FALSE); - gdk_window_process_updates (widget->window, FALSE); - - priv->text_y_offset ++; - if (priv->text_y_offset > line_height * NUM_TEXT_LINES + TEXT_HEIGHT) { - priv->text_y_offset = 0; - permute_names (about_box); - } - - g_object_unref (layout); - - return TRUE; -} - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - EShellAboutBox *about_box; - EShellAboutBoxPrivate *priv; - - about_box = E_SHELL_ABOUT_BOX (object); - priv = about_box->priv; - - if (priv->pixmap != NULL) { - gdk_pixmap_unref (priv->pixmap); - priv->pixmap = NULL; - } - - if (priv->text_background_pixmap != NULL) { - gdk_pixmap_unref (priv->text_background_pixmap); - priv->text_background_pixmap = NULL; - } - - if (priv->clipped_gc != NULL) { - gdk_gc_unref (priv->clipped_gc); - priv->clipped_gc = NULL; - } - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EShellAboutBox *about_box; - EShellAboutBoxPrivate *priv; - - about_box = E_SHELL_ABOUT_BOX (object); - priv = about_box->priv; - - if (priv->timeout_id != -1) - g_source_remove (priv->timeout_id); - - g_free (priv->permuted_text); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -/* GtkWidget methods. */ - -static void -impl_size_request (GtkWidget *widget, - GtkRequisition *requisition) -{ - requisition->width = WIDTH; - requisition->height = HEIGHT; -} - -static void -impl_realize (GtkWidget *widget) -{ - EShellAboutBox *about_box; - EShellAboutBoxPrivate *priv; - GdkPixbuf *background_pixbuf; - GdkRectangle clip_rectangle; - - (* GTK_WIDGET_CLASS (parent_class)->realize) (widget); - - about_box = E_SHELL_ABOUT_BOX (widget); - priv = about_box->priv; - - background_pixbuf = gdk_pixbuf_new_from_file (IMAGE_PATH, NULL); - g_assert (background_pixbuf != NULL); - g_assert (gdk_pixbuf_get_width (background_pixbuf) == WIDTH); - g_assert (gdk_pixbuf_get_height (background_pixbuf) == HEIGHT); - - g_assert (priv->pixmap == NULL); - priv->pixmap = gdk_pixmap_new (widget->window, WIDTH, HEIGHT, -1); - - gdk_pixbuf_render_to_drawable (background_pixbuf, priv->pixmap, widget->style->black_gc, - 0, 0, 0, 0, WIDTH, HEIGHT, - GDK_RGB_DITHER_MAX, 0, 0); - - g_assert (priv->clipped_gc == NULL); - priv->clipped_gc = gdk_gc_new (widget->window); - gdk_gc_copy (priv->clipped_gc, widget->style->black_gc); - - clip_rectangle.x = TEXT_X_OFFSET; - clip_rectangle.y = TEXT_Y_OFFSET; - clip_rectangle.width = TEXT_WIDTH; - clip_rectangle.height = TEXT_HEIGHT; - gdk_gc_set_clip_rectangle (priv->clipped_gc, & clip_rectangle); - - priv->text_background_pixmap = gdk_pixmap_new (widget->window, clip_rectangle.width, clip_rectangle.height, -1); - gdk_pixbuf_render_to_drawable (background_pixbuf, priv->text_background_pixmap, widget->style->black_gc, - TEXT_X_OFFSET, TEXT_Y_OFFSET, - 0, 0, TEXT_WIDTH, TEXT_HEIGHT, - GDK_RGB_DITHER_MAX, 0, 0); - - g_assert (priv->timeout_id == -1); - priv->timeout_id = g_timeout_add (ANIMATION_DELAY, timeout_callback, about_box); - - g_object_unref (background_pixbuf); -} - -static void -impl_unrealize (GtkWidget *widget) -{ - EShellAboutBox *about_box; - EShellAboutBoxPrivate *priv; - - about_box = E_SHELL_ABOUT_BOX (widget); - priv = about_box->priv; - - (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); - - g_assert (priv->clipped_gc != NULL); - gdk_gc_unref (priv->clipped_gc); - priv->clipped_gc = NULL; - - g_assert (priv->pixmap != NULL); - gdk_pixmap_unref (priv->pixmap); - priv->pixmap = NULL; - - if (priv->timeout_id != -1) { - g_source_remove (priv->timeout_id); - priv->timeout_id = -1; - } -} - -static int -impl_expose_event (GtkWidget *widget, - GdkEventExpose *event) -{ - EShellAboutBoxPrivate *priv; - - if (! GTK_WIDGET_DRAWABLE (widget)) - return FALSE; - - priv = E_SHELL_ABOUT_BOX (widget)->priv; - - gdk_draw_pixmap (widget->window, widget->style->black_gc, - priv->pixmap, - event->area.x, event->area.y, - event->area.x, event->area.y, - event->area.width, event->area.height); - - return TRUE; -} - - -static void -class_init (GObjectClass *object_class) -{ - GtkWidgetClass *widget_class; - - parent_class = g_type_class_ref(PARENT_TYPE); - - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - widget_class = GTK_WIDGET_CLASS (object_class); - widget_class->size_request = impl_size_request; - widget_class->realize = impl_realize; - widget_class->unrealize = impl_unrealize; - widget_class->expose_event = impl_expose_event; -} - -static void -init (EShellAboutBox *shell_about_box) -{ - EShellAboutBoxPrivate *priv; - gint i; - - priv = g_new (EShellAboutBoxPrivate, 1); - priv->pixmap = NULL; - priv->text_background_pixmap = NULL; - priv->clipped_gc = NULL; - priv->timeout_id = -1; - priv->text_y_offset = 0; - - priv->permuted_text = g_new (const gchar *, NUM_TEXT_LINES); - for (i = 0; i < NUM_TEXT_LINES; ++i) { - priv->permuted_text[i] = text[i]; - } - - shell_about_box->priv = priv; - - permute_names (shell_about_box); -} - - -GtkWidget * -e_shell_about_box_new (void) -{ - EShellAboutBox *about_box; - - about_box = g_object_new (e_shell_about_box_get_type (), NULL); - - return GTK_WIDGET (about_box); -} - - -E_MAKE_TYPE (e_shell_about_box, "EShellAboutBox", EShellAboutBox, class_init, init, GTK_TYPE_EVENT_BOX) diff --git a/shell/e-shell-about-box.h b/shell/e-shell-about-box.h deleted file mode 100644 index 301120c190..0000000000 --- a/shell/e-shell-about-box.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-about-box.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifndef _E_SHELL_ABOUT_BOX_H_ -#define _E_SHELL_ABOUT_BOX_H_ - -#include <gnome.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_SHELL_ABOUT_BOX (e_shell_about_box_get_type ()) -#define E_SHELL_ABOUT_BOX(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SHELL_ABOUT_BOX, EShellAboutBox)) -#define E_SHELL_ABOUT_BOX_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SHELL_ABOUT_BOX, EShellAboutBoxClass)) -#define E_IS_SHELL_ABOUT_BOX(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SHELL_ABOUT_BOX)) -#define E_IS_SHELL_ABOUT_BOX_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SHELL_ABOUT_BOX)) - - -typedef struct _EShellAboutBox EShellAboutBox; -typedef struct _EShellAboutBoxPrivate EShellAboutBoxPrivate; -typedef struct _EShellAboutBoxClass EShellAboutBoxClass; - -struct _EShellAboutBox { - GtkEventBox parent; - - EShellAboutBoxPrivate *priv; -}; - -struct _EShellAboutBoxClass { - GtkEventBoxClass parent_class; -}; - - -GtkType e_shell_about_box_get_type (void); -GtkWidget *e_shell_about_box_new (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_SHELL_ABOUT_BOX_H_ */ diff --git a/shell/e-shell-config-autocompletion.c b/shell/e-shell-config-autocompletion.c deleted file mode 100644 index df232e8067..0000000000 --- a/shell/e-shell-config-autocompletion.c +++ /dev/null @@ -1,129 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-config-autocompletion.c - Configuration page for addressbook autocompletion. - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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: Chris Lahey <clahey@ximian.com> - * Chris Toshok <toshok@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - - -#include "e-shell-config-autocompletion.h" - -#include "e-folder-list.h" - -#include "Evolution.h" - -#include <bonobo/bonobo-exception.h> - -#include <libgnome/gnome-i18n.h> -#include <gtk/gtkwidget.h> -#include <gtk/gtksignal.h> - -#include <gconf/gconf-client.h> - - -typedef struct { - EvolutionConfigControl *config_control; - - GtkWidget *control_widget; - - EvolutionShellClient *shell_client; -} EvolutionAutocompletionConfig; - -static void -folder_list_changed_callback (EFolderList *efl, - EvolutionAutocompletionConfig *ac) -{ - evolution_config_control_changed (ac->config_control); -} - -static void -config_control_destroy_notify (void *data, - GObject *where_the_config_control_was) -{ - EvolutionAutocompletionConfig *ac = (EvolutionAutocompletionConfig *) data; - - g_object_unref (ac->shell_client); - - g_free (ac); -} - - -static void -config_control_apply_callback (EvolutionConfigControl *config_control, - EvolutionAutocompletionConfig *ac) -{ - GConfClient *client; - char *xml; - - client = gconf_client_get_default (); - - xml = e_folder_list_get_xml (E_FOLDER_LIST (ac->control_widget)); - gconf_client_set_string (client, "/apps/evolution/addressbook/completion/uris", xml, NULL); - g_free (xml); - - g_object_unref (client); -} - -GtkWidget * -e_shell_config_autocompletion_create_widget (EShell *shell, EvolutionConfigControl *config_control) -{ - EvolutionAutocompletionConfig *ac; - CORBA_Environment ev; - GConfClient *client; - static const char *possible_types[] = { "contacts/*", NULL }; - char *xml; - - ac = g_new0 (EvolutionAutocompletionConfig, 1); - - CORBA_exception_init (&ev); - - ac->shell_client = evolution_shell_client_new (BONOBO_OBJREF (shell)); - - client = gconf_client_get_default (); - xml = gconf_client_get_string (client, "/apps/evolution/addressbook/completion/uris", NULL); - g_object_unref (client); - - ac->control_widget = e_folder_list_new (ac->shell_client, xml); - g_free (xml); - - g_object_set((ac->control_widget), - "title", _("Extra Completion folders"), - "possible_types", possible_types, - NULL); - - gtk_widget_show (ac->control_widget); - - ac->config_control = config_control; - - g_signal_connect (ac->control_widget, "changed", - G_CALLBACK (folder_list_changed_callback), ac); - g_signal_connect (ac->config_control, "apply", - G_CALLBACK (config_control_apply_callback), ac); - - g_object_weak_ref (G_OBJECT (ac->config_control), config_control_destroy_notify, ac); - - CORBA_exception_free (&ev); - - return ac->control_widget; -} - diff --git a/shell/e-shell-config-autocompletion.h b/shell/e-shell-config-autocompletion.h deleted file mode 100644 index 46a65627a3..0000000000 --- a/shell/e-shell-config-autocompletion.h +++ /dev/null @@ -1,34 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-config-autocompletion.c - Configuration page for addressbook autocompletion. - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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: Chris Lahey <clahey@ximian.com> - * Chris Toshok <toshok@ximian.com> - */ - -#ifndef E_SHELL_CONFIG_AUTOCOMPLETION_H -#define E_SHELL_CONFIG_AUTOCOMPLETION_H - -#include "e-shell.h" - -#include <gtk/gtkwidget.h> -#include "evolution-config-control.h" - -GtkWidget *e_shell_config_autocompletion_create_widget (EShell *shell, EvolutionConfigControl *config_control); - -#endif /* E_SHELL_CONFIG_AUTOCOMPLETION_H */ diff --git a/shell/e-shell-config-default-folders.c b/shell/e-shell-config-default-folders.c deleted file mode 100644 index 8c60682068..0000000000 --- a/shell/e-shell-config-default-folders.c +++ /dev/null @@ -1,203 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-config-default-folders.c - Configuration page for specifying default - * folders. - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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: Dan Winship <danw@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-shell-config-default-folders.h" - -#include "evolution-folder-selector-button.h" - -#include <glade/glade-xml.h> -#include <gtk/gtktogglebutton.h> -#include <gtk/gtksignal.h> - -#include <libgnome/gnome-i18n.h> - -#include <gconf/gconf-client.h> - - -typedef struct { - GladeXML *glade; - EvolutionConfigControl *config_control; - - char *mail_uri, *mail_path; - char *contacts_uri, *contacts_path; - char *calendar_uri, *calendar_path; - char *tasks_uri, *tasks_path; - - EvolutionShellClient *shell_client; -} EvolutionDefaultFolderConfig; - -static void -folder_selected (EvolutionFolderSelectorButton *button, - GNOME_Evolution_Folder *folder, - EvolutionDefaultFolderConfig *dfc) -{ - char **uri_ptr, **path_ptr; - - uri_ptr = g_object_get_data (G_OBJECT (button), "uri_ptr"); - path_ptr = g_object_get_data (G_OBJECT (button), "path_ptr"); - - g_free (*uri_ptr); - g_free (*path_ptr); - *uri_ptr = g_strdup (folder->physicalUri); - *path_ptr = g_strdup (folder->evolutionUri); - - evolution_config_control_changed (dfc->config_control); -} - -GtkWidget *e_shell_config_default_folder_selector_button_new (char *widget_name, char *string1, char *string2, int int1, int int2); - -GtkWidget * -e_shell_config_default_folder_selector_button_new (char *widget_name, - char *string1, - char *string2, - int int1, int int2) -{ - return (GtkWidget *) g_object_new (EVOLUTION_TYPE_FOLDER_SELECTOR_BUTTON, NULL); -} - -static void -config_control_apply_cb (EvolutionConfigControl *control, - EvolutionDefaultFolderConfig *dfc) -{ - GConfClient *client; - - client = gconf_client_get_default (); - - gconf_client_set_string (client, "/apps/evolution/shell/default_folders/mail_path", dfc->mail_path, NULL); - gconf_client_set_string (client, "/apps/evolution/shell/default_folders/mail_uri", dfc->mail_uri, NULL); - gconf_client_set_string (client, "/apps/evolution/shell/default_folders/contacts_path", dfc->contacts_path, NULL); - gconf_client_set_string (client, "/apps/evolution/shell/default_folders/contacts_uri", dfc->contacts_uri, NULL); - gconf_client_set_string (client, "/apps/evolution/shell/default_folders/calendar_path", dfc->calendar_path, NULL); - gconf_client_set_string (client, "/apps/evolution/shell/default_folders/calendar_uri", dfc->calendar_uri, NULL); - gconf_client_set_string (client, "/apps/evolution/shell/default_folders/tasks_path", dfc->tasks_path, NULL); - gconf_client_set_string (client, "/apps/evolution/shell/default_folders/tasks_uri", dfc->tasks_uri, NULL); - - - g_object_unref (client); -} - -static void -config_control_destroy_notify (void *data, - GObject *where_the_config_control_was) -{ - EvolutionDefaultFolderConfig *dfc = (EvolutionDefaultFolderConfig *) data; - - g_free (dfc->mail_uri); - g_free (dfc->mail_path); - g_free (dfc->contacts_uri); - g_free (dfc->contacts_path); - g_free (dfc->calendar_uri); - g_free (dfc->calendar_path); - g_free (dfc->tasks_uri); - g_free (dfc->tasks_path); - - g_object_unref (dfc->glade); - g_object_unref (dfc->shell_client); - - g_free (dfc); -} - -static const char *mail_types[] = { "mail", NULL }; -static const char *contacts_types[] = { "contacts", "contacts/ldap", NULL }; -static const char *calendar_types[] = { "calendar", NULL }; -static const char *tasks_types[] = { "tasks", NULL }; - -static void -setup_folder_selector (EvolutionDefaultFolderConfig *dfc, - const char *widget_name, - char **path_ptr, char *path_dbpath, - char **uri_ptr, char *uri_dbpath, - const char **types) -{ - GConfClient *client; - GtkWidget *button; - - client = gconf_client_get_default (); - - *path_ptr = gconf_client_get_string (client, path_dbpath, NULL); - *uri_ptr = gconf_client_get_string (client, uri_dbpath, NULL); - - g_object_unref (client); - - button = glade_xml_get_widget (dfc->glade, widget_name); - evolution_folder_selector_button_construct ( - EVOLUTION_FOLDER_SELECTOR_BUTTON (button), - dfc->shell_client, _("Select Default Folder"), - *uri_ptr, types); - g_object_set_data (G_OBJECT (button), "uri_ptr", uri_ptr); - g_object_set_data (G_OBJECT (button), "path_ptr", path_ptr); - g_signal_connect (button, "selected", - G_CALLBACK (folder_selected), - dfc); - - /* XXX libglade2 seems to not show custom widgets even when - they're flagged Visible.*/ - gtk_widget_show (button); -} - -GtkWidget* -e_shell_config_default_folders_create_widget (EShell *shell, EvolutionConfigControl *config_control) -{ - EvolutionDefaultFolderConfig *dfc; - GtkWidget *widget; - - dfc = g_new0 (EvolutionDefaultFolderConfig, 1); - - dfc->shell_client = evolution_shell_client_new (BONOBO_OBJREF (shell)); - - dfc->glade = glade_xml_new (EVOLUTION_GLADEDIR "/e-shell-config-default-folders.glade", NULL, NULL); - - setup_folder_selector (dfc, "default_mail_button", - &dfc->mail_path, "/apps/evolution/shell/default_folders/mail_path", - &dfc->mail_uri, "/apps/evolution/shell/default_folders/mail_uri", - mail_types); - setup_folder_selector (dfc, "default_contacts_button", - &dfc->contacts_path, "/apps/evolution/shell/default_folders/contacts_path", - &dfc->contacts_uri, "/apps/evolution/shell/default_folders/contacts_uri", - contacts_types); - setup_folder_selector (dfc, "default_calendar_button", - &dfc->calendar_path, "/apps/evolution/shell/default_folders/calendar_path", - &dfc->calendar_uri, "/apps/evolution/shell/default_folders/calendar_uri", - calendar_types); - setup_folder_selector (dfc, "default_tasks_button", - &dfc->tasks_path, "/apps/evolution/shell/default_folders/tasks_path", - &dfc->tasks_uri, "/apps/evolution/shell/default_folders/tasks_uri", - tasks_types); - - widget = glade_xml_get_widget (dfc->glade, "default_folders_table"); - gtk_widget_ref (widget); - gtk_container_remove (GTK_CONTAINER (widget->parent), widget); - gtk_widget_show (widget); - dfc->config_control = config_control; - - g_signal_connect (dfc->config_control, "apply", - G_CALLBACK (config_control_apply_cb), dfc); - - g_object_weak_ref (G_OBJECT (dfc->config_control), config_control_destroy_notify, dfc); - - return widget; -} diff --git a/shell/e-shell-config-default-folders.h b/shell/e-shell-config-default-folders.h deleted file mode 100644 index c5f4412a7a..0000000000 --- a/shell/e-shell-config-default-folders.h +++ /dev/null @@ -1,34 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-config-default-folders.h - Configuration page for specifying default - * folders. - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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: Dan Winship <danw@ximian.com> - */ - -#ifndef E_SHELL_CONFIG_DEFAULT_FOLDERS_H -#define E_SHELL_CONFIG_DEFAULT_FOLDERS_H - -#include "e-shell.h" - -#include <gtk/gtkwidget.h> -#include "evolution-config-control.h" - -GtkWidget *e_shell_config_default_folders_create_widget (EShell *shell, EvolutionConfigControl *config_control); - -#endif /* E_SHELL_CONFIG_DEFAULT_FOLDERS_H */ diff --git a/shell/e-shell-config-folder-settings.c b/shell/e-shell-config-folder-settings.c deleted file mode 100644 index 0805c00448..0000000000 --- a/shell/e-shell-config-folder-settings.c +++ /dev/null @@ -1,82 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-config-folder-settings.c - Configuration page for folder settings. - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - - -#include "e-shell-config-folder-settings.h" -#include "e-shell-config-offline.h" -#include "e-shell-config-autocompletion.h" -#include "e-shell-config-default-folders.h" - -#include "evolution-config-control.h" -#include "e-storage-set-view.h" - -#include "Evolution.h" - -#include <bonobo/bonobo-exception.h> - -#include <libgnome/gnome-i18n.h> -#include <gtk/gtknotebook.h> -#include <gtk/gtklabel.h> - - -static void -append_to_notebook (GtkWidget *notebook, char *label_str, - GtkWidget *child) -{ - GtkWidget *label; - - label = gtk_label_new (label_str); - - gtk_notebook_append_page (GTK_NOTEBOOK(notebook), child, label); - gtk_widget_show (label); - gtk_widget_show (child); -} - -BonoboObject * -e_shell_config_folder_settings_create_control (EShell *shell) -{ - GtkWidget *notebook; - EvolutionConfigControl *control; - - g_return_val_if_fail (E_IS_SHELL (shell), NULL); - - notebook = gtk_notebook_new (); - - control = evolution_config_control_new (notebook); - - append_to_notebook (notebook, _("Default Folders"), - e_shell_config_default_folders_create_widget (shell, control)); - - append_to_notebook (notebook, _("Offline Folders"), - e_shell_config_offline_create_widget (shell, control)); - - append_to_notebook (notebook, _("Autocompletion Folders"), - e_shell_config_autocompletion_create_widget (shell, control)); - - gtk_widget_show (notebook); - - return BONOBO_OBJECT (control); -} diff --git a/shell/e-shell-config-folder-settings.h b/shell/e-shell-config-folder-settings.h deleted file mode 100644 index 9da0bc79be..0000000000 --- a/shell/e-shell-config-folder-settings.h +++ /dev/null @@ -1,32 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-config-folder-settings.h - Configuration page for folder settings. - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifndef E_SHELL_CONFIG_FOLDER_SETTINGS_H -#define E_SHELL_CONFIG_FOLDER_SETTINGS_H - -#include "e-shell.h" - -#include <bonobo/bonobo-object.h> - -BonoboObject *e_shell_config_folder_settings_create_control (EShell *shell); - -#endif /* E_SHELL_CONFIG_FOLDER_SETTINGS_H */ diff --git a/shell/e-shell-config-offline.c b/shell/e-shell-config-offline.c deleted file mode 100644 index 1342abbbb2..0000000000 --- a/shell/e-shell-config-offline.c +++ /dev/null @@ -1,168 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-config-offline.c - Configuration page for offline synchronization. - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - - -#include "e-shell-config-offline.h" - -#include "evolution-config-control.h" -#include "e-storage-set-view.h" - -#include "Evolution.h" - -#include <gconf/gconf-client.h> - -#include <gtk/gtkscrolledwindow.h> -#include <gtk/gtkwidget.h> -#include <gtk/gtksignal.h> - - -struct _PageData { - EShell *shell; - GtkWidget *storage_set_view; - EvolutionConfigControl *config_control; -}; -typedef struct _PageData PageData; - - -/* Callbacks. */ - -static void -config_control_destroy_notify (void *data, - GObject *where_the_config_control_was) -{ - PageData *page_data; - - page_data = (PageData *) data; - gtk_widget_destroy (page_data->storage_set_view); - g_free (page_data); -} - -static void -config_control_apply_callback (EvolutionConfigControl *config_control, - void *data) -{ - GConfClient *gconf_client; - PageData *page_data; - GSList *checked_paths; - - page_data = (PageData *) data; - - checked_paths = e_storage_set_view_get_checkboxes_list (E_STORAGE_SET_VIEW (page_data->storage_set_view)); - - gconf_client = gconf_client_get_default (); - - gconf_client_set_list (gconf_client, "/apps/evolution/shell/offline/folder_paths", - GCONF_VALUE_STRING, checked_paths, NULL); - - g_slist_foreach (checked_paths, (GFunc) g_free, NULL); - g_slist_free (checked_paths); - - g_object_unref (gconf_client); -} - -static void -storage_set_view_checkboxes_changed_callback (EStorageSetView *storage_set_view, - void *data) -{ - PageData *page_data; - - page_data = (PageData *) data; - evolution_config_control_changed (page_data->config_control); -} - - -/* Construction. */ - -static void -init_storage_set_view_status_from_config (EStorageSetView *storage_set_view, - EShell *shell) -{ - GConfClient *gconf_client; - GSList *list; - - gconf_client = gconf_client_get_default (); - - list = gconf_client_get_list (gconf_client, "/apps/evolution/shell/offline/folder_paths", - GCONF_VALUE_STRING, NULL); - - e_storage_set_view_set_checkboxes_list (storage_set_view, list); - - g_slist_foreach (list, (GFunc) g_free, NULL); - g_slist_free (list); - - g_object_unref (gconf_client); -} - -static gboolean -storage_set_view_has_checkbox_func (EStorageSet *storage_set, - const char *path, - void *data) -{ - EFolder *folder; - - folder = e_storage_set_get_folder (storage_set, path); - if (folder == NULL) - return FALSE; - - return e_folder_get_can_sync_offline (folder); -} - -GtkWidget * -e_shell_config_offline_create_widget (EShell *shell, EvolutionConfigControl *control) -{ - PageData *page_data; - GtkWidget *scrolled_window; - - g_return_val_if_fail (E_IS_SHELL (shell), NULL); - - page_data = g_new (PageData, 1); - page_data->shell = shell; - - page_data->storage_set_view = e_storage_set_create_new_view (e_shell_get_storage_set (shell), NULL); - e_storage_set_view_set_show_checkboxes (E_STORAGE_SET_VIEW (page_data->storage_set_view), TRUE, - storage_set_view_has_checkbox_func, NULL); - gtk_widget_show (page_data->storage_set_view); - - init_storage_set_view_status_from_config (E_STORAGE_SET_VIEW (page_data->storage_set_view), shell); - g_signal_connect (page_data->storage_set_view, "checkboxes_changed", - G_CALLBACK (storage_set_view_checkboxes_changed_callback), page_data); - - scrolled_window = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_container_add (GTK_CONTAINER (scrolled_window), page_data->storage_set_view); - gtk_widget_show (scrolled_window); - - page_data->config_control = control; - - g_signal_connect (page_data->config_control, "apply", - G_CALLBACK (config_control_apply_callback), page_data); - - g_object_weak_ref (G_OBJECT (page_data->config_control), config_control_destroy_notify, page_data); - - return scrolled_window; -} diff --git a/shell/e-shell-config-offline.h b/shell/e-shell-config-offline.h deleted file mode 100644 index fb1d9fb0fb..0000000000 --- a/shell/e-shell-config-offline.h +++ /dev/null @@ -1,33 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-config-offline.h - Configuration page for offline synchronization. - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifndef E_SHELL_CONFIG_OFFLINE_H -#define E_SHELL_CONFIG_OFFLINE_H - -#include "e-shell.h" - -#include <gtk/gtkwidget.h> -#include "evolution-config-control.h" - -GtkWidget *e_shell_config_offline_create_widget (EShell *shell, EvolutionConfigControl *config_control); - -#endif /* E_SHELL_CONFIG_OFFLINE_H */ diff --git a/shell/e-shell-config.c b/shell/e-shell-config.c deleted file mode 100644 index 5eba72280d..0000000000 --- a/shell/e-shell-config.c +++ /dev/null @@ -1,69 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-config.c - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-shell-config.h" - -#include "e-shell-config-folder-settings.h" -#include "evolution-config-control.h" -#include "evolution-folder-selector-button.h" - -#include <string.h> -#include <bonobo/bonobo-generic-factory.h> - - -#define E_SHELL_CONFIG_FACTORY_OAFIID "OAFIID:GNOME_Evolution_Shell_Config_Factory" - -#define E_SHELL_CONFIG_FOLDER_SETTINGS_OAFIID "OAFIID:GNOME_Evolution_Shell_Config_FolderSettings_Control" - - -static BonoboObject * -config_control_factory_cb (BonoboGenericFactory *factory, - const char *component_id, - gpointer shell) -{ - if (!strcmp (component_id, E_SHELL_CONFIG_FOLDER_SETTINGS_OAFIID)) - return e_shell_config_folder_settings_create_control (shell); - else { - g_assert_not_reached(); - return NULL; - } -} - -gboolean -e_shell_config_factory_register (EShell *shell) -{ - BonoboGenericFactory *factory; - - g_return_val_if_fail (E_IS_SHELL (shell), FALSE); - - factory = bonobo_generic_factory_new (E_SHELL_CONFIG_FACTORY_OAFIID, - config_control_factory_cb, - shell); - - if (factory == NULL) { - g_warning ("Cannot register factory %s", E_SHELL_CONFIG_FACTORY_OAFIID); - return FALSE; - } - return TRUE; -} diff --git a/shell/e-shell-config.h b/shell/e-shell-config.h deleted file mode 100644 index 9ba17b78d7..0000000000 --- a/shell/e-shell-config.h +++ /dev/null @@ -1,30 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-config.h - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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. - */ - -#ifndef E_SHELL_CONFIG_H -#define E_SHELL_CONFIG_H - -#include "e-shell.h" - -#include <glib.h> - -gboolean e_shell_config_factory_register (EShell *shell); - -#endif diff --git a/shell/e-shell-constants.h b/shell/e-shell-constants.h deleted file mode 100644 index 9e0d7a5379..0000000000 --- a/shell/e-shell-constants.h +++ /dev/null @@ -1,50 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-utils.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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_DEFAULTURI_PREFIX "default:" -#define E_SHELL_DEFAULTURI_PREFIX_LEN 8 - -#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 - -#define E_PATH_SEPARATOR '/' -#define E_PATH_SEPARATOR_S "/" - -#define E_LOCAL_STORAGE_NAME "local" -#define E_SUMMARY_STORAGE_NAME "summary" - -#define E_SUMMARY_URI "evolution:/summary" -#define E_LOCAL_INBOX_URI "evolution:/local/Inbox" -#define E_LOCAL_CONTACTS_URI "evolution:/local/Contacts" -#define E_LOCAL_CALENDAR_URI "evolution:/local/Calendar" -#define E_LOCAL_TASKS_URI "evolution:/local/Tasks" - -#endif diff --git a/shell/e-shell-corba-icon-utils.c b/shell/e-shell-corba-icon-utils.c deleted file mode 100644 index b88483fd35..0000000000 --- a/shell/e-shell-corba-icon-utils.c +++ /dev/null @@ -1,208 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-corba-icon-utils.c - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 "e-shell-corba-icon-utils.h" - - - -/** - * e_store_corba_icon_from_pixbuf: - * @pixbuf: - * @icon_return: - * - * Store a CORBA Evolution::Icon in *@icon_return. @icon_return is not - * supposed to point to allocated memory, so all of its pointers are just - * overwritten. - **/ -void -e_store_corba_icon_from_pixbuf (GdkPixbuf *pixbuf, - GNOME_Evolution_Icon *icon_return) -{ - const char *sp; - CORBA_octet *dp; - int width, height, total_width, rowstride; - int i, j; - gboolean has_alpha; - - if (pixbuf == NULL) { - icon_return->width = 0; - icon_return->height = 0; - icon_return->hasAlpha = FALSE; - icon_return->rgbaData._length = 0; - icon_return->rgbaData._maximum = 0; - icon_return->rgbaData._buffer = NULL; - return; - } - - width = gdk_pixbuf_get_width (pixbuf); - height = gdk_pixbuf_get_height (pixbuf); - rowstride = gdk_pixbuf_get_rowstride (pixbuf); - has_alpha = gdk_pixbuf_get_has_alpha (pixbuf); - - if (has_alpha) - total_width = 4 * width; - else - total_width = 3 * width; - - icon_return->width = width; - icon_return->height = height; - icon_return->hasAlpha = has_alpha; - - icon_return->rgbaData._length = icon_return->height * total_width; - icon_return->rgbaData._maximum = icon_return->rgbaData._length; - icon_return->rgbaData._buffer = CORBA_sequence_CORBA_octet_allocbuf (icon_return->rgbaData._maximum); - - sp = gdk_pixbuf_get_pixels (pixbuf); - dp = icon_return->rgbaData._buffer; - for (i = 0; i < height; i ++) { - for (j = 0; j < total_width; j++) - *(dp ++) = sp[j]; - sp += rowstride; - } - - CORBA_sequence_set_release (& icon_return->rgbaData, TRUE); -} - -/** - * e_new_corba_icon_from_pixbuf: - * @pixbuf: - * - * Create a CORBA Evolution::Icon from the specified @pixbuf. - * - * Return value: The new Evolution::Icon. - **/ -GNOME_Evolution_Icon * -e_new_corba_icon_from_pixbuf (GdkPixbuf *pixbuf) -{ - GNOME_Evolution_Icon *icon; - - icon = GNOME_Evolution_Icon__alloc (); - e_store_corba_icon_from_pixbuf (pixbuf, icon); - - return icon; -} - -/** - * e_new_corba_animated_icon_from_pixbuf_array: - * @pixbuf_array: - * - * Generate a CORBA Evolution::AnimatedIcon from a NULL-terminated - * @pixbuf_array. - * - * Return value: The new Evolution::AnimatedIcon. - **/ -GNOME_Evolution_AnimatedIcon * -e_new_corba_animated_icon_from_pixbuf_array (GdkPixbuf **pixbuf_array) -{ - GNOME_Evolution_AnimatedIcon *animated_icon; - GdkPixbuf **p; - int num_frames; - int i; - - g_return_val_if_fail (pixbuf_array != NULL, NULL); - - num_frames = 0; - for (p = pixbuf_array; *p != NULL; p++) - num_frames++; - - if (num_frames == 0) - return NULL; - - animated_icon = GNOME_Evolution_AnimatedIcon__alloc (); - - animated_icon->_length = num_frames; - animated_icon->_maximum = num_frames; - animated_icon->_buffer = CORBA_sequence_GNOME_Evolution_Icon_allocbuf (animated_icon->_maximum); - - for (i = 0; i < num_frames; i++) - e_store_corba_icon_from_pixbuf (pixbuf_array[i], & animated_icon->_buffer[i]); - - CORBA_sequence_set_release (animated_icon, TRUE); - - return animated_icon; -} - - -/** - * e_new_gdk_pixbuf_from_corba_icon: - * @icon: A CORBA Evolution::Icon. - * @scaled_width: Width of the GdkPixbuf to obtain. - * @scaled_height: Width of the GdkPixbuf to obtain. - * - * If @scaled_width or @scaled_height is -1, do not scale. - * - * Create a GdkPixbuf for the specified CORBA @icon. - * - * Return value: The newly created GdkPixbuf. - **/ -GdkPixbuf * -e_new_gdk_pixbuf_from_corba_icon (const GNOME_Evolution_Icon *icon, - int scaled_width, - int scaled_height) -{ - GdkPixbuf *pixbuf; - GdkPixbuf *scaled_pixbuf; - unsigned char *p; - int src_offset; - int i, j; - int rowstride; - int total_width; - - g_return_val_if_fail (icon != NULL, NULL); - - if (scaled_width == -1) - scaled_width = icon->width; - - if (scaled_height == -1) - scaled_height = icon->height; - - pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, icon->hasAlpha, 8, icon->width, icon->height); - - if (icon->hasAlpha) - total_width = 4 * icon->width; - else - total_width = 3 * icon->width; - - rowstride = gdk_pixbuf_get_rowstride (pixbuf); - src_offset = 0; - p = gdk_pixbuf_get_pixels (pixbuf); - - for (i = 0; i < icon->height; i++) { - for (j = 0; j < total_width; j++) - p[j] = icon->rgbaData._buffer[src_offset ++]; - p += rowstride; - } - - if (icon->width == scaled_width && icon->height == scaled_height) - return pixbuf; - - scaled_pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, icon->hasAlpha, 8, scaled_width, scaled_height); - gdk_pixbuf_scale (pixbuf, scaled_pixbuf, - 0, 0, scaled_width, scaled_height, - 0, 0, (double) scaled_width / icon->width, (double) scaled_height / icon->height, - GDK_INTERP_HYPER); - - g_object_unref (pixbuf); - - return scaled_pixbuf; -} - diff --git a/shell/e-shell-corba-icon-utils.h b/shell/e-shell-corba-icon-utils.h deleted file mode 100644 index cc9da3c24b..0000000000 --- a/shell/e-shell-corba-icon-utils.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-corba-icon-utils.h - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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_ICON_UTILS_H -#define E_SHELL_ICON_UTILS_H - -#include "Evolution.h" - -#include <gdk-pixbuf/gdk-pixbuf.h> - - -void e_store_corba_icon_from_pixbuf (GdkPixbuf *pixbuf, - GNOME_Evolution_Icon *icon_return); -GNOME_Evolution_Icon *e_new_corba_icon_from_pixbuf (GdkPixbuf *pixbuf); -GNOME_Evolution_AnimatedIcon *e_new_corba_animated_icon_from_pixbuf_array (GdkPixbuf **pixbuf_array); - -GdkPixbuf *e_new_gdk_pixbuf_from_corba_icon (const GNOME_Evolution_Icon *icon, - int scaled_width, - int scaled_height); - -#endif diff --git a/shell/e-shell-folder-commands.c b/shell/e-shell-folder-commands.c deleted file mode 100644 index a0e8dd3c31..0000000000 --- a/shell/e-shell-folder-commands.c +++ /dev/null @@ -1,653 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-folder-commands.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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-shell-folder-commands.h" - -#include "e-util/e-dialog-utils.h" -#include "e-util/e-request.h" - -#include "e-shell-constants.h" -#include "e-shell-folder-creation-dialog.h" -#include "e-shell-folder-selection-dialog.h" -#include "e-shell-utils.h" - -#include <libgnome/gnome-i18n.h> -#include <libgnome/gnome-util.h> - -#include <gtk/gtkentry.h> -#include <gtk/gtklabel.h> -#include <gtk/gtkmessagedialog.h> -#include <gtk/gtksignal.h> -#include <gtk/gtkstock.h> - -#include <string.h> - - -/* Utility functions. */ - -static const char * -get_folder_name (EShell *shell, - const char *path) -{ - EStorageSet *storage_set; - EFolder *folder; - - storage_set = e_shell_get_storage_set (shell); - folder = e_storage_set_get_folder (storage_set, path); - - return e_folder_get_name (folder); -} - -static int -get_folder_unread (EShell *shell, - const char *path) -{ - EStorageSet *storage_set; - EFolder *folder; - - storage_set = e_shell_get_storage_set (shell); - folder = e_storage_set_get_folder (storage_set, path); - - return e_folder_get_unread_count (folder); -} - - -/* The data passed to the signals handled during the execution of the folder - commands. */ - -enum _FolderCommand { - FOLDER_COMMAND_COPY, - FOLDER_COMMAND_MOVE -}; -typedef enum _FolderCommand FolderCommand; - -struct _FolderCommandData { - EShell *shell; - EShellView *shell_view; - FolderCommand command; - char *source_path; - char *destination_path; -}; -typedef struct _FolderCommandData FolderCommandData; - -static FolderCommandData * -folder_command_data_new (EShell *shell, - EShellView *shell_view, - FolderCommand command, - const char *source_path, - const char *destination_path) -{ - FolderCommandData *new; - - new = g_new (FolderCommandData, 1); - new->shell = shell; - new->shell_view = shell_view; - new->command = command; - new->source_path = g_strdup (source_path); - new->destination_path = g_strdup (destination_path); - - return new; -} - -static void -folder_command_data_free (FolderCommandData *folder_command_data) -{ - g_free (folder_command_data->source_path); - g_free (folder_command_data->destination_path); - - g_free (folder_command_data); -} - - -/* Callback for the storage result. */ - -static void -xfer_result_callback (EStorageSet *storage_set, - EStorageResult result, - void *data) -{ - FolderCommandData *folder_command_data; - - folder_command_data = (FolderCommandData *) data; - - if (result != E_STORAGE_OK) { - const char *fmt; - - if (folder_command_data->command == FOLDER_COMMAND_COPY) - fmt = _("Cannot copy folder: %s"); - else - fmt = _("Cannot move folder: %s"); - - e_notice (folder_command_data->shell_view, GTK_MESSAGE_ERROR, - fmt, e_storage_result_to_string (result)); - } - - folder_command_data_free (folder_command_data); -} - - -/* The signals for the folder selection dialog. This used for the copy and - move commands. */ - -static void -folder_selection_dialog_folder_selected_callback (EShellFolderSelectionDialog *folder_selection_dialog, - const char *path, - void *data) -{ - FolderCommandData *folder_command_data; - EStorageSet *storage_set; - char *base_name; - gboolean remove_source; - - folder_command_data = (FolderCommandData *) data; - - base_name = g_path_get_basename (folder_command_data->source_path); - folder_command_data->destination_path = g_build_filename (path, base_name, NULL); - g_free (base_name); - - switch (folder_command_data->command) { - case FOLDER_COMMAND_COPY: - remove_source = FALSE; - break; - case FOLDER_COMMAND_MOVE: - remove_source = TRUE; - break; - default: - g_assert_not_reached (); - return; - } - - if (strcmp (folder_command_data->destination_path, - folder_command_data->source_path) == 0) { - const char *msg; - - if (remove_source) - msg = _("Cannot move a folder over itself."); - else - msg = _("Cannot copy a folder over itself."); - - e_notice (folder_selection_dialog, GTK_MESSAGE_ERROR, msg); - return; - } - - if (remove_source) { - int source_len; - - source_len = strlen (folder_command_data->source_path); - if (strncmp (folder_command_data->destination_path, - folder_command_data->source_path, - source_len) == 0) { - e_notice (folder_selection_dialog, GTK_MESSAGE_ERROR, - _("Cannot move a folder into one of its descendants.")); - return; - } - } - - storage_set = e_shell_get_storage_set (folder_command_data->shell); - - e_storage_set_async_xfer_folder (storage_set, - folder_command_data->source_path, - folder_command_data->destination_path, - remove_source, - xfer_result_callback, - folder_command_data); - - gtk_widget_destroy (GTK_WIDGET (folder_selection_dialog)); -} - -static void -folder_selection_dialog_cancelled_callback (EShellFolderSelectionDialog *folder_selection_dialog, - void *data) -{ - folder_command_data_free ((FolderCommandData *) data); -} - -static void -connect_folder_selection_dialog_signals (EShellFolderSelectionDialog *folder_selection_dialog, - FolderCommandData *folder_command_data) -{ - g_assert (folder_command_data != NULL); - - g_signal_connect (folder_selection_dialog, "folder_selected", - G_CALLBACK (folder_selection_dialog_folder_selected_callback), - folder_command_data); - - g_signal_connect (folder_selection_dialog, "cancelled", - G_CALLBACK (folder_selection_dialog_cancelled_callback), - folder_command_data); -} - - -/* Create new folder. */ - -void -e_shell_command_create_new_folder (EShell *shell, - EShellView *shell_view, - const char *parent_folder_path) -{ - g_return_if_fail (shell != NULL); - g_return_if_fail (E_IS_SHELL (shell)); - g_return_if_fail (shell_view != NULL || parent_folder_path != NULL); - g_return_if_fail (shell_view != NULL && E_IS_SHELL_VIEW (shell_view)); - g_return_if_fail (parent_folder_path != NULL || g_path_is_absolute (parent_folder_path)); - - if (parent_folder_path == NULL) - parent_folder_path = e_shell_view_get_current_path (shell_view); - - /* FIXME: Should handle the result stuff. */ - e_shell_show_folder_creation_dialog (shell, GTK_WINDOW (shell_view), - e_shell_view_get_current_path (shell_view), - NULL /* Default type. Take it from parent */, - NULL /* result_callback */, - NULL /* result_callback_data */); -} - - -/* Open folder in other window. */ - -void -e_shell_command_open_folder_in_other_window (EShell *shell, - EShellView *shell_view, - const char *folder_path) -{ - EShellView *view; - char *uri; - - g_return_if_fail (shell != NULL); - g_return_if_fail (E_IS_SHELL (shell)); - g_return_if_fail (shell_view != NULL && E_IS_SHELL_VIEW (shell_view)); - - if (folder_path == NULL) - folder_path = e_shell_view_get_current_path (shell_view); - - uri = g_strconcat (E_SHELL_URI_PREFIX, folder_path, NULL); - view = e_shell_create_view (shell, uri, shell_view); - g_free (uri); - - gtk_widget_show (GTK_WIDGET (view)); -} - - -/* Copy folder. */ - -void -e_shell_command_copy_folder (EShell *shell, - EShellView *shell_view, - const char *folder_path) -{ - GtkWidget *folder_selection_dialog; - FolderCommandData *data; - char *uri; - char *caption; - - g_return_if_fail (shell != NULL); - g_return_if_fail (E_IS_SHELL (shell)); - g_return_if_fail (shell_view != NULL && E_IS_SHELL_VIEW (shell_view)); - g_return_if_fail (folder_path == NULL || g_path_is_absolute (folder_path)); - - if (folder_path == NULL) - folder_path = e_shell_view_get_current_path (shell_view); - - if (folder_path == NULL) { - g_warning ("Called `e_shell_command_copy_folder()' without a valid displayed folder"); - return; - } - - caption = g_strdup_printf (_("Specify a folder to copy folder \"%s\" into:"), - get_folder_name (shell, folder_path)); - - uri = g_strconcat (E_SHELL_URI_PREFIX, folder_path, NULL); - folder_selection_dialog = e_shell_folder_selection_dialog_new (shell, _("Copy Folder"), - caption, uri, NULL, TRUE); - - g_free (caption); - g_free (uri); - - data = folder_command_data_new (shell, shell_view, FOLDER_COMMAND_COPY, folder_path, NULL); - connect_folder_selection_dialog_signals (E_SHELL_FOLDER_SELECTION_DIALOG (folder_selection_dialog), - data); - - gtk_widget_show (folder_selection_dialog); -} - - -/* Move folder. */ - -void -e_shell_command_move_folder (EShell *shell, - EShellView *shell_view, - const char *folder_path) -{ - GtkWidget *folder_selection_dialog; - FolderCommandData *data; - char *uri; - char *caption; - - g_return_if_fail (shell != NULL); - g_return_if_fail (E_IS_SHELL (shell)); - g_return_if_fail (shell_view != NULL); - g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); - g_return_if_fail (folder_path == NULL || g_path_is_absolute (folder_path)); - - if (folder_path == NULL) - folder_path = e_shell_view_get_current_path (shell_view); - - if (folder_path == NULL) { - g_warning ("Called `e_shell_command_move_folder()' without a valid displayed folder"); - return; - } - - caption = g_strdup_printf (_("Specify a folder to move folder \"%s\" into:"), - get_folder_name (shell, folder_path)); - - uri = g_strconcat (E_SHELL_URI_PREFIX, folder_path, NULL); - folder_selection_dialog = e_shell_folder_selection_dialog_new (shell, _("Move Folder"), - caption, uri, NULL, TRUE); - - g_free (caption); - g_free (uri); - - data = folder_command_data_new (shell, shell_view, FOLDER_COMMAND_MOVE, folder_path, NULL); - connect_folder_selection_dialog_signals (E_SHELL_FOLDER_SELECTION_DIALOG (folder_selection_dialog), - data); - - gtk_widget_show (folder_selection_dialog); -} - -static void -delete_cb (EStorageSet *storage_set, - EStorageResult result, - void *data) -{ - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (data); - - if (result != E_STORAGE_OK) - e_notice (shell_view, GTK_MESSAGE_ERROR, - _("Cannot delete folder:\n%s"), e_storage_result_to_string (result)); -} - -static GtkResponseType -delete_dialog (EShellView *shell_view, const char *folder_name) -{ - GtkWidget *dialog; - GtkResponseType response; - char *title; - - dialog = gtk_message_dialog_new (GTK_WINDOW (shell_view), - GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR, - GTK_MESSAGE_QUESTION, - GTK_BUTTONS_NONE, - _("Really delete folder \"%s\"?"), folder_name); - - gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); - gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_DELETE, GTK_RESPONSE_OK); - - gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); - - gtk_container_set_border_width (GTK_CONTAINER (dialog), 6); - - gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 6); - - title = g_strdup_printf (_("Delete \"%s\""), folder_name); - gtk_window_set_title (GTK_WINDOW (dialog), title); - g_free (title); - - response = gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); - - return response; -} - -void -e_shell_command_delete_folder (EShell *shell, - EShellView *shell_view, - const char *folder_path) -{ - EStorageSet *storage_set; - - g_return_if_fail (shell != NULL); - g_return_if_fail (E_IS_SHELL (shell)); - g_return_if_fail (shell_view != NULL || folder_path != NULL); - g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); - g_return_if_fail (folder_path != NULL || g_path_is_absolute (folder_path)); - - storage_set = e_shell_get_storage_set (shell); - - if (folder_path == NULL) - folder_path = e_shell_view_get_current_path (shell_view); - - if (delete_dialog (shell_view, get_folder_name (shell, folder_path)) == GTK_RESPONSE_OK) - e_storage_set_async_remove_folder (storage_set, folder_path, delete_cb, shell_view); -} - - -struct _RenameCallbackData { - EShellView *shell_view; - char *new_path; -}; -typedef struct _RenameCallbackData RenameCallbackData; - -static RenameCallbackData * -rename_callback_data_new (EShellView *shell_view, - const char *new_path) -{ - RenameCallbackData *callback_data; - - callback_data = g_new (RenameCallbackData, 1); - - g_object_ref (shell_view); - callback_data->shell_view = shell_view; - - callback_data->new_path = g_strdup (new_path); - - return callback_data; -} - -static void -rename_callback_data_free (RenameCallbackData *callback_data) -{ - g_object_unref (callback_data->shell_view); - g_free (callback_data->new_path); - - g_free (callback_data); -} - -static void -rename_cb (EStorageSet *storage_set, EStorageResult result, void *data) -{ - RenameCallbackData *callback_data; - - callback_data = (RenameCallbackData *) data; - - if (result != E_STORAGE_OK) { - e_notice (callback_data->shell_view, GTK_MESSAGE_ERROR, - _("Cannot rename folder:\n%s"), e_storage_result_to_string (result)); - } else { - EFolder *folder; - EShell *shell; - EStorageSet *storage_set; - - shell = e_shell_view_get_shell (callback_data->shell_view); - storage_set = e_shell_get_storage_set (shell); - folder = e_storage_set_get_folder (storage_set, callback_data->new_path); - - if (folder != NULL) { - char *base_name = g_path_get_basename (callback_data->new_path); - - e_folder_set_name (folder, base_name); - g_free (base_name); - } - } - - rename_callback_data_free (callback_data); -} - -void -e_shell_command_rename_folder (EShell *shell, - EShellView *shell_view, - const char *folder_path) -{ - EStorageSet *storage_set; - EFolder *folder; - RenameCallbackData *callback_data; - const char *old_name; - char *prompt; - char *new_name; - char *old_base_path; - char *new_path; - - g_return_if_fail (shell != NULL); - g_return_if_fail (E_IS_SHELL (shell)); - g_return_if_fail (shell_view != NULL); - g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); - - storage_set = e_shell_get_storage_set (shell); - - if (folder_path == NULL) - folder_path = e_shell_view_get_current_path (shell_view); - - folder = e_storage_set_get_folder (storage_set, folder_path); - g_return_if_fail (folder != NULL); - - old_name = e_folder_get_name (folder); - prompt = g_strdup_printf (_("Rename the \"%s\" folder to:"), old_name); - - while (1) { - const char *reason; - - new_name = e_request_string (shell_view != NULL ? GTK_WINDOW (shell_view) : NULL, - _("Rename Folder"), prompt, old_name); - - if (new_name == NULL) - return; - - if (e_shell_folder_name_is_valid (new_name, &reason)) - break; - - e_notice (shell_view, GTK_MESSAGE_ERROR, - _("The specified folder name is not valid: %s"), reason); - } - - g_free (prompt); - - if (strcmp (old_name, new_name) == 0) { - g_free (new_name); - return; - } - - old_base_path = g_path_get_dirname (folder_path); - new_path = g_build_filename (old_base_path, new_name, NULL); - - callback_data = rename_callback_data_new (shell_view, new_path); - e_storage_set_async_xfer_folder (storage_set, folder_path, new_path, TRUE, rename_cb, callback_data); - - g_free (old_base_path); - g_free (new_path); - g_free (new_name); -} - - -static void -remove_shared_cb (EStorageSet *storage_set, - EStorageResult result, - void *data) -{ - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (data); - - if (result == E_STORAGE_NOTIMPLEMENTED || - result == E_STORAGE_UNSUPPORTEDOPERATION) - e_notice (shell_view, GTK_MESSAGE_ERROR, - _("Selected folder does not belong to another user")); - else if (result != E_STORAGE_OK) - e_notice (shell_view, GTK_MESSAGE_ERROR, - _("Cannot remove folder:\n%s"), e_storage_result_to_string (result)); -} - -void -e_shell_command_remove_shared_folder (EShell *shell, - EShellView *shell_view, - const char *folder_path) -{ - EStorageSet *storage_set; - - g_return_if_fail (shell != NULL); - g_return_if_fail (E_IS_SHELL (shell)); - g_return_if_fail (shell_view != NULL || folder_path != NULL); - g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); - g_return_if_fail (folder_path != NULL || g_path_is_absolute (folder_path)); - - storage_set = e_shell_get_storage_set (shell); - - if (folder_path == NULL) - folder_path = e_shell_view_get_current_path (shell_view); - - e_storage_set_async_remove_shared_folder (storage_set, folder_path, - remove_shared_cb, shell_view); -} - - -void -e_shell_command_add_to_shortcut_bar (EShell *shell, - EShellView *shell_view, - const char *folder_path) -{ - EShortcuts *shortcuts; - EStorageSet *storage_set; - EFolder *folder; - int group_num; - char *uri; - int unread_count; - - g_return_if_fail (shell != NULL); - g_return_if_fail (E_IS_SHELL (shell)); - g_return_if_fail (shell_view != NULL); - g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); - g_return_if_fail (folder_path == NULL || g_path_is_absolute (folder_path)); - - shortcuts = e_shell_get_shortcuts (shell); - group_num = e_shell_view_get_current_shortcuts_group_num (shell_view); - - if (folder_path == NULL) - uri = g_strdup (e_shell_view_get_current_uri (shell_view)); - else - uri = g_strconcat (E_SHELL_URI_PREFIX, folder_path, NULL); - - unread_count = get_folder_unread (shell, e_shell_view_get_current_path (shell_view)); - - storage_set = e_shell_get_storage_set (shell); - folder = e_storage_set_get_folder (storage_set, e_shell_view_get_current_path (shell_view)); - - e_shortcuts_add_shortcut (shortcuts, group_num, -1, uri, NULL, - unread_count, - e_folder_get_type_string (folder), - e_folder_get_custom_icon_name (folder)); - - g_free (uri); -} diff --git a/shell/e-shell-folder-commands.h b/shell/e-shell-folder-commands.h deleted file mode 100644 index 72b7ba0b0e..0000000000 --- a/shell/e-shell-folder-commands.h +++ /dev/null @@ -1,42 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-folder-commands.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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_COMMANDS_H -#define E_SHELL_FOLDER_COMMANDS_H - -#include "e-shell.h" -#include "e-shell-view.h" - -void e_shell_command_open_folder_in_other_window (EShell *shell, EShellView *shell_view, const char *folder_path); - -void e_shell_command_create_new_folder (EShell *shell, EShellView *shell_view, const char *parent_folder_path); - -void e_shell_command_copy_folder (EShell *shell, EShellView *shell_view, const char *folder_path); -void e_shell_command_move_folder (EShell *shell, EShellView *shell_view, const char *folder_path); -void e_shell_command_delete_folder (EShell *shell, EShellView *shell_view, const char *folder_path); -void e_shell_command_rename_folder (EShell *shell, EShellView *shell_view, const char *folder_path); - -void e_shell_command_remove_shared_folder (EShell *shell, EShellView *shell_view, const char *folder_path); - -void e_shell_command_add_to_shortcut_bar (EShell *shell, EShellView *shell_view, const char *folder_path); - -#endif diff --git a/shell/e-shell-folder-creation-dialog.c b/shell/e-shell-folder-creation-dialog.c deleted file mode 100644 index 8390423850..0000000000 --- a/shell/e-shell-folder-creation-dialog.c +++ /dev/null @@ -1,568 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell.c - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <string.h> -#include <glib.h> -#include <libgnome/gnome-i18n.h> -#include <libgnome/gnome-util.h> - -#include <gtk/gtkentry.h> -#include <gtk/gtkdialog.h> -#include <gtk/gtkoptionmenu.h> -#include <gtk/gtkmenuitem.h> -#include <gtk/gtkscrolledwindow.h> - -#include <glade/glade-xml.h> - -#include <gal/util/e-util.h> - -#include "e-storage-set.h" -#include "e-storage-set-view.h" -#include "e-shell-utils.h" - -#include "e-util/e-dialog-utils.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; - - char *folder_path; - - EShellFolderCreationDialogCallback result_callback; - void *result_callback_data; - - gboolean creation_in_progress; -}; -typedef struct _DialogData DialogData; - -static void -dialog_data_destroy (DialogData *dialog_data) -{ - e_free_string_list (dialog_data->folder_types); - g_free (dialog_data->folder_path); - - g_free (dialog_data); -} - - -/* Callback for the asynchronous folder creation function. */ - -static void -async_create_cb (EStorageSet *storage_set, - EStorageResult result, - void *data) -{ - DialogData *dialog_data; - - dialog_data = (DialogData *) data; - - dialog_data->creation_in_progress = FALSE; - - gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog_data->dialog), GTK_RESPONSE_OK, TRUE); - gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog_data->dialog), GTK_RESPONSE_CANCEL, TRUE); - - if (result == E_STORAGE_OK) { - /* Success! Tell the callback of this, then return */ - if (dialog_data->result_callback != NULL) - (* dialog_data->result_callback) (dialog_data->shell, - E_SHELL_FOLDER_CREATION_DIALOG_RESULT_SUCCESS, - dialog_data->folder_path, - dialog_data->result_callback_data); - if (dialog_data->dialog != NULL) { - gtk_widget_destroy (dialog_data->dialog); - } else { - /* If dialog_data->dialog is NULL, it means that the - dialog has been destroyed before we were done, so we - have to free the dialog_data ourselves. */ - dialog_data_destroy (dialog_data); - } - return; - } - - /* Tell the callback something failed, then popup a dialog - explaining how it failed */ - if (dialog_data->result_callback != NULL) - (* dialog_data->result_callback) (dialog_data->shell, - E_SHELL_FOLDER_CREATION_DIALOG_RESULT_FAIL, - dialog_data->folder_path, - dialog_data->result_callback_data); - - e_notice (dialog_data->dialog, GTK_MESSAGE_ERROR, - _("Cannot create the specified folder:\n%s"), - e_storage_result_to_string (result)); - - /* If dialog_data->dialog is NULL, it means that the dialog has been - destroyed before we were done, so we have to free the dialog_data - ourselves. */ - if (dialog_data->dialog == NULL) - dialog_data_destroy (dialog_data); -} - - -/* Dialog signal callbacks. */ - -static void -dialog_response_cb (GtkDialog *dialog, - int response_id, - void *data) -{ - DialogData *dialog_data; - EStorageSet *storage_set; - GtkWidget *folder_type_menu_item; - const char *folder_type; - const char *parent_path; - const char *reason; - const char *folder_name; - char *path; - - dialog_data = (DialogData *) data; - - if (response_id != GTK_RESPONSE_OK) { - if (dialog_data->result_callback != NULL) - (* dialog_data->result_callback) (dialog_data->shell, - E_SHELL_FOLDER_CREATION_DIALOG_RESULT_CANCEL, - NULL, - dialog_data->result_callback_data); - gtk_widget_destroy (GTK_WIDGET (dialog)); - return; - } - - folder_name = gtk_entry_get_text(GTK_ENTRY (dialog_data->folder_name_entry)); - - if (! e_shell_folder_name_is_valid (folder_name, &reason)) { - e_notice (dialog, GTK_MESSAGE_ERROR, - _("The specified folder name is not valid: %s"), reason); - return; - } - - parent_path = e_storage_set_view_get_current_folder - (E_STORAGE_SET_VIEW (dialog_data->storage_set_view)); - if (parent_path == NULL) { - if (dialog_data->result_callback != NULL) - (* dialog_data->result_callback) (dialog_data->shell, - E_SHELL_FOLDER_CREATION_DIALOG_RESULT_CANCEL, - NULL, - dialog_data->result_callback_data); - gtk_widget_destroy (GTK_WIDGET (dialog)); - return; - } - - path = g_build_filename (parent_path, folder_name, NULL); - - 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 = g_object_get_data (G_OBJECT (folder_type_menu_item), "folder_type"); - - if (folder_type == NULL) { - g_warning ("Cannot get folder type for selected GtkOptionMenu item."); - return; - } - - g_free (dialog_data->folder_path); - dialog_data->folder_path = path; - - gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, FALSE); - gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL, FALSE); - - dialog_data->creation_in_progress = TRUE; - - e_storage_set_async_create_folder (storage_set, - path, - folder_type, - "", /* description */ - async_create_cb, dialog_data); -} - -static void -dialog_destroy_notify (void *data, - GObject *where_the_dialog_was) -{ - DialogData *dialog_data; - - dialog_data = (DialogData *) data; - - if (dialog_data->creation_in_progress) { - /* If the dialog has been closed before we are done creating - the folder, the dialog_data will be freed after the creation - is completed. */ - dialog_data->dialog = NULL; - dialog_data->folder_name_entry = NULL; - dialog_data->storage_set_view = NULL; - dialog_data->folder_type_option_menu = NULL; - return; - } - - dialog_data_destroy (dialog_data); -} - -static void -folder_name_entry_activate_cb (GtkEntry *entry, - void *data) -{ - DialogData *dialog_data; - const char *parent_path; - - dialog_data = (DialogData *) data; - - parent_path = e_storage_set_view_get_current_folder (E_STORAGE_SET_VIEW (dialog_data->storage_set_view)); - - if (parent_path != NULL - && GTK_ENTRY (dialog_data->folder_name_entry)->text_length > 0) - gtk_dialog_response (GTK_DIALOG (dialog_data->dialog), GTK_RESPONSE_OK); -} - -static void -folder_name_entry_changed_cb (GtkEditable *editable, - void *data) -{ - DialogData *dialog_data; - const char *parent_path; - - dialog_data = (DialogData *) data; - - parent_path = e_storage_set_view_get_current_folder (E_STORAGE_SET_VIEW (dialog_data->storage_set_view)); - - if (parent_path != NULL - && GTK_ENTRY (dialog_data->folder_name_entry)->text_length > 0) - gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog_data->dialog), GTK_RESPONSE_OK, TRUE); - else - gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog_data->dialog), GTK_RESPONSE_OK, FALSE); -} - -static void -storage_set_view_folder_selected_cb (EStorageSetView *storage_set_view, - const char *path, - void *data) -{ - DialogData *dialog_data; - - dialog_data = (DialogData *) data; - - if (GTK_ENTRY (dialog_data->folder_name_entry)->text_length > 0) - gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog_data->dialog), GTK_RESPONSE_OK, TRUE); -} - - -/* Shell signal callbacks. */ - -static void -shell_destroy_notify (void *data, - GObject *where_the_shell_was) -{ - DialogData *dialog_data = (DialogData *) data; - - dialog_data->shell = NULL; - gtk_widget_destroy (GTK_WIDGET (dialog_data->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), _("Create New Folder")); - - gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, 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"); -} - -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 *scrolled_window; - GtkWidget *vbox; - - storage_set = e_shell_get_storage_set (shell); - storage_set_view = e_storage_set_create_new_view (storage_set, NULL); - - e_storage_set_view_set_allow_dnd (E_STORAGE_SET_VIEW (storage_set_view), FALSE); - - 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"); - - 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_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN); - gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 6); - - gtk_container_add (GTK_CONTAINER (scrolled_window), storage_set_view); - - gtk_widget_show (scrolled_window); - gtk_widget_show (storage_set_view); - - return storage_set_view; -} - -struct _TypeWithDisplayName { - const char *type; - const char *display_name; -}; -typedef struct _TypeWithDisplayName TypeWithDisplayName; - -static int -type_with_display_name_compare_func (const void *a, const void *b) -{ - const TypeWithDisplayName *val_a, *val_b; - char *a_display_name_casefolded; - char *b_display_name_casefolded; - int retval; - - val_a = (const TypeWithDisplayName *) a; - val_b = (const TypeWithDisplayName *) b; - - a_display_name_casefolded = g_utf8_casefold (val_a->display_name, -1); - b_display_name_casefolded = g_utf8_casefold (val_b->display_name, -1); - - retval = g_utf8_collate (a_display_name_casefolded, b_display_name_casefolded); - - g_free (a_display_name_casefolded); - g_free (b_display_name_casefolded); - - return retval; -} - -static GList * -add_folder_types (GtkWidget *dialog, - GladeXML *gui, - EShell *shell, - const char *default_type) -{ - EFolderTypeRegistry *folder_type_registry; - GtkWidget *folder_type_option_menu; - GtkWidget *menu; - GList *folder_types; - GList *types_with_display_names; - GList *p; - int default_item; - int i, len; - - folder_type_option_menu = glade_xml_get_widget (gui, "folder_type_option_menu"); - - menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (folder_type_option_menu)); - - 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? */ - - types_with_display_names = NULL; - for (p = folder_types; p != NULL; p = p->next) { - TypeWithDisplayName *new; - - new = g_new (TypeWithDisplayName, 1); - new->type = p->data; - new->display_name = e_folder_type_registry_get_display_name_for_type (folder_type_registry, new->type); - - types_with_display_names = g_list_prepend (types_with_display_names, new); - } - - types_with_display_names = g_list_sort (types_with_display_names, type_with_display_name_compare_func); - - /* FIXME: Add icon (I don't feel like writing an alpha-capable thingie again). */ - - default_item = -1; - i = 0; - for (p = types_with_display_names; p != NULL; p = p->next) { - const TypeWithDisplayName *type; - GtkWidget *menu_item; - - type = (const TypeWithDisplayName *) p->data; - - if (! e_folder_type_registry_type_is_user_creatable (folder_type_registry, type->type)) - continue; - - menu_item = gtk_menu_item_new_with_label (type->display_name); - gtk_widget_show (menu_item); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); - - g_object_set_data_full (G_OBJECT (menu_item), "folder_type", g_strdup (type->type), g_free); - - if (strcmp (type->type, default_type) == 0) - default_item = i; - else if (default_item == -1) { - len = strlen (type->type); - if (strncmp (type->type, default_type, len) == 0 && - default_type[len] == '/') - default_item = i; - } - - i ++; - } - if (default_item == -1) - default_item = 0; - - for (p = types_with_display_names; p != NULL; p = p->next) - g_free (p->data); - g_list_free (types_with_display_names); - - 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; -} - -static const char * -get_type_from_parent_path (EShell *shell, - const char *path) -{ - EFolder *folder; - const char *folder_type; - EStorageSet *set; - - set = e_shell_get_storage_set (shell); - folder = e_storage_set_get_folder (set, path); - if (folder == NULL) { - return "mail"; - } - - folder_type = e_folder_get_type_string (folder); - if (folder_type == NULL || strcmp (folder_type, "noselect") == 0) { - return "mail"; - } else { - return folder_type; - } -} - - -/* 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, - const char *default_type, - EShellFolderCreationDialogCallback result_callback, - void *result_callback_data) -{ - 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, 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); - if (default_type == NULL) { - const char *dt; - - dt = get_type_from_parent_path (shell, default_parent_folder); - folder_types = add_folder_types (dialog, gui, shell, dt); - } else { - folder_types = add_folder_types (dialog, gui, shell, default_type); - } - - 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; - dialog_data->folder_path = NULL; - dialog_data->result_callback = result_callback; - dialog_data->result_callback_data = result_callback_data; - dialog_data->creation_in_progress = FALSE; - - g_signal_connect (dialog, "response", - G_CALLBACK (dialog_response_cb), dialog_data); - g_object_weak_ref (G_OBJECT (dialog), dialog_destroy_notify, dialog_data); - - g_signal_connect (dialog_data->folder_name_entry, "changed", - G_CALLBACK (folder_name_entry_changed_cb), dialog_data); - - g_signal_connect (dialog_data->folder_name_entry, "activate", - G_CALLBACK (folder_name_entry_activate_cb), dialog_data); - - g_signal_connect (dialog_data->storage_set_view, "folder_selected", - G_CALLBACK (storage_set_view_folder_selected_cb), dialog_data); - - g_object_weak_ref (G_OBJECT (shell), shell_destroy_notify, dialog_data); - - g_object_unref (gui); -} diff --git a/shell/e-shell-folder-creation-dialog.h b/shell/e-shell-folder-creation-dialog.h deleted file mode 100644 index 8e3e990835..0000000000 --- a/shell/e-shell-folder-creation-dialog.h +++ /dev/null @@ -1,49 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell.c - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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" - -enum _EShellFolderCreationDialogResult { - E_SHELL_FOLDER_CREATION_DIALOG_RESULT_SUCCESS, - E_SHELL_FOLDER_CREATION_DIALOG_RESULT_FAIL, - E_SHELL_FOLDER_CREATION_DIALOG_RESULT_CANCEL -}; -typedef enum _EShellFolderCreationDialogResult EShellFolderCreationDialogResult; - -typedef void (* EShellFolderCreationDialogCallback) (EShell *shell, - EShellFolderCreationDialogResult result, - const char *path, - void *data); - -void e_shell_show_folder_creation_dialog (EShell *shell, - GtkWindow *parent, - const char *default_parent_folder, - const char *default_type, - EShellFolderCreationDialogCallback result_callback, - void *result_callback_data); - -#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 0715a1d9ae..0000000000 --- a/shell/e-shell-folder-selection-dialog.c +++ /dev/null @@ -1,548 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-folder-selection-dialog.c - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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-shell-folder-selection-dialog.h" - -#include "e-shell-constants.h" -#include "e-shell-marshal.h" -#include "e-storage-set-view.h" -#include "e-storage-set.h" - -#include "e-shell-folder-creation-dialog.h" - -#include <libgnome/gnome-i18n.h> - -#include <gal/util/e-util.h> -#include <gal/widgets/e-gui-utils.h> - -#include <gtk/gtksignal.h> -#include <gtk/gtklabel.h> -#include <gtk/gtkstock.h> -#include <gtk/gtkscrolledwindow.h> - -#include <string.h> - - -#define PARENT_TYPE (gtk_dialog_get_type ()) -static GtkDialogClass *parent_class = NULL; - -struct _EShellFolderSelectionDialogPrivate { - EShell *shell; - GList *allowed_types; - EStorageSet *storage_set; - GtkWidget *storage_set_view; - - gboolean allow_creation; -}; - -enum { - FOLDER_SELECTED, - CANCELLED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -enum { - RESPONSE_NEW -}; - - -/* Utility functions. */ - -static gboolean -check_folder_type_valid (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, *slash; - - type = (const char *) p->data; - if (strcmp (folder_type, type) == 0) - return TRUE; - slash = strchr (type, '/'); - if (slash && slash[1] == '*' && strncmp (folder_type, type, slash - type) == 0) - return TRUE; - } - - return FALSE; -} - -static void -set_default_folder (EShellFolderSelectionDialog *shell_folder_selection_dialog, - const char *default_uri) -{ - EShellFolderSelectionDialogPrivate *priv; - char *default_path; - - g_assert (default_uri != NULL); - - priv = shell_folder_selection_dialog->priv; - - if (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); -} - - -/* Folder creation dialog callback. */ - -static void -folder_creation_dialog_result_cb (EShell *shell, - EShellFolderCreationDialogResult result, - const char *path, - void *data) -{ - EShellFolderSelectionDialog *dialog; - EShellFolderSelectionDialogPrivate *priv; - - dialog = E_SHELL_FOLDER_SELECTION_DIALOG (data); - priv = dialog->priv; - - if (priv == NULL) { - g_warning ("dialog->priv is NULL, and should not be"); - return; - } - - if (result == E_SHELL_FOLDER_CREATION_DIALOG_RESULT_SUCCESS) - e_storage_set_view_set_current_folder (E_STORAGE_SET_VIEW (priv->storage_set_view), - path); -} - - -/* GtkObject methods. */ - -/* Saves the expanded state of the tree to a common filename */ -static void -save_expanded_state (EShellFolderSelectionDialog *folder_selection_dialog) -{ - EShellFolderSelectionDialogPrivate *priv; - char *filename; - - priv = folder_selection_dialog->priv; - - filename = g_strdup_printf ("%s/config/storage-set-view-expanded:folder-selection-dialog", - e_shell_get_local_directory (priv->shell)); - e_tree_save_expanded_state (E_TREE (priv->storage_set_view), filename); - g_free (filename); -} - -static void -impl_dispose (GObject *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) { - save_expanded_state (folder_selection_dialog); - g_object_unref (priv->storage_set); - priv->storage_set = NULL; - } - - if (priv->shell != NULL) { - g_object_weak_unref (G_OBJECT (priv->shell), (GWeakNotify) gtk_widget_destroy, folder_selection_dialog); - priv->shell = NULL; - } - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EShellFolderSelectionDialog *folder_selection_dialog; - EShellFolderSelectionDialogPrivate *priv; - - folder_selection_dialog = E_SHELL_FOLDER_SELECTION_DIALOG (object); - priv = folder_selection_dialog->priv; - - e_free_string_list (priv->allowed_types); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -/* GtkDialog methods. */ - -static void -impl_response (GtkDialog *dialog, - int response) -{ - EShellFolderSelectionDialog *folder_selection_dialog; - EShellFolderSelectionDialogPrivate *priv; - EStorageSetView *storage_set_view; - const char *default_parent_folder; - const char *default_subtype; - char *default_type; - - folder_selection_dialog = E_SHELL_FOLDER_SELECTION_DIALOG (dialog); - priv = folder_selection_dialog->priv; - - switch (response) { - case GTK_RESPONSE_OK: - if (check_folder_type_valid (folder_selection_dialog)) { - g_signal_emit (folder_selection_dialog, signals[FOLDER_SELECTED], 0, - e_shell_folder_selection_dialog_get_selected_path (folder_selection_dialog)); - gtk_widget_destroy (GTK_WIDGET (dialog)); - } - break; - - case GTK_RESPONSE_CANCEL: - case GTK_RESPONSE_DELETE_EVENT: - g_signal_emit (folder_selection_dialog, signals[CANCELLED], 0); - gtk_widget_destroy (GTK_WIDGET (dialog)); - break; - - case RESPONSE_NEW: - storage_set_view = E_STORAGE_SET_VIEW (priv->storage_set_view); - default_parent_folder = e_storage_set_view_get_current_folder (storage_set_view); - - /* The default type in the folder creation dialog will be the - first of the allowed types. If all types are allowed, - hardcode to "mail". */ - if (priv->allowed_types == NULL) - default_type = g_strdup ("mail"); - else { - default_subtype = (const char *) priv->allowed_types->data; - default_type = g_strndup (default_subtype, - strcspn (default_subtype, "/")); - } - - e_shell_show_folder_creation_dialog (priv->shell, GTK_WINDOW (dialog), - default_parent_folder, - default_type, - folder_creation_dialog_result_cb, - dialog); - g_free (default_type); - - break; - } -} - - -/* GTK+ type initialization. */ - -static void -class_init (EShellFolderSelectionDialogClass *klass) -{ - GObjectClass *object_class; - GtkDialogClass *dialog_class; - - parent_class = g_type_class_ref(PARENT_TYPE); - object_class = G_OBJECT_CLASS (klass); - dialog_class = GTK_DIALOG_CLASS (klass); - - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - dialog_class->response = impl_response; - - signals[FOLDER_SELECTED] - = g_signal_new ("folder_selected", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EShellFolderSelectionDialogClass, folder_selected), - NULL, NULL, - e_shell_marshal_NONE__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); - - signals[CANCELLED] - = g_signal_new ("cancelled", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EShellFolderSelectionDialogClass, cancelled), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); -} - -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; - priv->allow_creation = TRUE; - - shell_folder_selection_dialog->priv = priv; -} - - -/* ETable callbacks. */ - -static void -folder_selected_cb (EStorageSetView *storage_set_view, - const char *path, - void *data) -{ - EShellFolderSelectionDialog *dialog; - - dialog = E_SHELL_FOLDER_SELECTION_DIALOG (data); - - if (check_folder_type_valid (dialog)) - gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, TRUE); - else - gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_OK, FALSE); -} - -static void -double_click_cb (EStorageSetView *essv, - int row, - ETreePath path, - int col, - GdkEvent *event, - EShellFolderSelectionDialog *folder_selection_dialog) -{ - g_return_if_fail (folder_selection_dialog != NULL); - - if (check_folder_type_valid (folder_selection_dialog)) { - g_signal_emit (folder_selection_dialog, signals[FOLDER_SELECTED], 0, - e_shell_folder_selection_dialog_get_selected_path (folder_selection_dialog)); - gtk_widget_destroy (GTK_WIDGET (folder_selection_dialog)); - } -} - - -/** - * 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 - * @caption: A brief text to be put on top of the storage view - * @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 *caption, - const char *default_uri, - const char *allowed_types[], - gboolean allow_creation) -{ - EShellFolderSelectionDialogPrivate *priv; - GtkWidget *scrolled_window; - GtkWidget *caption_label; - int i; - char *filename; - - 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; - - /* Basic dialog setup. */ - - gtk_window_set_default_size (GTK_WINDOW (folder_selection_dialog), 350, 300); - gtk_window_set_modal (GTK_WINDOW (folder_selection_dialog), TRUE); - gtk_window_set_title (GTK_WINDOW (folder_selection_dialog), title); - gtk_container_set_border_width (GTK_CONTAINER (folder_selection_dialog), 6); - - if (allow_creation) - gtk_dialog_add_buttons (GTK_DIALOG (folder_selection_dialog), - GTK_STOCK_NEW, RESPONSE_NEW, - NULL); - - gtk_dialog_add_buttons (GTK_DIALOG (folder_selection_dialog), - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_OK, - NULL); - - gtk_dialog_set_response_sensitive (GTK_DIALOG (folder_selection_dialog), GTK_RESPONSE_OK, FALSE); - gtk_dialog_set_default_response (GTK_DIALOG (folder_selection_dialog), GTK_RESPONSE_OK); - - /* Make sure we get destroyed if the shell gets destroyed. */ - - priv->shell = shell; - g_object_weak_ref (G_OBJECT (shell), (GWeakNotify) gtk_widget_destroy, folder_selection_dialog); - - /* Set up the label. */ - - if (caption != NULL) { - caption_label = gtk_label_new (caption); - gtk_label_set_justify (GTK_LABEL (caption_label), GTK_JUSTIFY_LEFT); - gtk_widget_show (caption_label); - - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (folder_selection_dialog)->vbox), - caption_label, FALSE, TRUE, 6); - gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (folder_selection_dialog)->vbox), - 6); - - - } - - /* Set up the storage set and its view. */ - - priv->storage_set = e_shell_get_storage_set (shell); - g_object_ref (priv->storage_set); - - priv->storage_set_view = e_storage_set_create_new_view (priv->storage_set, NULL); - e_storage_set_view_set_allow_dnd (E_STORAGE_SET_VIEW (priv->storage_set_view), FALSE); - e_storage_set_view_enable_search (E_STORAGE_SET_VIEW (priv->storage_set_view), TRUE); - - /* Load the expanded state for this StorageSetView */ - filename = g_strdup_printf ("%s/config/storage-set-view-expanded:folder-selection-dialog", - e_shell_get_local_directory (priv->shell)); - - e_tree_load_expanded_state (E_TREE (priv->storage_set_view), - filename); - - g_free (filename); - - g_signal_connect (priv->storage_set_view, "double_click", G_CALLBACK (double_click_cb), folder_selection_dialog); - g_signal_connect (priv->storage_set_view, "folder_selected", G_CALLBACK (folder_selected_cb), folder_selection_dialog); - - 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])); - - /* Preserve the order so we can use the first type listed as - the default for the folder creation dialog invoked by the - "New..." button. */ - priv->allowed_types = g_list_reverse (priv->allowed_types); - } - - if (default_uri != NULL) - set_default_folder (folder_selection_dialog, default_uri); - - scrolled_window = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - gtk_container_add (GTK_CONTAINER (scrolled_window), priv->storage_set_view); - - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (folder_selection_dialog)->vbox), - scrolled_window, TRUE, TRUE, 6); - gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (folder_selection_dialog)->vbox), 6); - - gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (folder_selection_dialog)->vbox), 6); - - gtk_widget_show (priv->storage_set_view); - gtk_widget_show (scrolled_window); - - GTK_WIDGET_SET_FLAGS (priv->storage_set_view, GTK_CAN_FOCUS); - gtk_widget_grab_focus (priv->storage_set_view); -} - -/** - * e_shell_folder_selection_dialog_new: - * @shell: The this folder selection dialog is for - * @title: Title of the window - * @caption: A brief text to be put on top of the storage view - * @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-`evolution:' URIs are - * considered to be physical URIs). - * - * Return value: - **/ -GtkWidget * -e_shell_folder_selection_dialog_new (EShell *shell, - const char *title, - const char *caption, - const char *default_uri, - const char *allowed_types[], - gboolean allow_creation) -{ - 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 = g_object_new (e_shell_folder_selection_dialog_get_type (), NULL); - e_shell_folder_selection_dialog_construct (folder_selection_dialog, shell, - title, caption, default_uri, allowed_types, - allow_creation); - - 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 05b1e46281..0000000000 --- a/shell/e-shell-folder-selection-dialog.h +++ /dev/null @@ -1,82 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-folder-selection-dialog.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <gtk/gtkdialog.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 { - GtkDialog parent; - - EShellFolderSelectionDialogPrivate *priv; -}; - -struct _EShellFolderSelectionDialogClass { - GtkDialogClass 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 *caption, - const char *default_uri, - const char *allowed_types[], - gboolean allow_creation); -GtkWidget *e_shell_folder_selection_dialog_new (EShell *shell, - const char *title, - const char *caption, - const char *default_uri, - const char *allowed_types[], - gboolean allow_creation); - -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 9871a9c1d1..0000000000 --- a/shell/e-shell-folder-title-bar.c +++ /dev/null @@ -1,749 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-folder-title-bar.c - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <string.h> -#include <gtk/gtkarrow.h> -#include <gtk/gtklabel.h> -#include <gtk/gtkimage.h> -#include <gtk/gtkrc.h> -#include <gtk/gtksignal.h> -#include <gtk/gtktogglebutton.h> -#include <libgnome/gnome-i18n.h> -#include <gdk-pixbuf/gdk-pixbuf.h> - -#include <gal/util/e-util.h> - -#include "widgets/misc/e-clipped-label.h" -#include "e-shell-constants.h" -#include "e-shell-marshal.h" -#include "e-shell-folder-title-bar.h" - - -#define PARENT_TYPE GTK_TYPE_HBOX -static GtkHBox *parent_class = NULL; - -struct _EShellFolderTitleBarPrivate { - GdkPixbuf *icon; - - /* We have an icon, a label and a button that contains an icon and a - label. When the button is enabled, the stand-alone label icon get - hidden; when the button is disabled, the button gets hidden and the - label and the icon get shown. This is pretty ugly but it easier to - manage the GTK layout this way. */ - - /* The stand-alone icon/label combo. */ - GtkWidget *title_icon; - GtkWidget *title_label; - - /* The button. */ - GtkWidget *title_button; - GtkWidget *title_button_icon; - GtkWidget *title_button_label; - GtkWidget *title_button_arrow; - - /* Holds extra information that is to be shown on the bar. */ - GtkWidget *folder_bar_label; - - /* Navigation buttons. */ - GtkWidget *back_button; - GtkWidget *forward_button; - - gboolean title_clickable; -}; - -enum { - TITLE_TOGGLED, - BACK_CLICKED, - FORWARD_CLICKED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - - -/* Utility functions for managing icons and icon widgets. */ - -static GdkPixbuf * -new_empty_pixbuf (void) -{ - GdkPixbuf *empty_pixbuf; - unsigned char *pixels; - - empty_pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, 1, 1); - pixels = gdk_pixbuf_get_pixels (empty_pixbuf); - - memset (pixels, 0, 4); - - return empty_pixbuf; -} - -static GtkWidget * -new_empty_image_widget (void) -{ - GtkWidget *image_widget; - GdkPixmap *pixmap; - GdkBitmap *mask; - GdkPixbuf *empty_pixbuf; - - empty_pixbuf = new_empty_pixbuf (); - - gdk_pixbuf_render_pixmap_and_mask (empty_pixbuf, &pixmap, &mask, 127); - image_widget = gtk_image_new_from_pixmap (pixmap, mask); - - g_object_unref (empty_pixbuf); - - return image_widget; -} - - -/* Utility functions. */ - -static int -get_max_clipped_label_width (EClippedLabel *clipped_label) -{ - int width; - - pango_layout_get_pixel_size (clipped_label->layout, &width, NULL); - width += 2 * GTK_MISC (clipped_label)->xpad; - - return width; -} - -static void -size_allocate_title_button (EShellFolderTitleBar *title_bar, - GtkAllocation *allocation, - int offset, - int *available_width_inout) -{ - EShellFolderTitleBarPrivate *priv; - GtkAllocation child_allocation; - GtkRequisition child_requisition; - int border_width; - - priv = title_bar->priv; - - /* Keep a little distance from the navigation arrows. */ - allocation->x += 2; - - border_width = GTK_CONTAINER (title_bar)->border_width; - - gtk_widget_get_child_requisition (priv->title_button, &child_requisition); - child_allocation.x = allocation->x + border_width + offset; - child_allocation.y = allocation->y + border_width; - child_allocation.height = allocation->height - 2 * border_width; - - child_allocation.width = child_requisition.width; - child_allocation.width += get_max_clipped_label_width (E_CLIPPED_LABEL (priv->title_button_label)); - - child_allocation.width = MIN (child_allocation.width, *available_width_inout); - - gtk_widget_size_allocate (priv->title_button, & child_allocation); - - *available_width_inout -= child_allocation.width; -} - -static int -size_allocate_navigation_buttons_and_title_icon (EShellFolderTitleBar *title_bar, - GtkAllocation *allocation) -{ - EShellFolderTitleBarPrivate *priv; - GtkRequisition child_requisition; - GtkAllocation child_allocation; - int border_width; - - priv = title_bar->priv; - - border_width = GTK_CONTAINER (title_bar)->border_width; - - child_allocation.x = allocation->x + border_width; - child_allocation.y = allocation->y + border_width; - child_allocation.height = allocation->height - 2 * border_width; - - gtk_widget_size_request (priv->back_button, &child_requisition); - child_allocation.width = child_requisition.width; - gtk_widget_size_allocate (priv->back_button, &child_allocation); - - child_allocation.x += child_allocation.width; - - gtk_widget_size_request (priv->forward_button, &child_requisition); - child_allocation.width = child_requisition.width; - gtk_widget_size_allocate (priv->forward_button, &child_allocation); - - if (! priv->title_clickable) { - /* Keep a little distance from the navigation arrows. */ - child_allocation.x += child_allocation.width + 5; - - gtk_widget_size_request (priv->title_icon, &child_requisition); - child_allocation.width = child_requisition.width; - gtk_widget_size_allocate (priv->title_icon, &child_allocation); - } - - return child_allocation.x + child_allocation.width; -} - -static void -size_allocate_label (EShellFolderTitleBar *title_bar, - GtkAllocation *allocation, - int offset, - int *available_width_inout) -{ - EShellFolderTitleBarPrivate *priv; - GtkAllocation child_allocation; - int border_width; - - priv = title_bar->priv; - - border_width = GTK_CONTAINER (title_bar)->border_width; - - child_allocation.x = allocation->x + border_width + offset; - child_allocation.y = allocation->y + border_width; - child_allocation.height = allocation->height - 2 * border_width; - - child_allocation.width = MIN (get_max_clipped_label_width (E_CLIPPED_LABEL (priv->title_label)), - *available_width_inout); - - gtk_widget_size_allocate (priv->title_label, & child_allocation); - - *available_width_inout -= child_allocation.width; -} - - -/* The back/forward navigation buttons. */ - -static void -back_button_clicked_callback (GtkButton *button, - void *data) -{ - EShellFolderTitleBar *folder_title_bar; - - folder_title_bar = E_SHELL_FOLDER_TITLE_BAR (data); - - g_signal_emit (folder_title_bar, signals[BACK_CLICKED], 0); -} - -static void -forward_button_clicked_callback (GtkButton *button, - void *data) -{ - EShellFolderTitleBar *folder_title_bar; - - folder_title_bar = E_SHELL_FOLDER_TITLE_BAR (data); - - g_signal_emit (folder_title_bar, signals[FORWARD_CLICKED], 0); -} - -static void -add_navigation_buttons (EShellFolderTitleBar *folder_title_bar) -{ - EShellFolderTitleBarPrivate *priv; - GtkWidget *back_image; - GtkWidget *forward_image; - - priv = folder_title_bar->priv; - - priv->back_button = gtk_button_new (); - gtk_button_set_relief (GTK_BUTTON (priv->back_button), GTK_RELIEF_NONE); - GTK_WIDGET_UNSET_FLAGS (priv->back_button, GTK_CAN_FOCUS); - - back_image = gtk_arrow_new (GTK_ARROW_LEFT, GTK_SHADOW_NONE); - gtk_container_add (GTK_CONTAINER (priv->back_button), back_image); - - g_signal_connect (priv->back_button, "clicked", - G_CALLBACK (back_button_clicked_callback), folder_title_bar); - - priv->forward_button = gtk_button_new (); - gtk_button_set_relief (GTK_BUTTON (priv->forward_button), GTK_RELIEF_NONE); - GTK_WIDGET_UNSET_FLAGS (priv->forward_button, GTK_CAN_FOCUS); - - forward_image = gtk_arrow_new (GTK_ARROW_RIGHT, GTK_SHADOW_NONE); - gtk_container_add (GTK_CONTAINER (priv->forward_button), forward_image); - - g_signal_connect (priv->forward_button, "clicked", - G_CALLBACK (forward_button_clicked_callback), folder_title_bar); - - gtk_box_pack_start (GTK_BOX (folder_title_bar), priv->back_button, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (folder_title_bar), priv->forward_button, FALSE, FALSE, 0); - - gtk_widget_show_all (priv->back_button); - gtk_widget_show_all (priv->forward_button); -} - - -/* Popup button callback. */ - -static void -title_button_toggled_cb (GtkToggleButton *title_button, - void *data) -{ - EShellFolderTitleBar *folder_title_bar; - - folder_title_bar = E_SHELL_FOLDER_TITLE_BAR (data); - - g_signal_emit (folder_title_bar, signals[TITLE_TOGGLED], 0, - gtk_toggle_button_get_active (title_button)); -} - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - EShellFolderTitleBar *folder_title_bar; - EShellFolderTitleBarPrivate *priv; - - folder_title_bar = E_SHELL_FOLDER_TITLE_BAR (object); - priv = folder_title_bar->priv; - - if (priv->icon != NULL) { - g_object_unref (priv->icon); - priv->icon = NULL; - } - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EShellFolderTitleBar *folder_title_bar; - EShellFolderTitleBarPrivate *priv; - - folder_title_bar = E_SHELL_FOLDER_TITLE_BAR (object); - priv = folder_title_bar->priv; - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -/* GTkWidget methods. */ - -static void -impl_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - EShellFolderTitleBar *title_bar; - EShellFolderTitleBarPrivate *priv; - GtkAllocation label_allocation; - int border_width; - int available_width; - int width_before_icon; - int offset; - - title_bar = E_SHELL_FOLDER_TITLE_BAR (widget); - priv = title_bar->priv; - - border_width = GTK_CONTAINER (widget)->border_width; - available_width = allocation->width - 2 * border_width; - - offset = size_allocate_navigation_buttons_and_title_icon (title_bar, allocation); - available_width -= offset; - - width_before_icon = available_width; - - if (priv->title_clickable) - size_allocate_title_button (title_bar, allocation, offset, & available_width); - else - size_allocate_label (title_bar, allocation, offset, & available_width); - - label_allocation.x = allocation->x + width_before_icon - available_width - border_width + offset; - label_allocation.y = allocation->y + border_width; - label_allocation.width = available_width - 2 * border_width; - label_allocation.height = allocation->height - 2 * border_width; - - gtk_widget_size_allocate (priv->folder_bar_label, & label_allocation); - - widget->allocation = *allocation; -} - - -static int -impl_expose_event (GtkWidget *widget, - GdkEventExpose *event) -{ - gtk_paint_flat_box (widget->style, widget->window, - GTK_STATE_ACTIVE, GTK_SHADOW_OUT, - &event->area, widget, "EShellFolderTitleBar", - widget->allocation.x, - widget->allocation.y, - widget->allocation.width, - widget->allocation.height); - - (* GTK_WIDGET_CLASS (parent_class)->expose_event) (widget, event); - - return FALSE; -} - - -static void -class_init (EShellFolderTitleBarClass *klass) -{ - GObjectClass *object_class; - GtkWidgetClass *widget_class; - - object_class = G_OBJECT_CLASS (klass); - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - widget_class = GTK_WIDGET_CLASS (klass); - widget_class->size_allocate = impl_size_allocate; - widget_class->expose_event = impl_expose_event; - - parent_class = g_type_class_ref(PARENT_TYPE); - - signals[TITLE_TOGGLED] - = g_signal_new ("title_toggled", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EShellFolderTitleBarClass, title_toggled), - NULL, NULL, - e_shell_marshal_NONE__BOOL, - G_TYPE_NONE, 1, - G_TYPE_BOOLEAN); - - signals[BACK_CLICKED] - = g_signal_new ("back_clicked", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EShellFolderTitleBarClass, back_clicked), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - signals[FORWARD_CLICKED] - = g_signal_new ("forward_clicked", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EShellFolderTitleBarClass, forward_clicked), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); -} - -static void -init (EShellFolderTitleBar *shell_folder_title_bar) -{ - EShellFolderTitleBarPrivate *priv; - - priv = g_new (EShellFolderTitleBarPrivate, 1); - - priv->icon = NULL; - - priv->title_icon = NULL; - priv->title_label = NULL; - - priv->title_button = NULL; - priv->title_button_icon = NULL; - priv->title_button_label = NULL; - priv->title_button_arrow = NULL; - - priv->folder_bar_label = NULL; - - priv->back_button = NULL; - priv->forward_button = NULL; - - priv->title_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; - GtkWidget *title_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->title_icon = new_empty_image_widget (); - gtk_misc_set_alignment (GTK_MISC (priv->title_icon), 1.0, .5); - gtk_misc_set_padding (GTK_MISC (priv->title_icon), 2, 0); - gtk_widget_show (priv->title_icon); - - priv->title_label = e_clipped_label_new ("", PANGO_WEIGHT_BOLD, 1.2); - gtk_misc_set_padding (GTK_MISC (priv->title_label), 0, 0); - gtk_misc_set_alignment (GTK_MISC (priv->title_label), 0.0, 0.5); - - priv->title_button_label = e_clipped_label_new ("", PANGO_WEIGHT_BOLD, 1.2); - gtk_misc_set_padding (GTK_MISC (priv->title_button_label), 2, 0); - gtk_misc_set_alignment (GTK_MISC (priv->title_button_label), 0.0, 0.5); - gtk_widget_show (priv->title_button_label); - - priv->folder_bar_label = e_clipped_label_new ("", PANGO_WEIGHT_NORMAL, 1.0); - gtk_misc_set_alignment (GTK_MISC (priv->folder_bar_label), 1.0, 0.5); - gtk_widget_show (priv->folder_bar_label); - - priv->title_button_icon = new_empty_image_widget (); - gtk_widget_show (priv->title_button_icon); - - title_button_hbox = gtk_hbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (title_button_hbox), priv->title_button_icon, - FALSE, TRUE, 2); - gtk_box_pack_start (GTK_BOX (title_button_hbox), priv->title_button_label, - TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (title_button_hbox), gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE), - FALSE, TRUE, 2); - gtk_widget_show (title_button_hbox); - - priv->title_button = gtk_toggle_button_new (); - gtk_button_set_relief (GTK_BUTTON (priv->title_button), GTK_RELIEF_NONE); - gtk_container_add (GTK_CONTAINER (priv->title_button), title_button_hbox); - GTK_WIDGET_UNSET_FLAGS (priv->title_button, GTK_CAN_FOCUS); - gtk_widget_show (priv->title_button); - - gtk_container_set_border_width (GTK_CONTAINER (folder_title_bar), 2); - gtk_box_pack_start (GTK_BOX (folder_title_bar), priv->title_icon, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (folder_title_bar), priv->title_label, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (folder_title_bar), priv->title_button, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (folder_title_bar), priv->folder_bar_label, TRUE, TRUE, 0); - - /* Make the label have a border as large as the button's. - FIXME: This is really hackish. The hardcoded numbers should be OK - as the padding is hardcoded in GtkButton too (see CHILD_SPACING in - gtkbutton.c). */ - gtk_misc_set_padding (GTK_MISC (priv->title_label), - GTK_WIDGET (priv->title_button)->style->xthickness, - GTK_WIDGET (priv->title_button)->style->ythickness + 2); - - g_signal_connect (priv->title_button, "toggled", - G_CALLBACK (title_button_toggled_cb), folder_title_bar); - - add_navigation_buttons (folder_title_bar); - - e_shell_folder_title_bar_set_title (folder_title_bar, NULL); -} - -/** - * 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 = g_object_new (e_shell_folder_title_bar_get_type (), NULL); - - 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) { - e_clipped_label_set_text (E_CLIPPED_LABEL (priv->title_button_label), _("(Untitled)")); - e_clipped_label_set_text (E_CLIPPED_LABEL (priv->title_label), _("(Untitled)")); - } else { - e_clipped_label_set_text (E_CLIPPED_LABEL (priv->title_button_label), title); - e_clipped_label_set_text (E_CLIPPED_LABEL (priv->title_label), title); - } - - /* FIXME: There seems to be a bug in EClippedLabel, this is just a workaround. */ - gtk_widget_queue_resize (GTK_WIDGET (folder_title_bar)); -} - -/** - * e_shell_folder_title_bar_set_folder_bar_label: - * @folder_title_bar: - * @text: Some text to show in the label. - * - * Sets the right-justified text label (to the left of the icon) for - * the title bar. - **/ -void -e_shell_folder_title_bar_set_folder_bar_label (EShellFolderTitleBar *folder_title_bar, - const char *text) -{ - 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 (text == NULL) - e_clipped_label_set_text (E_CLIPPED_LABEL (priv->folder_bar_label), ""); - else - e_clipped_label_set_text (E_CLIPPED_LABEL (priv->folder_bar_label), text); - - /* FIXME: Might want to set the styles somewhere in here too, - black text on grey background isn't the best combination */ - - gtk_widget_queue_resize (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, - GdkPixbuf *icon) -{ - EShellFolderTitleBarPrivate *priv; - GdkPixmap *pixmap; - GdkBitmap *mask; - - 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 (icon == NULL) { - if (priv->icon != NULL) - g_object_unref (priv->icon); - priv->icon = new_empty_pixbuf (); - } else { - g_object_ref (icon); - if (priv->icon != NULL) - g_object_unref (priv->icon); - priv->icon = icon; - } - - gdk_pixbuf_render_pixmap_and_mask (priv->icon, &pixmap, &mask, 127); - gtk_image_set_from_pixmap (GTK_IMAGE (priv->title_button_icon), pixmap, mask); - - gdk_pixbuf_render_pixmap_and_mask (priv->icon, &pixmap, &mask, 127); - gtk_image_set_from_pixmap (GTK_IMAGE (priv->title_icon), pixmap, mask); -} - - -/** - * 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->title_button), state); -} - -/** - * e_shell_folder_title_bar_set_clickable: - * @folder_title_bar: - * @clickable: - * - * Specify whether the title in the @folder_title_bar is clickable. If not, - * the arrow pixmap is not shown. - **/ -void -e_shell_folder_title_bar_set_title_clickable (EShellFolderTitleBar *folder_title_bar, - gboolean title_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->title_clickable && title_clickable) - || (! priv->title_clickable && ! title_clickable)) - return; - - if (title_clickable) { - gtk_widget_hide (priv->title_label); - gtk_widget_hide (priv->title_icon); - - gtk_widget_show_all (priv->title_button); - } else { - gtk_widget_hide (priv->title_button); - - gtk_widget_show (priv->title_icon); - gtk_widget_show (priv->title_label); - } - - priv->title_clickable = !! title_clickable; -} - - -void -e_shell_folder_title_bar_update_navigation_buttons (EShellFolderTitleBar *folder_title_bar, - gboolean can_go_back, - gboolean can_go_forward) -{ - 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_widget_set_sensitive (priv->back_button, can_go_back); - gtk_widget_set_sensitive (priv->forward_button, can_go_forward); -} - - -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 274e590ef7..0000000000 --- a/shell/e-shell-folder-title-bar.h +++ /dev/null @@ -1,84 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-folder-title-bar.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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__ - -#include <gtk/gtkhbox.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 { - GtkHBox parent; - - EShellFolderTitleBarPrivate *priv; -}; - -struct _EShellFolderTitleBarClass { - GtkHBoxClass parent_class; - - /* Signals. */ - void (* title_toggled) (EShellFolderTitleBar *folder_title_bar, gboolean pressed); - void (* back_clicked) (EShellFolderTitleBar *folder_title_bar); - void (* forward_clicked) (EShellFolderTitleBar *folder_title_bar); -}; - - -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_folder_bar_label (EShellFolderTitleBar *folder_title_bar, - const char *folder_bar_label); -void e_shell_folder_title_bar_set_icon (EShellFolderTitleBar *folder_title_bar, - GdkPixbuf *icon); -void e_shell_folder_title_bar_set_toggle_state (EShellFolderTitleBar *folder_title_bar, - gboolean state); -void e_shell_folder_title_bar_set_title_clickable (EShellFolderTitleBar *folder_title_bar, - gboolean clickable); - -void e_shell_folder_title_bar_update_navigation_buttons (EShellFolderTitleBar *folder_title_bar, - gboolean can_go_back, - gboolean can_go_forward); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __E_SHELL_FOLDER_TITLE_BAR_H__ */ diff --git a/shell/e-shell-importer.c b/shell/e-shell-importer.c deleted file mode 100644 index 309fa313a9..0000000000 --- a/shell/e-shell-importer.c +++ /dev/null @@ -1,1235 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* importer.c - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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: Iain Holmes <iain@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#undef GTK_DISABLE_DEPRECATED -#undef G_DISABLE_DEPRECATED - -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> - -#include <string.h> - -#include <glib.h> -#include <libgnome/gnome-i18n.h> -#include <libgnomeui/gnome-druid.h> -#include <libgnomeui/gnome-druid-page-edge.h> -#include <libgnomeui/gnome-druid-page-standard.h> -#include <libgnomeui/gnome-file-entry.h> - -#include <bonobo-activation/bonobo-activation.h> - -#include <bonobo/bonobo-exception.h> -#include <bonobo/bonobo-widget.h> - -#include "e-shell.h" -#include "e-shell-view.h" -#include "e-shell-constants.h" -#include "e-shell-folder-selection-dialog.h" - -#include "importer/evolution-importer-client.h" - -#include <glade/glade.h> -#include <gal/widgets/e-gui-utils.h> -#include <gal/widgets/e-unicode.h> - -#include "e-util/e-gtk-utils.h" - -#include "e-shell-importer.h" -#include "importer/GNOME_Evolution_Importer.h" - -typedef struct _ImportDialogFilePage { - GtkWidget *vbox; - GtkWidget *filename; - GtkWidget *filetype; - GtkWidget *menu; - - gboolean need_filename; -} ImportDialogFilePage; - -typedef struct _ImportDialogTypePage { - GtkWidget *vbox; - GtkWidget *intelligent; - GtkWidget *file; -} ImportDialogTypePage; - -typedef struct _ImportDialogImporterPage { - GtkWidget *vbox; - - GList *importers; - gboolean prepared; - int running; -} ImportDialogImporterPage; - -typedef struct _ImportData { - EShell *shell; - EShellView *view; - - GladeXML *wizard; - GtkWidget *dialog; - GtkWidget *druid; - ImportDialogFilePage *filepage; - ImportDialogTypePage *typepage; - ImportDialogImporterPage *importerpage; - - GtkWidget *filedialog; - GtkWidget *typedialog; - GtkWidget *intelligent; - GnomeDruidPageEdge *start; - GnomeDruidPageEdge *finish; - GtkWidget *vbox; - - char *choosen_iid; -} ImportData; - -typedef struct _IntelligentImporterData { - CORBA_Object object; - Bonobo_Control control; - GtkWidget *widget; - - char *name; - char *blurb; - char *iid; -} IntelligentImporterData; - -typedef struct _SelectedImporterData{ - CORBA_Object importer; - char *iid; -} SelectedImporterData; - -/* - #define IMPORTER_DEBUG -*/ -#ifdef IMPORTER_DEBUG -#define IN g_print ("=====> %s (%d)\n", G_GNUC_FUNCTION, __LINE__) -#define OUT g_print ("<==== %s (%d)\n", G_GNUC_FUNCTION, __LINE__) -#else -#define IN -#define OUT -#endif - -static struct { - char *name; - char *text; -} info[] = { - { "type_html", - N_("Choose the type of importer to run:") - }, - { "file_html", - N_("Choose the file that you want to import into Evolution, " - "and select what type of file it is from the list.\n\n" - "You can select \"Automatic\" if you do not know, and " - "Evolution will attempt to work it out.") - }, - { "intelligent_html", - N_("Please select the information that you would like to import:") - } -}; -#define num_info (sizeof (info) / sizeof (info[0])) - -static GtkWidget * -create_help (const char *name) -{ - GtkWidget *label; - int i; - - for (i = 0; i < num_info; i++) { - if (!strcmp (name, info[i].name)) - break; - } - g_assert(i != num_info); - - label = gtk_label_new(_(info[i].text)); - gtk_widget_show (label); - gtk_label_set_line_wrap((GtkLabel *)label, TRUE); - - return label; -} - -/* Importing functions */ - -/* Data to be passed around */ -typedef struct _ImporterComponentData { - EvolutionImporterClient *client; - EvolutionImporterListener *listener; - char *filename; - - GtkDialog *dialog; - GtkWidget *contents; - - int item; - - gboolean stop; -} ImporterComponentData; - -static gboolean importer_timeout_fn (gpointer data); -static void -import_cb (EvolutionImporterListener *listener, - EvolutionImporterResult result, - gboolean more_items, - void *data) -{ - ImporterComponentData *icd = (ImporterComponentData *) data; - char *label; - - IN; - if (icd->stop != TRUE) { - if (result == EVOLUTION_IMPORTER_NOT_READY) { - gtk_timeout_add (500, importer_timeout_fn, data); - OUT; - return; - } - - if (result == EVOLUTION_IMPORTER_BUSY) { - gtk_timeout_add (500, importer_timeout_fn, data); - OUT; - return; - } - - if (more_items) { - label = g_strdup_printf (_("Importing %s\nImporting item %d."), - icd->filename, ++(icd->item)); - gtk_label_set_text (GTK_LABEL (icd->contents), label); - g_free (label); - while (gtk_events_pending ()) - gtk_main_iteration (); - - g_idle_add_full (G_PRIORITY_LOW, importer_timeout_fn, - data, NULL); - OUT; - return; - } - } - - g_free (icd->filename); - if (icd->dialog != NULL) - gtk_widget_destroy ((GtkWidget *)icd->dialog); - bonobo_object_unref (BONOBO_OBJECT (icd->listener)); - g_object_unref (icd->client); - g_free (icd); - - OUT; -} - -static gboolean -importer_timeout_fn (gpointer data) -{ - ImporterComponentData *icd = (ImporterComponentData *) data; - char *label; - - IN; - label = g_strdup_printf (_("Importing %s\nImporting item %d."), - icd->filename, icd->item); - gtk_label_set_text (GTK_LABEL (icd->contents), label); - g_free (label); - while (gtk_events_pending ()) - gtk_main_iteration (); - - evolution_importer_client_process_item (icd->client, icd->listener); - OUT; - return FALSE; -} - -static void -dialog_response_cb (GtkDialog *dialog, - int button_number, - ImporterComponentData *icd) -{ - if (button_number != GTK_RESPONSE_CANCEL) - return; /* Interesting... */ - - icd->stop = TRUE; -} - -static void -dialog_destroy_notify (void *data, - GObject *where_the_dialog_was) -{ - ImporterComponentData *icd = (ImporterComponentData *) data; - - icd->dialog = NULL; - icd->stop = TRUE; -} - -struct _IIDInfo { - char *iid; - char *name; -}; - -static void -free_iid_list (GList *list) -{ - for (; list; list = list->next) { - struct _IIDInfo *iid = list->data; - - g_free (iid->iid); - g_free (iid->name); - g_free (iid); - } -} - -static const char * -get_name_from_component_info (const Bonobo_ServerInfo *info) -{ - Bonobo_ActivationProperty *property; - const char *name; - - property = bonobo_server_info_prop_find ((Bonobo_ServerInfo *) info, "evolution:menu_name"); - if (property == NULL || property->v._d != Bonobo_ACTIVATION_P_STRING) - return NULL; - - name = property->v._u.value_string; - - return name; -} - -static char * -choose_importer_from_list (GList *importer_list) -{ - GtkWidget *dialog, *clist; - GList *p; - int ans; - char *iid; - - dialog = gtk_dialog_new_with_buttons(_("Select importer"), NULL, GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_OK, - NULL); - gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); - - clist = gtk_clist_new (1); - for (p = importer_list; p; p = p->next) { - struct _IIDInfo *iid; - char *text[1]; - int row; - - iid = p->data; - text[0] = iid->name; - row = gtk_clist_append (GTK_CLIST (clist), text); - gtk_clist_set_row_data (GTK_CLIST (clist), row, iid->iid); - } - - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), clist, TRUE, TRUE, 0); - gtk_clist_set_selection_mode (GTK_CLIST (clist), GTK_SELECTION_BROWSE); - gtk_widget_show (clist); - - ans = gtk_dialog_run((GtkDialog *)dialog); - switch (ans) { - case GTK_RESPONSE_OK: - ans = GPOINTER_TO_INT (GTK_CLIST (clist)->selection->data); - iid = gtk_clist_get_row_data (GTK_CLIST (clist), ans); - break; - - case 1: - default: - iid = NULL; - break; - } - - gtk_widget_destroy (dialog); - - return g_strdup (iid); -} - -static char * -get_iid_for_filetype (const char *filename) -{ - Bonobo_ServerInfoList *info_list; - CORBA_Environment ev; - GList *can_handle = NULL; - char *ret_iid; - int i, len = 0; - - CORBA_exception_init (&ev); - info_list = bonobo_activation_query ("repo_ids.has ('IDL:GNOME/Evolution/Importer:1.0')", NULL, &ev); - - for (i = 0; i < info_list->_length; i++) { - CORBA_Environment ev2; - CORBA_Object importer; - const Bonobo_ServerInfo *info; - - info = info_list->_buffer + i; - - CORBA_exception_init (&ev2); - importer = bonobo_activation_activate_from_id ((char *) info->iid, 0, NULL, &ev2); - if (ev2._major != CORBA_NO_EXCEPTION) { - g_warning ("Error activating %s", info->iid); - CORBA_exception_free (&ev2); - continue; - } - - if (GNOME_Evolution_Importer_supportFormat (importer, - filename, &ev2)) { - struct _IIDInfo *iid; - - iid = g_new (struct _IIDInfo, 1); - iid->iid = g_strdup (info->iid); - iid->name = g_strdup (get_name_from_component_info (info)); - - can_handle = g_list_prepend (can_handle, iid); - len++; - } - - bonobo_object_release_unref (importer, &ev2); - CORBA_exception_free (&ev2); - } - - CORBA_free (info_list); - - if (len == 1) { - struct _IIDInfo *iid; - - iid = can_handle->data; - - ret_iid = g_strdup (iid->iid); - - free_iid_list (can_handle); - g_list_free (can_handle); - - return ret_iid; - } else if (len > 1) { - /* Display all the IIDs */ - ret_iid = choose_importer_from_list (can_handle); - - free_iid_list (can_handle); - g_list_free (can_handle); - - return ret_iid; - } else { - return NULL; - } -} - -static void error_response_cb(GtkWidget *w, int button, void *data) -{ - gtk_widget_destroy(w); -} - -static void -show_error (const char *message, - const char *title) -{ - GtkWidget *box; - - box = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "%s", message); - gtk_window_set_title (GTK_WINDOW (box), title); - g_signal_connect(box, "response", G_CALLBACK(error_response_cb), box); - - gtk_widget_show (box); -} - -static void -start_import (const char *physical_uri, - const char *filename, - const char *iid, - const char *folder_type) -{ - ImporterComponentData *icd; - char *label; - char *real_iid; - struct stat buf; - - if (stat (filename, &buf) == -1) { - char *message; - - message = g_strdup_printf (_("File %s does not exist"), filename); - show_error (message, _("Evolution Error")); - g_free (message); - - return; - } - - if (iid == NULL || strcmp (iid, "Automatic") == 0) { - /* Work out the component to use */ - real_iid = get_iid_for_filetype (filename); - } else { - real_iid = g_strdup (iid); - } - - if (real_iid == NULL) { - char *message; - - message = g_strdup_printf (_("There is no importer that is able to handle\n%s"), filename); - show_error (message, _("Evolution Error")); - g_free (message); - - return; - } - - icd = g_new (ImporterComponentData, 1); - icd->stop = FALSE; - icd->dialog = GTK_DIALOG (gtk_dialog_new_with_buttons(_("Importing"), NULL, 0, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - NULL)); - g_signal_connect (icd->dialog, "response", G_CALLBACK (dialog_response_cb), icd); - - g_object_weak_ref (G_OBJECT(icd->dialog), dialog_destroy_notify, icd); - - label = g_strdup_printf (_("Importing %s.\nStarting %s"), - filename, real_iid); - icd->contents = gtk_label_new (label); - g_free (label); - - gtk_box_pack_start (GTK_BOX (icd->dialog->vbox), icd->contents, TRUE, TRUE, 0); - gtk_widget_show_all (GTK_WIDGET (icd->dialog)); - while (gtk_events_pending ()) - gtk_main_iteration (); - - icd->client = evolution_importer_client_new_from_id (real_iid); - if (icd->client == NULL) { - label = g_strdup_printf (_("Error starting %s"), real_iid); - g_free (real_iid); - gtk_label_set_text (GTK_LABEL (icd->contents), label); - g_free (label); - while (gtk_events_pending ()) - gtk_main_iteration (); - - g_object_unref (icd->dialog); - g_free (icd); - return; - } - g_free (real_iid); - - if (evolution_importer_client_load_file (icd->client, filename, physical_uri, folder_type) == FALSE) { - label = g_strdup_printf (_("Error loading %s"), filename); - show_error (label, _("Evolution Error")); - - gtk_label_set_text (GTK_LABEL (icd->contents), label); - g_free (label); - while (gtk_events_pending ()) - gtk_main_iteration (); - - g_object_unref (icd->client); - g_object_unref (icd->dialog); - g_free (icd); - return; - } - - icd->filename = g_strdup (filename); - icd->item = 1; - - label = g_strdup_printf (_("Importing %s\nImporting item 1."), - filename); - gtk_label_set_text (GTK_LABEL (icd->contents), label); - g_free (label); - while (gtk_events_pending ()) - gtk_main_iteration (); - - icd->listener = evolution_importer_listener_new (import_cb, icd); - evolution_importer_client_process_item (icd->client, icd->listener); -} - -static void -filename_changed (GtkEntry *entry, - ImportData *data) -{ - ImportDialogFilePage *page; - const char *filename; - - page = data->filepage; - - filename = gtk_entry_get_text (entry); - if (filename != NULL && *filename != '\0') - page->need_filename = FALSE; - else - page->need_filename = TRUE; - - gnome_druid_set_buttons_sensitive (GNOME_DRUID (data->druid), - TRUE, !page->need_filename, TRUE, FALSE); -} - -static void -item_selected (GtkWidget *item, - ImportData *data) -{ - char *iid; - - g_free (data->choosen_iid); - iid = g_object_get_data (G_OBJECT (item), "bonoboiid"); - if (iid == NULL) - data->choosen_iid = g_strdup ("Automatic"); - else - data->choosen_iid = g_strdup (iid); -} - -static GtkWidget * -create_plugin_menu (ImportData *data) -{ - Bonobo_ServerInfoList *info_list; - CORBA_Environment ev; - int i; - GtkWidget *menu; - GtkWidget *item; - - menu = gtk_menu_new (); - item = gtk_menu_item_new_with_label (_("Automatic")); - g_object_set_data_full ((GObject *)item, "bonoboiid", g_strdup ("Automatic"), g_free); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); - - CORBA_exception_init (&ev); - info_list = bonobo_activation_query ("repo_ids.has ('IDL:GNOME/Evolution/Importer:1.0')", NULL, &ev); - for (i = 0; i < info_list->_length; i++) { - const Bonobo_ServerInfo *info; - char *name = NULL; - - info = info_list->_buffer + i; - - name = g_strdup (get_name_from_component_info (info)); - if (name == NULL) { - name = g_strdup (info->iid); - } - - item = gtk_menu_item_new_with_label (name); - g_free (name); - gtk_widget_show (item); - g_signal_connect (item, "activate", - G_CALLBACK (item_selected), data); - - g_object_set_data_full ((GObject *)item, "bonoboiid", g_strdup (info->iid), g_free); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); - } - CORBA_free (info_list); - - return menu; -} - -static ImportDialogFilePage * -importer_file_page_new (ImportData *data) -{ - ImportDialogFilePage *page; - GtkWidget *table, *label; - int row = 0; - - page = g_new0 (ImportDialogFilePage, 1); - - page->vbox = gtk_vbox_new (FALSE, 5); - page->need_filename = TRUE; - - table = gtk_table_new (2, 2, FALSE); - gtk_table_set_row_spacings (GTK_TABLE (table), 2); - gtk_table_set_col_spacings (GTK_TABLE (table), 10); - gtk_container_set_border_width (GTK_CONTAINER (table), 8); - gtk_box_pack_start (GTK_BOX (page->vbox), table, TRUE, TRUE, 0); - - label = gtk_label_new (_("Filename:")); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, row, row + 1, - GTK_FILL, 0, 0, 0); - gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); - - page->filename = gnome_file_entry_new ("Evolution_Importer_FileName", _("Select a file")); - g_signal_connect (gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY (page->filename)), "changed", - G_CALLBACK (filename_changed), data); - - gtk_table_attach (GTK_TABLE (table), page->filename, 1, 2, - row, row + 1, GTK_EXPAND | GTK_FILL, 0, 0, 0); - - row++; - - label = gtk_label_new (_("File type:")); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, row, row + 1, - GTK_FILL, 0, 0, 0); - gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); - - page->filetype = gtk_option_menu_new (); - page->menu = create_plugin_menu (data); - gtk_option_menu_set_menu (GTK_OPTION_MENU (page->filetype), page->menu); - gtk_table_attach (GTK_TABLE (table), page->filetype, 1, 2, - row, row + 1, GTK_EXPAND | GTK_FILL, 0, 0, 0); - - gtk_widget_show_all (table); - - return page; -} - -static ImportDialogTypePage * -importer_type_page_new (ImportData *data) -{ - ImportDialogTypePage *page; - - page = g_new0 (ImportDialogTypePage, 1); - - page->vbox = gtk_vbox_new (FALSE, 5); - page->intelligent = gtk_radio_button_new_with_label (NULL, - _("Import data and settings from older programs")); - gtk_box_pack_start (GTK_BOX (page->vbox), page->intelligent, FALSE, FALSE, 0); - - page->file = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (page->intelligent), - _("Import a single file")); - gtk_box_pack_start (GTK_BOX (page->vbox), page->file, FALSE, FALSE, 0); - gtk_widget_show_all (page->vbox); - return page; -} - -static ImportDialogImporterPage * -importer_importer_page_new (ImportData *data) -{ - ImportDialogImporterPage *page; - GtkWidget *sep; - - page = g_new0 (ImportDialogImporterPage, 1); - - page->vbox = gtk_vbox_new (FALSE, 5); - gtk_container_set_border_width (GTK_CONTAINER (page->vbox), 4); - - sep = gtk_hseparator_new (); - gtk_box_pack_start (GTK_BOX (page->vbox), sep, FALSE, FALSE, 0); - - page->prepared = FALSE; - gtk_widget_show_all (page->vbox); - - return page; -} - -static GList * -get_intelligent_importers (void) -{ - Bonobo_ServerInfoList *info_list; - GList *iids_ret = NULL; - CORBA_Environment ev; - int i; - - CORBA_exception_init (&ev); - info_list = bonobo_activation_query ("repo_ids.has ('IDL:GNOME/Evolution/IntelligentImporter:1.0')", NULL, &ev); - CORBA_exception_free (&ev); - - for (i = 0; i < info_list->_length; i++) { - const Bonobo_ServerInfo *info; - - info = info_list->_buffer + i; - iids_ret = g_list_prepend (iids_ret, g_strdup (info->iid)); - } - - return iids_ret; -} - -static gboolean -prepare_intelligent_page (GnomeDruidPage *page, - GnomeDruid *druid, - ImportData *data) -{ - GtkWidget *dialog; - ImportDialogImporterPage *import; - GList *l, *importers; - GtkWidget *table; - int running = 0; - - if (data->importerpage->prepared == TRUE) { - return TRUE; - } - - data->importerpage->prepared = TRUE; - - dialog = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_INFO, GTK_BUTTONS_NONE, "%s", - _("Please wait...\nScanning for existing setups")); - e_make_widget_backing_stored (dialog); - - gtk_window_set_title (GTK_WINDOW (dialog), _("Starting Intelligent Importers")); - gtk_widget_show_all (dialog); - gtk_widget_show_now (dialog); - - gtk_widget_queue_draw (dialog); - gdk_flush (); - - while (gtk_events_pending ()) { - gtk_main_iteration (); - } - - import = data->importerpage; - importers = get_intelligent_importers (); - if (importers == NULL) { - /* No importers, go directly to finish, do not pass go - Do not collect $200 */ - import->running = 0; - gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->finish)) - ; - gtk_widget_destroy (dialog); - return TRUE; - } - - table = gtk_table_new (g_list_length (importers), 2, FALSE); - for (l = importers; l; l = l->next) { - GtkWidget *label; - IntelligentImporterData *id; - CORBA_Environment ev; - gboolean can_run; - char *str; - - id = g_new0 (IntelligentImporterData, 1); - id->iid = g_strdup (l->data); - - CORBA_exception_init (&ev); - id->object = bonobo_activation_activate_from_id ((char *) id->iid, 0, NULL, &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Could not start %s:%s", id->iid, - CORBA_exception_id (&ev)); - - CORBA_exception_free (&ev); - /* Clean up the IID */ - g_free (id->iid); - g_free (id); - continue; - } - - if (id->object == CORBA_OBJECT_NIL) { - g_warning ("Could not activate component %s", id->iid); - CORBA_exception_free (&ev); - - g_free (id->iid); - g_free (id); - continue; - } - - can_run = GNOME_Evolution_IntelligentImporter_canImport (id->object, &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Could not call canImport(%s): %s", id->iid, - CORBA_exception_id (&ev)); - bonobo_object_release_unref (id->object, &ev); - CORBA_exception_free (&ev); - - g_free (id->iid); - g_free (id); - continue; - } - - if (can_run == FALSE) { - bonobo_object_release_unref (id->object, &ev); - CORBA_exception_free (&ev); - g_free (id->iid); - g_free (id); - continue; - } - - running++; - id->name = GNOME_Evolution_IntelligentImporter__get_importername (id->object, &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Could not get name(%s): %s", id->iid, - CORBA_exception_id (&ev)); - bonobo_object_release_unref (id->object, &ev); - CORBA_exception_free (&ev); - g_free (id->iid); - g_free (id); - continue; - } - - id->blurb = GNOME_Evolution_IntelligentImporter__get_message (id->object, &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Could not get message(%s): %s", - id->iid, CORBA_exception_id (&ev)); - bonobo_object_release_unref (id->object, &ev); - CORBA_exception_free (&ev); - g_free (id->iid); - CORBA_free (id->name); - g_free (id); - continue; - } - - id->control = Bonobo_Unknown_queryInterface (id->object, - "IDL:Bonobo/Control:1.0", &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Could not QI for Bonobo/Control:1.0 %s:%s", - id->iid, CORBA_exception_id (&ev)); - bonobo_object_release_unref (id->object, &ev); - CORBA_exception_free (&ev); - g_free (id->iid); - CORBA_free (id->name); - CORBA_free (id->blurb); - continue; - } - - if (id->control != CORBA_OBJECT_NIL) { - id->widget = bonobo_widget_new_control_from_objref (id->control, CORBA_OBJECT_NIL); - gtk_widget_show (id->widget); - } else { - id->widget = gtk_label_new (""); - gtk_widget_show (id->widget); - } - - CORBA_exception_free (&ev); - - import->importers = g_list_prepend (import->importers, id); - str = g_strdup_printf (_("From %s:"), id->name); - label = gtk_label_new (str); - g_free (str); - - gtk_misc_set_alignment (GTK_MISC (label), 0, .5); - - gtk_table_attach (GTK_TABLE (table), label, 0, 1, running - 1, - running, GTK_FILL, 0, 0, 0); - gtk_table_attach (GTK_TABLE (table), id->widget, 1, 2, - running - 1, running, GTK_FILL, 0, 3, 0); - gtk_box_pack_start (GTK_BOX (data->importerpage->vbox), table, - FALSE, FALSE, 0); - } - - gtk_widget_show_all (table); - - if (running == 0) { - gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->finish)); - gtk_widget_destroy (dialog); - return TRUE; - } - - import->running = running; - gtk_widget_destroy (dialog); - - return FALSE; -} - -static void -import_druid_cancel (GnomeDruid *druid, - ImportData *data) -{ - gtk_widget_destroy (GTK_WIDGET (data->dialog)); -} - -static void -import_druid_weak_notify (void *blah, - GObject *where_the_object_was) -{ - ImportData *data = (ImportData *) blah; - - g_object_unref (data->wizard); - g_free (data->choosen_iid); - g_free (data); -} - -static void -folder_selected (EShellFolderSelectionDialog *dialog, - const char *path, - ImportData *data) -{ - EFolder *folder; - char *filename, *iid; - - iid = g_strdup (data->choosen_iid); - filename = gnome_file_entry_get_full_path (GNOME_FILE_ENTRY (data->filepage->filename), FALSE); - - folder = e_storage_set_get_folder (e_shell_get_storage_set (data->shell), path); - g_assert (folder != NULL); - - gtk_widget_destroy (data->dialog); - gtk_widget_hide (GTK_WIDGET (dialog)); - - start_import (e_folder_get_physical_uri (folder), filename, iid, e_folder_get_type_string (folder)); - - g_free (iid); - g_free (filename); -} - -static void -folder_cancelled (EShellFolderSelectionDialog *dialog, - ImportData *data) -{ - gtk_widget_destroy (data->dialog); -} - -static void -free_importers (ImportData *data) -{ - GList *l; - - for (l = data->importerpage->importers; l; l = l->next) { - IntelligentImporterData *iid; - - iid = l->data; - if (iid->object != CORBA_OBJECT_NIL) { - bonobo_object_release_unref (iid->object, NULL); - } - } - - g_list_free (data->importerpage->importers); -} - -static void -start_importers (GList *p) -{ - CORBA_Environment ev; - - for (; p; p = p->next) { - SelectedImporterData *sid = p->data; - - CORBA_exception_init (&ev); - GNOME_Evolution_IntelligentImporter_importData (sid->importer, &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Error importing %s\n%s", sid->iid, - CORBA_exception_id (&ev)); - } - CORBA_exception_free (&ev); - } -} - -static void -do_import (ImportData *data) -{ - CORBA_Environment ev; - GList *l, *selected = NULL; - - for (l = data->importerpage->importers; l; l = l->next) { - IntelligentImporterData *importer_data; - SelectedImporterData *sid; - char *iid; - - importer_data = l->data; - iid = g_strdup (importer_data->iid); - - sid = g_new (SelectedImporterData, 1); - sid->iid = iid; - - CORBA_exception_init (&ev); - sid->importer = bonobo_object_dup_ref (importer_data->object, &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Error duplication %s\n(%s)", iid, - CORBA_exception_id (&ev)); - g_free (iid); - CORBA_exception_free (&ev); - g_free (sid); - continue; - } - CORBA_exception_free (&ev); - - selected = g_list_prepend (selected, sid); - } - - free_importers (data); - - if (selected != NULL) { - start_importers (selected); - - for (l = selected; l; l = l->next) { - SelectedImporterData *sid = l->data; - - CORBA_exception_init (&ev); - bonobo_object_release_unref (sid->importer, &ev); - CORBA_exception_free (&ev); - - g_free (sid->iid); - g_free (sid); - } - g_list_free (selected); - } -} - -static void -import_druid_finish (GnomeDruidPage *page, - GnomeDruid *druid, - ImportData *data) -{ - GtkWidget *folder; - - if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->typepage->intelligent))) { - do_import (data); - gtk_widget_destroy (data->dialog); - } else { - folder = e_shell_folder_selection_dialog_new (data->shell, - _("Select folder"), - _("Select a destination folder for importing this data"), - e_shell_view_get_current_uri (data->view), - NULL, TRUE); - - g_signal_connect (folder, "folder_selected", - G_CALLBACK (folder_selected), data); - g_signal_connect (folder, "cancelled", - G_CALLBACK (folder_cancelled), data); - - gtk_widget_hide (data->dialog); - gtk_widget_show (folder); - } -} - -static gboolean -prepare_file_page (GnomeDruidPage *page, - GnomeDruid *druid, - ImportData *data) -{ - gnome_druid_set_buttons_sensitive (druid, TRUE, - !data->filepage->need_filename, - TRUE, FALSE); - return FALSE; -} - -static gboolean -next_file_page (GnomeDruidPage *page, - GnomeDruid *druid, - ImportData *data) -{ - gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->finish)); - return TRUE; -} - -static gboolean -back_file_page (GnomeDruidPage *page, - GnomeDruid *druid, - ImportData *data) -{ - gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->typedialog)); - return TRUE; -} - -static gboolean -next_type_page (GnomeDruidPage *page, - GnomeDruid *druid, - ImportData *data) -{ - if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->typepage->intelligent))) { - gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->intelligent)); - } else { - gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->filedialog)); - } - - return TRUE; -} - -static gboolean -back_finish_page (GnomeDruidPage *page, - GnomeDruid *druid, - ImportData *data) -{ - if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->typepage->intelligent))) { - if (data->importerpage->running != 0) { - gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->intelligent)); - } else { - gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->typedialog)); - } - } else { - gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->filedialog)); - } - - return TRUE; -} - -static gboolean -back_intelligent_page (GnomeDruidPage *page, - GnomeDruid *druid, - ImportData *data) -{ - gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->typedialog)); - return TRUE; -} - -static gboolean -next_intelligent_page (GnomeDruidPage *page, - GnomeDruid *druid, - ImportData *data) -{ - gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->finish)); - return TRUE; -} - -static void -dialog_weak_notify (void *data, - GObject *where_the_dialog_was) -{ - gboolean *dialog_open = (gboolean *) data; - - *dialog_open = FALSE; -} - -void -show_import_wizard (BonoboUIComponent *component, - gpointer user_data, - const char *cname) -{ - ImportData *data = g_new0 (ImportData, 1); - GtkWidget *html; - static gboolean dialog_open = FALSE; - - if (dialog_open) { - return; - } - - dialog_open = TRUE; - data->view = E_SHELL_VIEW (user_data); - data->shell = e_shell_view_get_shell (data->view); - - data->wizard = glade_xml_new (EVOLUTION_GLADEDIR "/import.glade", NULL, NULL); - data->dialog = glade_xml_get_widget (data->wizard, "importwizard"); - gtk_window_set_wmclass (GTK_WINDOW (data->dialog), "importdruid", - "Evolution:shell"); - gtk_window_set_transient_for (GTK_WINDOW (data->dialog), GTK_WINDOW (user_data)); - g_object_weak_ref ((GObject *)data->dialog, dialog_weak_notify, &dialog_open); - - data->druid = glade_xml_get_widget (data->wizard, "druid1"); - g_signal_connect (data->druid, "cancel", - G_CALLBACK (import_druid_cancel), data); - - gtk_button_set_label((GtkButton *)((GnomeDruid *)data->druid)->finish, _("Import")); - - data->start = GNOME_DRUID_PAGE_EDGE (glade_xml_get_widget (data->wizard, "page0")); - - data->typedialog = glade_xml_get_widget (data->wizard, "page1"); - g_signal_connect (data->typedialog, "next", - G_CALLBACK (next_type_page), data); - data->typepage = importer_type_page_new (data); - html = create_help ("type_html"); - gtk_box_pack_start (GTK_BOX (data->typepage->vbox), html, FALSE, TRUE, 0); - gtk_box_reorder_child (GTK_BOX (data->typepage->vbox), html, 0); - - gtk_box_pack_start (GTK_BOX (GNOME_DRUID_PAGE_STANDARD (data->typedialog)->vbox), data->typepage->vbox, TRUE, TRUE, 0); - - data->intelligent = glade_xml_get_widget (data->wizard, "page2-intelligent"); - g_signal_connect (data->intelligent, "next", - G_CALLBACK (next_intelligent_page), data); - g_signal_connect (data->intelligent, "back", - G_CALLBACK (back_intelligent_page), data); - g_signal_connect (data->intelligent, "prepare", - G_CALLBACK (prepare_intelligent_page), data); - - data->importerpage = importer_importer_page_new (data); - html = create_help ("intelligent_html"); - gtk_box_pack_start (GTK_BOX (data->importerpage->vbox), html, FALSE, TRUE, 0); - gtk_box_reorder_child (GTK_BOX (data->importerpage->vbox), html, 0); - - gtk_box_pack_start (GTK_BOX (GNOME_DRUID_PAGE_STANDARD (data->intelligent)->vbox), data->importerpage->vbox, TRUE, TRUE, 0); - - - data->filedialog = glade_xml_get_widget (data->wizard, "page2-file"); - g_signal_connect (data->filedialog, "prepare", - G_CALLBACK (prepare_file_page), data); - g_signal_connect (data->filedialog, "next", - G_CALLBACK (next_file_page), data); - g_signal_connect (data->filedialog, "back", - G_CALLBACK (back_file_page), data); - - data->finish = GNOME_DRUID_PAGE_EDGE (glade_xml_get_widget (data->wizard, "page3")); - g_signal_connect (data->finish, "back", - G_CALLBACK (back_finish_page), data); - - data->filepage = importer_file_page_new (data); - - html = create_help ("file_html"); - gtk_box_pack_start (GTK_BOX (data->filepage->vbox), html, FALSE, TRUE, 0); - gtk_box_reorder_child (GTK_BOX (data->filepage->vbox), html, 0); - - gtk_box_pack_start (GTK_BOX (GNOME_DRUID_PAGE_STANDARD (data->filedialog)->vbox), data->filepage->vbox, TRUE, TRUE, 0); - - /* Finish page */ - g_signal_connect (data->finish, "finish", - G_CALLBACK (import_druid_finish), data); - - g_object_weak_ref ((GObject *)data->dialog, import_druid_weak_notify, data); - - gtk_widget_show_all (data->dialog); -} diff --git a/shell/e-shell-importer.h b/shell/e-shell-importer.h deleted file mode 100644 index 4e9b91ff26..0000000000 --- a/shell/e-shell-importer.h +++ /dev/null @@ -1,32 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* importer.c - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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: Iain Holmes <iain@ximian.com> - */ - -#include <bonobo/bonobo-ui-component.h> - -#ifndef __IMPORTER_H__ -#define __IMPORTER_H__ - -void show_import_wizard (BonoboUIComponent *component, - gpointer user_data, - const char *cname); - -#endif diff --git a/shell/e-shell-marshal.list b/shell/e-shell-marshal.list deleted file mode 100644 index f1ae29622d..0000000000 --- a/shell/e-shell-marshal.list +++ /dev/null @@ -1,28 +0,0 @@ -NONE:BOOL -NONE:BOOL,INT -NONE:INT -NONE:INT,INT -NONE:INT,POINTER -NONE:INT,STRING -NONE:NONE -NONE:POINTER -NONE:POINTER,INT -NONE:POINTER,INT,INT -NONE:POINTER,POINTER -NONE:POINTER,POINTER,POINTER -NONE:POINTER,POINTER,POINTER,BOOL -NONE:POINTER,POINTER,POINTER,POINTER -NONE:POINTER,POINTER,POINTER,POINTER,POINTER -NONE:POINTER,STRING -NONE:POINTER,STRING,BOOL -NONE:POINTER,STRING,STRING -NONE:POINTER,STRING,STRING,BOOL -NONE:POINTER,STRING,STRING,STRING,STRING -NONE:STRING -NONE:STRING,BOOL -NONE:STRING,INT -NONE:STRING,INT,INT -NONE:STRING,POINTER -NONE:STRING,STRING -NONE:STRING,STRING,STRING -NONE:STRING,STRING,STRING,STRING diff --git a/shell/e-shell-offline-handler.c b/shell/e-shell-offline-handler.c deleted file mode 100644 index 4b22bdbf1d..0000000000 --- a/shell/e-shell-offline-handler.c +++ /dev/null @@ -1,869 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-offline-handler.c - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#undef G_DISABLE_DEPRECATED /* FIXME */ -#undef GTK_DISABLE_DEPRECATED /* FIXME */ - -#include "e-shell-offline-handler.h" - -#include "e-shell-offline-sync.h" - -#include "e-shell-marshal.h" - -#include <gtk/gtkclist.h> -#include <gtk/gtkdialog.h> -#include <gtk/gtklabel.h> -#include <gtk/gtksignal.h> -#include <gtk/gtkliststore.h> -#include <gtk/gtktreeview.h> -#include <gtk/gtktypeutils.h> -#include <gtk/gtkwidget.h> - -#include <gal/util/e-util.h> - -#include <libgnome/gnome-i18n.h> - -#include <glade/glade-xml.h> - -#include <bonobo/bonobo-main.h> -#include <bonobo/bonobo-exception.h> - - -#define GLADE_DIALOG_FILE_NAME EVOLUTION_GLADEDIR "/e-active-connection-dialog.glade" - - -#define PARENT_TYPE GTK_TYPE_OBJECT -static GtkObjectClass *parent_class = NULL; - - -/* Private part. */ - -struct _OfflineProgressListenerServant { - POA_GNOME_Evolution_OfflineProgressListener servant; - EShellOfflineHandler *offline_handler; - char *component_id; -}; -typedef struct _OfflineProgressListenerServant OfflineProgressListenerServant; - -struct _ComponentInfo { - /* Component ID. */ - char *id; - - /* The `Evolution::Offline' interface for this component (cached just - to avoid going through the EComponentRegistry all the time). */ - GNOME_Evolution_Offline offline_interface; - - /* The interface and servant for the - `Evolution::OfflineProgressListener' we have to implement to get - notifications about progress of the off-line process. */ - GNOME_Evolution_OfflineProgressListener progress_listener_interface; - OfflineProgressListenerServant *progress_listener_servant; - - /* The current active connections for this component. This is updated - by the component itself through the `::ProgressListener' interface; - when the count reaches zero, the off-line process is considered to - be complete. */ - GNOME_Evolution_ConnectionList *active_connection_list; -}; -typedef struct _ComponentInfo ComponentInfo; - -struct _EShellOfflineHandlerPrivate { - EShell *shell; - - EShellView *parent_shell_view; - - GladeXML *dialog_gui; - - int num_total_connections; - GHashTable *id_to_component_info; - - int procedure_in_progress : 1; - int finished : 1; -}; - - -/* Signals. */ - -enum { - OFFLINE_PROCEDURE_STARTED, - OFFLINE_PROCEDURE_FINISHED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - - -/* Forward declarations for the dialog handling. */ - -static void update_dialog_clist (EShellOfflineHandler *offline_handler); - - -/* Implementation for the OfflineProgressListener interface. */ - -static PortableServer_ServantBase__epv OfflineProgressListener_base_epv; -static POA_GNOME_Evolution_OfflineProgressListener__epv OfflineProgressListener_epv; -static POA_GNOME_Evolution_OfflineProgressListener__vepv OfflineProgressListener_vepv; - -static OfflineProgressListenerServant * -progress_listener_servant_new (EShellOfflineHandler *offline_handler, - const char *id) -{ - OfflineProgressListenerServant *servant; - - servant = g_new0 (OfflineProgressListenerServant, 1); - - servant->servant.vepv = &OfflineProgressListener_vepv; - servant->offline_handler = offline_handler; - servant->component_id = g_strdup (id); - - return servant; -} - -static void -progress_listener_servant_free (OfflineProgressListenerServant *servant) -{ - CORBA_Environment ev; - PortableServer_ObjectId *oid; - - CORBA_exception_init (&ev); - - oid = PortableServer_POA_servant_to_id (bonobo_poa (), servant, &ev); - PortableServer_POA_deactivate_object (bonobo_poa (), oid, &ev); - CORBA_free (oid); - - CORBA_exception_free (&ev); - - g_free (servant->component_id); - g_free (servant); -} - -static GNOME_Evolution_ConnectionList * -duplicate_connection_list (const GNOME_Evolution_ConnectionList *source) -{ - GNOME_Evolution_ConnectionList *copy; - int i; - - copy = GNOME_Evolution_ConnectionList__alloc (); - - copy->_length = source->_length; - copy->_maximum = source->_length; - - copy->_buffer = CORBA_sequence_GNOME_Evolution_Connection_allocbuf (copy->_maximum); - - for (i = 0; i < source->_length; i++) { - copy->_buffer[i].hostName = CORBA_string_dup (source->_buffer[i].hostName); - copy->_buffer[i].type = CORBA_string_dup (source->_buffer[i].type); - } - - CORBA_sequence_set_release (copy, TRUE); - - return copy; -} - -static void -impl_OfflineProgressListener_updateProgress (PortableServer_Servant servant, - const GNOME_Evolution_ConnectionList *current_active_connections, - CORBA_Environment *ev) -{ - EShellOfflineHandler *offline_handler; - EShellOfflineHandlerPrivate *priv; - ComponentInfo *component_info; - int connection_delta; - const char *component_id; - - component_id = ((OfflineProgressListenerServant *) servant)->component_id; - - offline_handler = ((OfflineProgressListenerServant *) servant)->offline_handler; - priv = offline_handler->priv; - - component_info = g_hash_table_lookup (priv->id_to_component_info, component_id); - g_assert (component_info != NULL); - - connection_delta = component_info->active_connection_list->_length - current_active_connections->_length; - if (connection_delta < 0) { - /* FIXME: Should raise an exception or something? */ - g_warning ("Weird, buggy component increased number of connection when going off-line -- %s", - component_id); - } - - g_assert (priv->num_total_connections >= connection_delta); - priv->num_total_connections -= connection_delta; - - CORBA_free (component_info->active_connection_list); - component_info->active_connection_list = duplicate_connection_list (current_active_connections); - - update_dialog_clist (offline_handler); - - if (priv->num_total_connections == 0 && ! priv->finished) { - g_signal_emit (offline_handler, signals[OFFLINE_PROCEDURE_FINISHED], 0, TRUE); - priv->finished = TRUE; - } -} - -static gboolean -create_progress_listener (EShellOfflineHandler *offline_handler, - const char *component_id, - GNOME_Evolution_OfflineProgressListener *objref_return, - OfflineProgressListenerServant **servant_return) -{ - OfflineProgressListenerServant *servant; - CORBA_Environment ev; - - *servant_return = NULL; - *objref_return = CORBA_OBJECT_NIL; - - OfflineProgressListener_base_epv._private = NULL; - OfflineProgressListener_base_epv.finalize = NULL; - OfflineProgressListener_base_epv.default_POA = NULL; - - OfflineProgressListener_epv.updateProgress = impl_OfflineProgressListener_updateProgress; - - OfflineProgressListener_vepv._base_epv = &OfflineProgressListener_base_epv; - OfflineProgressListener_vepv.GNOME_Evolution_OfflineProgressListener_epv = &OfflineProgressListener_epv; - - servant = progress_listener_servant_new (offline_handler, component_id); - - CORBA_exception_init (&ev); - - POA_GNOME_Evolution_OfflineProgressListener__init ((PortableServer_Servant) servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("Cannot initialize GNOME::Evolution::Offline::ProgressListener"); - progress_listener_servant_free (servant); - CORBA_exception_free (&ev); - return FALSE; - } - - CORBA_free (PortableServer_POA_activate_object (bonobo_poa (), servant, &ev)); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("Cannot activate GNOME::Evolution::Offline::ProgressListener"); - progress_listener_servant_free (servant); - CORBA_exception_free (&ev); - return FALSE; - } - - *servant_return = servant; - *objref_return = PortableServer_POA_servant_to_reference (bonobo_poa (), servant, &ev); - - CORBA_exception_free (&ev); - - return TRUE; -} - - -/* ComponentInfo handling. */ - -static ComponentInfo * -component_info_new (const char *id, - const GNOME_Evolution_Offline offline_interface, - GNOME_Evolution_OfflineProgressListener progress_listener_interface, - OfflineProgressListenerServant *progress_listener_servant, - GNOME_Evolution_ConnectionList *active_connection_list) -{ - ComponentInfo *new; - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - new = g_new (ComponentInfo, 1); - new->id = g_strdup (id); - new->offline_interface = CORBA_Object_duplicate (offline_interface, &ev); - new->progress_listener_interface = progress_listener_interface; - new->progress_listener_servant = progress_listener_servant; - new->active_connection_list = active_connection_list; - - CORBA_exception_free (&ev); - - return new; -} - -static void -component_info_free (ComponentInfo *component_info) -{ - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - g_free (component_info->id); - - progress_listener_servant_free (component_info->progress_listener_servant); - CORBA_Object_release (component_info->progress_listener_interface, &ev); - - CORBA_Object_release (component_info->offline_interface, &ev); - - CORBA_free (component_info->active_connection_list); - - g_free (component_info); - - CORBA_exception_free (&ev); -} - - -/* Utility functions. */ - -static void -hash_foreach_free_component_info (void *key, - void *value, - void *user_data) -{ - ComponentInfo *component_info; - - component_info = (ComponentInfo *) value; - component_info_free (component_info); -} - - -/* Cancelling the off-line procedure. */ - -static void -cancel_offline (EShellOfflineHandler *offline_handler) -{ - EShellOfflineHandlerPrivate *priv; - EComponentRegistry *component_registry; - GList *component_ids; - GList *p; - - priv = offline_handler->priv; - - component_registry = e_shell_get_component_registry (priv->shell); - component_ids = e_component_registry_get_id_list (component_registry); - - for (p = component_ids; p != NULL; p = p->next) { - EvolutionShellComponentClient *shell_component_client; - GNOME_Evolution_Offline offline_interface; - CORBA_Environment ev; - const char *id; - - id = (const char *) p->data; - shell_component_client = e_component_registry_get_component_by_id (component_registry, id); - - offline_interface = evolution_shell_component_client_get_offline_interface (shell_component_client); - if (offline_interface == CORBA_OBJECT_NIL) - continue; - - CORBA_exception_init (&ev); - - GNOME_Evolution_Offline_goOnline (offline_interface, &ev); - if (ev._major != CORBA_NO_EXCEPTION) - g_warning ("Error putting component `%s' on-line.", id); - - CORBA_exception_free (&ev); - } - - e_free_string_list (component_ids); - - priv->num_total_connections = 0; - - if (! priv->finished) { - g_signal_emit (offline_handler, signals[OFFLINE_PROCEDURE_FINISHED], 0, FALSE); - priv->finished = TRUE; - } -} - - -/* Preparing the off-line procedure. */ - -static gboolean -prepare_for_offline (EShellOfflineHandler *offline_handler) -{ - EComponentRegistry *component_registry; - EShellOfflineHandlerPrivate *priv; - GList *component_ids; - GList *p; - gboolean error; - - priv = offline_handler->priv; - component_registry = e_shell_get_component_registry (priv->shell); - - component_ids = e_component_registry_get_id_list (component_registry); - - error = FALSE; - for (p = component_ids; p != NULL; p = p->next) { - EvolutionShellComponentClient *shell_component_client; - GNOME_Evolution_Offline offline_interface; - GNOME_Evolution_OfflineProgressListener progress_listener_interface; - GNOME_Evolution_ConnectionList *active_connection_list; - OfflineProgressListenerServant *progress_listener_servant; - ComponentInfo *component_info; - CORBA_Environment ev; - const char *id; - - id = (const char *) p->data; - shell_component_client = e_component_registry_get_component_by_id (component_registry, id); - offline_interface = evolution_shell_component_client_get_offline_interface (shell_component_client); - if (offline_interface == CORBA_OBJECT_NIL) - continue; - - if (! create_progress_listener (offline_handler, id, - &progress_listener_interface, - &progress_listener_servant)) { - g_warning ("Cannot create the Evolution::OfflineProgressListener interface for `%s'", id); - continue; - } - - CORBA_exception_init (&ev); - - GNOME_Evolution_Offline_prepareForOffline (offline_interface, &active_connection_list, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("Cannot prepare component component to go offline -- %s [%s]", - id, BONOBO_EX_REPOID (&ev)); - - progress_listener_servant_free (progress_listener_servant); - - CORBA_Object_release (progress_listener_interface, &ev); - - CORBA_exception_free (&ev); - - error = TRUE; - break; - } - - CORBA_exception_free (&ev); - - priv->num_total_connections += active_connection_list->_length; - - component_info = component_info_new (id, - offline_interface, - progress_listener_interface, - progress_listener_servant, - active_connection_list); - - g_assert (g_hash_table_lookup (priv->id_to_component_info, component_info->id) == NULL); - g_hash_table_insert (priv->id_to_component_info, component_info->id, component_info); - } - - /* If an error occurred while preparing, just put all the components - on-line again. */ - if (error) - cancel_offline (offline_handler); - - e_free_string_list (component_ids); - - return ! error; -} - - -/* Finalizing the off-line procedure. */ - -static void -finalize_offline_hash_foreach (void *key, - void *value, - void *user_data) -{ - EShellOfflineHandler *offline_handler; - EShellOfflineHandlerPrivate *priv; - ComponentInfo *component_info; - CORBA_Environment ev; - - offline_handler = E_SHELL_OFFLINE_HANDLER (user_data); - priv = offline_handler->priv; - - component_info = (ComponentInfo *) value; - - CORBA_exception_init (&ev); - - GNOME_Evolution_Offline_goOffline (component_info->offline_interface, - component_info->progress_listener_interface, - &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - /* FIXME: Should detect an error and put all the components - on-line again. */ - g_warning ("Error putting component off-line -- %s", component_info->id); - } - - CORBA_exception_free (&ev); -} - -static void -finalize_offline (EShellOfflineHandler *offline_handler) -{ - EShellOfflineHandlerPrivate *priv; - - priv = offline_handler->priv; - - g_object_ref (offline_handler); - - g_hash_table_foreach (priv->id_to_component_info, finalize_offline_hash_foreach, offline_handler); - - if (priv->num_total_connections == 0 && ! priv->finished) { - /* Nothing else to do, we are all set. */ - g_signal_emit (offline_handler, signals[OFFLINE_PROCEDURE_FINISHED], 0, TRUE); - priv->finished = TRUE; - } - - g_object_unref (offline_handler); -} - - -/* The confirmation dialog. */ - -static void -update_dialog_tree_view_hash_foreach (void *key, - void *data, - void *user_data) -{ - ComponentInfo *component_info; - const GNOME_Evolution_Connection *p; - GtkTreeModel *model = GTK_TREE_MODEL (user_data); - int i; - - component_info = (ComponentInfo *) data; - for (i = 0, p = component_info->active_connection_list->_buffer; - i < component_info->active_connection_list->_length; - i++, p++) { - GtkTreeIter iter; - char *host = g_strdup_printf ("%s (%s)", p->hostName, p->type); - - gtk_list_store_prepend (GTK_LIST_STORE (model), &iter); - gtk_list_store_set (GTK_LIST_STORE (model), &iter, 0, host, -1); - } -} - -static void -update_dialog_clist (EShellOfflineHandler *offline_handler) -{ - EShellOfflineHandlerPrivate *priv; - GtkWidget *tree_view; - GtkTreeModel *model; - GtkTreeModel *model_sort; - GtkCellRenderer *renderer; - GtkTreeViewColumn *column; - - priv = offline_handler->priv; - if (priv->dialog_gui == NULL) - return; - - tree_view = glade_xml_get_widget (priv->dialog_gui, "active_connection_treeview"); - g_assert (GTK_IS_TREE_VIEW (tree_view)); - - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tree_view), FALSE); - - renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("Host", renderer, "text", 0, NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column); - - model = gtk_list_store_new (1, G_TYPE_STRING); - g_hash_table_foreach (priv->id_to_component_info, update_dialog_tree_view_hash_foreach, model); - - gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), model); -} - -static void -dialog_handle_ok (GtkDialog *dialog, - EShellOfflineHandler *offline_handler) -{ - EShellOfflineHandlerPrivate *priv; - GtkWidget *instruction_label; - - priv = offline_handler->priv; - - gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_OK, FALSE); - - instruction_label = glade_xml_get_widget (priv->dialog_gui, "instruction_label"); - g_assert (instruction_label != NULL); - g_assert (GTK_IS_LABEL (instruction_label)); - - e_shell_offline_sync_all_folders (priv->shell, GTK_WINDOW (dialog)); - - gtk_label_set_text (GTK_LABEL (instruction_label), _("Closing connections...")); - - finalize_offline (offline_handler); -} - -static void -dialog_handle_cancel (GtkDialog *dialog, - EShellOfflineHandler *offline_handler) -{ - EShellOfflineHandlerPrivate *priv; - - priv = offline_handler->priv; - - gtk_widget_destroy (GTK_WIDGET (dialog)); - - g_object_unref (priv->dialog_gui); - priv->dialog_gui = NULL; - - cancel_offline (offline_handler); -} - -static void -dialog_response_cb (GtkDialog *dialog, - int response_id, - void *data) -{ - EShellOfflineHandler *offline_handler; - - offline_handler = E_SHELL_OFFLINE_HANDLER (data); - - switch (response_id) { - case GTK_RESPONSE_OK: - dialog_handle_ok (dialog, offline_handler); - break; - - case GTK_RESPONSE_CANCEL: - dialog_handle_cancel (dialog, offline_handler); - break; - - default: - g_assert_not_reached (); - } -} - -static void -pop_up_confirmation_dialog (EShellOfflineHandler *offline_handler) -{ - EShellOfflineHandlerPrivate *priv; - GtkWidget *dialog; - - priv = offline_handler->priv; - - if (priv->dialog_gui == NULL) { - priv->dialog_gui = glade_xml_new (GLADE_DIALOG_FILE_NAME, NULL, NULL); - if (priv->dialog_gui == NULL) { - g_warning ("Cannot load the active connection dialog (installation problem?) -- %s", - GLADE_DIALOG_FILE_NAME); - finalize_offline (offline_handler); - return; - } - } - - dialog = glade_xml_get_widget (priv->dialog_gui, "active_connection_dialog"); - - /* FIXME: do we really want this? */ - /* gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (priv->parent_shell_view)); */ - /* gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); */ - - update_dialog_clist (offline_handler); - - g_signal_connect (dialog, "response", G_CALLBACK (dialog_response_cb), offline_handler); - - gtk_widget_show (dialog); -} - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - EShellOfflineHandler *offline_handler; - EShellOfflineHandlerPrivate *priv; - - offline_handler = E_SHELL_OFFLINE_HANDLER (object); - priv = offline_handler->priv; - - /* (We don't unref the shell, as it's our owner.) */ - - if (priv->id_to_component_info != NULL) { - g_hash_table_foreach (priv->id_to_component_info, hash_foreach_free_component_info, NULL); - g_hash_table_destroy (priv->id_to_component_info); - priv->id_to_component_info = NULL; - } - - if (priv->dialog_gui != NULL) { - GtkWidget *dialog; - - dialog = glade_xml_get_widget (priv->dialog_gui, "active_connection_dialog"); - gtk_widget_destroy (dialog); - - g_object_unref (priv->dialog_gui); - priv->dialog_gui = NULL; - } - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EShellOfflineHandler *offline_handler; - EShellOfflineHandlerPrivate *priv; - - offline_handler = E_SHELL_OFFLINE_HANDLER (object); - priv = offline_handler->priv; - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -/* GTK type handling. */ - -static void -class_init (EShellOfflineHandlerClass *klass) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - parent_class = g_type_class_ref(gtk_object_get_type ()); - - signals[OFFLINE_PROCEDURE_STARTED] - = g_signal_new ("offline_procedure_started", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EShellOfflineHandlerClass, offline_procedure_started), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - signals[OFFLINE_PROCEDURE_FINISHED] - = g_signal_new ("offline_procedure_finished", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EShellOfflineHandlerClass, offline_procedure_finished), - NULL, NULL, - e_shell_marshal_NONE__BOOL, - G_TYPE_NONE, 1, - G_TYPE_BOOLEAN); -} - - -static void -init (EShellOfflineHandler *shell_offline_handler) -{ - EShellOfflineHandlerPrivate *priv; - - priv = g_new (EShellOfflineHandlerPrivate, 1); - - priv->shell = NULL; - priv->parent_shell_view = NULL; - - priv->dialog_gui = NULL; - - priv->num_total_connections = 0; - priv->id_to_component_info = g_hash_table_new (g_str_hash, g_str_equal); - - priv->procedure_in_progress = FALSE; - priv->finished = FALSE; - - shell_offline_handler->priv = priv; -} - - -/** - * e_shell_offline_handler_construct: - * @offline_handler: A pointer to an EShellOfflineHandler to construct. - * @shell: The Evolution shell. - * - * Construct the @offline_handler. - **/ -void -e_shell_offline_handler_construct (EShellOfflineHandler *offline_handler, - EShell *shell) -{ - EShellOfflineHandlerPrivate *priv; - - g_return_if_fail (E_IS_SHELL_OFFLINE_HANDLER (offline_handler)); - g_return_if_fail (E_IS_SHELL (shell)); - - priv = offline_handler->priv; - - g_assert (priv->shell == NULL); - - GTK_OBJECT_UNSET_FLAGS (GTK_OBJECT (offline_handler), GTK_FLOATING); - - priv->shell = shell; -} - -/** - * e_shell_offline_handler_new: - * @shell: The Evolution shell. - * - * Create a new offline handler. - * - * Return value: A pointer to the newly created EShellOfflineHandler object. - **/ -EShellOfflineHandler * -e_shell_offline_handler_new (EShell *shell) -{ - EShellOfflineHandler *offline_handler; - - g_return_val_if_fail (E_IS_SHELL (shell), NULL); - - offline_handler = (EShellOfflineHandler *) g_object_new (e_shell_offline_handler_get_type (), NULL); - e_shell_offline_handler_construct (offline_handler, shell); - - return offline_handler; -} - - -/** - * e_shell_offline_handler_put_components_offline: - * @offline_handler: A pointer to an EShellOfflineHandler object. - * - * Put the components offline. - **/ -void -e_shell_offline_handler_put_components_offline (EShellOfflineHandler *offline_handler, - EShellView *parent_shell_view) -{ - EShellOfflineHandlerPrivate *priv; - - g_return_if_fail (offline_handler != NULL); - g_return_if_fail (E_IS_SHELL_OFFLINE_HANDLER (offline_handler)); - g_return_if_fail (parent_shell_view == NULL || E_IS_SHELL_VIEW (parent_shell_view)); - - priv = offline_handler->priv; - - priv->procedure_in_progress = TRUE; - priv->parent_shell_view = parent_shell_view; - - /* Add an extra ref here as the signal handlers might want to unref - us. */ - - g_object_ref (offline_handler); - - g_signal_emit (offline_handler, signals[OFFLINE_PROCEDURE_STARTED], 0); - - priv->finished = FALSE; - - if (! prepare_for_offline (offline_handler)) { - /* FIXME: Maybe do something smarter here. */ - g_warning ("Couldn't put components off-line"); - g_signal_emit (offline_handler, signals[OFFLINE_PROCEDURE_FINISHED], 0, FALSE); - priv->finished = TRUE; - g_object_unref (offline_handler); - return; - } - - if (priv->num_total_connections > 0 && priv->parent_shell_view != NULL) { - pop_up_confirmation_dialog (offline_handler); - } else { - e_shell_offline_sync_all_folders (priv->shell, - parent_shell_view ? GTK_WINDOW (parent_shell_view) : NULL); - finalize_offline (offline_handler); - } - - g_object_unref (offline_handler); -} - - -E_MAKE_TYPE (e_shell_offline_handler, "EShellOfflineHandler", EShellOfflineHandler, class_init, init, PARENT_TYPE) diff --git a/shell/e-shell-offline-handler.h b/shell/e-shell-offline-handler.h deleted file mode 100644 index ce58dd73a9..0000000000 --- a/shell/e-shell-offline-handler.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-offline-handler.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifndef _E_SHELL_OFFLINE_HANDLER_H_ -#define _E_SHELL_OFFLINE_HANDLER_H_ - -#include <gtk/gtkobject.h> - -#include "e-component-registry.h" -#include "e-shell-view.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_SHELL_OFFLINE_HANDLER (e_shell_offline_handler_get_type ()) -#define E_SHELL_OFFLINE_HANDLER(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SHELL_OFFLINE_HANDLER, EShellOfflineHandler)) -#define E_SHELL_OFFLINE_HANDLER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SHELL_OFFLINE_HANDLER, EShellOfflineHandlerClass)) -#define E_IS_SHELL_OFFLINE_HANDLER(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SHELL_OFFLINE_HANDLER)) -#define E_IS_SHELL_OFFLINE_HANDLER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SHELL_OFFLINE_HANDLER)) - - -typedef struct _EShellOfflineHandler EShellOfflineHandler; -typedef struct _EShellOfflineHandlerPrivate EShellOfflineHandlerPrivate; -typedef struct _EShellOfflineHandlerClass EShellOfflineHandlerClass; - -struct _EShellOfflineHandler { - GtkObject parent; - - EShellOfflineHandlerPrivate *priv; -}; - -struct _EShellOfflineHandlerClass { - GtkObjectClass parent_class; - - /* This signal is emitted when the offline procedure starts, i.e. the - EShellOfflineHanlder starts contacting the components one-by-one - telling them to be prepared to go off-line. */ - void (* offline_procedure_started) (EShellOfflineHandler *offline_handler); - - /* This is emitted when the procedure is finished, and all the - components are all either off-line (@now_offline is %TRUE) or - on-line (@now_offline is %FALSE). */ - void (* offline_procedure_finished) (EShellOfflineHandler *offline_hanlder, - gboolean now_offline); -}; - - -GtkType e_shell_offline_handler_get_type (void); -void e_shell_offline_handler_construct (EShellOfflineHandler *offline_handler, - EShell *shell); -EShellOfflineHandler *e_shell_offline_handler_new (EShell *shell); - -void e_shell_offline_handler_put_components_offline (EShellOfflineHandler *offline_handler, - EShellView *parent_shell_view); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_SHELL_OFFLINE_HANDLER_H_ */ diff --git a/shell/e-shell-offline-sync.c b/shell/e-shell-offline-sync.c deleted file mode 100644 index c37839e455..0000000000 --- a/shell/e-shell-offline-sync.c +++ /dev/null @@ -1,433 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-offline-sync.c - Sync folders before going into Offline mode. - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-shell-offline-sync.h" - -#include "e-shell.h" -#include "e-shell-constants.h" - -#include "Evolution.h" - -#include "e-util/e-dialog-utils.h" - -#include <gconf/gconf-client.h> - -#include <gtk/gtklabel.h> -#include <gtk/gtkmain.h> -#include <gtk/gtkprogressbar.h> -#include <gtk/gtksignal.h> -#include <gtk/gtkstock.h> - -#include <libgnome/gnome-i18n.h> - -#include <bonobo/bonobo-main.h> -#include <bonobo/bonobo-exception.h> - - -typedef struct _SyncData SyncData; -typedef struct _SyncFolderProgressListenerServant SyncFolderProgressListenerServant; - -struct _SyncFolderProgressListenerServant { - POA_GNOME_Evolution_SyncFolderProgressListener servant; - SyncData *sync_data; -}; - -struct _SyncData { - /* The shell. */ - EShell *shell; - - /* Parent view. */ - GtkWindow *parent_window; - - /* The progress dialog. */ - GtkWidget *dialog; - - /* Label in the progress dialog. */ - GtkWidget *label; - - /* Progress bar in the progress dialog. */ - GtkWidget *progress_bar; - - /* Path of the folder currently being synced. */ - char *current_folder_path; - - /* Whether to cancel the current folder's syncing. */ - gboolean cancel; - - /* Whether the current folder is finished syncing; used for async - notification of completion. */ - gboolean current_folder_finished; - - /* CORBA cruft. */ - SyncFolderProgressListenerServant *progress_listener_servant; - GNOME_Evolution_SyncFolderProgressListener progress_listener_objref; -}; - - -/* The progress listener interface. */ - -static PortableServer_ServantBase__epv SyncFolderProgressListener_base_epv; -static POA_GNOME_Evolution_SyncFolderProgressListener__epv SyncFolderProgressListener_epv; -static POA_GNOME_Evolution_SyncFolderProgressListener__vepv SyncFolderProgressListener_vepv; - -static SyncFolderProgressListenerServant * -progress_listener_servant_new (SyncData *sync_data) -{ - SyncFolderProgressListenerServant *servant; - - servant = g_new0 (SyncFolderProgressListenerServant, 1); - - servant->servant.vepv = &SyncFolderProgressListener_vepv; - servant->sync_data = sync_data; - - return servant; -} - -static void -progress_listener_servant_free (SyncFolderProgressListenerServant *servant) -{ - CORBA_Environment ev; - PortableServer_ObjectId *oid; - - CORBA_exception_init (&ev); - - oid = PortableServer_POA_servant_to_id (bonobo_poa (), servant, &ev); - PortableServer_POA_deactivate_object (bonobo_poa (), oid, &ev); - CORBA_free (oid); - - CORBA_exception_free (&ev); - - g_free (servant); -} - -static void -impl_SyncFolderProgressListener_updateProgress (PortableServer_Servant servant, - const CORBA_float percent, - CORBA_Environment *ev) -{ - SyncData *sync_data; - - sync_data = ((SyncFolderProgressListenerServant *) servant)->sync_data; - gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (sync_data->progress_bar), percent); -} - -static void -impl_SyncFolderProgressListener_reportSuccess (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - SyncData *sync_data; - - sync_data = ((SyncFolderProgressListenerServant *) servant)->sync_data; - sync_data->current_folder_finished = TRUE; -} - -static void -impl_SyncFolderProgressListener_reportFailure (PortableServer_Servant servant, - const CORBA_char *message, - CORBA_Environment *ev) -{ - EFolder *folder; - SyncData *sync_data; - - sync_data = ((SyncFolderProgressListenerServant *) servant)->sync_data; - - folder = e_storage_set_get_folder (e_shell_get_storage_set (sync_data->shell), - sync_data->current_folder_path); - - /* FIXME -- We probably should give the user more of a chance to do - something about it. */ - e_notice (sync_data->dialog, GTK_MESSAGE_ERROR, - _("Error synchronizing \"%s\":\n%s"), e_folder_get_name (folder), message); - - sync_data->current_folder_finished = TRUE; -} - -static gboolean -setup_progress_listener (SyncData *sync_data) -{ - SyncFolderProgressListenerServant *servant; - CORBA_Environment ev; - - SyncFolderProgressListener_base_epv._private = NULL; - SyncFolderProgressListener_base_epv.finalize = NULL; - SyncFolderProgressListener_base_epv.default_POA = NULL; - - SyncFolderProgressListener_epv.updateProgress = impl_SyncFolderProgressListener_updateProgress; - SyncFolderProgressListener_epv.reportSuccess = impl_SyncFolderProgressListener_reportSuccess; - SyncFolderProgressListener_epv.reportFailure = impl_SyncFolderProgressListener_reportFailure; - - SyncFolderProgressListener_vepv._base_epv = &SyncFolderProgressListener_base_epv; - SyncFolderProgressListener_vepv.GNOME_Evolution_SyncFolderProgressListener_epv = &SyncFolderProgressListener_epv; - - servant = progress_listener_servant_new (sync_data); - - CORBA_exception_init (&ev); - - POA_GNOME_Evolution_SyncFolderProgressListener__init ((PortableServer_Servant) servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("Cannot initialize GNOME::Evolution::Offline::ProgressListener"); - progress_listener_servant_free (servant); - CORBA_exception_free (&ev); - return FALSE; - } - - CORBA_free (PortableServer_POA_activate_object (bonobo_poa (), servant, &ev)); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("Cannot activate GNOME::Evolution::Offline::ProgressListener"); - progress_listener_servant_free (servant); - CORBA_exception_free (&ev); - return FALSE; - } - - sync_data->progress_listener_servant = servant; - sync_data->progress_listener_objref = PortableServer_POA_servant_to_reference (bonobo_poa (), - servant, &ev); - - CORBA_exception_free (&ev); - - return TRUE; -} - - -/* Setting up the progress dialog. */ - -static void -progress_dialog_response_callback (GtkDialog *dialog, - int response_id, - void *data) -{ - SyncData *sync_data; - - sync_data = (SyncData *) data; - sync_data->cancel = TRUE; -} - -static void -setup_dialog (SyncData *sync_data) -{ - sync_data->dialog = gtk_dialog_new_with_buttons (_("Syncing Folder"), - sync_data->parent_window, - 0, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - NULL); - gtk_widget_set_size_request (sync_data->dialog, 300, -1); - gtk_window_set_resizable (GTK_WINDOW (sync_data->dialog), FALSE); - - g_signal_connect (sync_data->dialog, "response", - G_CALLBACK (progress_dialog_response_callback), sync_data); - - sync_data->label = gtk_label_new (""); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (sync_data->dialog)->vbox), - sync_data->label, FALSE, TRUE, 0); - - sync_data->progress_bar = gtk_progress_bar_new (); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (sync_data->dialog)->vbox), - sync_data->progress_bar, FALSE, TRUE, 0); - - gtk_widget_show_all (sync_data->dialog); -} - - -/* Sync the folder at the specified @folder_path. */ -static void -sync_folder (SyncData *sync_data, - const char *folder_path, - int num, - int total) -{ - EvolutionShellComponentClient *component_client; - EStorageSet *storage_set; - GNOME_Evolution_Folder *corba_folder; - GNOME_Evolution_Offline offline_interface; - CORBA_Environment ev; - EFolder *folder; - char *evolution_uri; - char *msg; - - CORBA_exception_init (&ev); - - /* Retrieve the folder that needs to be synced from the storage set, as - well as the component that should perform the syncing. */ - - storage_set = e_shell_get_storage_set (sync_data->shell); - - folder = e_storage_set_get_folder (storage_set, folder_path); - if (folder == NULL) { - /* This might be a remote folder that is not visible right now, - or is otherwise hidden from the tree somehow. So we just - ignore it, and keep going without signalling any error. */ - return; - } - - /* Don't attempt to sync folders that don't have the can_sync_offline - property set. */ - if (! e_folder_get_can_sync_offline (folder)) - return; - - component_client = e_folder_type_registry_get_handler_for_type (e_shell_get_folder_type_registry (sync_data->shell), - e_folder_get_type_string (folder)); - - offline_interface = evolution_shell_component_client_get_offline_interface (component_client); - if (offline_interface == CORBA_OBJECT_NIL) { - /* The component doesn't support going off-line, just ignore - this as it's probably a programming error in the - implementation of the component. */ - return; - } - - /* Prepare the CORBA folder to be passed to the component. */ - - corba_folder = GNOME_Evolution_Folder__alloc (); - evolution_uri = g_strconcat (E_SHELL_URI_PREFIX, "/", folder_path, NULL); - e_folder_to_corba (folder, evolution_uri, corba_folder); - g_free (evolution_uri); - - /* Prepare the dialog. */ - - msg = g_strdup_printf (_("Synchronizing \"%s\" (%d of %d) ..."), - e_folder_get_name (folder), num, total); - gtk_label_set_text (GTK_LABEL (sync_data->label), msg); - g_free (msg); - - gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (sync_data->progress_bar), 0.0); - - /* Get the data ready. */ - - g_free (sync_data->current_folder_path); - sync_data->current_folder_path = g_strdup (folder_path); - sync_data->current_folder_finished = FALSE; - sync_data->cancel = FALSE; - - /* Tell the component to start syncing. */ - - GNOME_Evolution_Offline_syncFolder (offline_interface, - corba_folder, - sync_data->progress_listener_objref, - &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Error invoking ::syncFolder -- %s", BONOBO_EX_REPOID (&ev)); - CORBA_free (corba_folder); - CORBA_exception_free (&ev); - return; - } - - /* Wait for the component to signal completion... */ - - while (! sync_data->current_folder_finished && ! sync_data->cancel) { - gtk_main_iteration (); - - /* Check if the user clicked the Cancel button. */ - if (sync_data->cancel) { - gtk_dialog_set_response_sensitive (GTK_DIALOG (sync_data->dialog), - GTK_RESPONSE_CANCEL, FALSE); - - GNOME_Evolution_Offline_cancelSyncFolder (offline_interface, corba_folder, &ev); - - while (! sync_data->current_folder_finished) - gtk_main_iteration (); - - break; - } - } - - /* All done. */ - - CORBA_free (corba_folder); - CORBA_exception_free (&ev); -} - -/* Free up the data needed for syncing. */ -static void -cleanup (SyncData *sync_data) -{ - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - if (sync_data->dialog != NULL) - gtk_widget_destroy (sync_data->dialog); - - if (sync_data->progress_listener_servant != NULL) - progress_listener_servant_free (sync_data->progress_listener_servant); - - if (sync_data->progress_listener_objref != CORBA_OBJECT_NIL) - CORBA_Object_release (sync_data->progress_listener_objref, &ev); - - g_free (sync_data); - - CORBA_exception_free (&ev); -} - - -void -e_shell_offline_sync_all_folders (EShell *shell, - GtkWindow *parent_window) -{ - GConfClient *gconf_client; - SyncData *sync_data; - GSList *path_list; - GSList *p; - int i; - - gconf_client = gconf_client_get_default (); - - path_list = gconf_client_get_list (gconf_client, "/apps/evolution/shell/offline/folder_paths", - GCONF_VALUE_STRING, NULL); - - sync_data = g_new0 (SyncData, 1); - sync_data->shell = shell; - sync_data->parent_window = parent_window; - - /* Initialize everything, then go ahead and sync. */ - - if (! setup_progress_listener (sync_data)) - goto done; - - setup_dialog (sync_data); - - for (p = path_list, i = 1; p != NULL; p = p->next, i ++) { - const char *path; - - path = (const char *) p->data; - - sync_folder (sync_data, path, i, g_slist_length (path_list)); - - /* If the operation has been cancelled, stop syncing and - return. */ - if (sync_data->cancel) { - /* FIXME: Do we want to pop up a dialog asking for - confirmation? */ - break; - } - } - - done: - cleanup (sync_data); - - g_slist_foreach (path_list, (GFunc) g_free, NULL); - g_slist_free (path_list); -} diff --git a/shell/e-shell-offline-sync.h b/shell/e-shell-offline-sync.h deleted file mode 100644 index f214938585..0000000000 --- a/shell/e-shell-offline-sync.h +++ /dev/null @@ -1,33 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-offline-sync.h - Sync folders before going into Offline mode. - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifndef E_SHELL_OFFLINE_SYNC_H -#define E_SHELL_OFFLINE_SYNC_H - -#include "e-shell.h" - -#include <gtk/gtkwidget.h> - -void e_shell_offline_sync_all_folders (EShell *shell, - GtkWindow *widget); - -#endif /* E_SHELL_OFFLINE_SYNC_H */ diff --git a/shell/e-shell-settings-dialog.c b/shell/e-shell-settings-dialog.c deleted file mode 100644 index ed688828db..0000000000 --- a/shell/e-shell-settings-dialog.c +++ /dev/null @@ -1,392 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-settings-dialog.c - * - * Copyright (C) 2002 Ximian, 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 <ettore@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-shell-settings-dialog.h" - -#include "e-corba-config-page.h" - -#include "e-util/e-lang-utils.h" - -#include <gal/util/e-util.h> - -#include <bonobo/bonobo-widget.h> -#include <bonobo/bonobo-exception.h> - -#include <bonobo-activation/bonobo-activation.h> - -#include <string.h> - - -#define PARENT_TYPE e_multi_config_dialog_get_type () -static EMultiConfigDialogClass *parent_class = NULL; - - - -struct _EShellSettingsDialogPrivate { - GHashTable *types; -}; - - -/* FIXME ugly hack to work around that sizing of invisible widgets is broken - with Bonobo. */ - -static void -set_dialog_size (EShellSettingsDialog *dialog) -{ - PangoLayout *layout; - PangoContext *context; - PangoFontMetrics *metrics; - int width, height; - - layout = gtk_widget_create_pango_layout (GTK_WIDGET (dialog), "M"); - context = pango_layout_get_context (layout); - metrics = pango_context_get_metrics (context, - gtk_widget_get_style (GTK_WIDGET (dialog))->font_desc, - pango_context_get_language (context)); - - pango_layout_get_pixel_size (layout, &width, NULL); - - width *= 60; - height = PANGO_PIXELS (pango_font_metrics_get_ascent (metrics) - + pango_font_metrics_get_descent (metrics)) * 30; - - gtk_window_set_default_size((GtkWindow *)dialog, width, height); - g_object_unref (layout); - pango_font_metrics_unref (metrics); -} - - -/* Page handling. */ - -struct _Page { - char *title; - char *description; - GdkPixbuf *icon; - Bonobo_ActivationProperty *type; - int priority; - EConfigPage *page_widget; -}; -typedef struct _Page Page; - -static Page * -page_new (const char *title, - const char *description, - GdkPixbuf *icon, - Bonobo_ActivationProperty *type, - int priority, - EConfigPage *page_widget) -{ - Page *page; - - if (icon != NULL) - g_object_ref (icon); - - page = g_new (Page, 1); - page->title = g_strdup (title); - page->description = g_strdup (description); - page->icon = icon; - page->type = type; - page->priority = priority; - page->page_widget = page_widget; - - return page; -} - -static void -page_free (Page *page) -{ - g_free (page->title); - g_free (page->description); - - if (page->icon != NULL) - g_object_unref (page->icon); - - g_free (page); -} - -static int -compare_page_func (const void *a, - const void *b) -{ - const Page *page_a; - const Page *page_b; - - page_a = (const Page *) a; - page_b = (const Page *) b; - - if (page_a->priority == page_b->priority) - return strcmp (page_a->title, page_b->title); - - return page_a->priority - page_b->priority; -} - -static GList * -sort_page_list (GList *list) -{ - return g_list_sort (list, compare_page_func); -} - -static void -load_pages (EShellSettingsDialog *dialog) -{ - EShellSettingsDialogPrivate *priv; - Bonobo_ServerInfoList *control_list; - CORBA_Environment ev; - GSList *language_list; - GList *page_list; - GList *p; - int i, j; - - priv = dialog->priv; - - CORBA_exception_init (&ev); - - control_list = bonobo_activation_query ("defined(evolution:config_item:title)", NULL, &ev); - if (ev._major != CORBA_NO_EXCEPTION || control_list == NULL) { - g_warning ("Cannot load configuration pages -- %s", BONOBO_EX_REPOID (&ev)); - CORBA_exception_free (&ev); - return; - } - - CORBA_exception_free (&ev); - - language_list = e_get_language_list (); - - page_list = NULL; - for (i = 0; i < control_list->_length; i ++) { - CORBA_Object corba_object; - Bonobo_ServerInfo *info; - const char *title; - const char *description; - const char *icon_path; - const char *priority_string; - Bonobo_ActivationProperty *type; - int priority; - GdkPixbuf *icon; - - CORBA_exception_init (&ev); - - info = & control_list->_buffer[i]; - - title = bonobo_server_info_prop_lookup (info, "evolution:config_item:title", language_list); - description = bonobo_server_info_prop_lookup (info, "evolution:config_item:description", language_list); - icon_path = bonobo_server_info_prop_lookup (info, "evolution:config_item:icon_name", NULL); - type = bonobo_server_info_prop_find (info, "evolution:config_item:type"); - priority_string = bonobo_server_info_prop_lookup (info, "evolution:config_item:priority", NULL); - - if (icon_path == NULL) { - icon = NULL; - } else { - if (g_path_is_absolute (icon_path)) { - icon = gdk_pixbuf_new_from_file (icon_path, NULL); - } else { - char *real_icon_path; - - real_icon_path = g_build_filename (EVOLUTION_IMAGES, icon_path, NULL); - icon = gdk_pixbuf_new_from_file (real_icon_path, NULL); - g_free (real_icon_path); - } - } - - if (type != NULL && type->v._d != Bonobo_ACTIVATION_P_STRINGV) - type = NULL; - if (priority_string == NULL) - priority = 0xffff; - else - priority = atoi (priority_string); - - corba_object = bonobo_activation_activate_from_id ((char *) info->iid, 0, NULL, &ev); - - if (! BONOBO_EX (&ev)) { - Page *page; - - page = page_new (title, description, icon, type, priority, - E_CONFIG_PAGE (e_corba_config_page_new_from_objref (corba_object))); - - page_list = g_list_prepend (page_list, page); - } else { - char *bonobo_ex_text = bonobo_exception_get_text (&ev); - g_warning ("Cannot activate %s -- %s", info->iid, bonobo_ex_text); - g_free (bonobo_ex_text); - } - - if (icon != NULL) - g_object_unref (icon); - - CORBA_exception_free (&ev); - } - - page_list = sort_page_list (page_list); - for (p = page_list, i = 0; p != NULL; p = p->next, i++) { - Page *page; - - page = (Page *) p->data; - - e_multi_config_dialog_add_page (E_MULTI_CONFIG_DIALOG (dialog), - page->title, - page->description, - page->icon, - page->page_widget); - - if (page->type != NULL) { - Bonobo_StringList list = page->type->v._u.value_stringv; - - for (j = 0; j < list._length; j++) { - if (g_hash_table_lookup (priv->types, list._buffer[j]) == NULL) - g_hash_table_insert (priv->types, g_strdup (list._buffer[j]), - GINT_TO_POINTER (i)); - } - } - - - page_free (page); - } - - g_list_free (page_list); - e_free_language_list (language_list); - CORBA_free (control_list); -} - - -/* GtkWidget methods. */ - -static void -impl_realize (GtkWidget *widget) -{ - EShellSettingsDialog *dialog; - - dialog = E_SHELL_SETTINGS_DIALOG (widget); - - set_dialog_size (dialog); - - (* GTK_WIDGET_CLASS (parent_class)->realize) (widget); -} - - -/* GtkObject methods. */ - -static gboolean -destroy_type_entry (gpointer key, gpointer value, gpointer data) -{ - g_free (key); - - return TRUE; -} - -static void -impl_finalize (GObject *object) -{ - EShellSettingsDialog *dialog; - EShellSettingsDialogPrivate *priv; - - dialog = E_SHELL_SETTINGS_DIALOG (object); - priv = dialog->priv; - - g_hash_table_foreach_remove (priv->types, destroy_type_entry, NULL); - g_hash_table_destroy (priv->types); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -class_init (EShellSettingsDialog *class) -{ - GObjectClass *object_class; - GtkWidgetClass *widget_class; - - object_class = G_OBJECT_CLASS (class); - object_class->finalize = impl_finalize; - - widget_class = GTK_WIDGET_CLASS (class); - widget_class->realize = impl_realize; - - parent_class = g_type_class_ref(PARENT_TYPE); -} - -static void -init (EShellSettingsDialog *dialog) -{ - EShellSettingsDialogPrivate *priv; - - priv = g_new (EShellSettingsDialogPrivate, 1); - priv->types = g_hash_table_new (g_str_hash, g_str_equal); - - dialog->priv = priv; - - load_pages (dialog); - - gtk_container_set_border_width (GTK_CONTAINER (dialog), 6); - gtk_window_set_title (GTK_WINDOW (dialog), _("Evolution Settings")); -} - - -GtkWidget * -e_shell_settings_dialog_new () -{ - EShellSettingsDialog *new; - - new = g_object_new (e_shell_settings_dialog_get_type (), NULL); - - return GTK_WIDGET (new); -} - -void -e_shell_settings_dialog_show_type (EShellSettingsDialog *dialog, const char *type) -{ - EShellSettingsDialogPrivate *priv; - gpointer key, value; - int page; - - g_return_if_fail (dialog != NULL); - g_return_if_fail (E_IS_SHELL_SETTINGS_DIALOG (dialog)); - g_return_if_fail (type != NULL); - - priv = dialog->priv; - - if (!g_hash_table_lookup_extended (priv->types, type, &key, &value)) { - char *slash, *supertype; - - slash = strchr (type, '/'); - if (slash) { - supertype = g_strndup (type, slash - type); - value = g_hash_table_lookup (priv->types, type); - g_free (supertype); - } else - value = NULL; - } - page = GPOINTER_TO_INT (value); - - e_multi_config_dialog_show_page (E_MULTI_CONFIG_DIALOG (dialog), page); -} - - -E_MAKE_TYPE (e_shell_settings_dialog, "EShellSettingsDialog", EShellSettingsDialog, - class_init, init, PARENT_TYPE) - diff --git a/shell/e-shell-settings-dialog.h b/shell/e-shell-settings-dialog.h deleted file mode 100644 index 49f3fb60f3..0000000000 --- a/shell/e-shell-settings-dialog.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-settings-dialog.h - * - * Copyright (C) 2002 Ximian, 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 <ettore@ximian.com> - */ - -#ifndef _E_SHELL_SETTINGS_DIALOG_H_ -#define _E_SHELL_SETTINGS_DIALOG_H_ - -#include "e-multi-config-dialog.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_SHELL_SETTINGS_DIALOG (e_shell_settings_dialog_get_type ()) -#define E_SHELL_SETTINGS_DIALOG(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SHELL_SETTINGS_DIALOG, EShellSettingsDialog)) -#define E_SHELL_SETTINGS_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SHELL_SETTINGS_DIALOG, EShellSettingsDialogClass)) -#define E_IS_SHELL_SETTINGS_DIALOG(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SHELL_SETTINGS_DIALOG)) -#define E_IS_SHELL_SETTINGS_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SHELL_SETTINGS_DIALOG)) - - -typedef struct _EShellSettingsDialog EShellSettingsDialog; -typedef struct _EShellSettingsDialogPrivate EShellSettingsDialogPrivate; -typedef struct _EShellSettingsDialogClass EShellSettingsDialogClass; - -struct _EShellSettingsDialog { - EMultiConfigDialog parent; - - EShellSettingsDialogPrivate *priv; -}; - -struct _EShellSettingsDialogClass { - EMultiConfigDialogClass parent_class; -}; - - -GtkType e_shell_settings_dialog_get_type (void); -GtkWidget *e_shell_settings_dialog_new (void); -void e_shell_settings_dialog_show_type (EShellSettingsDialog *dialog, - const char *type); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_SHELL_SETTINGS_DIALOG_H_ */ diff --git a/shell/e-shell-shared-folder-picker-dialog.c b/shell/e-shell-shared-folder-picker-dialog.c deleted file mode 100644 index 191eccbbe3..0000000000 --- a/shell/e-shell-shared-folder-picker-dialog.c +++ /dev/null @@ -1,540 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-shared-folder-picker-dialog.c - Implementation for the shared folder - * picker dialog. - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-shell-shared-folder-picker-dialog.h" - -#include "e-corba-storage.h" -#include "e-shell-constants.h" -#include "evolution-storage-listener.h" - -#include "Evolution-Addressbook-SelectNames.h" - -#include "e-util/e-dialog-utils.h" - -#include <libgnome/gnome-i18n.h> -#include <glade/glade.h> - -#include <bonobo/bonobo-exception.h> -#include <bonobo/bonobo-listener.h> -#include <bonobo/bonobo-widget.h> - -#include <bonobo-activation/bonobo-activation.h> - -#include <gtk/gtk.h> -#include <gtk/gtksignal.h> - - -/* Timeout for showing the progress dialog (msecs). */ - -#define PROGRESS_DIALOG_DELAY 500 - - -/* Dialog creation and handling. */ - -static void -setup_folder_name_combo (GladeXML *glade_xml) -{ - GtkWidget *combo; - GList *string_list; - char *strings[] = { - "Calendar", - "Inbox", - "Contacts", - NULL - /* FIXME: Should these be translated? */ - }; - int i; - - combo = glade_xml_get_widget (glade_xml, "folder-name-combo"); - g_assert (GTK_IS_COMBO (combo)); - - string_list = NULL; - for (i = 0; strings[i] != NULL; i ++) - string_list = g_list_append (string_list, strings[i]); - gtk_combo_set_popdown_strings (GTK_COMBO (combo), string_list); - g_list_free (string_list); - - gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combo)->entry), "Calendar"); -} - -static void -user_clicked (GtkWidget *button, GNOME_Evolution_Addressbook_SelectNames corba_iface) -{ - CORBA_Environment ev; - - CORBA_exception_init (&ev); - GNOME_Evolution_Addressbook_SelectNames_activateDialog (corba_iface, "User", &ev); - - if (BONOBO_EX (&ev)) - g_warning ("Cannot activate SelectNames dialog -- %s", BONOBO_EX_REPOID (&ev)); - - CORBA_exception_free (&ev); -} - -static GtkWidget * -setup_name_selector (GladeXML *glade_xml, - GNOME_Evolution_Addressbook_SelectNames *iface_ret) -{ - GNOME_Evolution_Addressbook_SelectNames corba_iface; - Bonobo_Control control; - CORBA_Environment ev; - GtkWidget *placeholder; - GtkWidget *control_widget; - GtkWidget *button; - - placeholder = glade_xml_get_widget (glade_xml, "user-picker-placeholder"); - g_assert (GTK_IS_CONTAINER (placeholder)); - - CORBA_exception_init (&ev); - - corba_iface = bonobo_activation_activate_from_id ("OAFIID:GNOME_Evolution_Addressbook_SelectNames", - 0, NULL, &ev); - if (corba_iface == CORBA_OBJECT_NIL || BONOBO_EX (&ev)) { - g_warning ("Cannot activate SelectNames -- %s", BONOBO_EX_REPOID (&ev)); - CORBA_exception_free (&ev); - return CORBA_OBJECT_NIL; - } - - GNOME_Evolution_Addressbook_SelectNames_addSectionWithLimit (corba_iface, "User", "User", 1, &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Cannot add SelectNames section -- %s", BONOBO_EX_REPOID (&ev)); - goto err; - } - - control = GNOME_Evolution_Addressbook_SelectNames_getEntryBySection (corba_iface, "User", &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Cannot get SelectNames section -- %s", BONOBO_EX_REPOID (&ev)); - goto err; - } - - control_widget = bonobo_widget_new_control_from_objref (control, CORBA_OBJECT_NIL); - gtk_container_add (GTK_CONTAINER (placeholder), control_widget); - gtk_widget_show (control_widget); - - button = glade_xml_get_widget (glade_xml, "button-user"); - g_signal_connect (button, "clicked", G_CALLBACK (user_clicked), corba_iface); - - CORBA_exception_free (&ev); - *iface_ret = corba_iface; - return control_widget; - - err: - bonobo_object_release_unref (corba_iface, NULL); - CORBA_exception_free (&ev); - return NULL; -} - -static void -server_option_menu_item_activate_callback (GtkMenuItem *menu_item, - void *data) -{ - char **storage_name_return; - - storage_name_return = (char **) data; - if (*storage_name_return != NULL) - g_free (*storage_name_return); - - *storage_name_return = g_strdup ((const char *) g_object_get_data (G_OBJECT (menu_item), "storage_name")); -} - -static void -folder_name_entry_changed_callback (GtkEditable *editable, - void *data) -{ - GtkDialog *dialog = GTK_DIALOG (data); - const char *folder_name_text = gtk_entry_get_text (GTK_ENTRY (editable)); - - if (*folder_name_text == '\0') - gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_OK, FALSE); - else - gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_OK, TRUE); -} - -static void -setup_server_option_menu (EShell *shell, - GladeXML *glade_xml, - char **storage_name_return) -{ - GList *storages; - GList *p; - GtkWidget *widget; - GtkWidget *menu; - - widget = glade_xml_get_widget (glade_xml, "server-option-menu"); - g_assert (GTK_IS_OPTION_MENU (widget)); - - menu = gtk_menu_new (); - gtk_widget_show (menu); - - *storage_name_return = NULL; - storages = e_storage_set_get_storage_list (e_shell_get_storage_set (shell)); - for (p = storages; p != NULL; p = p->next) { - GtkWidget *menu_item; - const char *storage_name; - - if (!e_storage_supports_shared_folders (p->data)) - continue; - - storage_name = e_storage_get_name (E_STORAGE (p->data)); - - menu_item = gtk_menu_item_new_with_label (storage_name); - g_signal_connect (menu_item, "activate", - G_CALLBACK (server_option_menu_item_activate_callback), - storage_name_return); - g_object_set_data_full (G_OBJECT (menu_item), "storage_name", g_strdup (storage_name), g_free); - - gtk_widget_show (menu_item); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); - - if (*storage_name_return == NULL) - *storage_name_return = g_strdup (storage_name); - } - - gtk_option_menu_set_menu (GTK_OPTION_MENU (widget), menu); - - /* FIXME: Default to the current storage in the shell view. */ -} - -static gboolean -show_dialog (EShell *shell, - EShellView *parent, - char **user_email_address_return, - char **storage_name_return, - char **folder_name_return) -{ - GNOME_Evolution_Addressbook_SelectNames corba_iface; - GladeXML *glade_xml; - GtkWidget *dialog; - GtkWidget *name_selector_widget; - GtkWidget *folder_name_entry; - char *user_email_address; - int response; - - glade_xml = glade_xml_new (EVOLUTION_GLADEDIR "/e-shell-shared-folder-picker-dialog.glade", - NULL, NULL); - g_assert (glade_xml != NULL); - - name_selector_widget = setup_name_selector (glade_xml, &corba_iface); - if (name_selector_widget == NULL) - return FALSE; - - setup_server_option_menu (shell, glade_xml, storage_name_return); - setup_folder_name_combo (glade_xml); - - dialog = glade_xml_get_widget (glade_xml, "dialog"); - g_assert (dialog != NULL); - - folder_name_entry = glade_xml_get_widget (glade_xml, "folder-name-entry"); - - /* Connect the callback to set the OK button insensitive when there is - no text in the folder_name_entry. Notice that we put a value there - by default so the OK button is sensitive by default. */ - g_signal_connect (folder_name_entry, "changed", - G_CALLBACK (folder_name_entry_changed_callback), dialog); - - while (TRUE) { - response = gtk_dialog_run (GTK_DIALOG (dialog)); - if (response == GTK_RESPONSE_CANCEL) { - g_free (*storage_name_return); - *storage_name_return = NULL; - gtk_widget_destroy (dialog); - bonobo_object_release_unref (corba_iface, NULL); - return FALSE; - } - - bonobo_widget_get_property (BONOBO_WIDGET (name_selector_widget), - "addresses", TC_CORBA_string, &user_email_address, - NULL); - - if (user_email_address != NULL && *user_email_address != '\0') - break; - - g_free (user_email_address); - - /* It would be nice to insensitivize the OK button appropriately - instead of doing this, but unfortunately we can't do this for the - Bonobo control. */ - e_notice (dialog, GTK_MESSAGE_ERROR, _("Please select a user.")); - } - - *user_email_address_return = user_email_address; - *folder_name_return = g_strdup (gtk_entry_get_text (GTK_ENTRY (folder_name_entry))); - - gtk_widget_destroy (dialog); - bonobo_object_release_unref (corba_iface, NULL); - return TRUE; -} - - -/* Discovery process. */ - -struct _DiscoveryData { - EShell *shell; - EShellView *parent; - GtkWidget *dialog; - char *user_email_address; - char *folder_name; - EStorage *storage; -}; -typedef struct _DiscoveryData DiscoveryData; - -static void -cleanup_discovery (DiscoveryData *discovery_data) -{ - if (discovery_data->dialog != NULL) - gtk_widget_destroy (discovery_data->dialog); - - g_free (discovery_data->user_email_address); - g_free (discovery_data->folder_name); - g_object_unref (discovery_data->storage); - g_free (discovery_data); -} - -static int -progress_bar_timeout_callback (void *data) -{ - gtk_progress_bar_pulse (GTK_PROGRESS_BAR (data)); - - return TRUE; -} - -static void -progress_bar_weak_notify (void *data, - GObject *where_the_object_was) -{ - int timeout_id; - - timeout_id = GPOINTER_TO_INT (data); - g_source_remove (timeout_id); -} - -/* This is invoked if the "Cancel" button is clicked. */ -static void -progress_dialog_clicked_callback (GtkDialog *dialog, - int response, - void *data) -{ - DiscoveryData *discovery_data; - - discovery_data = (DiscoveryData *) data; - - e_storage_cancel_discover_shared_folder (discovery_data->storage, - discovery_data->user_email_address, - discovery_data->folder_name); - - cleanup_discovery (discovery_data); -} - -static int -progress_dialog_show_timeout_callback (void *data) -{ - GtkWidget *dialog; - - dialog = GTK_WIDGET (data); - gtk_widget_show_all (dialog); - return FALSE; -} - -static GtkWidget * -create_progress_dialog (EShell *shell, - EStorage *storage, - const char *user_email_address, - const char *folder_name) -{ - GtkWidget *dialog; - GtkWidget *label; - GtkWidget *progress_bar; - int timeout_id; - char *text; - - dialog = gtk_dialog_new_with_buttons (_("Opening Folder"), NULL, 0, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - NULL); - gtk_widget_set_size_request (dialog, 300, -1); - gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); - - text = g_strdup_printf (_("Opening Folder \"%s\""), folder_name); - label = gtk_label_new (text); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), label, FALSE, TRUE, 0); - g_free (text); - - text = g_strdup_printf (_("in \"%s\" ..."), e_storage_get_name (storage)); - label = gtk_label_new (text); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), label, FALSE, TRUE, 0); - g_free (text); - - progress_bar = gtk_progress_bar_new (); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), progress_bar, FALSE, TRUE, 0); - - timeout_id = g_timeout_add (50, progress_bar_timeout_callback, progress_bar); - g_object_weak_ref (G_OBJECT (progress_bar), progress_bar_weak_notify, GINT_TO_POINTER (timeout_id)); - - timeout_id = g_timeout_add (PROGRESS_DIALOG_DELAY, progress_dialog_show_timeout_callback, dialog); - g_object_weak_ref (G_OBJECT (progress_bar), progress_bar_weak_notify, GINT_TO_POINTER (timeout_id)); - - return dialog; -} - -static void -shell_weak_notify (void *data, - GObject *where_the_object_was) -{ - DiscoveryData *discovery_data; - - discovery_data = (DiscoveryData *) data; - cleanup_discovery (discovery_data); -} - -static void -shell_view_weak_notify (void *data, - GObject *where_the_object_was) -{ - DiscoveryData *discovery_data; - - discovery_data = (DiscoveryData *) data; - discovery_data->parent = NULL; -} - -static void -storage_weak_notify (void *data, - GObject *where_the_object_was) -{ - DiscoveryData *discovery_data; - - discovery_data = (DiscoveryData *) data; - cleanup_discovery (discovery_data); - - /* FIXME: Should we signal the user when this happens? I.e. when the - storage dies for some reason before the folder is discovered. */ -} - -static void -shared_folder_discovery_callback (EStorage *storage, - EStorageResult result, - const char *path, - void *data) -{ - DiscoveryData *discovery_data; - EShell *shell; - EShellView *parent; - - discovery_data = (DiscoveryData *) data; - shell = discovery_data->shell; - parent = discovery_data->parent; - - /* Make sure the progress dialog doesn't show up now. */ - cleanup_discovery (discovery_data); - - if (result == E_STORAGE_OK) { - char *uri; - - uri = g_strconcat (E_SHELL_URI_PREFIX, "/", - e_storage_get_name (storage), - path, NULL); - - if (discovery_data->parent != NULL) - e_shell_view_display_uri (parent, uri, TRUE); - else - e_shell_create_view (shell, uri, NULL); - } else { - e_notice (parent, GTK_MESSAGE_ERROR, - _("Could not open shared folder: %s."), - e_storage_result_to_string (result)); - } -} - -static void -discover_folder (EShell *shell, - EShellView *parent, - const char *user_email_address, - const char *storage_name, - const char *folder_name) -{ - EStorageSet *storage_set; - EStorage *storage; - GtkWidget *dialog; - DiscoveryData *discovery_data; - - storage_set = e_shell_get_storage_set (shell); - if (storage_set == NULL) - goto error; - - storage = e_storage_set_get_storage (storage_set, storage_name); - if (storage == NULL || ! e_storage_supports_shared_folders (storage)) - goto error; - - dialog = create_progress_dialog (shell, storage, user_email_address, folder_name); - - discovery_data = g_new (DiscoveryData, 1); - discovery_data->dialog = dialog; - discovery_data->shell = shell; - discovery_data->parent = parent; - discovery_data->user_email_address = g_strdup (user_email_address); - discovery_data->folder_name = g_strdup (folder_name); - discovery_data->storage = storage; - g_object_ref (storage); - - g_object_weak_ref (G_OBJECT (shell), shell_weak_notify, discovery_data); - g_object_weak_ref (G_OBJECT (parent), shell_view_weak_notify, discovery_data); - g_object_weak_ref (G_OBJECT (storage), storage_weak_notify, discovery_data); - - g_signal_connect (dialog, "clicked", - G_CALLBACK (progress_dialog_clicked_callback), discovery_data); - - e_storage_async_discover_shared_folder (storage, - user_email_address, - folder_name, - shared_folder_discovery_callback, - discovery_data); - return; - - error: - /* FIXME: Be more verbose? */ - e_notice (parent, GTK_MESSAGE_ERROR, - _("Cannot find the specified shared folder.")); -} - - -void -e_shell_show_shared_folder_picker_dialog (EShell *shell, - EShellView *parent) -{ - char *user_email_address = NULL; - char *storage_name = NULL; - char *folder_name = NULL; - - g_return_if_fail (E_IS_SHELL (shell)); - - if (! show_dialog (shell, parent, &user_email_address, &storage_name, &folder_name)) - return; - - discover_folder (shell, parent, user_email_address, storage_name, folder_name); - - g_free (user_email_address); - g_free (storage_name); - g_free (folder_name); -} diff --git a/shell/e-shell-shared-folder-picker-dialog.h b/shell/e-shell-shared-folder-picker-dialog.h deleted file mode 100644 index 721cbaec6a..0000000000 --- a/shell/e-shell-shared-folder-picker-dialog.h +++ /dev/null @@ -1,33 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-shared-folder-picker-dialog.h - Implementation for the shared folder - * picker dialog. - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifndef E_SHELL_SHARED_FOLDER_PICKER_DIALOG_H -#define E_SHELL_SHARED_FOLDER_PICKER_DIALOG_H - -#include "e-shell.h" -#include "e-shell-view.h" - -void e_shell_show_shared_folder_picker_dialog (EShell *shell, - EShellView *parent); - -#endif /* E_SHELL_SHARED_FOLDER_PICKER_DIALOG_H */ diff --git a/shell/e-shell-startup-wizard.c b/shell/e-shell-startup-wizard.c deleted file mode 100644 index b684044ac0..0000000000 --- a/shell/e-shell-startup-wizard.c +++ /dev/null @@ -1,800 +0,0 @@ -/* - * e-shell-startup-wizard.c - * - * Copyright (C) 2001, 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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: Iain Holmes <iain@ximian.com> - */ - -/* WARNING: I LEAK. */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-shell-startup-wizard.h" -#include "e-shell-corba-icon-utils.h" - -#include "e-timezone-dialog/e-timezone-dialog.h" -#include "e-util/e-gtk-utils.h" - -#include <gconf/gconf-client.h> - -#include <evolution-wizard.h> -#include "Evolution.h" -#include "importer/GNOME_Evolution_Importer.h" - -#include <string.h> -#include <glib.h> -#include <gtk/gtk.h> -#include <gnome.h> -#include <glade/glade.h> - -#include <bonobo/bonobo-object.h> -#include <bonobo/bonobo-widget.h> -#include <bonobo/bonobo-exception.h> -#include <bonobo/bonobo-moniker-util.h> - -#include <bonobo-activation/bonobo-activation.h> - -#include <gal/widgets/e-gui-utils.h> - -#include <widgets/e-timezone-dialog/e-timezone-dialog.h> - -typedef struct _TimezoneDialogPage { - GtkWidget *page; - GtkWidget *vbox; - GObject *etd; - - gboolean prepared; -} TimezoneDialogPage; - -typedef struct _ImportDialogPage { - GtkWidget *page; - GtkWidget *vbox; - - GList *importers; - - int running; - gboolean prepared; -} ImportDialogPage; - -typedef struct _SWData { - GladeXML *wizard; - GtkWidget *dialog; - GtkWidget *druid; - - GtkWidget *start, *finish; - GPtrArray *corba_pages; - TimezoneDialogPage *timezone_page; - ImportDialogPage *import_page; - - gboolean cancel; - GNOME_Evolution_Wizard corba_wizard; - BonoboListener *listener; - GNOME_Evolution_Wizard_PageList *pagelist; -} SWData; - -typedef struct _IntelligentImporterData { - CORBA_Object object; - Bonobo_Control control; - GtkWidget *widget; - - char *name; - char *blurb; - char *iid; -} IntelligentImporterData; - -typedef struct _SelectedImporterData{ - CORBA_Object importer; - char *iid; -} SelectedImporterData; - -static GHashTable *page_hash; -static GList *page_list = NULL; - -static void -druid_event_notify_cb (BonoboListener *listener, - const char *name, - BonoboArg *arg, - CORBA_Environment *ev, - SWData *data) -{ - int buttons, pagenum; - GnomeDruidPage *page; - - if (strcmp (name, EVOLUTION_WIZARD_SET_BUTTONS_SENSITIVE) == 0) { - buttons = (int) *((CORBA_short *)arg->_value); - gnome_druid_set_buttons_sensitive (GNOME_DRUID (data->druid), - (buttons & 4) >> 2, - (buttons & 2) >> 1, - (buttons & 1), - FALSE); - } else if (strcmp (name, EVOLUTION_WIZARD_SET_SHOW_FINISH) == 0) { - gnome_druid_set_show_finish (GNOME_DRUID (data->druid), - (gboolean) *((CORBA_boolean *) arg->_value)); - } else if (strcmp (name, EVOLUTION_WIZARD_SET_PAGE) == 0) { - pagenum = (int) *((CORBA_short *) arg->_value); - - page = g_list_nth_data (page_list, pagenum); - gnome_druid_set_page (GNOME_DRUID (data->druid), page); - } -} - -static GNOME_Evolution_Wizard -start_wizard (void) -{ - char *const selection_order[] = { "0-evolution:startup_wizard:priority", NULL }; - Bonobo_ServerInfoList *info; - CORBA_Environment ev; - GNOME_Evolution_Wizard wizard; - int i; - - CORBA_exception_init (&ev); - info = bonobo_activation_query ("repo_ids.has ('IDL:GNOME/Evolution/StartupWizard:1.0')", selection_order, &ev); - if (BONOBO_EX (&ev) || info == CORBA_OBJECT_NIL) { - g_warning ("Cannot find startup wizard -- %s", BONOBO_EX_REPOID (&ev)); - CORBA_exception_free (&ev); - return NULL; - } - CORBA_exception_free (&ev); - - for (i = 0; i < info->_length; i++) { - CORBA_exception_init (&ev); - wizard = bonobo_activation_activate_from_id (info->_buffer[i].iid, 0, NULL, &ev); - if (!BONOBO_EX (&ev) && wizard != CORBA_OBJECT_NIL) { - CORBA_free (info); - return wizard; - } - CORBA_exception_free (&ev); - } - - if (info->_length) - g_warning ("Could not start any startup wizard!"); - else - g_warning ("No startup wizard available!"); - CORBA_free (info); - return NULL; -} - -static void -make_corba_dialog_pages (SWData *data) -{ - CORBA_Environment ev; - CORBA_Object object; - Bonobo_EventSource event_source; - - data->corba_wizard = start_wizard (); - if (!data->corba_wizard) - return; - - CORBA_exception_init (&ev); - data->pagelist = GNOME_Evolution_Wizard__get_pages (data->corba_wizard, &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Could not get CORBA wizard pages (%s)", CORBA_exception_id (&ev)); - CORBA_exception_free (&ev); - data->pagelist = CORBA_OBJECT_NIL; - return; - } - - CORBA_exception_init (&ev); - event_source = Bonobo_Unknown_queryInterface (data->corba_wizard, "IDL:Bonobo/EventSource:1.0", &ev); - CORBA_exception_free (&ev); - data->listener = bonobo_listener_new (NULL, NULL); - g_signal_connect (data->listener, "event-notify", - G_CALLBACK (druid_event_notify_cb), data); - object = bonobo_object_corba_objref (BONOBO_OBJECT (data->listener)); - - CORBA_exception_init (&ev); - Bonobo_EventSource_addListener (event_source, object, &ev); - CORBA_exception_free (&ev); - bonobo_object_release_unref (event_source, &ev); - CORBA_exception_free (&ev); -} - -static int -page_to_num (GnomeDruidPage *page) -{ - return GPOINTER_TO_INT (g_hash_table_lookup (page_hash, page)); -} - -static gboolean -next_func (GnomeDruidPage *page, - GnomeDruid *druid, - SWData *data) -{ - CORBA_Environment ev; - int pagenum; - - CORBA_exception_init (&ev); - pagenum = page_to_num (page); - GNOME_Evolution_Wizard_notifyAction (data->corba_wizard, pagenum, GNOME_Evolution_Wizard_NEXT, &ev); - CORBA_exception_free (&ev); - - /* If on last page we own, let druid goto next page */ - if (pagenum == g_list_length(page_list)-1) - return FALSE; - - return TRUE; -} - -static gboolean -prepare_func (GnomeDruidPage *page, - GnomeDruid *druid, - SWData *data) -{ - CORBA_Environment ev; - int pagenum; - - CORBA_exception_init (&ev); - pagenum = page_to_num (page); - GNOME_Evolution_Wizard_notifyAction (data->corba_wizard, pagenum, GNOME_Evolution_Wizard_PREPARE, &ev); - CORBA_exception_free (&ev); - return FALSE; -} - -static gboolean -back_func (GnomeDruidPage *page, - GnomeDruid *druid, - SWData *data) -{ - CORBA_Environment ev; - int pagenum; - - CORBA_exception_init (&ev); - pagenum = page_to_num (page); - GNOME_Evolution_Wizard_notifyAction (data->corba_wizard, pagenum, GNOME_Evolution_Wizard_BACK, &ev); - CORBA_exception_free (&ev); - - /* if we're on page 0, let the druid go back to the start page, if we have one */ - if (pagenum == 0) - return FALSE; - - return TRUE; -} - -static void -free_importers (SWData *data) -{ - GList *l; - - for (l = data->import_page->importers; l; l = l->next) { - IntelligentImporterData *iid; - - iid = l->data; - if (iid->object != CORBA_OBJECT_NIL) { - bonobo_object_release_unref (iid->object, NULL); - } - } - - g_list_free (data->import_page->importers); -} - -static void -start_importers (GList *p) -{ - CORBA_Environment ev; - - for (; p; p = p->next) { - SelectedImporterData *sid = p->data; - - CORBA_exception_init (&ev); - GNOME_Evolution_IntelligentImporter_importData (sid->importer, &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Error importing %s\n%s", sid->iid, - CORBA_exception_id (&ev)); - } - CORBA_exception_free (&ev); - } -} - -static void -do_import (SWData *data) -{ - CORBA_Environment ev; - GList *l, *selected = NULL; - - for (l = data->import_page->importers; l; l = l->next) { - IntelligentImporterData *importer_data; - SelectedImporterData *sid; - char *iid; - - importer_data = l->data; - iid = g_strdup (importer_data->iid); - - sid = g_new (SelectedImporterData, 1); - sid->iid = iid; - - CORBA_exception_init (&ev); - sid->importer = bonobo_object_dup_ref (importer_data->object, &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Error duplication %s\n(%s)", iid, - CORBA_exception_id (&ev)); - g_free (iid); - CORBA_exception_free (&ev); - g_free (sid); - continue; - } - CORBA_exception_free (&ev); - - selected = g_list_prepend (selected, sid); - } - - free_importers (data); - - if (selected != NULL) { - start_importers (selected); - - for (l = selected; l; l = l->next) { - SelectedImporterData *sid = l->data; - - CORBA_exception_init (&ev); - bonobo_object_release_unref (sid->importer, &ev); - CORBA_exception_free (&ev); - - g_free (sid->iid); - g_free (sid); - } - g_list_free (selected); - } -} - -static gboolean -finish_func (GnomeDruidPage *page, - GnomeDruid *druid, - SWData *data) -{ - GConfClient *client; - CORBA_Environment ev; - icaltimezone *zone; - - /* Notify mailer */ - CORBA_exception_init (&ev); - GNOME_Evolution_Wizard_notifyAction (data->corba_wizard, 0, GNOME_Evolution_Wizard_FINISH, &ev); - CORBA_exception_free (&ev); - - /* Set Timezone */ - zone = e_timezone_dialog_get_timezone (E_TIMEZONE_DIALOG (data->timezone_page->etd)); - if (zone) { - client = gconf_client_get_default (); - gconf_client_set_string (client, "/apps/evolution/calendar/display/timezone", - icaltimezone_get_display_name (zone), NULL); - g_object_unref (client); - } - - do_import (data); - - /* Free data */ - data->cancel = FALSE; - - /* Need to do this otherwise the timezone widget gets destroyed but the - timezone object isn't, and we can get a crash like #22047. */ - g_object_unref (data->timezone_page->etd); - data->timezone_page->etd = NULL; - - gtk_widget_destroy (data->dialog); - gtk_main_quit (); - - return TRUE; -} - -static void -connect_page (GtkWidget *page, - SWData *data) -{ - g_signal_connect (page, "next", - G_CALLBACK (next_func), data); - g_signal_connect (page, "back", - G_CALLBACK (back_func), data); - g_signal_connect (page, "finish", - G_CALLBACK (finish_func), data); - - /* At least in 2.0 (and probably 2.2 too), - * GnomeDruidPageStandard is broken and you need to - * connect_after to "prepare" or else its default method will - * run after your signal handler and undo its button - * sensitivity changes. - */ - g_signal_connect_after (page, "prepare", - G_CALLBACK (prepare_func), data); -} - -static GtkWidget * -make_corba_page (SWData *data, int n, GtkWidget *prev) -{ - GNOME_Evolution_Wizard_Page *corba_page; - GdkPixbuf *icon; - GtkWidget *page, *body; - - corba_page = &data->pagelist->_buffer[n]; - icon = e_new_gdk_pixbuf_from_corba_icon (&corba_page->icon, -1, -1); - page = gnome_druid_page_standard_new_with_vals (corba_page->title, - icon, NULL); - g_object_unref (icon); - - body = bonobo_widget_new_control_from_objref (corba_page->control, - CORBA_OBJECT_NIL); - gtk_box_pack_start (GTK_BOX (GNOME_DRUID_PAGE_STANDARD (page)->vbox), - body, TRUE, TRUE, 0); - gtk_widget_show_all (page); - - gnome_druid_insert_page (GNOME_DRUID (data->druid), - GNOME_DRUID_PAGE (prev), - GNOME_DRUID_PAGE (page)); - connect_page (page, data); - g_hash_table_insert (page_hash, page, GINT_TO_POINTER (n)); - page_list = g_list_append (page_list, page); - - return page; -} - -static gboolean -prepare_timezone_page (GnomeDruidPage *page, - GnomeDruid *druid, - SWData *data) -{ - GConfClient *client; - icaltimezone *zone; - char *zone_name; - - if (data->timezone_page->prepared) - return TRUE; - data->timezone_page->prepared = TRUE; - - client = gconf_client_get_default (); - zone_name = gconf_client_get_string (client, "/apps/evolution/calendar/display/timezone", NULL); - g_object_unref (client); - - if (!zone_name) - return TRUE; - - zone = icaltimezone_get_builtin_timezone (zone_name); - g_free (zone_name); - - if (zone) - e_timezone_dialog_set_timezone (E_TIMEZONE_DIALOG (data->timezone_page->etd), zone); - - return TRUE; -} - -static TimezoneDialogPage * -make_timezone_page (SWData *data) -{ - TimezoneDialogPage *page; - ETimezoneDialog *etd; - - g_return_val_if_fail (data != NULL, NULL); - - page = g_new0 (TimezoneDialogPage, 1); - page->page = glade_xml_get_widget (data->wizard, "timezone-page"); - g_return_val_if_fail (page->page != NULL, NULL); - - g_signal_connect_after (page->page, "prepare", - G_CALLBACK (prepare_timezone_page), data); - page->vbox = GTK_WIDGET (GNOME_DRUID_PAGE_STANDARD (page->page)->vbox); - - etd = e_timezone_dialog_new (); - page->etd = G_OBJECT (etd); - e_timezone_dialog_reparent (E_TIMEZONE_DIALOG (page->etd), page->vbox); - - return page; -} - -static GList * -get_intelligent_importers (void) -{ - Bonobo_ServerInfoList *info_list; - GList *iids_ret = NULL; - CORBA_Environment ev; - int i; - - CORBA_exception_init (&ev); - info_list = bonobo_activation_query ("repo_ids.has ('IDL:GNOME/Evolution/IntelligentImporter:1.0')", NULL, &ev); - CORBA_exception_free (&ev); - - for (i = 0; i < info_list->_length; i++) { - const Bonobo_ServerInfo *info; - - info = info_list->_buffer + i; - iids_ret = g_list_prepend (iids_ret, g_strdup (info->iid)); - } - - return iids_ret; -} - -static gboolean -prepare_importer_page (GnomeDruidPage *page, - GnomeDruid *druid, - SWData *data) -{ - GtkWidget *dialog; - ImportDialogPage *import; - GList *l, *importers; - GtkWidget *table; - int running = 0; - - if (data->import_page->prepared == TRUE) { - return TRUE; - } - - data->import_page->prepared = TRUE; - - dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_INFO, - GTK_BUTTONS_NONE, - _("Please wait...\nScanning for existing setups")); - e_make_widget_backing_stored (dialog); - - gtk_window_set_title (GTK_WINDOW (dialog), _("Starting import")); - gtk_widget_show_all (dialog); - gtk_widget_show_now (dialog); - - gtk_widget_queue_draw (dialog); - gdk_flush (); - - while (gtk_events_pending ()) { - gtk_main_iteration (); - } - - import = data->import_page; - importers = get_intelligent_importers (); - if (importers == NULL) { - /* No importers, go directly to finish, do not pass go - Do not collect $200 */ - gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->finish)); - gtk_widget_destroy (dialog); - return TRUE; - } - - table = gtk_table_new (g_list_length (importers), 2, FALSE); - for (l = importers; l; l = l->next) { - GtkWidget *label; - CORBA_Environment ev; - gboolean can_run; - char *str; - IntelligentImporterData *id; - - id = g_new0 (IntelligentImporterData, 1); - id->iid = g_strdup (l->data); - - CORBA_exception_init (&ev); - id->object = bonobo_activation_activate_from_id ((char *) id->iid, 0, NULL, &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Could not start %s:%s", id->iid, - CORBA_exception_id (&ev)); - - CORBA_exception_free (&ev); - /* Clean up the IID */ - g_free (id->iid); - g_free (id); - continue; - } - - if (id->object == CORBA_OBJECT_NIL) { - g_warning ("Could not activate component %s", id->iid); - CORBA_exception_free (&ev); - - g_free (id->iid); - g_free (id); - continue; - } - - can_run = GNOME_Evolution_IntelligentImporter_canImport (id->object, &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Could not call canImport(%s): %s", id->iid, - CORBA_exception_id (&ev)); - bonobo_object_release_unref (id->object, &ev); - CORBA_exception_free (&ev); - - g_free (id->iid); - g_free (id); - continue; - } - - if (can_run == FALSE) { - bonobo_object_release_unref (id->object, &ev); - CORBA_exception_free (&ev); - g_free (id->iid); - g_free (id); - continue; - } - - running++; - id->name = GNOME_Evolution_IntelligentImporter__get_importername (id->object, &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Could not get name(%s): %s", id->iid, - CORBA_exception_id (&ev)); - bonobo_object_release_unref (id->object, &ev); - CORBA_exception_free (&ev); - g_free (id->iid); - g_free (id); - continue; - } - - id->blurb = GNOME_Evolution_IntelligentImporter__get_message (id->object, &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Could not get message(%s): %s", - id->iid, CORBA_exception_id (&ev)); - bonobo_object_release_unref (id->object, &ev); - CORBA_exception_free (&ev); - g_free (id->iid); - CORBA_free (id->name); - g_free (id); - continue; - } - - id->control = Bonobo_Unknown_queryInterface (id->object, - "IDL:Bonobo/Control:1.0", &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Could not QI for Bonobo/Control:1.0 %s:%s", - id->iid, CORBA_exception_id (&ev)); - bonobo_object_release_unref (id->object, &ev); - CORBA_exception_free (&ev); - g_free (id->iid); - CORBA_free (id->name); - CORBA_free (id->blurb); - continue; - } - - if (id->control != CORBA_OBJECT_NIL) { - id->widget = bonobo_widget_new_control_from_objref (id->control, CORBA_OBJECT_NIL); - gtk_widget_show (id->widget); - } else { - printf("no control\n"); - id->widget = gtk_label_new (""); - gtk_widget_show (id->widget); - } - - CORBA_exception_free (&ev); - - import->importers = g_list_prepend (import->importers, id); - str = g_strdup_printf (_("From %s:"), id->name); - label = gtk_label_new (str); - g_free (str); - - gtk_misc_set_alignment (GTK_MISC (label), 0, .5); - - gtk_table_attach (GTK_TABLE (table), label, 0, 1, running - 1, - running, GTK_FILL, 0, 0, 0); - gtk_table_attach (GTK_TABLE (table), id->widget, 1, 2, - running - 1, running, GTK_FILL, 0, 3, 0); - gtk_widget_show_all (table); - - gtk_box_pack_start (GTK_BOX (data->import_page->vbox), table, - FALSE, FALSE, 0); - } - - if (running == 0) { - gnome_druid_set_page (druid, GNOME_DRUID_PAGE (data->finish)); - gtk_widget_destroy (dialog); - return TRUE; - } - - import->running = running; - gtk_widget_destroy (dialog); - - return FALSE; -} - -static ImportDialogPage * -make_importer_page (SWData *data) -{ - ImportDialogPage *page; - GtkWidget *label, *sep; - - g_return_val_if_fail (data != NULL, NULL); - - page = g_new0 (ImportDialogPage, 1); - page->page = glade_xml_get_widget (data->wizard, "import-page"); - g_return_val_if_fail (page->page != NULL, NULL); - - g_signal_connect_after (page->page, "prepare", - G_CALLBACK (prepare_importer_page), data); - page->vbox = GNOME_DRUID_PAGE_STANDARD (page->page)->vbox; - gtk_container_set_border_width (GTK_CONTAINER (page->vbox), 4); - - label = gtk_label_new (_("Please select the information that you would like to import:")); - gtk_box_pack_start (GTK_BOX (page->vbox), label, FALSE, FALSE, 3); - - sep = gtk_hseparator_new (); - gtk_box_pack_start (GTK_BOX (page->vbox), sep, FALSE, FALSE, 3); - - page->prepared = FALSE; - return page; -} - -static void -startup_wizard_cancel (GnomeDruid *druid, - SWData *data) -{ - /* Free data */ - data->cancel = TRUE; - - if (data->timezone_page->etd != NULL) { - /* Need to do this otherwise the timezone widget gets destroyed but the - timezone object isn't, and we can get a crash like #22047. */ - g_object_unref (data->timezone_page->etd); - data->timezone_page->etd = NULL; - } - - gtk_widget_destroy (data->dialog); - gtk_main_quit (); -} - -gboolean -e_shell_startup_wizard_create (void) -{ - GConfClient *client; - SWData *data; - GSList *accounts; - GtkWidget *page; - int i; - - client = gconf_client_get_default (); - accounts = gconf_client_get_list (client, "/apps/evolution/mail/accounts", GCONF_VALUE_STRING, NULL); - g_object_unref (client); - - if (accounts != NULL) { - g_slist_foreach (accounts, (GFunc) g_free, NULL); - g_slist_free (accounts); - return TRUE; - } - - data = g_new0 (SWData, 1); - - data->wizard = glade_xml_new (EVOLUTION_GLADEDIR "/evolution-startup-wizard.glade", NULL, NULL); - g_return_val_if_fail (data->wizard != NULL, FALSE); - data->dialog = glade_xml_get_widget (data->wizard, "startup-wizard"); - g_return_val_if_fail (data->dialog != NULL, FALSE); - gtk_window_set_wmclass (GTK_WINDOW (data->dialog), "startup-wizard", - "Evolution:shell"); - - page_hash = g_hash_table_new (NULL, NULL); - data->druid = glade_xml_get_widget (data->wizard, "startup-druid"); - g_return_val_if_fail (data->druid != NULL, FALSE); - gnome_druid_set_buttons_sensitive (GNOME_DRUID (data->druid), - FALSE, TRUE, FALSE, FALSE); - - g_signal_connect (data->druid, "cancel", - G_CALLBACK (startup_wizard_cancel), data); - - data->start = glade_xml_get_widget (data->wizard, "start-page"); - data->finish = glade_xml_get_widget (data->wizard, "done-page"); - g_return_val_if_fail (data->start != NULL, FALSE); - g_return_val_if_fail (data->finish != NULL, FALSE); - g_signal_connect (data->finish, "finish", G_CALLBACK (finish_func), data); - - make_corba_dialog_pages (data); - g_return_val_if_fail (data->corba_wizard != CORBA_OBJECT_NIL, TRUE); - g_return_val_if_fail (data->pagelist != CORBA_OBJECT_NIL, TRUE); - - page = data->start; - for (i = 0; i < data->pagelist->_length; i++) - page = make_corba_page (data, i, page); - - data->timezone_page = make_timezone_page (data); - data->import_page = make_importer_page (data); - - g_return_val_if_fail (data->timezone_page != NULL, TRUE); - g_return_val_if_fail (data->import_page != NULL, TRUE); - - gnome_druid_set_buttons_sensitive (GNOME_DRUID (data->druid), FALSE, TRUE, TRUE, FALSE); - gtk_widget_show_all (data->dialog); - - gtk_main (); - - return !data->cancel; -} diff --git a/shell/e-shell-startup-wizard.h b/shell/e-shell-startup-wizard.h deleted file mode 100644 index 4e849b8feb..0000000000 --- a/shell/e-shell-startup-wizard.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * e-shell-startup-wizard.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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: Iain Holmes <iain@ximian.com> - */ - -#ifndef E_SHELL_STARTUP_WIZARD_H -#define E_SHELL_STARTUP_WIZARD_H - -#include <glib.h> - -gboolean e_shell_startup_wizard_create (void); - -#endif diff --git a/shell/e-shell-user-creatable-items-handler.c b/shell/e-shell-user-creatable-items-handler.c deleted file mode 100644 index efc1b24f5f..0000000000 --- a/shell/e-shell-user-creatable-items-handler.c +++ /dev/null @@ -1,796 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-user-creatable-items-handler.c - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-shell-user-creatable-items-handler.h" - -#include "e-shell-corba-icon-utils.h" - -#include "widgets/misc/e-combo-button.h" - -#include "e-util/e-corba-utils.h" - -#include <gal/util/e-util.h> - -#include <bonobo/bonobo-ui-util.h> -#include <bonobo/bonobo-exception.h> - -#include <libgnome/gnome-i18n.h> - -#include <gtk/gtksignal.h> -#include <gtk/gtktooltips.h> - -#include <stdlib.h> -#include <ctype.h> -#include <string.h> - - -#define PARENT_TYPE G_TYPE_OBJECT -static GObjectClass *parent_class = NULL; - - -#define VERB_PREFIX "ShellUserCreatableItemVerb" - -#define EVOLUTION_MAIL_OAFIID "OAFIID:GNOME_Evolution_Mail_ShellComponent" - -#define SHELL_VIEW_KEY "EShellUserCreatableItemsHandler:shell_view" -#define COMBO_BUTTON_WIDGET_KEY "EShellUserCreatableItemsHandler:combo_button" -#define TOOLTIPS_KEY "EShellUserCreatableItemsHandler:tooltips" - -struct _Component { - EvolutionShellComponentClient *component_client; - - GNOME_Evolution_UserCreatableItemTypeList *type_list; -}; -typedef struct _Component Component; - -/* Representation of a single menu item. */ -struct _MenuItem { - const char *label; - char shortcut; - char *verb; - char *tooltip; - GdkPixbuf *icon; - char *component_id; - char *folder_type; -}; -typedef struct _MenuItem MenuItem; - -struct _EShellUserCreatableItemsHandlerPrivate { - /* The components that register user creatable items. */ - GSList *components; /* Component */ - - /* The "New ..." menu items. */ - GSList *menu_items; /* MenuItem */ - - /* The default item (the mailer's "message" item). To be used when the - component in the view we are in doesn't provide a default user - creatable type. This pointer always points to one of the menu items - in ->menu_items. */ - const MenuItem *default_menu_item; -}; - - -/* Component struct handling. */ - -static Component * -component_new (const char *id, - EvolutionShellComponentClient *client) -{ - CORBA_Environment ev; - Component *new; - GNOME_Evolution_ShellComponent objref; - - new = g_new (Component, 1); - - new->component_client = client; - g_object_ref (client); - - CORBA_exception_init (&ev); - - objref = evolution_shell_component_client_corba_objref (client); - new->type_list = GNOME_Evolution_ShellComponent__get_userCreatableItemTypes (objref, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) - new->type_list = NULL; - - CORBA_exception_free (&ev); - - return new; -} - -static void -component_free (Component *component) -{ - g_object_unref (component->component_client); - - if (component->type_list != NULL) - CORBA_free (component->type_list); - - g_free (component); -} - - -/* Helper functions. */ - -static gboolean -item_is_default (const MenuItem *item, - const char *folder_type, - const char *component_id) -{ - if (component_id == NULL || folder_type == NULL) - return FALSE; - - if (item->folder_type != NULL && *item->folder_type != 0) { - if (strcmp (item->folder_type, folder_type) == 0) - return TRUE; - else - return FALSE; - } - - if (strcmp (item->component_id, component_id) == 0) - return TRUE; - else - return FALSE; -} - -static char * -create_verb_from_component_number_and_type_id (int component_num, - const char *type_id) -{ - return g_strdup_printf (VERB_PREFIX ":%d:%s", component_num, type_id); -} - - -/* Setting up menu items for the "File -> New" submenu and the "New" toolbar - button. */ - -static void -ensure_menu_items (EShellUserCreatableItemsHandler *handler) -{ - EShellUserCreatableItemsHandlerPrivate *priv; - GSList *menu_items; - GSList *p; - int component_num; - const char *default_verb; - - priv = handler->priv; - if (priv->menu_items != NULL) - return; - - menu_items = NULL; - component_num = 0; - default_verb = NULL; - for (p = priv->components; p != NULL; p = p->next) { - const Component *component; - int i; - - component = (const Component *) p->data; - if (component->type_list != NULL) { - for (i = 0; i < component->type_list->_length; i ++) { - const GNOME_Evolution_UserCreatableItemType *type; - MenuItem *item; - - type = (const GNOME_Evolution_UserCreatableItemType *) component->type_list->_buffer + i; - - item = g_new (MenuItem, 1); - item->label = type->menuDescription; - item->shortcut = type->menuShortcut; - item->verb = create_verb_from_component_number_and_type_id (component_num, type->id); - item->tooltip = type->tooltip; - item->component_id = g_strdup (evolution_shell_component_client_get_id (component->component_client)); - item->folder_type = g_strdup (type->folderType); - - if (strcmp (item->component_id, EVOLUTION_MAIL_OAFIID) == 0 - && strcmp (type->id, "message") == 0) - default_verb = item->verb; - - if (type->icon.width == 0 || type->icon.height == 0) - item->icon = NULL; - else - item->icon = e_new_gdk_pixbuf_from_corba_icon (& type->icon, 16, 16); - - menu_items = g_slist_prepend (menu_items, item); - } - } - - component_num ++; - } - - priv->menu_items = menu_items; - - priv->default_menu_item = NULL; - if (default_verb != NULL) { - for (p = priv->menu_items; p != NULL; p = p->next) { - const MenuItem *item; - - item = (const MenuItem *) p->data; - if (strcmp (item->verb, default_verb) == 0) - priv->default_menu_item = item; - } - } -} - -static void -free_menu_items (GSList *menu_items) -{ - GSList *p; - - if (menu_items == NULL) - return; - - for (p = menu_items; p != NULL; p = p->next) { - MenuItem *item; - - item = (MenuItem *) p->data; - g_free (item->verb); - - if (item->icon != NULL) - g_object_unref (item->icon); - - g_free (item->component_id); - - g_free (item); - } - - g_slist_free (menu_items); -} - -static const MenuItem * -get_default_action_for_view (EShellUserCreatableItemsHandler *handler, - EShellView *shell_view) -{ - EShellUserCreatableItemsHandlerPrivate *priv; - const char *view_component_id; - const GSList *p; - - priv = handler->priv; - - view_component_id = e_shell_view_get_current_component_id (shell_view); - if (view_component_id == NULL) - return priv->default_menu_item; - - for (p = priv->menu_items; p != NULL; p = p->next) { - const MenuItem *item; - - item = (const MenuItem *) p->data; - if (item_is_default (item, - e_shell_view_get_current_folder_type (shell_view), - e_shell_view_get_current_component_id (shell_view))) - return item; - } - - return priv->default_menu_item; -} - - -/* The XML description for "File -> New". */ - -/* This adds a menu item for @item. If @first is true, the keyboard shortcut - is going to be "Control-N" instead of whatever the component defines. */ -static void -append_xml_for_menu_item (GString *xml, - const MenuItem *item, - gboolean first) -{ - char *encoded_label; - char *encoded_tooltip; - - encoded_label = bonobo_ui_util_encode_str (item->label); - g_string_append_printf (xml, "<menuitem name=\"New:%s\" verb=\"%s\" label=\"%s\"", - item->verb, item->verb, encoded_label); - - if (first) - g_string_append_printf (xml, " accel=\"*Control*N\""); - else if (item->shortcut != '\0') - g_string_append_printf (xml, " accel=\"*Control**Shift*%c\"", item->shortcut); - - if (item->icon != NULL) { - char *icon_xml; - - icon_xml = bonobo_ui_util_pixbuf_to_xml (item->icon); - g_string_append_printf (xml, " pixtype=\"pixbuf\" pixname=\"%s\"", icon_xml); - g_free (icon_xml); - } - - encoded_tooltip = bonobo_ui_util_encode_str (item->tooltip); - g_string_append_printf (xml, " tip=\"%s\"", encoded_tooltip); - - g_string_append (xml, "/> "); - - g_free (encoded_label); - g_free (encoded_tooltip); -} - -static int -item_types_sort_func (const void *a, - const void *b) -{ - const MenuItem *item_a; - const MenuItem *item_b; - const char *p1, *p2; - - item_a = (const MenuItem *) a; - item_b = (const MenuItem *) b; - - p1 = item_a->label; - p2 = item_b->label; - - while (*p1 != '\0' && *p2 != '\0') { - if (*p1 == '_') { - p1 ++; - continue; - } - - if (*p2 == '_') { - p2 ++; - continue; - } - - if (toupper ((int) *p1) < toupper ((int) *p2)) - return -1; - else if (toupper ((int) *p1) > toupper ((int) *p2)) - return +1; - - p1 ++, p2 ++; - } - - if (*p1 == '\0') { - if (*p2 == '\0') - return 0; - else - return -1; - } else { - return +1; - } -} - -static char * -create_menu_xml (EShellUserCreatableItemsHandler *handler, - const char *folder_type, - const char *component_id) -{ - EShellUserCreatableItemsHandlerPrivate *priv; - GString *xml; - GSList *p; - GSList *non_default_items; - char *retval; - - priv = handler->priv; - - ensure_menu_items (handler); - - xml = g_string_new (""); - - g_string_append (xml, "<placeholder name=\"ComponentItems\">"); - g_string_append (xml, "<placeholder name=\"EShellUserCreatableItemsPlaceholder\">"); - - /* 1. Add all the elements that are default for this component. (Note - that we don't need to do any sorting since the items are already - sorted alphabetically.) */ - - if (component_id != NULL) { - gboolean first = TRUE; - - for (p = priv->menu_items; p != NULL; p = p->next) { - const MenuItem *item; - - item = (const MenuItem *) p->data; - if (item_is_default (item, folder_type, component_id)) { - append_xml_for_menu_item (xml, item, first); - first = FALSE; - } - } - } - - /* 2. Add a separator. */ - - if (component_id != NULL) - g_string_append_printf (xml, - "<separator f=\"\" name=\"EShellUserCreatableItemsHandlerSeparator\"/>"); - - /* 3. Add the elements that are not default for this component. */ - - non_default_items = NULL; - for (p = priv->menu_items; p != NULL; p = p->next) { - const MenuItem *item; - - item = (const MenuItem *) p->data; - if (! item_is_default (item, folder_type, component_id)) - non_default_items = g_slist_prepend (non_default_items, (void *) item); - } - - non_default_items = g_slist_sort (non_default_items, item_types_sort_func); - for (p = non_default_items; p != NULL; p = p->next) - append_xml_for_menu_item (xml, (const MenuItem *) p->data, FALSE); - g_slist_free (non_default_items); - - /* Done... */ - - g_string_append (xml, "</placeholder>"); /* EShellUserCreatableItemsPlaceholder */ - g_string_append (xml, "</placeholder>"); /* ComponentItems */ - - retval = xml->str; - g_string_free (xml, FALSE); - - return retval; -} - - -/* Verb handling. */ - -static void -execute_verb (EShellUserCreatableItemsHandler *handler, - EShellView *shell_view, - const char *verb_name) -{ - EShellUserCreatableItemsHandlerPrivate *priv; - const Component *component; - int component_number; - const char *p; - const char *id; - GSList *component_list_item; - int i; - - priv = handler->priv; - - p = strchr (verb_name, ':'); - g_assert (p != NULL); - component_number = atoi (p + 1); - - p = strchr (p + 1, ':'); - g_assert (p != NULL); - id = p + 1; - - component_list_item = g_slist_nth (priv->components, component_number); - g_assert (component_list_item != NULL); - - component = (const Component *) component_list_item->data; - - if (component->type_list == NULL) - return; - - for (i = 0; i < component->type_list->_length; i ++) { - if (strcmp (component->type_list->_buffer[i].id, id) == 0) { - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - GNOME_Evolution_ShellComponent_userCreateNewItem - (evolution_shell_component_client_corba_objref (component->component_client), - id, - e_safe_corba_string (e_shell_view_get_current_physical_uri (shell_view)), - e_safe_corba_string (e_shell_view_get_current_folder_type (shell_view)), - &ev); - - if (ev._major != CORBA_NO_EXCEPTION) - g_warning ("Error in userCreateNewItem -- %s", BONOBO_EX_REPOID (&ev)); - - CORBA_exception_free (&ev); - return; - } - } -} - -static void -verb_fn (BonoboUIComponent *ui_component, - void *data, - const char *verb_name) -{ - EShellUserCreatableItemsHandler *handler; - EShellView *shell_view; - - shell_view = g_object_get_data (G_OBJECT (ui_component), SHELL_VIEW_KEY); - g_assert (E_IS_SHELL_VIEW (shell_view)); - - handler = E_SHELL_USER_CREATABLE_ITEMS_HANDLER (data); - - execute_verb (handler, shell_view, verb_name); -} - -static void -add_verbs (EShellUserCreatableItemsHandler *handler, - EShellView *shell_view) -{ - EShellUserCreatableItemsHandlerPrivate *priv; - BonoboUIComponent *ui_component; - int component_num; - GSList *p; - - priv = handler->priv; - - ui_component = e_shell_view_get_bonobo_ui_component (shell_view); - g_object_set_data (G_OBJECT (ui_component), SHELL_VIEW_KEY, shell_view); - - component_num = 0; - for (p = priv->components; p != NULL; p = p->next) { - const Component *component; - int i; - - component = (const Component *) p->data; - - if (component->type_list != NULL) { - for (i = 0; i < component->type_list->_length; i ++) { - char *verb_name; - - verb_name = create_verb_from_component_number_and_type_id - (component_num, component->type_list->_buffer[i].id); - - bonobo_ui_component_add_verb (ui_component, verb_name, verb_fn, handler); - - g_free (verb_name); - } - } - - component_num ++; - } -} - - -/* The "New" button in the toolbar. */ - -static void -combo_button_activate_default_callback (EComboButton *combo_button, - void *data) -{ - EShellView *shell_view; - EShellUserCreatableItemsHandler *handler; - const MenuItem *menu_item; - - shell_view = E_SHELL_VIEW (data); - handler = e_shell_get_user_creatable_items_handler (e_shell_view_get_shell (shell_view)); - - menu_item = get_default_action_for_view (handler, shell_view); - execute_verb (handler, shell_view, menu_item->verb); -} - -static void -setup_toolbar_button (EShellUserCreatableItemsHandler *handler, - EShellView *shell_view) -{ - EShellUserCreatableItemsHandlerPrivate *priv; - BonoboUIComponent *ui_component; - GtkWidget *combo_button; - GtkWidget *menu; - GtkTooltips *tooltips; - BonoboControl *control; - - priv = handler->priv; - - menu = gtk_menu_new (); - - combo_button = e_combo_button_new (); - e_combo_button_set_menu (E_COMBO_BUTTON (combo_button), GTK_MENU (menu)); - e_combo_button_set_label (E_COMBO_BUTTON (combo_button), _("New")); - gtk_widget_show (combo_button); - - g_signal_connect (combo_button, "activate_default", - G_CALLBACK (combo_button_activate_default_callback), - shell_view); - - ui_component = e_shell_view_get_bonobo_ui_component (shell_view); - bonobo_window_add_popup (BONOBO_WINDOW (shell_view), GTK_MENU (menu), "/popups/NewPopup"); - - control = bonobo_control_new (combo_button); - - bonobo_ui_component_object_set (ui_component, "/Toolbar/NewComboButton", - BONOBO_OBJREF (control), NULL); - - g_object_set_data (G_OBJECT (shell_view), COMBO_BUTTON_WIDGET_KEY, combo_button); - - tooltips = gtk_tooltips_new (); - g_object_set_data (G_OBJECT (combo_button), TOOLTIPS_KEY, tooltips); -} - - -/* This handles the menus for a given EShellView. We have to rebuild the menu - and set the toolbar button every time the view changes, and clean up when - the view is destroyed. */ - -static void -shell_view_view_changed_callback (EShellView *shell_view, - const char *evolution_path, - const char *physical_uri, - const char *folder_type, - const char *component_id, - void *data) -{ - EShellUserCreatableItemsHandler *handler; - EShellUserCreatableItemsHandlerPrivate *priv; - GtkWidget *combo_button_widget; - GtkTooltips *tooltips; - BonoboUIComponent *ui_component; - const MenuItem *default_menu_item; - char *menu_xml; - - handler = E_SHELL_USER_CREATABLE_ITEMS_HANDLER (data); - priv = handler->priv; - - combo_button_widget = g_object_get_data (G_OBJECT (shell_view), COMBO_BUTTON_WIDGET_KEY); - g_assert (E_IS_COMBO_BUTTON (combo_button_widget)); - - tooltips = g_object_get_data (G_OBJECT (combo_button_widget), TOOLTIPS_KEY); - g_assert (tooltips != NULL); - - default_menu_item = get_default_action_for_view (handler, shell_view); - if (default_menu_item == NULL) { - gtk_widget_set_sensitive (combo_button_widget, FALSE); - e_combo_button_set_label (E_COMBO_BUTTON (combo_button_widget), _("New")); - e_combo_button_set_icon (E_COMBO_BUTTON (combo_button_widget), NULL); - gtk_tooltips_set_tip (tooltips, combo_button_widget, NULL, NULL); - return; - } - - gtk_widget_set_sensitive (combo_button_widget, TRUE); - - e_combo_button_set_icon (E_COMBO_BUTTON (combo_button_widget), default_menu_item->icon); - gtk_tooltips_set_tip (tooltips, combo_button_widget, default_menu_item->tooltip, NULL); - - ui_component = e_shell_view_get_bonobo_ui_component (shell_view); - bonobo_ui_component_rm (ui_component, "/menu/File/New/ComponentItems/EShellUserCreatableItemsPlaceholder", NULL); - bonobo_ui_component_rm (ui_component, "/popups/NewPopup/ComponentItems/EShellUserCreatableItemsPlaceholder", NULL); - - menu_xml = create_menu_xml (handler, - e_shell_view_get_current_folder_type (shell_view), - e_shell_view_get_current_component_id (shell_view)); - bonobo_ui_component_set (ui_component, "/menu/File/New", menu_xml, NULL); - bonobo_ui_component_set (ui_component, "/popups/NewPopup", menu_xml, NULL); - g_free (menu_xml); -} - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - EShellUserCreatableItemsHandler *handler; - EShellUserCreatableItemsHandlerPrivate *priv; - GSList *p; - - handler = E_SHELL_USER_CREATABLE_ITEMS_HANDLER (object); - priv = handler->priv; - - for (p = priv->components; p != NULL; p = p->next) - component_free ((Component *) p->data); - - g_slist_free (priv->components); - priv->components = NULL; - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EShellUserCreatableItemsHandler *handler; - EShellUserCreatableItemsHandlerPrivate *priv; - - handler = E_SHELL_USER_CREATABLE_ITEMS_HANDLER (object); - priv = handler->priv; - - free_menu_items (priv->menu_items); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -class_init (GObjectClass *object_class) -{ - parent_class = g_type_class_ref(PARENT_TYPE); - - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; -} - -static void -init (EShellUserCreatableItemsHandler *shell_user_creatable_items_handler) -{ - EShellUserCreatableItemsHandlerPrivate *priv; - - priv = g_new (EShellUserCreatableItemsHandlerPrivate, 1); - priv->components = NULL; - priv->menu_items = NULL; - priv->default_menu_item = NULL; - - shell_user_creatable_items_handler->priv = priv; -} - - -EShellUserCreatableItemsHandler * -e_shell_user_creatable_items_handler_new (void) -{ - EShellUserCreatableItemsHandler *new; - - new = g_object_new (e_shell_user_creatable_items_handler_get_type (), NULL); - - return new; -} - -void -e_shell_user_creatable_items_handler_add_component (EShellUserCreatableItemsHandler *handler, - const char *id, - EvolutionShellComponentClient *shell_component_client) -{ - EShellUserCreatableItemsHandlerPrivate *priv; - - g_return_if_fail (handler != NULL); - g_return_if_fail (E_IS_SHELL_USER_CREATABLE_ITEMS_HANDLER (handler)); - g_return_if_fail (shell_component_client != NULL); - g_return_if_fail (EVOLUTION_IS_SHELL_COMPONENT_CLIENT (shell_component_client)); - - priv = handler->priv; - - priv->components = g_slist_prepend (priv->components, component_new (id, shell_component_client)); -} - - -/** - * e_shell_user_creatable_items_handler_attach_menus: - * @handler: - * @shell_view: - * - * Set up the menus and toolbar items for @shell_view. When the shell changes - * view, the menu and the toolbar item will update automatically (i.e. the - * actions for the current folder will go on top etc.). - **/ -void -e_shell_user_creatable_items_handler_attach_menus (EShellUserCreatableItemsHandler *handler, - EShellView *shell_view) -{ - BonoboUIComponent *ui_component; - EShellUserCreatableItemsHandlerPrivate *priv; - char *menu_xml; - - g_return_if_fail (handler != NULL); - g_return_if_fail (E_IS_SHELL_USER_CREATABLE_ITEMS_HANDLER (handler)); - g_return_if_fail (shell_view != NULL); - g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); - - priv = handler->priv; - - setup_toolbar_button (handler, shell_view); - g_signal_connect (shell_view, "view_changed", - G_CALLBACK (shell_view_view_changed_callback), handler); - - add_verbs (handler, shell_view); - menu_xml = create_menu_xml (handler, - e_shell_view_get_current_component_id (shell_view), - e_shell_view_get_current_folder_type (shell_view)); - - ui_component = e_shell_view_get_bonobo_ui_component (shell_view); - bonobo_ui_component_set (ui_component, "/menu/File/New", menu_xml, NULL); - bonobo_ui_component_set (ui_component, "/popups/NewPopup", menu_xml, NULL); - - g_free (menu_xml); -} - - -E_MAKE_TYPE (e_shell_user_creatable_items_handler, - "EShellUserCreatableItemsHandler", EShellUserCreatableItemsHandler, - class_init, init, PARENT_TYPE) diff --git a/shell/e-shell-user-creatable-items-handler.h b/shell/e-shell-user-creatable-items-handler.h deleted file mode 100644 index 228603573a..0000000000 --- a/shell/e-shell-user-creatable-items-handler.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-user-creatable-items-handler.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifndef _E_SHELL_USER_CREATABLE_ITEMS_HANDLER_H_ -#define _E_SHELL_USER_CREATABLE_ITEMS_HANDLER_H_ - -#include "evolution-shell-component-client.h" - -#include <glib-object.h> -#include <bonobo/bonobo-ui-component.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_SHELL_USER_CREATABLE_ITEMS_HANDLER (e_shell_user_creatable_items_handler_get_type ()) -#define E_SHELL_USER_CREATABLE_ITEMS_HANDLER(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SHELL_USER_CREATABLE_ITEMS_HANDLER, EShellUserCreatableItemsHandler)) -#define E_SHELL_USER_CREATABLE_ITEMS_HANDLER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SHELL_USER_CREATABLE_ITEMS_HANDLER, EShellUserCreatableItemsHandlerClass)) -#define E_IS_SHELL_USER_CREATABLE_ITEMS_HANDLER(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SHELL_USER_CREATABLE_ITEMS_HANDLER)) -#define E_IS_SHELL_USER_CREATABLE_ITEMS_HANDLER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SHELL_USER_CREATABLE_ITEMS_HANDLER)) - - -typedef struct _EShellUserCreatableItemsHandler EShellUserCreatableItemsHandler; -typedef struct _EShellUserCreatableItemsHandlerPrivate EShellUserCreatableItemsHandlerPrivate; -typedef struct _EShellUserCreatableItemsHandlerClass EShellUserCreatableItemsHandlerClass; - -#include "e-shell-view.h" - -struct _EShellUserCreatableItemsHandler { - GObject parent; - - EShellUserCreatableItemsHandlerPrivate *priv; -}; - -struct _EShellUserCreatableItemsHandlerClass { - GObjectClass parent_class; -}; - - -GtkType e_shell_user_creatable_items_handler_get_type (void); -EShellUserCreatableItemsHandler *e_shell_user_creatable_items_handler_new (void); - -void e_shell_user_creatable_items_handler_add_component (EShellUserCreatableItemsHandler *handler, - const char *id, - EvolutionShellComponentClient *shell_component_client); - -void e_shell_user_creatable_items_handler_attach_menus (EShellUserCreatableItemsHandler *handler, - EShellView *shell_view); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_SHELL_USER_CREATABLE_ITEMS_HANDLER_H_ */ diff --git a/shell/e-shell-utils.c b/shell/e-shell-utils.c deleted file mode 100644 index 195b25b986..0000000000 --- a/shell/e-shell-utils.c +++ /dev/null @@ -1,149 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-utils.c - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <string.h> - -#include <glib.h> - -#include <libgnome/gnome-util.h> -#include <libgnome/gnome-i18n.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 = g_build_filename (EVOLUTION_IMAGES, icon_name, NULL); - - if (g_file_test (icon_path, G_FILE_TEST_EXISTS)) { - return icon_path; - } else { - g_free (icon_path); - return NULL; - } -} - -static char * -get_mini_name (const char *icon_name) -{ - const char *dot_ptr; - char *basename; - char *name_without_extension; - char *mini_name; - - basename = g_path_get_basename (icon_name); - if (basename == NULL) - return NULL; - - dot_ptr = strrchr (basename, '.'); - - if (dot_ptr == NULL) { - /* No extension. */ - g_free (basename); - return g_strconcat (icon_name, E_SHELL_MINI_ICON_SUFFIX, NULL); - } - - name_without_extension = g_strndup (icon_name, dot_ptr - basename); - mini_name = g_strconcat (name_without_extension, E_SHELL_MINI_ICON_SUFFIX, - dot_ptr, NULL); - g_free (name_without_extension); - - g_free (basename); - 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); -} - - -gboolean -e_shell_folder_name_is_valid (const char *name, - const char **reason_return) -{ - if (name == NULL || *name == '\0') { - if (reason_return != NULL) - *reason_return = _("No folder name specified."); - return FALSE; - } - - /* GtkEntry is broken - if you hit KP_ENTER you get a \r inserted... */ - if (strchr (name, '\r')) { - if (reason_return != NULL) - *reason_return = _("Folder name cannot contain the Return character."); - return FALSE; - } - - if (strchr (name, E_PATH_SEPARATOR) != NULL) { - if (reason_return != NULL) - *reason_return = _("Folder name cannot contain the character \"/\"."); - return FALSE; - } - - if (strchr (name, '#') != NULL) { - if (reason_return != NULL) - *reason_return = _("Folder name cannot contain the character \"#\"."); - return FALSE; - } - - if (strcmp (name, ".") == 0 || strcmp (name, "..") == 0) { - if (reason_return != NULL) - *reason_return = _("'.' and '..' are reserved folder names."); - return FALSE; - } - - *reason_return = NULL; - - return TRUE; -} - diff --git a/shell/e-shell-utils.h b/shell/e-shell-utils.h deleted file mode 100644 index f6bf62de8a..0000000000 --- a/shell/e-shell-utils.h +++ /dev/null @@ -1,34 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-utils.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 - -#include <glib.h> - -char *e_shell_get_icon_path (const char *icon_name, - gboolean try_mini); - -gboolean e_shell_folder_name_is_valid (const char *name, - const char **reason_return); - -#endif diff --git a/shell/e-shell-view-menu.c b/shell/e-shell-view-menu.c deleted file mode 100644 index 0b9bc8c071..0000000000 --- a/shell/e-shell-view-menu.c +++ /dev/null @@ -1,868 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-view-menu.c - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 - */ - -/* FIXME: This file is a bit of a mess. */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-shell-view-menu.h" - -#include "e-shell-shared-folder-picker-dialog.h" -#include "e-shell-folder-creation-dialog.h" -#include "e-shell-folder-selection-dialog.h" - -#include "e-shell-constants.h" - -#include "e-shell-importer.h" -#include "e-shell-about-box.h" - -#include "e-shell-folder-commands.h" - -#include "evolution-shell-component-utils.h" - -#include "e-util/e-dialog-utils.h" - -#include <glib.h> - -#include <gtk/gtksignal.h> -#include <gtk/gtkmain.h> -#include <gtk/gtkwindow.h> - -#include <libgnome/gnome-exec.h> -#include <libgnome/gnome-help.h> -#include <libgnome/gnome-i18n.h> -#include <libgnome/gnome-url.h> -#include <libgnome/gnome-util.h> -#include <libgnomeui/gnome-about.h> - - -/* Utility functions. */ - -static const char * -get_path_for_folder_op (EShellView *shell_view) -{ - const char *path; - - path = e_shell_view_get_folder_bar_right_click_path (shell_view); - if (path != NULL) - return path; - - return e_shell_view_get_current_path (shell_view); -} - -static void -launch_pilot_settings (const char *extra_arg) -{ - char *args[] = { - "gpilotd-control-applet", - (char *) extra_arg, - NULL - }; - int pid; - - args[0] = g_find_program_in_path ("gpilotd-control-applet"); - if (!args[0]) { - e_notice (NULL, GTK_MESSAGE_ERROR, - _("The GNOME Pilot tools do not appear to be installed on this system.")); - return; - } - - pid = gnome_execute_async (NULL, extra_arg ? 2 : 1, args); - g_free (args[0]); - - if (pid == -1) - e_notice (NULL, GTK_MESSAGE_ERROR, _("Error executing %s."), args[0]); -} - - -/* EShellView callbacks. */ - -static void -shortcut_bar_visibility_changed_cb (EShellView *shell_view, - gboolean visible, - void *data) -{ - BonoboUIComponent *uic; - const char *path; - const char *txt; - - if (visible) - txt = "1"; - else - txt = "0"; - - path = (const char *) data; - uic = e_shell_view_get_bonobo_ui_component (shell_view); - - bonobo_ui_component_set_prop (uic, path, "state", txt, NULL); -} - -static void -folder_bar_visibility_changed_cb (EShellView *shell_view, - gboolean visible, - void *data) -{ - BonoboUIComponent *uic; - const char *path; - const char *txt; - - if (visible) - txt = "1"; - else - txt = "0"; - - path = (const char *) data; - uic = e_shell_view_get_bonobo_ui_component (shell_view); - - bonobo_ui_component_set_prop (uic, path, "state", txt, NULL); -} - - -/* Command callbacks. */ - -static void -command_close (BonoboUIComponent *uih, - void *data, - const char *path) -{ - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (data); - - if (e_shell_request_close_view (e_shell_view_get_shell (shell_view), shell_view)) - gtk_widget_destroy (GTK_WIDGET (shell_view)); -} - -static void -command_quit (BonoboUIComponent *uih, - void *data, - const char *path) -{ - EShellView *shell_view; - EShell *shell; - - shell_view = E_SHELL_VIEW (data); - - e_shell_view_save_defaults (shell_view); - - shell = e_shell_view_get_shell (shell_view); - - if (e_shell_prepare_for_quit (shell)) - e_shell_destroy_all_views (shell); -} - -static void -command_submit_bug (BonoboUIComponent *uih, - void *data, - const char *path) -{ - int pid; - char *args[] = { - "bug-buddy", - "--sm-disable", - "--package=evolution", - "--package-ver="VERSION, - NULL - }; - - args[0] = g_find_program_in_path ("bug-buddy"); - if (!args[0]) { - e_notice (NULL, GTK_MESSAGE_ERROR, _("Bug buddy is not installed.")); - return; - } - - pid = gnome_execute_async (NULL, 4, args); - g_free (args[0]); - - if (pid == -1) - e_notice (NULL, GTK_MESSAGE_ERROR, _("Bug buddy could not be run.")); -} - -static int -about_box_event_callback (GtkWidget *widget, - GdkEvent *event, - void *data) -{ - GtkWidget **widget_pointer; - - widget_pointer = (GtkWidget **) data; - - gtk_widget_destroy (GTK_WIDGET (*widget_pointer)); - *widget_pointer = NULL; - - return TRUE; -} - -static void -command_about_box (BonoboUIComponent *uih, - void *data, - const char *path) -{ - static GtkWidget *about_box_window = NULL; - GtkWidget *about_box; - - if (about_box_window != NULL) { - gdk_window_raise (about_box_window->window); - return; - } - - about_box = e_shell_about_box_new (); - gtk_widget_show (about_box); - - about_box_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_type_hint (GTK_WINDOW (about_box_window), GDK_WINDOW_TYPE_HINT_DIALOG); - - gtk_window_set_resizable (GTK_WINDOW (about_box_window), FALSE); - g_signal_connect (about_box_window, "key_press_event", - G_CALLBACK (about_box_event_callback), &about_box_window); - g_signal_connect (about_box_window, "button_press_event", - G_CALLBACK (about_box_event_callback), &about_box_window); - g_signal_connect (about_box_window, "delete_event", - G_CALLBACK (about_box_event_callback), &about_box_window); - - gtk_window_set_transient_for (GTK_WINDOW (about_box_window), GTK_WINDOW (data)); - gtk_window_set_title (GTK_WINDOW (about_box_window), _("About Ximian Evolution")); - gtk_container_add (GTK_CONTAINER (about_box_window), about_box); - gtk_widget_show (about_box_window); -} - -static void -command_help_faq (BonoboUIComponent *uih, - void *data, - const char *path) -{ - gnome_url_show ("http://www.ximian.com/apps/evolution-faq.html", NULL); /* FIXME use the error */ -} - -static void -command_toggle_folder_bar (BonoboUIComponent *component, - const char *path, - Bonobo_UIComponent_EventType type, - const char *state, - gpointer user_data) -{ - EShellView *shell_view; - gboolean show; - - if (type != Bonobo_UIComponent_STATE_CHANGED) - return; - - shell_view = E_SHELL_VIEW (user_data); - show = atoi (state); - - e_shell_view_show_folder_bar (shell_view, show); -} - -static void -command_toggle_shortcut_bar (BonoboUIComponent *component, - const char *path, - Bonobo_UIComponent_EventType type, - const char *state, - gpointer user_data) -{ - EShellView *shell_view; - gboolean show; - - if (type != Bonobo_UIComponent_STATE_CHANGED) - return; - - shell_view = E_SHELL_VIEW (user_data); - - show = atoi (state); - - e_shell_view_show_shortcut_bar (shell_view, show); -} - - -static void -command_send_receive (BonoboUIComponent *ui_component, - 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_send_receive (shell); -} - -static void -command_new_folder (BonoboUIComponent *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_show_folder_creation_dialog (shell, GTK_WINDOW (shell_view), - get_path_for_folder_op (shell_view), - NULL, - NULL /* result_callback */, - NULL /* result_callback_data */); -} - -static void -command_activate_view (BonoboUIComponent *uih, - void *data, - const char *path) -{ - EShellView *shell_view; - char *uri; - - shell_view = E_SHELL_VIEW (data); - - uri = g_strconcat (E_SHELL_URI_PREFIX, get_path_for_folder_op (shell_view), NULL); - e_shell_view_display_uri (shell_view, uri, TRUE); - g_free (uri); -} - -static void -command_open_folder_in_new_window (BonoboUIComponent *uih, - gpointer data, - const char *path) -{ - EShellView *shell_view, *new_view; - EShell *shell; - char *uri; - - shell_view = E_SHELL_VIEW (data); - shell = e_shell_view_get_shell (shell_view); - - uri = g_strconcat (E_SHELL_URI_PREFIX, get_path_for_folder_op (shell_view), NULL); - new_view = e_shell_create_view (shell, uri, shell_view); - g_free (uri); - - e_shell_view_show_shortcut_bar (new_view, FALSE); - e_shell_view_show_folder_bar (new_view, FALSE); -} - - -/* Folder operations. */ - -static void -command_move_folder (BonoboUIComponent *uih, - void *data, - const char *path) -{ - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (data); - e_shell_command_move_folder (e_shell_view_get_shell (shell_view), shell_view, - get_path_for_folder_op (shell_view)); -} - -static void -command_copy_folder (BonoboUIComponent *uih, - void *data, - const char *path) -{ - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (data); - e_shell_command_copy_folder (e_shell_view_get_shell (shell_view), shell_view, - get_path_for_folder_op (shell_view)); -} - -static void -command_delete_folder (BonoboUIComponent *uih, - void *data, - const char *path) -{ - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (data); - e_shell_command_delete_folder (e_shell_view_get_shell (shell_view), shell_view, - get_path_for_folder_op (shell_view)); -} - -static void -command_rename_folder (BonoboUIComponent *uih, - void *data, - const char *path) -{ - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (data); - e_shell_command_rename_folder (e_shell_view_get_shell (shell_view), shell_view, - get_path_for_folder_op (shell_view)); -} - -static void -command_add_folder_to_shortcut_bar (BonoboUIComponent *uih, - void *data, - const char *path) -{ - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (data); - e_shell_command_add_to_shortcut_bar (e_shell_view_get_shell (shell_view), shell_view, - get_path_for_folder_op (shell_view)); -} - - -/* Opening and removing other users' folders. */ - -static void -command_open_other_users_folder (BonoboUIComponent *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_show_shared_folder_picker_dialog (shell, shell_view); -} - -static void -command_remove_other_users_folder (BonoboUIComponent *uih, - void *data, - const char *path) -{ - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (data); - e_shell_command_remove_shared_folder (e_shell_view_get_shell (shell_view), shell_view, - get_path_for_folder_op (shell_view)); -} - - -/* Going to a folder. */ - -static void -goto_folder_dialog_cancelled_cb (EShellFolderSelectionDialog *folder_selection_dialog, - void *data) -{ - gtk_widget_destroy (GTK_WIDGET (folder_selection_dialog)); -} - -static void -goto_folder_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, TRUE); - g_free (uri); - } -} - -static void -command_goto_folder (BonoboUIComponent *uih, - gpointer 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..."), - _("Select the folder that you want to open"), - current_uri, - NULL, TRUE); - - gtk_window_set_transient_for (GTK_WINDOW (folder_selection_dialog), GTK_WINDOW (shell_view)); - - g_signal_connect (folder_selection_dialog, "cancelled", - G_CALLBACK (goto_folder_dialog_cancelled_cb), shell_view); - g_signal_connect (folder_selection_dialog, "folder_selected", - G_CALLBACK (goto_folder_dialog_folder_selected_cb), shell_view); - - gtk_widget_show (folder_selection_dialog); -} - -static void -command_create_folder (BonoboUIComponent *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_command_create_new_folder (shell, shell_view, get_path_for_folder_op (shell_view)); -} - - -static void -command_work_offline (BonoboUIComponent *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_go_offline (shell, shell_view); -} - -static void -command_work_online (BonoboUIComponent *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_go_online (shell, shell_view); -} - - -static void -new_shortcut_dialog_cancelled_cb (EShellFolderSelectionDialog *folder_selection_dialog, - void *data) -{ - gtk_widget_destroy (GTK_WIDGET (folder_selection_dialog)); -} - -static void -new_shortcut_dialog_folder_selected_cb (EShellFolderSelectionDialog *folder_selection_dialog, - const char *path, - void *data) -{ - EShellView *shell_view; - EShell *shell; - EShortcuts *shortcuts; - EFolder *folder; - int group_num; - char *evolution_uri; - - if (path == NULL) - return; - - shell_view = E_SHELL_VIEW (data); - shell = e_shell_view_get_shell (shell_view); - shortcuts = e_shell_get_shortcuts (shell); - - folder = e_storage_set_get_folder (e_shell_get_storage_set (shell), path); - if (folder == NULL) - return; - - group_num = e_shell_view_get_current_shortcuts_group_num (shell_view); - - evolution_uri = g_strconcat (E_SHELL_URI_PREFIX, path, NULL); - - /* FIXME: I shouldn't have to set the type here. Maybe. */ - e_shortcuts_add_shortcut (shortcuts, group_num, -1, evolution_uri, NULL, - e_folder_get_unread_count (folder), - e_folder_get_type_string (folder), - e_folder_get_custom_icon_name (folder)); - - g_free (evolution_uri); - - gtk_widget_destroy (GTK_WIDGET (folder_selection_dialog)); -} - -static void -command_new_shortcut (BonoboUIComponent *uih, - void *data, - const char *path) -{ - EShellView *shell_view; - GtkWidget *folder_selection_dialog; - - shell_view = E_SHELL_VIEW (data); - - folder_selection_dialog = e_shell_folder_selection_dialog_new (e_shell_view_get_shell (shell_view), - _("Create New Shortcut"), - _("Select the folder you want the shortcut to point to:"), - e_shell_view_get_current_uri (shell_view), - NULL, TRUE); - - g_signal_connect (folder_selection_dialog, "cancelled", - G_CALLBACK (new_shortcut_dialog_cancelled_cb), shell_view); - g_signal_connect (folder_selection_dialog, "folder_selected", - G_CALLBACK (new_shortcut_dialog_folder_selected_cb), shell_view); - - gtk_widget_show (folder_selection_dialog); -} - - -/* Tools menu. */ - -static void -command_settings (BonoboUIComponent *uih, - void *data, - const char *path) -{ - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (data); - - e_shell_view_show_settings (shell_view); -} - -static void -command_pilot_settings (BonoboUIComponent *uih, - void *data, - const char *path) -{ - launch_pilot_settings (NULL); -} - - -static BonoboUIVerb new_verbs [] = { - BONOBO_UI_VERB ("NewFolder", command_new_folder), - BONOBO_UI_VERB ("NewShortcut", command_new_shortcut), - - BONOBO_UI_VERB_END -}; - -static BonoboUIVerb file_verbs [] = { - BONOBO_UI_VERB ("FileImporter", (BonoboUIVerbFn) show_import_wizard), - BONOBO_UI_VERB ("FileOpenOtherUsersFolder", command_open_other_users_folder), - BONOBO_UI_VERB ("FileRemoveOtherUsersFolder", command_remove_other_users_folder), - BONOBO_UI_VERB ("FileGoToFolder", command_goto_folder), - BONOBO_UI_VERB ("FileCreateFolder", command_create_folder), - BONOBO_UI_VERB ("FileClose", command_close), - BONOBO_UI_VERB ("FileExit", command_quit), - - BONOBO_UI_VERB ("WorkOffline", command_work_offline), - BONOBO_UI_VERB ("WorkOnline", command_work_online), - - BONOBO_UI_VERB_END -}; - -static BonoboUIVerb folder_verbs [] = { - BONOBO_UI_VERB ("ActivateView", command_activate_view), - BONOBO_UI_VERB ("OpenFolderInNewWindow", command_open_folder_in_new_window), - BONOBO_UI_VERB ("MoveFolder", command_move_folder), - BONOBO_UI_VERB ("CopyFolder", command_copy_folder), - - BONOBO_UI_VERB ("DeleteFolder", command_delete_folder), - BONOBO_UI_VERB ("RenameFolder", command_rename_folder), - - BONOBO_UI_VERB ("AddFolderToShortcutBar", command_add_folder_to_shortcut_bar), - - BONOBO_UI_VERB_END -}; - -static BonoboUIVerb actions_verbs[] = { - BONOBO_UI_VERB ("SendReceive", command_send_receive), - - BONOBO_UI_VERB_END -}; - -static BonoboUIVerb tools_verbs[] = { - BONOBO_UI_VERB ("Settings", command_settings), - - BONOBO_UI_VERB ("PilotSettings", command_pilot_settings), - - BONOBO_UI_VERB_END -}; - -static BonoboUIVerb help_verbs [] = { - BONOBO_UI_VERB_DATA ("HelpFAQ", command_help_faq, NULL), - - BONOBO_UI_VERB_END -}; - -static EPixmap pixmaps [] = { - E_PIXMAP ("/commands/SendReceive", "send-receive.xpm"), - - E_PIXMAP ("/menu/File/New/Folder", "folder.xpm"), - E_PIXMAP ("/menu/File/Folder/Folder", "folder.xpm"), - E_PIXMAP ("/menu/File/FileImporter", "import.xpm"), - E_PIXMAP ("/menu/File/ToggleOffline", "work_offline.xpm"), - - E_PIXMAP ("/menu/Tools/Settings", "settings-16.png"), - - E_PIXMAP ("/Toolbar/SendReceive", "buttons/send-24-receive.png"), - - E_PIXMAP ("/popups/NewPopup/Folder", "folder.xpm"), - - E_PIXMAP_END -}; - -static EPixmap offline_pixmaps [] = { - E_PIXMAP ("/menu/File/ToggleOffline", "work_offline.xpm"), - - E_PIXMAP_END -}; - -static EPixmap online_pixmaps [] = { - E_PIXMAP ("/menu/File/ToggleOffline", "work_online-16.png"), - - E_PIXMAP_END -}; - -static void -menu_do_misc (BonoboUIComponent *component, - EShellView *shell_view) -{ - bonobo_ui_component_add_listener (component, "ViewShortcutBar", - command_toggle_shortcut_bar, shell_view); - bonobo_ui_component_add_listener (component, "ViewFolderBar", - command_toggle_folder_bar, shell_view); - - bonobo_ui_component_add_verb (component, "HelpSubmitBug", - (BonoboUIVerbFn) command_submit_bug, shell_view); - bonobo_ui_component_add_verb (component, "HelpAbout", - (BonoboUIVerbFn) command_about_box, shell_view); -} - - -/* The Work Online / Work Offline menu item. */ - -static void -update_offline_menu_item (EShellView *shell_view, - EShellLineStatus line_status) -{ - BonoboUIComponent *ui_component; - - ui_component = e_shell_view_get_bonobo_ui_component (shell_view); - - switch (line_status) { - case E_SHELL_LINE_STATUS_OFFLINE: - bonobo_ui_component_set_prop (ui_component, - "/menu/File/ToggleOffline", - "label", _("_Work Online"), NULL); - bonobo_ui_component_set_prop (ui_component, - "/menu/File/ToggleOffline", - "verb", "WorkOnline", NULL); - bonobo_ui_component_set_prop (ui_component, - "/commands/ToggleOffline", - "sensitive", "1", NULL); - e_pixmaps_update (ui_component, online_pixmaps); - break; - - case E_SHELL_LINE_STATUS_ONLINE: - bonobo_ui_component_set_prop (ui_component, - "/menu/File/ToggleOffline", - "label", _("_Work Offline"), NULL); - bonobo_ui_component_set_prop (ui_component, - "/menu/File/ToggleOffline", - "verb", "WorkOffline", NULL); - bonobo_ui_component_set_prop (ui_component, - "/commands/ToggleOffline", - "sensitive", "1", NULL); - e_pixmaps_update (ui_component, offline_pixmaps); - break; - - case E_SHELL_LINE_STATUS_GOING_OFFLINE: - bonobo_ui_component_set_prop (ui_component, - "/menu/File/ToggleOffline", - "label", _("Work Offline"), NULL); - bonobo_ui_component_set_prop (ui_component, - "/menu/File/ToggleOffline", - "verb", "WorkOffline", NULL); - bonobo_ui_component_set_prop (ui_component, - "/commands/ToggleOffline", - "sensitive", "0", NULL); - e_pixmaps_update (ui_component, offline_pixmaps); - break; - - default: - g_assert_not_reached (); - } -} - -static void -shell_line_status_changed_cb (EShell *shell, - EShellLineStatus new_status, - void *data) -{ - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (data); - - update_offline_menu_item (shell_view, new_status); -} - - -#define SHORTCUT_BAR_TOGGLE_PATH "/commands/ViewShortcutBar" -#define FOLDER_BAR_TOGGLE_PATH "/commands/ViewFolderBar" - -void -e_shell_view_menu_setup (EShellView *shell_view) -{ - BonoboUIComponent *uic; - EShell *shell; - - g_return_if_fail (shell_view != NULL); - g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); - - uic = e_shell_view_get_bonobo_ui_component (shell_view); - shell = e_shell_view_get_shell (shell_view); - - bonobo_ui_component_add_verb_list_with_data (uic, file_verbs, shell_view); - bonobo_ui_component_add_verb_list_with_data (uic, folder_verbs, shell_view); - bonobo_ui_component_add_verb_list_with_data (uic, new_verbs, shell_view); - - bonobo_ui_component_add_verb_list_with_data (uic, actions_verbs, shell_view); - bonobo_ui_component_add_verb_list_with_data (uic, tools_verbs, shell_view); - - bonobo_ui_component_add_verb_list (uic, help_verbs); - - menu_do_misc (uic, shell_view); - - e_pixmaps_update (uic, pixmaps); - - g_signal_connect (shell_view, "shortcut_bar_visibility_changed", - G_CALLBACK (shortcut_bar_visibility_changed_cb), - SHORTCUT_BAR_TOGGLE_PATH); - g_signal_connect (shell_view, "folder_bar_visibility_changed", - G_CALLBACK (folder_bar_visibility_changed_cb), - FOLDER_BAR_TOGGLE_PATH); - - /* Initialize the toggles. Yeah, this is, well, yuck. */ - folder_bar_visibility_changed_cb (shell_view, e_shell_view_folder_bar_shown (shell_view), - FOLDER_BAR_TOGGLE_PATH); - shortcut_bar_visibility_changed_cb (shell_view, e_shell_view_shortcut_bar_shown (shell_view), - SHORTCUT_BAR_TOGGLE_PATH); - - /* Set up the work online / work offline menu item. */ - g_signal_connect_object (shell, "line_status_changed", - G_CALLBACK (shell_line_status_changed_cb), shell_view, 0); - update_offline_menu_item (shell_view, e_shell_get_line_status (shell)); -} diff --git a/shell/e-shell-view-menu.h b/shell/e-shell-view-menu.h deleted file mode 100644 index 976d70c281..0000000000 --- a/shell/e-shell-view-menu.h +++ /dev/null @@ -1,32 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-view.c - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 "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 e3a4a1422e..0000000000 --- a/shell/e-shell-view.c +++ /dev/null @@ -1,2925 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-view.c - * - * Copyright (C) 2000, 2001, 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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@ximian.com> - * Miguel de Icaza <miguel@ximian.com> - * Matt Loper <matt@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-shell-view.h" - -#include "evolution-shell-view.h" - -#include "e-shell-marshal.h" - -#include "e-history.h" -#include "e-icon-factory.h" -#include "e-shell-constants.h" -#include "e-shell-folder-title-bar.h" -#include "e-shell-utils.h" -#include "e-shell-view-menu.h" -#include "e-shell.h" -#include "e-shortcuts-view.h" -#include "e-storage-set-view.h" -#include "e-title-bar.h" - -#include "e-util/e-gtk-utils.h" - -#include "widgets/misc/e-clipped-label.h" - -#include <gtk/gtkwidget.h> - -#include <sys/stat.h> -#include <sys/types.h> -#include <fcntl.h> -#include <ctype.h> -#include <string.h> - -#include <glib.h> - -#include <libgnome/libgnome.h> -#include <libgnomeui/gnome-window.h> -#include <libgnomeui/gnome-window-icon.h> -#include <libgnomeui/gnome-app.h> - -#include <gtk/gtkscrolledwindow.h> -#include <gconf/gconf-client.h> - -#include <bonobo/bonobo-socket.h> -#include <bonobo/bonobo-ui-util.h> -#include <bonobo/bonobo-ui-container.h> -#include <bonobo/bonobo-ui-engine.h> -#include <bonobo/bonobo-widget.h> -#include <bonobo/bonobo-window.h> - -#include <gal/util/e-util.h> -#include <gal/widgets/e-gui-utils.h> - -static BonoboWindowClass *parent_class = NULL; - -struct _View { - char *uri; - GtkWidget *control; - EFolder *folder; -}; -typedef struct _View View; - -struct _EShellViewPrivate { - /* The shell. */ - EShell *shell; - - /* EvolutionShellView Bonobo object for implementing the - Evolution::ShellView interface. */ - EvolutionShellView *corba_interface; - - /* The UI handler & container. */ - BonoboUIComponent *ui_component; - BonoboUIContainer *ui_container; - - /* History of visited (evolution:) URIs. */ - EHistory *history; - - /* Currently displayed URI. */ - char *uri; - - /* Delayed selection, used when a path doesn't exist in an EStorage. - Cleared when we're signaled with "folder_selected". */ - char *delayed_selection; - - /* uri to go to at timeout */ - unsigned int set_folder_timeout; - char *set_folder_uri; - - /* Tooltips. */ - GtkTooltips *tooltips; - - /* The widgetry. */ - GtkWidget *appbar; - GtkWidget *hpaned; - GtkWidget *view_vbox; - GtkWidget *folder_title_bar; - GtkWidget *view_hpaned; - GtkWidget *contents; - GtkWidget *notebook; - GtkWidget *shortcut_frame; - GtkWidget *shortcut_bar; - GtkWidget *storage_set_title_bar; - GtkWidget *storage_set_view; - GtkWidget *storage_set_view_box; - - /* The status bar widgetry. */ - GtkWidget *status_bar; - GtkWidget *offline_toggle; - GtkWidget *offline_toggle_image; - GtkWidget *menu_hint_label; - GtkWidget *task_bar; - - /* The pop-up window for the folder-tree (i.e. the one we create when - the user clicks on the folder title. */ - GtkWidget *folder_bar_popup; - - /* The views we have already open. */ - GHashTable *uri_to_view; - - /* 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; - - /* Whether the shortcut and folder bars are visible or not. */ - unsigned int shortcut_bar_shown : 1; - unsigned int folder_bar_shown : 1; - - /* List of sockets we created. */ - GList *sockets; -}; - -enum { - SHORTCUT_BAR_VISIBILITY_CHANGED, - FOLDER_BAR_VISIBILITY_CHANGED, - VIEW_CHANGED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -#define DEFAULT_SHORTCUT_BAR_WIDTH 100 - -#define DEFAULT_TREE_WIDTH 130 -#define MIN_POPUP_TREE_WIDTH 130 - -#define DEFAULT_WIDTH 705 -#define DEFAULT_HEIGHT 550 - -#define SET_FOLDER_DELAY 250 - -/* URI to display when the currently displayed folder is removed from the - storage. */ -#define FALLBACK_URI E_SUMMARY_URI - - -/* The icons for the offline/online status. */ - -static GdkPixmap *offline_pixmap = NULL; -static GdkBitmap *offline_mask = NULL; - -static GdkPixmap *online_pixmap = NULL; -static GdkBitmap *online_mask = NULL; - - -static void update_for_current_uri (EShellView *shell_view); -static void update_offline_toggle_status (EShellView *shell_view); -static const char *get_storage_set_path_from_uri (const char *uri); - - -/* Boo. */ -static void new_folder_cb (EStorageSet *storage_set, const char *path, void *data); -static gboolean display_uri (EShellView *shell_view, const char *uri, - gboolean add_to_history, gboolean queue); - - -/* View handling. */ - -static View * -view_new (const char *uri, - GtkWidget *control) -{ - View *new; - - new = g_new (View, 1); - new->uri = g_strdup (uri); - new->control = control; - - return new; -} - -static void -view_destroy (View *view) -{ - g_free (view->uri); - g_free (view); -} - - -/* Utility functions. */ - -static void -update_other_users_folder_items_sensitivity (EShellView *shell_view) -{ - EShellViewPrivate *priv = shell_view->priv; - gboolean a_storage_supports_shared_folders; - GList *storage_list, *p; - - storage_list = e_storage_set_get_storage_list (e_shell_get_storage_set (priv->shell)); - a_storage_supports_shared_folders = FALSE; - for (p = storage_list; p != NULL; p = p->next) { - if (e_storage_supports_shared_folders (E_STORAGE (p->data))) - a_storage_supports_shared_folders = TRUE; - } - - if (a_storage_supports_shared_folders) { - bonobo_ui_component_set_prop (priv->ui_component, "/commands/FileOpenOtherUsersFolder", - "sensitive", "1", NULL); - bonobo_ui_component_set_prop (priv->ui_component, "/commands/FileRemoveOtherUsersFolder", - "sensitive", "1", NULL); - } else { - bonobo_ui_component_set_prop (priv->ui_component, "/commands/FileOpenOtherUsersFolder", - "sensitive", "0", NULL); - bonobo_ui_component_set_prop (priv->ui_component, "/commands/FileRemoveOtherUsersFolder", - "sensitive", "0", NULL); - } - - g_list_foreach (storage_list, (GFunc) g_object_unref, NULL); - g_list_free (storage_list); -} - -static GtkWidget * -create_label_for_empty_page (void) -{ - GtkWidget *label; - - label = e_clipped_label_new (_("(No folder displayed)"), PANGO_WEIGHT_NORMAL, 1.0); - gtk_widget_show (label); - - return label; -} - -/* Initialize the icons. */ -static void -load_images (void) -{ - GdkPixbuf *pixbuf; - - pixbuf = gdk_pixbuf_new_from_file (EVOLUTION_IMAGES "/offline.png", NULL); - if (pixbuf == NULL) { - g_warning ("Cannot load `%s'", EVOLUTION_IMAGES "/offline.png"); - } else { - gdk_pixbuf_render_pixmap_and_mask (pixbuf, &offline_pixmap, &offline_mask, 128); - g_object_unref (pixbuf); - } - - pixbuf = gdk_pixbuf_new_from_file (EVOLUTION_IMAGES "/online.png", NULL); - if (pixbuf == NULL) { - g_warning ("Cannot load `%s'", EVOLUTION_IMAGES "/online.png"); - } else { - gdk_pixbuf_render_pixmap_and_mask (pixbuf, &online_pixmap, &online_mask, 128); - g_object_unref (pixbuf); - } -} - -static void -cleanup_delayed_selection (EShellView *shell_view) -{ - EShellViewPrivate *priv; - - priv = shell_view->priv; - - if (priv->delayed_selection != NULL) { - g_free (priv->delayed_selection); - priv->delayed_selection = NULL; - g_signal_handlers_disconnect_by_func (e_shell_get_storage_set (priv->shell), - G_CALLBACK (new_folder_cb), shell_view); - } -} - -static GtkWidget * -find_socket (GtkContainer *container) -{ - GList *children, *tmp; - - children = gtk_container_get_children(container); - while (children) { - if (BONOBO_IS_SOCKET (children->data)) - return children->data; - else if (GTK_IS_CONTAINER (children->data)) { - GtkWidget *socket = find_socket (children->data); - if (socket) - return socket; - } - tmp = children->next; - g_list_free_1 (children); - children = tmp; - } - return NULL; -} - -static void -setup_verb_sensitivity_for_folder (EShellView *shell_view, - const char *path) -{ - EShellViewPrivate *priv; - BonoboUIComponent *ui_component; - EFolder *folder; - const char *prop; - - priv = shell_view->priv; - - ui_component = e_shell_view_get_bonobo_ui_component (shell_view); - - if (path == NULL) - folder = NULL; - else - folder = e_storage_set_get_folder (e_shell_get_storage_set (priv->shell), path); - - /* Adjust sensitivity for menu options depending on whether the folder - selected can actually be manipulated or not. */ - - if (folder != NULL - && ! e_folder_get_is_stock (folder) - && e_folder_get_physical_uri (folder) != NULL) - prop = "1"; - else - prop = "0"; - bonobo_ui_component_set_prop (ui_component, "/commands/MoveFolder", "sensitive", prop, NULL); - bonobo_ui_component_set_prop (ui_component, "/commands/CopyFolder", "sensitive", prop, NULL); - bonobo_ui_component_set_prop (ui_component, "/commands/DeleteFolder", "sensitive", prop, NULL); - bonobo_ui_component_set_prop (ui_component, "/commands/RenameFolder", "sensitive", prop, NULL); - - /* Adjust sensitivity for menu options depending on whether the user - right-clicked a folder whose contents can be viewed. */ - - if (folder != NULL - && e_folder_type_registry_get_handler_for_type (e_shell_get_folder_type_registry (e_shell_view_get_shell (shell_view)), - e_folder_get_type_string (folder)) != NULL) - prop = "1"; - else - prop = "0"; - bonobo_ui_component_set_prop (ui_component, "/commands/ActivateView", "sensitive", prop, NULL); - bonobo_ui_component_set_prop (ui_component, "/commands/OpenFolderInNewWindow", "sensitive", prop, NULL); - bonobo_ui_component_set_prop (ui_component, "/commands/AddFolderToShortcutBar", "sensitive", prop, NULL); -} - - -static void -update_navigation_buttons (EShellView *shell_view) -{ - EShellViewPrivate *priv; - - priv = shell_view->priv; - - e_shell_folder_title_bar_update_navigation_buttons (E_SHELL_FOLDER_TITLE_BAR (priv->folder_title_bar), - e_history_has_prev (priv->history), - e_history_has_next (priv->history)); -} - -static int -history_uri_matching_func (const void *a, - const void *b) -{ - const char *s1, *s2; - - s1 = (const char *) a; - s2 = (const char *) b; - - return strcmp (s1, s2); -} - -static void -remove_uri_from_history (EShellView *shell_view, - const char *uri) -{ - EShellViewPrivate *priv; - - priv = shell_view->priv; - - e_history_remove_matching (priv->history, uri, history_uri_matching_func); -} - - -static void -setup_defaults (EShellView *shell_view) -{ - EShellViewPrivate *priv; - EShortcutBar *shortcut_bar; - GConfClient *client; - char *file_name; - int shortcut_group; - int width; - - g_return_if_fail (shell_view != NULL); - g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); - - priv = shell_view->priv; - shortcut_bar = E_SHORTCUT_BAR (priv->shortcut_bar); - - client = gconf_client_get_default (); - - gtk_window_set_default_size (GTK_WINDOW (shell_view), - gconf_client_get_int (client, "/apps/evolution/shell/view_defaults/width", NULL), - gconf_client_get_int (client, "/apps/evolution/shell/view_defaults/height", NULL)); - - shortcut_group = gconf_client_get_int (client, "/apps/evolution/shell/view_defaults/selected_shortcut_group", NULL); - e_shell_view_set_current_shortcuts_group_num (shell_view, shortcut_group); - - e_shell_view_show_folder_bar (shell_view, - gconf_client_get_bool (client, "/apps/evolution/shell/view_defaults/show_folder_bar", NULL)); - e_shell_view_show_shortcut_bar (shell_view, - gconf_client_get_bool (client, "/apps/evolution/shell/view_defaults/show_shortcut_bar", NULL)); - - width = gconf_client_get_int (client, "/apps/evolution/shell/view_defaults/shortcut_bar/width", NULL); - if (priv->shortcut_bar_shown) - gtk_paned_set_position (GTK_PANED (priv->hpaned), width); - priv->hpaned_position = width; - - width = gconf_client_get_int (client, "/apps/evolution/shell/view_defaults/folder_bar/width", NULL); - if (priv->folder_bar_shown) - gtk_paned_set_position (GTK_PANED (priv->view_hpaned), width); - priv->view_hpaned_position = width; - - /* Load the expanded state for the ShellView's StorageSetView */ - file_name = g_strdup_printf ("%s/config/storage-set-view-expanded:default", - e_shell_get_local_directory (priv->shell)); - e_tree_load_expanded_state (E_TREE (priv->storage_set_view), - file_name); - g_free (file_name); -} - - -/* This implements the behavior for when the folder which is currently displayed - gets deleted. */ - -/* Find the path for an Inbox in the specified storage. This is not really - 100% correct, but should work for most cases. */ -static char * -find_inbox_in_storage (EShellView *shell_view, - const char *storage_name) -{ - EShellViewPrivate *priv; - EStorageSet *storage_set; - EStorage *storage; - GList *subfolder_paths; - GList *p; - - priv = shell_view->priv; - storage_set = e_shell_get_storage_set (priv->shell); - storage = e_storage_set_get_storage (storage_set, storage_name); - - subfolder_paths = e_storage_get_subfolder_paths (storage, "/"); - for (p = subfolder_paths; p != NULL; p = p->next) { - const char *path; - char *casefold_i18n_inbox_name; - char *casefold_path; - - path = (const char *) p->data; - - casefold_i18n_inbox_name = g_utf8_casefold (_("Inbox"), -1); - casefold_path = g_utf8_casefold (path + 1, -1); - - if (g_utf8_collate (casefold_path, "/inbox") == 0 - || g_utf8_collate (casefold_path + 1, _("Inbox")) == 0) { - char *return_path; - - return_path = g_strconcat ("/", storage_name, "/", path, - NULL); - e_free_string_list (subfolder_paths); - - g_free (casefold_i18n_inbox_name); - g_free (casefold_path); - return return_path; - } - - g_free (casefold_i18n_inbox_name); - g_free (casefold_path); - } - - e_free_string_list (subfolder_paths); - - return NULL; -} - -static void -handle_current_folder_removed (EShellView *shell_view) -{ - EShellViewPrivate *priv; - const char *current_path; - const char *p; - char *new_path; - - /* Note: we assume that priv->uri is an evolution: URI. */ - - priv = shell_view->priv; - - current_path = priv->uri + E_SHELL_URI_PREFIX_LEN; - - g_assert (*current_path == E_PATH_SEPARATOR); - - new_path = NULL; - - /* If we have a parent folder (not a parent storage), try to display - that one. */ - - p = strrchr (current_path + 1, E_PATH_SEPARATOR); - if (p != NULL && p[1] != '\0' && strchr (current_path + 1, E_PATH_SEPARATOR) != p) { - new_path = g_strndup (current_path, p - current_path); - } else { - /* We don't have a parent folder, so try to see if there is an - Inbox folder in the same storage. */ - - /* Extract the storage name. */ - p = strchr (current_path + 1, E_PATH_SEPARATOR); - if (p == NULL) { - /* The URL points itself to a storage, so just redirect - to the default case. */ - new_path = NULL; - } else { - char *storage_name; - - storage_name = g_strndup (current_path + 1, p - current_path - 1); - - new_path = find_inbox_in_storage (shell_view, storage_name); - if (new_path == NULL) { - char *storage_uri; - - /* No Inbox in this storage -- fallback to the storage. */ - storage_uri = g_strconcat (E_SHELL_URI_PREFIX, storage_name, NULL); - e_shell_view_display_uri (shell_view, storage_uri, TRUE); - - g_free (storage_uri); - g_free (storage_name); - return; - } - - g_free (storage_name); - } - } - - if (new_path == NULL) { - e_shell_view_display_uri (shell_view, FALLBACK_URI, TRUE); - } else { - EFolder *folder; - - /* Check that the folder we have chosen exists; if it doesn't, - we just use the fallback URI. */ - - folder = e_storage_set_get_folder (e_shell_get_storage_set (priv->shell), new_path); - if (folder == NULL) { - e_shell_view_display_uri (shell_view, FALLBACK_URI, TRUE); - } else { - char *new_uri; - - new_uri = g_strconcat (E_SHELL_URI_PREFIX, new_path, NULL); - e_shell_view_display_uri (shell_view, new_uri, TRUE); - g_free (new_uri); - } - - g_free (new_path); - } -} - - -/* Callbacks for the EStorageSet. */ - -static void -storage_set_new_storage_callback (EStorageSet *storage_set, - EStorage *storage, - void *data) -{ - if (e_storage_supports_shared_folders (storage)) - update_other_users_folder_items_sensitivity (E_SHELL_VIEW (data)); -} - -static void -storage_set_removed_storage_callback (EStorageSet *storage_set, - EStorage *storage, - void *data) -{ - EShellView *shell_view = E_SHELL_VIEW (data); - - if (! e_storage_supports_shared_folders (storage)) - return; - - update_other_users_folder_items_sensitivity (shell_view); -} - -static void -storage_set_removed_folder_callback (EStorageSet *storage_set, - const char *path, - void *data) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - GtkWidget *socket; - View *view; - int destroy_connection_id; - int page_num; - char *uri; - - shell_view = E_SHELL_VIEW (data); - priv = shell_view->priv; - - uri = g_strconcat (E_SHELL_URI_PREFIX, path, NULL); - - remove_uri_from_history (shell_view, uri); - update_navigation_buttons (shell_view); - - /* (Note that at this point the current URI in the history might have - been changed and not match the current view. But we catch this case - when checking if this was the current view, below.) */ - - view = g_hash_table_lookup (priv->uri_to_view, uri); - - g_free (uri); - - if (view == NULL) - return; - - socket = find_socket (GTK_CONTAINER (view->control)); - priv->sockets = g_list_remove (priv->sockets, socket); - - destroy_connection_id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (socket), "e_shell_view_destroy_connection_id")); - g_signal_handler_disconnect((socket), destroy_connection_id); - - page_num = gtk_notebook_page_num (GTK_NOTEBOOK (priv->notebook), view->control); - - /* Check if it's the URI that we are currently displaying. */ - if (strncmp (priv->uri, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN) == 0 - && strcmp (priv->uri + E_SHELL_URI_PREFIX_LEN, path) == 0) { - handle_current_folder_removed (shell_view); - } - - bonobo_control_frame_control_deactivate (BONOBO_CONTROL_FRAME (bonobo_widget_get_control_frame (BONOBO_WIDGET (view->control)))); - gtk_widget_destroy (view->control); - - g_hash_table_remove (priv->uri_to_view, view->uri); - view_destroy (view); - - gtk_notebook_remove_page (GTK_NOTEBOOK (priv->notebook), page_num); -} - - -/* Folder bar pop-up handling. */ - -static void -reparent (GtkWidget *widget, - GtkContainer *new_container) -{ - gtk_widget_ref (widget); - gtk_container_remove (GTK_CONTAINER (widget->parent), widget); - gtk_container_add (GTK_CONTAINER (new_container), widget); - gtk_widget_unref (widget); -} - -static void -reparent_storage_set_view_box_and_destroy_popup (EShellView *shell_view) -{ - EShellViewPrivate *priv; - - priv = shell_view->priv; - - if (priv->folder_bar_popup == NULL) - return; - - gtk_widget_ref (priv->storage_set_view_box); - gtk_container_remove (GTK_CONTAINER (priv->folder_bar_popup), priv->storage_set_view_box); - gtk_paned_pack1 (GTK_PANED (priv->view_hpaned), priv->storage_set_view_box, FALSE, FALSE); - gtk_widget_unref (priv->storage_set_view_box); - - gtk_widget_destroy (priv->folder_bar_popup); - priv->folder_bar_popup = NULL; - - /* Re-enable DnD on the StorageSetView (it got disabled when displaying - the pop-up). */ - e_storage_set_view_set_allow_dnd (E_STORAGE_SET_VIEW (priv->storage_set_view), TRUE); -} - -static void -popdown_transient_folder_bar (EShellView *shell_view) -{ - EShellViewPrivate *priv; - - priv = shell_view->priv; - - gdk_pointer_ungrab (GDK_CURRENT_TIME); - gdk_keyboard_ungrab (GDK_CURRENT_TIME); - gtk_grab_remove (priv->storage_set_view_box); - - reparent_storage_set_view_box_and_destroy_popup (shell_view); - gtk_widget_hide (priv->storage_set_view_box); - - e_shell_folder_title_bar_set_toggle_state (E_SHELL_FOLDER_TITLE_BAR (priv->folder_title_bar), FALSE); - - /* Re-enable DnD on the StorageSetView (it got disabled when displaying - the pop-up). */ - e_storage_set_view_set_allow_dnd (E_STORAGE_SET_VIEW (priv->storage_set_view), TRUE); -} - -static int -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; - - if (button_event->window == GTK_PANED (priv->view_hpaned)->handle - || button_event->button != 1) - return FALSE; - - popdown_transient_folder_bar (shell_view); - return TRUE; -} - -static void -storage_set_view_folder_opened_cb (EStorageSetView *storage_set_view, - const char *path, - void *data) -{ - /* Pop down for top level nodes, see #31303. */ - if (strchr (path + 1, E_PATH_SEPARATOR) == NULL) - popdown_transient_folder_bar (E_SHELL_VIEW (data)); -} - -static void -popup_storage_set_view_button_clicked (ETitleBar *title_bar, - void *data) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - - shell_view = E_SHELL_VIEW (data); - priv = shell_view->priv; - - g_assert (priv->folder_bar_popup != NULL); - - reparent_storage_set_view_box_and_destroy_popup (shell_view); - - e_shell_view_show_folder_bar (shell_view, TRUE); - e_shell_folder_title_bar_set_toggle_state (E_SHELL_FOLDER_TITLE_BAR (priv->folder_title_bar), FALSE); -} - -static void -folder_bar_popup_map_callback (GtkWidget *widget, - void *data) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - guint32 current_time; - - shell_view = E_SHELL_VIEW (data); - priv = shell_view->priv; - - current_time = GDK_CURRENT_TIME; - - 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, current_time) != 0) { - g_warning ("e-shell-view.c:folder_bar_popup_map_callback() -- pointer grab failed."); - return; - } - - if (gdk_keyboard_grab (widget->window, TRUE, 0) != 0) { - g_warning ("e-shell-view.c:folder_bar_popup_map_callback() -- keyboard grab failed."); - gdk_pointer_ungrab (current_time); - return; - } - - gtk_grab_add (widget); - - e_signal_connect_while_alive (widget, "button_release_event", - G_CALLBACK (storage_set_view_box_button_release_event_cb), - shell_view, priv->folder_bar_popup); - e_signal_connect_while_alive (priv->storage_set_view, "folder_opened", - G_CALLBACK (storage_set_view_folder_opened_cb), - shell_view, priv->folder_bar_popup); - e_signal_connect_while_alive (priv->storage_set_view, "button_release_event", - G_CALLBACK (storage_set_view_box_button_release_event_cb), - shell_view, priv->folder_bar_popup); - e_signal_connect_while_alive (priv->storage_set_title_bar, "button_clicked", - G_CALLBACK (popup_storage_set_view_button_clicked), - shell_view, priv->folder_bar_popup); -} - -static void -pop_up_folder_bar (EShellView *shell_view) -{ - EShellViewPrivate *priv; - int x, y; - int orig_x, orig_y; - - priv = shell_view->priv; - - g_assert (! priv->folder_bar_shown); - - e_title_bar_set_button_mode (E_TITLE_BAR (priv->storage_set_title_bar), - E_TITLE_BAR_BUTTON_MODE_PIN); - - priv->folder_bar_popup = gtk_window_new (GTK_WINDOW_POPUP); - - /* 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" signal; `storage_set_view_box_map_cb()' will do the grab. */ - g_signal_connect (priv->folder_bar_popup, "map", - G_CALLBACK (folder_bar_popup_map_callback), shell_view); - - x = priv->folder_title_bar->allocation.x; - y = priv->folder_title_bar->allocation.y + priv->folder_title_bar->allocation.height; - - gdk_window_get_origin (priv->folder_title_bar->window, &orig_x, &orig_y); - x += orig_x; - y += orig_y + 2; - - priv->view_hpaned_position = MAX (priv->view_hpaned_position, MIN_POPUP_TREE_WIDTH); - - gtk_window_set_default_size (GTK_WINDOW (priv->folder_bar_popup), - priv->view_hpaned_position, - priv->view_hpaned->allocation.height); - - reparent (priv->storage_set_view_box, GTK_CONTAINER (priv->folder_bar_popup)); - - gtk_widget_show (priv->storage_set_view_box); - - gtk_window_move (GTK_WINDOW (priv->folder_bar_popup), x, y); - gtk_widget_show (priv->folder_bar_popup); - - /* Disable DnD or "interesting" things will happen. */ - e_storage_set_view_set_allow_dnd (E_STORAGE_SET_VIEW (priv->storage_set_view), FALSE); -} - - - -/* Switching views on a tree view click. */ - -static int -set_folder_timeout (gpointer data) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - - shell_view = E_SHELL_VIEW (data); - priv = shell_view->priv; - - /* Set to 0 so we don't remove it in _display_uri(). */ - priv->set_folder_timeout = 0; - e_shell_view_display_uri (shell_view, priv->set_folder_uri, TRUE); - - return FALSE; -} - -static int -popdown_transient_folder_bar_idle (void *data) -{ - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (data); - - popdown_transient_folder_bar (shell_view); - - g_object_unref (shell_view); - - return FALSE; -} - -static void -switch_on_folder_tree_click (EShellView *shell_view, - const char *path) -{ - EShellViewPrivate *priv; - char *uri; - - priv = shell_view->priv; - - gdk_pointer_ungrab (GDK_CURRENT_TIME); - gdk_keyboard_ungrab (GDK_CURRENT_TIME); - gtk_grab_remove (priv->storage_set_view_box); - - uri = g_strconcat (E_SHELL_URI_PREFIX, path, NULL); - if (priv->uri != NULL && !strcmp (uri, priv->uri)) { - g_free (uri); - return; - } - - if (priv->set_folder_timeout != 0) - gtk_timeout_remove (priv->set_folder_timeout); - - g_free (priv->set_folder_uri); - priv->set_folder_uri = NULL; - - cleanup_delayed_selection (shell_view); - - if (priv->folder_bar_popup != NULL) { - e_shell_view_display_uri (shell_view, uri, TRUE); - g_free (uri); - - g_object_ref (shell_view); - gtk_idle_add (popdown_transient_folder_bar_idle, shell_view); - return; - } - - priv->set_folder_uri = uri; - - priv->set_folder_timeout = gtk_timeout_add (SET_FOLDER_DELAY, set_folder_timeout, shell_view); -} - - -/* Callbacks. */ - -/* Callback when a new folder is added. Removed when we clear the - delayed_selection. */ -static void -new_folder_cb (EStorageSet *storage_set, - const char *path, - void *data) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - char *delayed_path; - - shell_view = E_SHELL_VIEW (data); - priv = shell_view->priv; - - delayed_path = strchr (priv->delayed_selection, ':'); - if (delayed_path) { - delayed_path ++; - if (!strcmp(path, delayed_path)) { - char *uri; - - uri = g_strdup (priv->delayed_selection); - cleanup_delayed_selection (shell_view); - e_shell_view_display_uri (shell_view, uri, FALSE); - g_free (uri); - } - } -} - -/* Callback called when an icon on the shortcut bar gets clicked. */ -static void -activate_shortcut_cb (EShortcutsView *shortcut_view, - EShortcuts *shortcuts, - const char *uri, - gboolean in_new_window, - void *data) -{ - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (data); - - if (in_new_window) { - EShellView *new_view; - - new_view = e_shell_create_view (e_shell_view_get_shell (shell_view), uri, shell_view); - e_shell_view_show_shortcut_bar (new_view, FALSE); - e_shell_view_show_folder_bar (new_view, FALSE); - } else { - e_shell_view_display_uri (shell_view, uri, TRUE); - } -} - -/* Callback when user chooses "Hide shortcut bar" via a right click */ -static void -hide_requested_cb (EShortcutsView *shortcut_view, - void *data) -{ - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (data); - - e_shell_view_show_shortcut_bar (shell_view, FALSE); -} - -/* 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; - - shell_view = E_SHELL_VIEW (data); - - setup_verb_sensitivity_for_folder (shell_view, path); - switch_on_folder_tree_click (shell_view, path); -} - -/* Callbacks for the folder context menu in the folder bar. */ - -static void -folder_context_menu_popping_up_cb (EStorageSetView *storage_set_view, - const char *path, - void *data) -{ - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (data); - - setup_verb_sensitivity_for_folder (shell_view, path); -} - -static void -folder_context_menu_popped_down_cb (EStorageSetView *storage_set_view, - void *data) -{ - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (data); - - setup_verb_sensitivity_for_folder (shell_view, e_shell_view_get_current_path (shell_view)); - - if (shell_view->priv->folder_bar_popup != NULL) - popdown_transient_folder_bar (shell_view); -} - -/* Callback called when the button on the tree's title bar is clicked. */ -static void -storage_set_view_button_clicked_cb (ETitleBar *title_bar, - void *data) -{ - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (data); - - if (shell_view->priv->folder_bar_popup == NULL) - e_shell_view_show_folder_bar (shell_view, FALSE); -} - -/* Callback called when the title bar button is clicked. */ -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 (shell_view->priv->folder_bar_popup == NULL) - pop_up_folder_bar (shell_view); -} - -/* Callback called when the offline toggle button is clicked. */ -static void -offline_toggle_clicked_cb (GtkButton *button, - void *data) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - - shell_view = E_SHELL_VIEW (data); - priv = shell_view->priv; - - switch (e_shell_get_line_status (priv->shell)) { - case E_SHELL_LINE_STATUS_ONLINE: - e_shell_go_offline (priv->shell, shell_view); - break; - case E_SHELL_LINE_STATUS_OFFLINE: - e_shell_go_online (priv->shell, shell_view); - break; - default: - g_assert_not_reached (); - } -} - - -/* Navigation button callbacks. */ - -static void -back_clicked_callback (EShellFolderTitleBar *title_bar, - void *data) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - const char *new_uri; - - shell_view = E_SHELL_VIEW (data); - priv = shell_view->priv; - - if (! e_history_has_prev (priv->history)) - return; - - new_uri = (const char *) e_history_prev (priv->history); - - display_uri (shell_view, new_uri, FALSE, TRUE); -} - -static void -forward_clicked_callback (EShellFolderTitleBar *title_bar, - void *data) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - const char *new_uri; - - shell_view = E_SHELL_VIEW (data); - priv = shell_view->priv; - - if (! e_history_has_next (priv->history)) - return; - - new_uri = (const char *) e_history_next (priv->history); - - display_uri (shell_view, new_uri, FALSE, TRUE); -} - - -/* 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_create_new_view (e_shell_get_storage_set (priv->shell), - priv->ui_container); - g_signal_connect (storage_set_view, "folder_selected", - G_CALLBACK (folder_selected_cb), shell_view); - g_signal_connect (storage_set_view, "folder_context_menu_popping_up", - G_CALLBACK (folder_context_menu_popping_up_cb), shell_view); - g_signal_connect (storage_set_view, "folder_context_menu_popped_down", - G_CALLBACK (folder_context_menu_popped_down_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_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), - GTK_SHADOW_IN); - - 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); - - g_signal_connect (priv->storage_set_title_bar, "button_clicked", - G_CALLBACK (storage_set_view_button_clicked_cb), shell_view); - - 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; - - /* Notice we don't show the vbox here yet. By default it's hidden. */ -} - -static void -setup_offline_toggle (EShellView *shell_view) -{ - EShellViewPrivate *priv; - GtkWidget *toggle; - GtkWidget *image; - - priv = shell_view->priv; - - toggle = gtk_button_new (); - GTK_WIDGET_UNSET_FLAGS (toggle, GTK_CAN_FOCUS); - gtk_button_set_relief (GTK_BUTTON (toggle), GTK_RELIEF_NONE); - - g_signal_connect (toggle, "clicked", - G_CALLBACK (offline_toggle_clicked_cb), shell_view); - - image = gtk_image_new_from_pixmap (offline_pixmap, offline_mask); - - gtk_container_add (GTK_CONTAINER (toggle), image); - - gtk_widget_show (toggle); - gtk_widget_show (image); - - priv->offline_toggle = toggle; - priv->offline_toggle_image = image; - - update_offline_toggle_status (shell_view); - - g_assert (priv->status_bar != NULL); - - gtk_box_pack_start (GTK_BOX (priv->status_bar), priv->offline_toggle, FALSE, TRUE, 0); -} - -static void -setup_menu_hint_label (EShellView *shell_view) -{ - EShellViewPrivate *priv; - - priv = shell_view->priv; - - priv->menu_hint_label = gtk_label_new (""); - gtk_misc_set_alignment (GTK_MISC (priv->menu_hint_label), 0.0, 0.5); - - gtk_box_pack_start (GTK_BOX (priv->status_bar), priv->menu_hint_label, TRUE, TRUE, 0); -} - -static void -setup_task_bar (EShellView *shell_view) -{ - EShellViewPrivate *priv; - - priv = shell_view->priv; - - priv->task_bar = e_task_bar_new (); - - g_assert (priv->status_bar != NULL); - - gtk_box_pack_start (GTK_BOX (priv->status_bar), priv->task_bar, TRUE, TRUE, 0); - gtk_widget_show (priv->task_bar); -} - -static void -create_status_bar (EShellView *shell_view) -{ - EShellViewPrivate *priv; - - priv = shell_view->priv; - - priv->status_bar = gtk_hbox_new (FALSE, 2); - gtk_widget_show (priv->status_bar); - - setup_offline_toggle (shell_view); - setup_menu_hint_label (shell_view); - setup_task_bar (shell_view); -} - - -/* Menu hints for the status bar. */ - -static void -ui_engine_add_hint_callback (BonoboUIEngine *engine, - const char *hint, - void *data) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - - shell_view = E_SHELL_VIEW (data); - priv = shell_view->priv; - - gtk_label_set_text (GTK_LABEL (priv->menu_hint_label), hint); - gtk_widget_show (priv->menu_hint_label); - gtk_widget_hide (priv->task_bar); -} - -static void -ui_engine_remove_hint_callback (BonoboUIEngine *engine, - void *data) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - - shell_view = E_SHELL_VIEW (data); - priv = shell_view->priv; - - gtk_widget_hide (priv->menu_hint_label); - gtk_widget_show (priv->task_bar); -} - -static void -setup_statusbar_hints (EShellView *shell_view) -{ - EShellViewPrivate *priv; - BonoboUIEngine *ui_engine; - - priv = shell_view->priv; - - g_assert (priv->status_bar != NULL); - - ui_engine = bonobo_window_get_ui_engine (BONOBO_WINDOW (shell_view)); - - g_signal_connect (ui_engine, "add_hint", - G_CALLBACK (ui_engine_add_hint_callback), shell_view); - g_signal_connect (ui_engine, "remove_hint", - G_CALLBACK (ui_engine_remove_hint_callback), shell_view); -} - - -static void -setup_widgets (EShellView *shell_view) -{ - EShellViewPrivate *priv; - GtkWidget *contents_vbox; - GtkWidget *gray_bar; - - priv = shell_view->priv; - - /* The shortcut bar. */ - - priv->shortcut_bar = e_shortcuts_new_view (e_shell_get_shortcuts (priv->shell)); - g_signal_connect (priv->shortcut_bar, "activate_shortcut", - G_CALLBACK (activate_shortcut_cb), shell_view); - - g_signal_connect (priv->shortcut_bar, "hide_requested", - G_CALLBACK (hide_requested_cb), shell_view); - - priv->shortcut_frame = gtk_frame_new (NULL); - gtk_frame_set_shadow_type (GTK_FRAME (priv->shortcut_frame), GTK_SHADOW_IN); - - /* 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); - - priv->folder_title_bar = e_shell_folder_title_bar_new (); - g_signal_connect (priv->folder_title_bar, "title_toggled", - G_CALLBACK (title_bar_toggled_cb), shell_view); - g_signal_connect (priv->folder_title_bar, "back_clicked", - G_CALLBACK (back_clicked_callback), shell_view); - g_signal_connect (priv->folder_title_bar, "forward_clicked", - G_CALLBACK (forward_clicked_callback), shell_view); - - priv->view_hpaned = gtk_hpaned_new (); - gtk_paned_pack1 (GTK_PANED (priv->view_hpaned), priv->storage_set_view_box, TRUE, FALSE); - gtk_paned_pack2 (GTK_PANED (priv->view_hpaned), priv->notebook, TRUE, FALSE); - - gray_bar = gtk_event_box_new (); - gtk_container_add (GTK_CONTAINER (gray_bar), priv->folder_title_bar); - gtk_box_pack_start (GTK_BOX (priv->view_vbox), gray_bar, FALSE, FALSE, 2); - - gtk_box_pack_start (GTK_BOX (priv->view_vbox), priv->view_hpaned, TRUE, TRUE, 0); - - priv->hpaned = gtk_hpaned_new (); - gtk_container_add (GTK_CONTAINER (priv->shortcut_frame), priv->shortcut_bar); - gtk_paned_pack1 (GTK_PANED (priv->hpaned), priv->shortcut_frame, TRUE, FALSE); - gtk_paned_pack2 (GTK_PANED (priv->hpaned), priv->view_vbox, TRUE, FALSE); - gtk_paned_set_position (GTK_PANED (priv->hpaned), DEFAULT_SHORTCUT_BAR_WIDTH); - - /* The status bar. */ - - create_status_bar (shell_view); - setup_statusbar_hints (shell_view); - - /* The contents. */ - - contents_vbox = gtk_vbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (contents_vbox), priv->hpaned, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (contents_vbox), priv->status_bar, FALSE, TRUE, 0); - gtk_widget_show (contents_vbox); - - bonobo_window_set_contents (BONOBO_WINDOW (shell_view), contents_vbox); - - /* Show stuff. */ - - gtk_widget_show (priv->shortcut_frame); - gtk_widget_show (priv->shortcut_bar); - gtk_widget_show (priv->storage_set_view); - 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->folder_title_bar); - gtk_widget_show (priv->status_bar); - - gtk_widget_show (gray_bar); - - priv->shortcut_bar_shown = TRUE; - priv->folder_bar_shown = FALSE; - - /* FIXME: Session management and stuff? */ - gtk_window_set_default_size (GTK_WINDOW (shell_view), DEFAULT_WIDTH, DEFAULT_HEIGHT); -} - - -/* GObject methods. */ - -static void -hash_foreach_destroy_view (void *name, - void *value, - void *data) -{ - View *view; - - view = (View *) value; - - gtk_widget_destroy (view->control); - - view_destroy (view); -} - -static void -impl_dispose (GObject *object) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - GList *p; - - shell_view = E_SHELL_VIEW (object); - priv = shell_view->priv; - - /* This is necessary to remove the signal handler for folder_new on the - storage set used for the delayed selection mechanism. */ - cleanup_delayed_selection (shell_view); - - if (priv->tooltips != NULL) { - g_object_unref (priv->tooltips); - priv->tooltips = NULL; - } - - if (priv->history != NULL) { - g_object_unref (priv->history); - priv->history = NULL; - } - - if (priv->shell != NULL) { - bonobo_object_unref (BONOBO_OBJECT (priv->shell)); - priv->shell = NULL; - } - - if (priv->corba_interface != NULL) { - bonobo_object_unref (BONOBO_OBJECT (priv->corba_interface)); - priv->corba_interface = NULL; - } - - if (priv->folder_bar_popup != NULL) { - gtk_widget_destroy (priv->folder_bar_popup); - priv->folder_bar_popup = NULL; - } - - for (p = priv->sockets; p != NULL; p = p->next) { - GtkWidget *socket_widget; - int destroy_connection_id; - - socket_widget = GTK_WIDGET (p->data); - destroy_connection_id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (socket_widget), - "e_shell_view_destroy_connection_id")); - g_signal_handler_disconnect((socket_widget), destroy_connection_id); - } - g_list_free (priv->sockets); - priv->sockets = NULL; - - if (priv->uri_to_view != NULL) { - g_hash_table_foreach (priv->uri_to_view, hash_foreach_destroy_view, NULL); - g_hash_table_destroy (priv->uri_to_view); - priv->uri_to_view = NULL; - } - - if (priv->ui_component != NULL) { - bonobo_object_unref (BONOBO_OBJECT (priv->ui_component)); - priv->ui_component = NULL; - } - - if (priv->set_folder_timeout != 0) { - gtk_timeout_remove (priv->set_folder_timeout); - priv->set_folder_timeout = 0; - } - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - - shell_view = E_SHELL_VIEW (object); - priv = shell_view->priv; - - g_free (priv->uri); - g_free (priv->set_folder_uri); - g_free (priv->delayed_selection); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -/* Initialization. */ - -static void -class_init (EShellViewClass *klass) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - parent_class = g_type_class_ref(BONOBO_TYPE_WINDOW); - - signals[SHORTCUT_BAR_VISIBILITY_CHANGED] - = g_signal_new ("shortcut_bar_visibility_changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EShellViewClass, shortcut_bar_visibility_changed), - NULL, NULL, - e_shell_marshal_NONE__INT, - G_TYPE_NONE, 1, - G_TYPE_INT); - - signals[FOLDER_BAR_VISIBILITY_CHANGED] - = g_signal_new ("folder_bar_visibility_changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EShellViewClass, folder_bar_visibility_changed), - NULL, NULL, - e_shell_marshal_NONE__INT, - G_TYPE_NONE, 1, - G_TYPE_INT); - - signals[VIEW_CHANGED] - = g_signal_new ("view_changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EShellViewClass, view_changed), - NULL, NULL, - e_shell_marshal_NONE__STRING_STRING_STRING_STRING, - G_TYPE_NONE, 4, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_STRING); - - load_images (); -} - -static void -init (EShellView *shell_view) -{ - EShellViewPrivate *priv; - - priv = g_new (EShellViewPrivate, 1); - - priv->shell = NULL; - priv->corba_interface = NULL; - priv->ui_component = NULL; - priv->history = e_history_new ((EHistoryItemFreeFunc) g_free); - priv->uri = NULL; - priv->delayed_selection = NULL; - - priv->tooltips = gtk_tooltips_new (); - g_object_ref (priv->tooltips); - gtk_object_sink (GTK_OBJECT (priv->tooltips)); - - 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->status_bar = NULL; - priv->offline_toggle = NULL; - priv->offline_toggle_image = NULL; - priv->menu_hint_label = NULL; - priv->task_bar = NULL; - - priv->folder_bar_popup = NULL; - - priv->shortcut_bar_shown = FALSE; - priv->folder_bar_shown = FALSE; - - priv->hpaned_position = 0; - priv->view_hpaned_position = 0; - - priv->uri_to_view = g_hash_table_new (g_str_hash, g_str_equal); - - priv->sockets = NULL; - - priv->set_folder_timeout = 0; - priv->set_folder_uri = NULL; - - shell_view->priv = priv; -} - - -/* EvolutionShellView interface callbacks. */ - -static void -corba_interface_set_message_cb (EvolutionShellView *shell_view, - const char *message, - gboolean busy, - void *data) -{ - /* Don't do anything here anymore. The interface is going to be - deprecated soon. */ -} - -static void -corba_interface_unset_message_cb (EvolutionShellView *shell_view, - void *data) -{ - /* Don't do anything here anymore. The interface is going to be - deprecated soon. */ -} - -static void -corba_interface_change_current_view_cb (EvolutionShellView *shell_view, - const char *uri, - void *data) -{ - EShellView *view; - - view = E_SHELL_VIEW (data); - - g_return_if_fail (view != NULL); - - e_shell_view_display_uri (view, uri, TRUE); -} - -static void -corba_interface_set_title (EvolutionShellView *shell_view, - const char *title, - void *data) -{ - EShellView *view; - - view = E_SHELL_VIEW (data); - - g_return_if_fail (view != NULL); - - gtk_window_set_title (GTK_WINDOW (view), title); -} - -static void -corba_interface_set_folder_bar_label (EvolutionShellView *evolution_shell_view, - const char *text, - void *data) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - - g_return_if_fail (data != NULL); - g_return_if_fail (E_IS_SHELL_VIEW (data)); - - shell_view = E_SHELL_VIEW (data); - priv = shell_view->priv; - - e_shell_folder_title_bar_set_folder_bar_label (E_SHELL_FOLDER_TITLE_BAR (priv->folder_title_bar), - text); -} - -static void -corba_interface_show_settings (EvolutionShellView *evolution_shell_view, - void *data) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - - g_return_if_fail (data != NULL); - g_return_if_fail (E_IS_SHELL_VIEW (data)); - - shell_view = E_SHELL_VIEW (data); - priv = shell_view->priv; - - e_shell_view_show_settings (shell_view); -} - -static void -unmerge_on_error (BonoboObject *object, - CORBA_Object cobject, - CORBA_Environment *ev) -{ -#if 0 - BonoboWindow *window; - BonoboUIEngine *ui_engine; - - /* FIXME changes.txt says we should be able to do this but bonobo_ui_engine_get_view() - is marked as internal in bonoob-ui-engine.h! */ - ui_engine = bonobo_ui_container_get_engine (BONOBO_UI_CONTAINER (object)); - window = BONOBO_WINDOW (bonobo_ui_engine_get_view (ui_engine)); - - if (window != NULL) - bonobo_ui_engine_deregister_component_by_ref (ui_engine, cobject); -#endif -} - -static void -updated_folder_cb (EStorageSet *storage_set, - const char *path, - void *data) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - const char *view_path; - - shell_view = E_SHELL_VIEW (data); - priv = shell_view->priv; - - view_path = get_storage_set_path_from_uri (priv->uri); - if (view_path && strcmp (path, view_path) != 0) - return; - - /* Update the folder title bar and the window title bar */ - update_for_current_uri (shell_view); -} - - -/* Shell callbacks. */ - -static void -shell_line_status_changed_cb (EShell *shell, - EShellLineStatus new_status, - void *data) -{ - EShellView *shell_view; - - shell_view = E_SHELL_VIEW (data); - update_offline_toggle_status (shell_view); - - if (new_status == E_SHELL_LINE_STATUS_OFFLINE) - bonobo_ui_component_set_prop (shell_view->priv->ui_component, - "/commands/SendReceive", - "sensitive", "0", NULL); - else - bonobo_ui_component_set_prop (shell_view->priv->ui_component, - "/commands/SendReceive", - "sensitive", "1", NULL); -} - -static int -delete_event_cb (GtkWidget *widget, - GdkEventAny *ev, - void *data) -{ - return FALSE; -} - - -EShellView * -e_shell_view_construct (EShellView *shell_view, - EShell *shell, - const char *uri) -{ - EShellViewPrivate *priv; - EStorageSet *storage_set; - EShellView *view; - char *uri_to_load; - - g_return_val_if_fail (shell != NULL, NULL); - g_return_val_if_fail (shell_view != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL (shell), NULL); - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL); - - priv = shell_view->priv; - - view = E_SHELL_VIEW (bonobo_window_construct (BONOBO_WINDOW (shell_view), - bonobo_ui_container_new (), - "evolution", "Ximian Evolution")); - - if (!view) { - g_object_unref (shell_view); - return NULL; - } - - priv->shell = shell; - bonobo_object_ref (BONOBO_OBJECT (priv->shell)); - - g_signal_connect (view, "delete_event", - G_CALLBACK (delete_event_cb), NULL); - - priv->ui_container = bonobo_window_get_ui_container (BONOBO_WINDOW (view)); - g_signal_connect (priv->ui_container, "system_exception", - G_CALLBACK (unmerge_on_error), NULL); - - priv->ui_component = bonobo_ui_component_new ("evolution"); - bonobo_ui_component_set_container (priv->ui_component, - bonobo_object_corba_objref (BONOBO_OBJECT (priv->ui_container)), - NULL); - - bonobo_ui_component_freeze (priv->ui_component, NULL); - - bonobo_ui_util_set_ui (priv->ui_component, PREFIX, - EVOLUTION_UIDIR "/evolution.xml", - "evolution-1.4", NULL); - - setup_widgets (shell_view); - - bonobo_ui_engine_config_set_path (bonobo_window_get_ui_engine (BONOBO_WINDOW (shell_view)), - "/evolution/UIConf/kvps"); - e_shell_view_menu_setup (shell_view); - - e_shell_view_show_folder_bar (shell_view, FALSE); - - bonobo_ui_component_thaw (priv->ui_component, NULL); - - g_signal_connect_object (shell, "line_status_changed", - G_CALLBACK (shell_line_status_changed_cb), shell_view, 0); - - storage_set = e_shell_get_storage_set (shell); - e_signal_connect_while_alive (storage_set, "updated_folder", - G_CALLBACK (updated_folder_cb), shell_view, shell_view); - g_signal_connect_object (storage_set, "new_storage", - G_CALLBACK (storage_set_new_storage_callback), shell_view, 0); - g_signal_connect_object (storage_set, "removed_storage", - G_CALLBACK (storage_set_removed_storage_callback), shell_view, 0); - g_signal_connect_object (storage_set, "removed_folder", - G_CALLBACK (storage_set_removed_folder_callback), shell_view, 0); - - e_shell_user_creatable_items_handler_attach_menus (e_shell_get_user_creatable_items_handler (priv->shell), - shell_view); - - setup_defaults (view); - update_other_users_folder_items_sensitivity (view); - - if (uri != NULL) { - uri_to_load = g_strdup (uri); - } else { - GConfClient *client = gconf_client_get_default (); - char *path = gconf_client_get_string (client, "/apps/evolution/shell/view_defaults/folder_path", NULL); - - uri_to_load = g_strconcat (E_SHELL_URI_PREFIX, path, NULL); - g_free (path); - g_object_unref (client); - } - - if (! e_shell_view_display_uri (shell_view, uri_to_load, FALSE)) { - e_shell_view_display_uri (shell_view, E_SHELL_VIEW_DEFAULT_URI, FALSE); - e_shell_view_display_uri (shell_view, uri_to_load, TRUE); - } - - g_free (uri_to_load); - - return view; -} - -/* WARNING: Don't use `e_shell_view_new()' to create new views for the shell - unless you know what you are doing; this is just the standard GTK+ - constructor thing and it won't allow the shell to do the required - bookkeeping for the created views. Instead, the right way to create a new - view is calling `e_shell_create_view()'. */ -EShellView * -e_shell_view_new (EShell *shell, - const char *uri) -{ - GtkWidget *new; - - g_return_val_if_fail (shell != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL (shell), NULL); - - new = g_object_new (e_shell_view_get_type (), NULL); - - return e_shell_view_construct (E_SHELL_VIEW (new), shell, uri); -} - -const GNOME_Evolution_ShellView -e_shell_view_get_corba_interface (EShellView *shell_view) -{ - EShellViewPrivate *priv; - - g_return_val_if_fail (shell_view != NULL, CORBA_OBJECT_NIL); - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), CORBA_OBJECT_NIL); - - priv = shell_view->priv; - - return bonobo_object_corba_objref (BONOBO_OBJECT (priv->corba_interface)); -} - - -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_ascii_strncasecmp (uri, E_SHELL_URI_PREFIX, colon - uri) != 0) - return NULL; - - return colon + 1; -} - -static void -update_window_icon (EShellView *shell_view, - const char *type) -{ - EShellViewPrivate *priv; - const char *icon_name; - char *icon_path; - - priv = shell_view->priv; - - 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, FALSE); - } - - 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, - const char *title, - EFolder *folder) -{ - EShellViewPrivate *priv; - GdkPixbuf *folder_icon; - - priv = shell_view->priv; - - if (folder == NULL) { - folder_icon = NULL; - } else { - const char *icon_name; - - icon_name = e_folder_get_custom_icon_name (folder); - if (icon_name != NULL) { - folder_icon = e_icon_factory_get_icon (icon_name, TRUE); - } else { - EFolderTypeRegistry *folder_type_registry; - - folder_type_registry = e_shell_get_folder_type_registry (priv->shell); - folder_icon = e_folder_type_registry_get_icon_for_type (folder_type_registry, - e_folder_get_type_string (folder), - TRUE); - g_object_ref (folder_icon); - } - } - - e_shell_folder_title_bar_set_icon (E_SHELL_FOLDER_TITLE_BAR (priv->folder_title_bar), - folder_icon); - - if (folder_icon != NULL) - g_object_unref (folder_icon); - - if (title != NULL) - e_shell_folder_title_bar_set_title (E_SHELL_FOLDER_TITLE_BAR (priv->folder_title_bar), title); -} - -static void -update_for_current_uri (EShellView *shell_view) -{ - EShellViewPrivate *priv; - EFolder *folder; - const char *path; - const char *curr_path; - const char *type; - const char *folder_name; - char *title; - char *window_title; - int unread_count; - - priv = shell_view->priv; - - /* If we update when there is a timeout set, the selection will jump - around against the user's wishes. So we just return. */ - if (priv->set_folder_timeout != 0) - return; - - path = get_storage_set_path_from_uri (priv->uri); - - folder = NULL; - folder_name = NULL; - type = NULL; - unread_count = 0; - - if (path != NULL) { - folder = e_storage_set_get_folder (e_shell_get_storage_set (priv->shell), path); - - if (folder != NULL) { - folder_name = e_folder_get_name (folder); - type = e_folder_get_type_string (folder); - unread_count = e_folder_get_unread_count (folder); - } - } - - if (unread_count > 0) - title = g_strdup_printf (_("%s (%d)"), folder_name, unread_count); - else if (folder_name == NULL) - title = g_strdup (_("(None)")); - else - title = g_strdup (folder_name); - - if (SUB_VERSION[0] == '\0') - window_title = g_strdup_printf ("%s - Ximian Evolution %s", title, VERSION); - else - window_title = g_strdup_printf ("%s - Ximian Evolution %s [%s]", title, VERSION, SUB_VERSION); - - gtk_window_set_title (GTK_WINDOW (shell_view), window_title); - - update_folder_title_bar (shell_view, title, folder); - update_window_icon (shell_view, type); - - g_free (window_title); - g_free (title); - - g_signal_handlers_block_by_func (priv->storage_set_view, - G_CALLBACK (folder_selected_cb), shell_view); - - curr_path = e_storage_set_view_get_current_folder (E_STORAGE_SET_VIEW (priv->storage_set_view)); - if (path != NULL && (curr_path == NULL || strcmp(path, curr_path))) - e_storage_set_view_set_current_folder (E_STORAGE_SET_VIEW (priv->storage_set_view), path); - - g_signal_handlers_unblock_by_func (priv->storage_set_view, - G_CALLBACK (folder_selected_cb), shell_view); -} - -static void -update_offline_toggle_status (EShellView *shell_view) -{ - EShellViewPrivate *priv; - GdkPixmap *icon_pixmap; - GdkBitmap *icon_mask; - const char *tooltip; - gboolean sensitive; - - priv = shell_view->priv; - - switch (e_shell_get_line_status (priv->shell)) { - case E_SHELL_LINE_STATUS_ONLINE: - icon_pixmap = online_pixmap; - icon_mask = online_mask; - sensitive = TRUE; - tooltip = _("Ximian Evolution is currently online. " - "Click on this button to work offline."); - break; - case E_SHELL_LINE_STATUS_GOING_OFFLINE: - icon_pixmap = online_pixmap; - icon_mask = online_mask; - sensitive = FALSE; - tooltip = _("Ximian Evolution is in the process of going offline."); - break; - case E_SHELL_LINE_STATUS_OFFLINE: - icon_pixmap = offline_pixmap; - icon_mask = offline_mask; - sensitive = TRUE; - tooltip = _("Ximian Evolution is currently offline. " - "Click on this button to work online."); - break; - default: - g_assert_not_reached (); - return; - } - - gtk_image_set_from_pixmap (GTK_IMAGE (priv->offline_toggle_image), icon_pixmap, icon_mask); - gtk_widget_set_sensitive (priv->offline_toggle, sensitive); - gtk_tooltips_set_tip (priv->tooltips, priv->offline_toggle, tooltip, NULL); -} - -/* 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 *old_control_frame = NULL; - BonoboControlFrame *new_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); - old_control_frame = bonobo_widget_get_control_frame (BONOBO_WIDGET (current)); - bonobo_control_frame_set_autoactivate (old_control_frame, FALSE); - } - - e_shell_folder_title_bar_set_folder_bar_label (E_SHELL_FOLDER_TITLE_BAR (priv->folder_title_bar), ""); - gtk_notebook_set_current_page (notebook, page_num); - - if (page_num == -1 || page_num == 0) - return; - - current = gtk_notebook_get_nth_page (notebook, page_num); - new_control_frame = bonobo_widget_get_control_frame (BONOBO_WIDGET (current)); - bonobo_control_frame_set_autoactivate (new_control_frame, FALSE); - - bonobo_control_frame_control_activate (new_control_frame); - if (old_control_frame) - bonobo_control_frame_control_deactivate (old_control_frame); -} - -static void -setup_corba_interface (EShellView *shell_view, - GtkWidget *control) -{ - EShellViewPrivate *priv; - BonoboControlFrame *control_frame; - EvolutionShellView *corba_interface; - - g_return_if_fail (control != NULL); - - priv = shell_view->priv; - - control_frame = bonobo_widget_get_control_frame (BONOBO_WIDGET (control)); - corba_interface = evolution_shell_view_new (); - - g_signal_connect_object (corba_interface, "set_message", - G_CALLBACK (corba_interface_set_message_cb), shell_view, 0); - g_signal_connect_object (corba_interface, "unset_message", - G_CALLBACK (corba_interface_unset_message_cb), shell_view, 0); - g_signal_connect_object (corba_interface, "change_current_view", - G_CALLBACK (corba_interface_change_current_view_cb), shell_view, 0); - g_signal_connect_object (corba_interface, "set_title", - G_CALLBACK (corba_interface_set_title), shell_view, 0); - g_signal_connect_object (corba_interface, "set_folder_bar_label", - G_CALLBACK (corba_interface_set_folder_bar_label), shell_view, 0); - g_signal_connect_object (corba_interface, "show_settings", - G_CALLBACK (corba_interface_show_settings), shell_view, 0); - - bonobo_object_add_interface (BONOBO_OBJECT (control_frame), - BONOBO_OBJECT (corba_interface)); - - bonobo_object_ref (BONOBO_OBJECT (corba_interface)); - priv->corba_interface = corba_interface; -} - - -/* Socket destruction handling. */ - -static void -socket_destroy_cb (GtkWidget *socket_widget, gpointer data) -{ - EShellView *shell_view; - EShellViewPrivate *priv; - EFolder *folder; - View *view; - const char *uri; - gboolean viewing_closed_uri; - const char *current_uri; - const char *path; - const char *folder_type; - - shell_view = E_SHELL_VIEW (data); - priv = shell_view->priv; - - uri = (const char *) g_object_get_data (G_OBJECT (socket_widget), "e_shell_view_folder_uri"); - - view = g_hash_table_lookup (priv->uri_to_view, uri); - if (view == NULL) { - g_warning ("What?! Destroyed socket for non-existing URI? -- %s", uri); - return; - } - - priv->sockets = g_list_remove (priv->sockets, socket_widget); - - gtk_widget_destroy (view->control); - - g_hash_table_remove (priv->uri_to_view, view->uri); - view_destroy (view); - - path = get_storage_set_path_from_uri (uri); - folder = e_storage_set_get_folder (e_shell_get_storage_set (priv->shell), path); - - if (folder != NULL) - folder_type = e_folder_get_type_string (folder); - else - folder_type = NULL; - - /* See if we were actively viewing the uri for the socket that's being closed */ - current_uri = e_shell_view_get_current_uri (shell_view); - if (current_uri == NULL) { - viewing_closed_uri = FALSE; - } else { - if (strcmp (uri, current_uri) == 0) - viewing_closed_uri = TRUE; - else - viewing_closed_uri = FALSE; - } - - if (viewing_closed_uri) - e_shell_view_display_uri (shell_view, NULL, TRUE); - - e_shell_component_maybe_crashed (priv->shell, uri, folder_type, shell_view); - - /* We were actively viewing the component that just crashed, so flip to the default URI */ - if (viewing_closed_uri) - e_shell_view_display_uri (shell_view, E_SHELL_VIEW_DEFAULT_URI, TRUE); -} - - -static const char * -get_type_for_folder (EShellView *shell_view, - const char *path, - const char **physical_uri_return) -{ - EShellViewPrivate *priv; - EStorageSet *storage_set; - EFolder *folder; - - priv = shell_view->priv; - - storage_set = e_shell_get_storage_set (priv->shell); - folder = e_storage_set_get_folder (storage_set, path); - if (!folder) - return NULL; - - if (physical_uri_return != NULL) - *physical_uri_return = e_folder_get_physical_uri (folder); - - return e_folder_get_type_string (folder); -} - -/* Create a new view for @uri with @control. It assumes a view for @uri does not exist yet. */ -static View * -get_view_for_uri (EShellView *shell_view, - const char *uri, - const char *view_info) -{ - EShellViewPrivate *priv; - CORBA_Environment ev; - EvolutionShellComponentClient *handler_client; - EFolderTypeRegistry *folder_type_registry; - GNOME_Evolution_ShellComponent handler; - Bonobo_UIContainer container; - GtkWidget *control; - GtkWidget *socket; - Bonobo_Control corba_control; - const char *path; - const char *physical_uri; - const char *folder_type; - int destroy_connection_id; - - priv = shell_view->priv; - - path = strchr (uri, ':'); - if (path == NULL) - return NULL; - - path++; - if (*path == '\0') - return NULL; - - folder_type = get_type_for_folder (shell_view, path, &physical_uri); - if (folder_type == NULL || physical_uri == NULL) - return NULL; - - folder_type_registry = e_shell_get_folder_type_registry (e_shell_view_get_shell (shell_view)); - - handler_client = e_folder_type_registry_get_handler_for_type (folder_type_registry, folder_type); - if (handler_client == CORBA_OBJECT_NIL) - return NULL; - - handler = evolution_shell_component_client_corba_objref (handler_client); - - CORBA_exception_init (&ev); - - corba_control = GNOME_Evolution_ShellComponent_createView (handler, physical_uri, folder_type, view_info, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - CORBA_exception_free (&ev); - return NULL; - } - - CORBA_exception_free (&ev); - - if (corba_control == CORBA_OBJECT_NIL) - return NULL; - - container = bonobo_ui_component_get_container (priv->ui_component); - control = bonobo_widget_new_control_from_objref (corba_control, container); - - socket = find_socket (GTK_CONTAINER (control)); - destroy_connection_id = g_signal_connect (socket, "destroy", - G_CALLBACK (socket_destroy_cb), - shell_view); - g_object_set_data (G_OBJECT (socket), "e_shell_view_destroy_connection_id", GINT_TO_POINTER (destroy_connection_id)); - g_object_set_data_full (G_OBJECT (socket), "e_shell_view_folder_uri", g_strdup (uri), g_free); - - priv->sockets = g_list_prepend (priv->sockets, socket); - - setup_corba_interface (shell_view, control); - - return view_new (uri, control); -} - -static gboolean -show_existing_view (EShellView *shell_view, - const char *uri, - View *view) -{ - EShellViewPrivate *priv; - int notebook_page; - - priv = shell_view->priv; - - notebook_page = gtk_notebook_page_num (GTK_NOTEBOOK (priv->notebook), view->control); - g_assert (notebook_page != -1); - - g_free (priv->uri); - priv->uri = g_strdup (uri); - - set_current_notebook_page (shell_view, notebook_page); - - return TRUE; -} - -static gboolean -create_new_view_for_uri (EShellView *shell_view, - const char *uri, - const char *view_info) -{ - View *view; - EShellViewPrivate *priv; - int page_num; - - priv = shell_view->priv; - - view = get_view_for_uri (shell_view, uri, view_info); - if (view == NULL) - return FALSE; - - g_free (priv->uri); - priv->uri = g_strdup (uri); - - gtk_widget_show (view->control); - - gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), view->control, NULL); - - page_num = gtk_notebook_page_num (GTK_NOTEBOOK (priv->notebook), view->control); - g_assert (page_num != -1); - set_current_notebook_page (shell_view, page_num); - - g_hash_table_insert (priv->uri_to_view, view->uri, view); - - return TRUE; -} - -static char * -evolution_uri_for_default_uri (EShell *shell, - const char *default_uri) -{ - char *uri; - char *path; - char *extra; - - if (! e_shell_parse_uri (shell, default_uri, &path, &extra)) - return NULL; - - uri = g_strconcat (E_SHELL_URI_PREFIX, path, "#", extra, NULL); - - g_free (path); - g_free (extra); - - return uri; -} - -static gboolean -display_uri (EShellView *shell_view, - const char *uri, - gboolean add_to_history, - gboolean queue) -{ - EShellViewPrivate *priv; - View *view; - gboolean retval; - const char *view_info; - char *real_uri; - char *allocated_uri = NULL; - - priv = shell_view->priv; - - if (uri == NULL && priv->uri == NULL) - return TRUE; - - if (priv->uri != NULL && uri != NULL && strcmp (priv->uri, uri) == 0) - return TRUE; - - bonobo_ui_engine_freeze (bonobo_window_get_ui_engine (BONOBO_WINDOW (shell_view))); - - 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); - - g_free (priv->uri); - priv->uri = real_uri = NULL; - - retval = TRUE; - goto end; - } - - if (strncmp (uri, E_SHELL_DEFAULTURI_PREFIX, E_SHELL_DEFAULTURI_PREFIX_LEN) == 0) { - allocated_uri = evolution_uri_for_default_uri (e_shell_view_get_shell (shell_view), uri); - uri = allocated_uri; - } - - view_info = strchr (uri, '#'); - if (view_info) { - real_uri = g_strndup (uri, view_info - uri); - view_info++; - } else { - view_info = ""; - real_uri = g_strdup (uri); - } - - if (strncmp (uri, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN) != 0) { - retval = FALSE; - goto end; - } - - view = g_hash_table_lookup (priv->uri_to_view, real_uri); - if (view != NULL) { - show_existing_view (shell_view, real_uri, view); - } else if (! create_new_view_for_uri (shell_view, real_uri, view_info)) { - if (! queue) { - retval = FALSE; - goto end; - } - - cleanup_delayed_selection (shell_view); - priv->delayed_selection = g_strdup (real_uri); - g_signal_connect_after (e_shell_get_storage_set (priv->shell), - "new_folder", G_CALLBACK (new_folder_cb), shell_view); - retval = TRUE; - goto end; - } - - retval = TRUE; - - end: - g_free (real_uri); - - if (add_to_history && retval == TRUE && priv->uri != NULL) - e_history_add (priv->history, g_strdup (priv->uri)); - - update_navigation_buttons (shell_view); - - g_free (priv->set_folder_uri); - priv->set_folder_uri = NULL; - - if (priv->set_folder_timeout != 0) { - gtk_timeout_remove (priv->set_folder_timeout); - priv->set_folder_timeout = 0; - } - - update_for_current_uri (shell_view); - - bonobo_ui_engine_thaw (bonobo_window_get_ui_engine (BONOBO_WINDOW (shell_view))); - - g_signal_emit (shell_view, signals[VIEW_CHANGED], 0, - e_shell_view_get_current_path (shell_view), - e_shell_view_get_current_uri (shell_view), - e_shell_view_get_current_folder_type (shell_view), - e_shell_view_get_current_component_id (shell_view)); - - g_free (allocated_uri); - - return retval; -} - -gboolean -e_shell_view_display_uri (EShellView *shell_view, - const char *uri, - gboolean queue) -{ - g_return_val_if_fail (shell_view != NULL, FALSE); - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), FALSE); - - return display_uri (shell_view, uri, TRUE, queue); -} - - -void -e_shell_view_show_shortcut_bar (EShellView *shell_view, - gboolean show) -{ - EShellViewPrivate *priv; - - g_return_if_fail (shell_view != NULL); - g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); - - priv = shell_view->priv; - - if (!! show == priv->shortcut_bar_shown) - return; - - if (show) { - if (! GTK_WIDGET_VISIBLE (priv->shortcut_frame)) { - gtk_widget_show (priv->shortcut_frame); - gtk_paned_set_position (GTK_PANED (priv->hpaned), priv->hpaned_position); - } - } else { - if (GTK_WIDGET_VISIBLE (priv->shortcut_frame)) { - /* FIXME this is a private field! */ - priv->hpaned_position = GTK_PANED (priv->hpaned)->child1_size; - - gtk_widget_hide (priv->shortcut_frame); - } - gtk_paned_set_position (GTK_PANED (priv->hpaned), 0); - } - - priv->shortcut_bar_shown = !! show; - - g_signal_emit (shell_view, signals[SHORTCUT_BAR_VISIBILITY_CHANGED], 0, - priv->shortcut_bar_shown); -} - -void -e_shell_view_show_folder_bar (EShellView *shell_view, - gboolean show) -{ - EShellViewPrivate *priv; - - g_return_if_fail (shell_view != NULL); - g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); - - priv = shell_view->priv; - - if (!! show == priv->folder_bar_shown) - return; - - if (show) { - gtk_widget_show (priv->storage_set_view_box); - gtk_paned_set_position (GTK_PANED (priv->view_hpaned), priv->view_hpaned_position); - - e_title_bar_set_button_mode (E_TITLE_BAR (priv->storage_set_title_bar), - E_TITLE_BAR_BUTTON_MODE_CLOSE); - - e_shell_folder_title_bar_set_title_clickable (E_SHELL_FOLDER_TITLE_BAR (priv->folder_title_bar), - FALSE); - } else { - if (GTK_WIDGET_VISIBLE (priv->storage_set_view_box)) { - /* FIXME this is a private field! */ - priv->view_hpaned_position = GTK_PANED (priv->view_hpaned)->child1_size; - gtk_widget_hide (priv->storage_set_view_box); - } - - gtk_paned_set_position (GTK_PANED (priv->view_hpaned), 0); - - e_title_bar_set_button_mode (E_TITLE_BAR (priv->storage_set_title_bar), - E_TITLE_BAR_BUTTON_MODE_PIN); - - e_shell_folder_title_bar_set_title_clickable (E_SHELL_FOLDER_TITLE_BAR (priv->folder_title_bar), - TRUE); - } - - priv->folder_bar_shown = !! show; - - g_signal_emit (shell_view, signals[FOLDER_BAR_VISIBILITY_CHANGED], 0, - priv->folder_bar_shown); -} - -void -e_shell_view_show_settings (EShellView *shell_view) -{ - EShellViewPrivate *priv; - const char *type; - - g_return_if_fail (shell_view != NULL); - g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); - - priv = shell_view->priv; - - type = e_shell_view_get_current_folder_type (shell_view); - e_shell_show_settings (priv->shell, type, shell_view); -} - -gboolean -e_shell_view_shortcut_bar_shown (EShellView *shell_view) -{ - g_return_val_if_fail (shell_view != NULL, FALSE); - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), FALSE); - - return shell_view->priv->shortcut_bar_shown; -} - -gboolean -e_shell_view_folder_bar_shown (EShellView *shell_view) -{ - g_return_val_if_fail (shell_view != NULL, FALSE); - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), FALSE); - - return shell_view->priv->folder_bar_shown; -} - - -ETaskBar * -e_shell_view_get_task_bar (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 E_TASK_BAR (shell_view->priv->task_bar); -} - -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; -} - -BonoboUIComponent * -e_shell_view_get_bonobo_ui_component (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->ui_component; -} - -BonoboUIContainer * -e_shell_view_get_bonobo_ui_container (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->ui_container; -} - -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; -} - -/** - * e_shell_view_get_current_uri: - * @shell_view: A pointer to an EShellView object - * - * Get the URI currently displayed by this shell view. - * - * Return value: - **/ -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_get_current_path: - * @shell_view: A pointer to an EShellView object - * - * Get the path of the current displayed folder. - * - * Return value: - **/ -const char * -e_shell_view_get_current_path (EShellView *shell_view) -{ - const char *current_uri; - const char *current_path; - - current_uri = e_shell_view_get_current_uri (shell_view); - if (current_uri == NULL) - return NULL; - - if (strncmp (current_uri, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN) == 0) - current_path = current_uri + E_SHELL_URI_PREFIX_LEN; - else - current_path = NULL; - - return current_path; -} - -const char * -e_shell_view_get_current_physical_uri (EShellView *shell_view) -{ - const char *current_path; - const char *physical_uri; - - g_return_val_if_fail (shell_view != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL); - - current_path = e_shell_view_get_current_path (shell_view); - if (current_path == NULL) - return NULL; - - if (get_type_for_folder (shell_view, current_path, &physical_uri) == NULL) - return NULL; - else - return physical_uri; -} - -const char * -e_shell_view_get_current_folder_type (EShellView *shell_view) -{ - const char *current_path; - - g_return_val_if_fail (shell_view != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL); - - current_path = e_shell_view_get_current_path (shell_view); - if (current_path == NULL) - return NULL; - - return get_type_for_folder (shell_view, current_path, NULL); -} - -const char * -e_shell_view_get_current_component_id (EShellView *shell_view) -{ - EShellViewPrivate *priv; - EFolderTypeRegistry *type_registry; - EvolutionShellComponentClient *component_client; - const char *current_folder_type; - - priv = shell_view->priv; - - type_registry = e_shell_get_folder_type_registry (priv->shell); - - current_folder_type = e_shell_view_get_current_folder_type (shell_view); - if (current_folder_type == NULL) - return NULL; - - component_client = e_folder_type_registry_get_handler_for_type (type_registry, current_folder_type); - if (component_client == NULL) - return NULL; - - return evolution_shell_component_client_get_id (component_client); -} - - -/** - * e_shell_view_save_defaults: - * @shell_view: - **/ -void -e_shell_view_save_defaults (EShellView *shell_view) -{ - GConfClient *client; - EShellViewPrivate *priv; - EShortcutBar *shortcut_bar; - const char *uri; - char *file_name; - struct stat temp; - - g_return_if_fail (shell_view != NULL); - g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); - - priv = shell_view->priv; - shortcut_bar = E_SHORTCUT_BAR (priv->shortcut_bar); - - client = gconf_client_get_default (); - - gconf_client_set_int (client, "/apps/evolution/shell/view_defaults/width", - GTK_WIDGET (shell_view)->allocation.width, NULL); - gconf_client_set_int (client, "/apps/evolution/shell/view_defaults/height", - GTK_WIDGET (shell_view)->allocation.height, NULL); - - gconf_client_set_int (client, "/apps/evolution/shell/view_defaults/selected_shortcut_group", - e_shell_view_get_current_shortcuts_group_num (shell_view), NULL); - - gconf_client_set_bool (client, "/apps/evolution/shell/view_defaults/show_folder_bar", - e_shell_view_folder_bar_shown (shell_view), NULL); - gconf_client_set_bool (client, "/apps/evolution/shell/view_defaults/show_shortcut_bar", - e_shell_view_shortcut_bar_shown (shell_view), NULL); - - if (priv->shortcut_bar_shown) - gconf_client_set_int (client, "/apps/evolution/shell/view_defaults/shortcut_bar/width", - GTK_PANED (priv->hpaned)->child1_size, NULL); - else - gconf_client_set_int (client, "/apps/evolution/shell/view_defaults/shortcut_bar/width", - priv->hpaned_position, NULL); - - if (priv->folder_bar_shown) - gconf_client_set_int (client, "/apps/evolution/shell/view_defaults/folder_bar/width", - GTK_PANED (priv->view_hpaned)->child1_size, NULL); - else - gconf_client_set_int (client, "/apps/evolution/shell/view_defaults/folder_bar/width", - priv->view_hpaned_position, NULL); - - uri = e_shell_view_get_current_uri (shell_view); - if (uri != NULL) - gconf_client_set_string (client, "/apps/evolution/shell/view_defaults/folder_path", - uri + E_SHELL_URI_PREFIX_LEN, NULL); - else - gconf_client_unset (client, "/apps/evolution/shell/view_defaults/folder_path", NULL); - - /* If ~/evolution/config/ doesn't exist yet, make it */ - file_name = g_strdup_printf ("%s/config/", e_shell_get_local_directory (priv->shell)); - if (stat (file_name, &temp) != 0) - mkdir (file_name, S_IRWXU); - g_free (file_name); - - /* Save the expanded state for the StorageSetView. */ - - file_name = g_strdup_printf ("%s/config/storage-set-view-expanded:default", - e_shell_get_local_directory (priv->shell)); - e_tree_save_expanded_state (E_TREE (priv->storage_set_view), - file_name); - g_free (file_name); - - g_object_unref (client); -} - - -/* FIXME: This function could become static */ -void -e_shell_view_set_current_shortcuts_group_num (EShellView *shell_view, int group_num) -{ - EShellViewPrivate *priv; - EShortcutsView *shortcuts_view; - - g_return_if_fail (shell_view != NULL); - g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); - - priv = shell_view->priv; - - shortcuts_view = E_SHORTCUTS_VIEW (priv->shortcut_bar); - - e_group_bar_set_current_group_num (E_GROUP_BAR (E_SHORTCUT_BAR (shortcuts_view)), group_num, FALSE); -} - -int -e_shell_view_get_current_shortcuts_group_num (EShellView *shell_view) -{ - EShellViewPrivate *priv; - EShortcutsView *shortcuts_view; - int group; - - g_return_val_if_fail (shell_view != NULL, -1); - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), -1); - - priv = shell_view->priv; - - shortcuts_view = E_SHORTCUTS_VIEW (priv->shortcut_bar); - - group = e_group_bar_get_current_group_num (E_GROUP_BAR (E_SHORTCUT_BAR (shortcuts_view))); - - return group; -} - - -const char * -e_shell_view_get_folder_bar_right_click_path (EShellView *shell_view) -{ - EShellViewPrivate *priv; - - g_return_val_if_fail (shell_view != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL); - - priv = shell_view->priv; - - return e_storage_set_view_get_right_click_path (E_STORAGE_SET_VIEW (priv->storage_set_view)); -} - - -E_MAKE_TYPE (e_shell_view, "EShellView", EShellView, class_init, init, BONOBO_TYPE_WINDOW) diff --git a/shell/e-shell-view.h b/shell/e-shell-view.h deleted file mode 100644 index 7e3ec94806..0000000000 --- a/shell/e-shell-view.h +++ /dev/null @@ -1,128 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-view.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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_ - -#include "e-task-bar.h" - -#include <bonobo/bonobo-window.h> -#include <bonobo/bonobo-ui-component.h> -#include <bonobo/bonobo-ui-container.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; - -#include "e-shell.h" - -#define E_SHELL_VIEW_DEFAULT_URI "evolution:/summary" - -struct _EShellView { - BonoboWindow parent; - - EShellViewPrivate *priv; -}; - -struct _EShellViewClass { - BonoboWindowClass parent_class; - - /* Signals. */ - - void (* shortcut_bar_visibility_changed) (EShellView *shell_view, - gboolean visible); - void (* folder_bar_visibility_changed) (EShellView *shell_view, - gboolean visible); - - void (* view_changed) (EShellView *shell_view, - const char *evolution_path, - const char *physical_uri, - const char *folder_type, - const char *component_id); -}; - - -/* WARNING: Don't use `e_shell_view_new()' to create new views for the shell - unless you know what you are doing; this is just the standard GTK+ - constructor thing and it won't allow the shell to do the required - bookkeeping for the created views. Instead, the right way to create a new - view is calling `e_shell_new_view()'. */ - -GtkType e_shell_view_get_type (void); -EShellView *e_shell_view_construct (EShellView *shell_view, - EShell *shell, - const char *uri); -EShellView *e_shell_view_new (EShell *shell, - const char *uri); - -const GNOME_Evolution_ShellView e_shell_view_get_corba_interface (EShellView *view); - -gboolean e_shell_view_display_uri (EShellView *shell_view, - const char *uri, - gboolean queue); - -void e_shell_view_show_shortcut_bar (EShellView *shell_view, - gboolean show); -gboolean e_shell_view_shortcut_bar_shown (EShellView *shell_view); -void e_shell_view_show_folder_bar (EShellView *shell_view, - gboolean show); -gboolean e_shell_view_folder_bar_shown (EShellView *shell_view); - -void e_shell_view_show_settings (EShellView *shell_view); - -ETaskBar *e_shell_view_get_task_bar (EShellView *shell_view); -EShell *e_shell_view_get_shell (EShellView *shell_view); -BonoboUIComponent *e_shell_view_get_bonobo_ui_component (EShellView *shell_view); -BonoboUIContainer *e_shell_view_get_bonobo_ui_container (EShellView *shell_view); -GtkWidget *e_shell_view_get_appbar (EShellView *shell_view); -const char *e_shell_view_get_current_uri (EShellView *shell_view); -const char *e_shell_view_get_current_physical_uri (EShellView *shell_view); -const char *e_shell_view_get_current_folder_type (EShellView *shell_view); -const char *e_shell_view_get_current_component_id (EShellView *shell_view); -const char *e_shell_view_get_current_path (EShellView *shell_view); - -void e_shell_view_save_defaults (EShellView *shell_view); - -int e_shell_view_get_current_shortcuts_group_num (EShellView *shell_view); -void e_shell_view_set_current_shortcuts_group_num (EShellView *shell_view, - int group_num); - -/* Private -- */ -const char *e_shell_view_get_folder_bar_right_click_path (EShellView *shell_view); - -#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 8985f42661..0000000000 --- a/shell/e-shell.c +++ /dev/null @@ -1,2252 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell.c - * - * Copyright (C) 2000, 2001, 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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-shell.h" - -#include "e-util/e-dialog-utils.h" - -#include "e-activity-handler.h" -#include "e-component-registry.h" -#include "e-corba-shortcuts.h" -#include "e-corba-storage-registry.h" -#include "e-folder-type-registry.h" -#include "e-local-storage.h" -#include "e-setup.h" -#include "e-shell-constants.h" -#include "e-shell-corba-icon-utils.h" -#include "e-shell-folder-selection-dialog.h" -#include "e-shell-offline-handler.h" -#include "e-shell-settings-dialog.h" -#include "e-shell-startup-wizard.h" -#include "e-shell-view.h" -#include "e-shortcuts.h" -#include "e-storage-set.h" -#include "e-splash.h" -#include "e-uri-schema-registry.h" - -#include "e-shell-marshal.h" - -#include "evolution-shell-component-client.h" -#include "evolution-shell-component-utils.h" -#include "evolution-storage-set-view-factory.h" - -#include "importer/intelligent.h" - -#include <glib.h> - -#include <gtk/gtkmain.h> -#include <gtk/gtksignal.h> -#include <gdk/gdkx.h> - -#include <X11/Xatom.h> - -#include <libgnome/gnome-i18n.h> -#include <libgnome/gnome-util.h> - -/* (For the displayName stuff.) */ -#include <gdk/gdkprivate.h> -#include <X11/Xlib.h> - -#include <bonobo/bonobo-exception.h> -#include <bonobo/bonobo-moniker-util.h> - -#include <gal/util/e-util.h> - -#include <gconf/gconf-client.h> - -#include <string.h> - -#include "Evolution.h" - - -#define PARENT_TYPE bonobo_object_get_type () -static BonoboObjectClass *parent_class = NULL; - -struct _EShellPrivate { - /* IID for registering the object on OAF. */ - char *iid; - - char *local_directory; - - GList *views; - - EStorageSet *storage_set; - ELocalStorage *local_storage; - EStorage *summary_storage; - - EShortcuts *shortcuts; - EFolderTypeRegistry *folder_type_registry; - EUriSchemaRegistry *uri_schema_registry; - - EComponentRegistry *component_registry; - - EShellUserCreatableItemsHandler *user_creatable_items_handler; - - /* ::StorageRegistry interface handler. */ - ECorbaStorageRegistry *corba_storage_registry; /* <aggregate> */ - - /* ::Activity interface handler. */ - EActivityHandler *activity_handler; /* <aggregate> */ - - /* ::Shortcuts interface handler. */ - ECorbaShortcuts *corba_shortcuts; /* <aggregate> */ - - /* This object handles going off-line. If the pointer is not NULL, it - means we have a going-off-line process in progress. */ - EShellOfflineHandler *offline_handler; - - /* Names for the types of the folders that have maybe crashed. */ - GList *crash_type_names; /* char * */ - - /* Line status. */ - EShellLineStatus line_status; - - /* Settings Dialog */ - GtkWidget *settings_dialog; - - /* Whether the shell is succesfully initialized. This is needed during - the start-up sequence, to avoid CORBA calls to do make wrong things - to happen while the shell is initializing. */ - unsigned int is_initialized : 1; - - /* Wether the shell is working in "interactive" mode or not. - (Currently, it's interactive IIF there is at least one active - view.) */ - unsigned int is_interactive : 1; - - /* Whether quit has been requested, and the shell is now waiting for - permissions from all the components to quit. */ - unsigned int preparing_to_quit : 1; -}; - - -/* Constants. */ - -/* FIXME: We need a component repository instead. */ - -#define SHORTCUTS_FILE_NAME "shortcuts.xml" -#define LOCAL_STORAGE_DIRECTORY "local" - - -enum { - NO_VIEWS_LEFT, - LINE_STATUS_CHANGED, - NEW_VIEW_CREATED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - - -/* Utility functions. */ - -static void -pop_up_activation_error_dialog (ESplash *splash, - const char *id, - CORBA_Environment *ev) -{ - char *error_message; - - error_message = e_get_activation_failure_msg (ev); - e_notice (splash, GTK_MESSAGE_ERROR, - _("Cannot activate component %s :\n" - "The error from the activation system is:\n" - "%s"), - id, error_message); - g_free (error_message); -} - -static gboolean -get_config_start_offline (void) -{ - GConfClient *client; - gboolean value; - - client = gconf_client_get_default (); - - value = gconf_client_get_bool (client, "/apps/evolution/shell/start_offline", NULL); - - g_object_unref (client); - - return value; -} - - -/* Interactivity handling. */ - -static void -set_interactive (EShell *shell, - gboolean interactive) -{ - EShellPrivate *priv; - GList *id_list, *p; - Window new_view_xid; - - priv = shell->priv; - - if (!! priv->is_interactive == !! interactive) - return; - - priv->is_interactive = interactive; - - if (interactive) { - GtkWidget *new_view; - - g_return_if_fail (priv->views && priv->views->data); - new_view = priv->views->data; - - new_view_xid = GDK_WINDOW_XWINDOW (new_view->window); - } else - new_view_xid = None; - - id_list = e_component_registry_get_id_list (priv->component_registry); - for (p = id_list; p != NULL; p = p->next) { - EvolutionShellComponentClient *shell_component_client; - GNOME_Evolution_ShellComponent shell_component_objref; - const char *id; - CORBA_Environment ev; - - id = (const char *) p->data; - shell_component_client = e_component_registry_get_component_by_id (priv->component_registry, id); - shell_component_objref = evolution_shell_component_client_corba_objref (shell_component_client); - - CORBA_exception_init (&ev); - - GNOME_Evolution_ShellComponent_interactive (shell_component_objref, interactive, new_view_xid, &ev); - if (ev._major != CORBA_NO_EXCEPTION) - g_warning ("Error changing interactive status of component %s to %s -- %s\n", - id, interactive ? "TRUE" : "FALSE", BONOBO_EX_REPOID (&ev)); - - CORBA_exception_free (&ev); - } - - e_free_string_list (id_list); -} - - -/* Callback for the folder selection dialog. */ - -static void -folder_selection_dialog_cancelled_cb (EShellFolderSelectionDialog *folder_selection_dialog, - void *data) -{ - GNOME_Evolution_FolderSelectionListener listener; - CORBA_Environment ev; - - listener = g_object_get_data (G_OBJECT (folder_selection_dialog), "corba_listener"); - - CORBA_exception_init (&ev); - - GNOME_Evolution_FolderSelectionListener_notifyCanceled (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; - GNOME_Evolution_FolderSelectionListener listener; - EStorageSet *storage_set; - EFolder *folder; - GNOME_Evolution_Folder corba_folder; - - shell = E_SHELL (data); - listener = g_object_get_data (G_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); - - if (folder == NULL) { - corba_folder.type = ""; - corba_folder.description = ""; - corba_folder.displayName = ""; - corba_folder.physicalUri = ""; - corba_folder.evolutionUri = ""; - corba_folder.unreadCount = -1; - corba_folder.customIconName = ""; - } else { - corba_folder.type = (CORBA_char *)e_folder_get_type_string (folder); - corba_folder.description = (CORBA_char *)e_folder_get_description (folder); - if (corba_folder.description == NULL) - corba_folder.description = ""; - corba_folder.displayName = (CORBA_char *)e_folder_get_name (folder); - corba_folder.physicalUri = (CORBA_char *)e_folder_get_physical_uri (folder); - if (corba_folder.physicalUri == NULL) - corba_folder.physicalUri = ""; - corba_folder.evolutionUri = (CORBA_char *)g_strconcat (E_SHELL_URI_PREFIX, path, NULL); - corba_folder.unreadCount = e_folder_get_unread_count (folder); - corba_folder.customIconName = (CORBA_char *)e_folder_get_custom_icon_name (folder); - if (corba_folder.customIconName == NULL) - corba_folder.customIconName = ""; - } - - GNOME_Evolution_FolderSelectionListener_notifySelected (listener, &corba_folder, &ev); - g_free (corba_folder.evolutionUri); - - CORBA_exception_free (&ev); -} - - -/* CORBA interface implementation. */ - -static gboolean -raise_exception_if_not_ready (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - EShell *shell; - - shell = E_SHELL (bonobo_object_from_servant (servant)); - - if (! shell->priv->is_initialized) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_Shell_NotReady, NULL); - return TRUE; - } - - return FALSE; -} - -static GNOME_Evolution_ShellComponent -impl_Shell_getComponentByType (PortableServer_Servant servant, - const CORBA_char *type, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionShellComponentClient *handler; - EFolderTypeRegistry *folder_type_registry; - GNOME_Evolution_ShellComponent corba_component; - EShell *shell; - - if (raise_exception_if_not_ready (servant, ev)) - return CORBA_OBJECT_NIL; - - 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_GNOME_Evolution_Shell_NotFound, NULL); - return CORBA_OBJECT_NIL; - } - - corba_component = evolution_shell_component_client_corba_objref (handler); - Bonobo_Unknown_ref (corba_component, ev); - - return CORBA_Object_duplicate (corba_component, ev); -} - -static GNOME_Evolution_Icon * -impl_Shell_getIconByType (PortableServer_Servant servant, - const CORBA_char *type, - const CORBA_boolean mini, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EFolderTypeRegistry *folder_type_registry; - GdkPixbuf *pixbuf; - GNOME_Evolution_Icon *icon; - EShell *shell; - - if (raise_exception_if_not_ready (servant, ev)) - return CORBA_OBJECT_NIL; - - bonobo_object = bonobo_object_from_servant (servant); - shell = E_SHELL (bonobo_object); - folder_type_registry = shell->priv->folder_type_registry; - - pixbuf = e_folder_type_registry_get_icon_for_type (folder_type_registry, type, mini); - - if (pixbuf == NULL) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Shell_NotFound, NULL); - return CORBA_OBJECT_NIL; - } - - icon = e_new_corba_icon_from_pixbuf (pixbuf); - return icon; -} - -static GNOME_Evolution_ShellView -impl_Shell_createNewView (PortableServer_Servant servant, - const CORBA_char *uri, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EShell *shell; - EShellView *shell_view; - GNOME_Evolution_ShellView shell_view_interface; - - if (raise_exception_if_not_ready (servant, ev)) - return CORBA_OBJECT_NIL; - - bonobo_object = bonobo_object_from_servant (servant); - shell = E_SHELL (bonobo_object); - - if (strncmp (uri, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN) != 0) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_Shell_UnsupportedSchema, - NULL); - return CORBA_OBJECT_NIL; - } - - shell_view = e_shell_create_view (shell, uri, NULL); - if (shell_view == NULL) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_Shell_NotFound, NULL); - return CORBA_OBJECT_NIL; - } - - shell_view_interface = e_shell_view_get_corba_interface (shell_view); - if (shell_view_interface == CORBA_OBJECT_NIL) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_Shell_InternalError, NULL); - return CORBA_OBJECT_NIL; - } - - Bonobo_Unknown_ref (shell_view_interface, ev); - return CORBA_Object_duplicate ((CORBA_Object) shell_view_interface, ev); -} - -static void -impl_Shell_handleURI (PortableServer_Servant servant, - const CORBA_char *uri, - CORBA_Environment *ev) -{ - EvolutionShellComponentClient *schema_handler; - EShell *shell; - EShellPrivate *priv; - const char *colon_p; - char *schema; - - if (raise_exception_if_not_ready (servant, ev)) - return; - - shell = E_SHELL (bonobo_object_from_servant (servant)); - priv = shell->priv; - - if (strncmp (uri, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN) == 0 - || strncmp (uri, E_SHELL_DEFAULTURI_PREFIX, E_SHELL_DEFAULTURI_PREFIX_LEN) == 0) { - e_shell_create_view (shell, uri, NULL); - return; - } - - /* Extract the schema. */ - - colon_p = strchr (uri, ':'); - if (colon_p == NULL || colon_p == uri) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_Shell_InvalidURI, NULL); - return; - } - - schema = g_strndup (uri, colon_p - uri); - schema_handler = e_uri_schema_registry_get_handler_for_schema (priv->uri_schema_registry, schema); - g_free (schema); - - if (schema_handler == NULL) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_Shell_UnsupportedSchema, NULL); - return; - } - - if (evolution_shell_component_client_handle_external_uri (schema_handler, uri) - != EVOLUTION_SHELL_COMPONENT_OK) { - /* FIXME: Just a wild guess here. */ - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_Shell_NotFound, NULL); - return; - } -} - -static void -corba_listener_destroy_notify (void *data) -{ - CORBA_Environment ev; - GNOME_Evolution_FolderSelectionListener listener_interface; - - listener_interface = (GNOME_Evolution_FolderSelectionListener) data; - - CORBA_exception_init (&ev); - CORBA_Object_release (listener_interface, &ev); - CORBA_exception_free (&ev); -} - -static void -impl_Shell_selectUserFolder (PortableServer_Servant servant, - const CORBA_long_long parent_xid, - const GNOME_Evolution_FolderSelectionListener listener, - const CORBA_char *title, - const CORBA_char *default_folder, - const GNOME_Evolution_Shell_FolderTypeNameList *corba_allowed_type_names, - CORBA_Environment *ev) -{ - GtkWidget *folder_selection_dialog; - BonoboObject *bonobo_object; - GNOME_Evolution_FolderSelectionListener listener_duplicate; - EShell *shell; - const char **allowed_type_names; - int i; - - if (raise_exception_if_not_ready (servant, ev)) - return; - - bonobo_object = bonobo_object_from_servant (servant); - shell = E_SHELL (bonobo_object); - - allowed_type_names = alloca (sizeof (allowed_type_names[0]) * (corba_allowed_type_names->_length + 1)); - for (i = 0; i < corba_allowed_type_names->_length; i++) - allowed_type_names[i] = corba_allowed_type_names->_buffer[i]; - allowed_type_names[corba_allowed_type_names->_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, - NULL, - default_folder, - allowed_type_names, - TRUE); - - - listener_duplicate = CORBA_Object_duplicate (listener, ev); - g_object_set_data_full (G_OBJECT (folder_selection_dialog), "corba_listener", - listener_duplicate, corba_listener_destroy_notify); - - g_signal_connect (folder_selection_dialog, "folder_selected", - G_CALLBACK (folder_selection_dialog_folder_selected_cb), shell); - g_signal_connect (folder_selection_dialog, "cancelled", - G_CALLBACK (folder_selection_dialog_cancelled_cb), shell); - - if (parent_xid) - e_dialog_set_transient_for_xid (GTK_WINDOW (folder_selection_dialog), parent_xid); - -#if NASTY_HACK_FOR_OUT_OF_PROC_COMPONENTS - if (parent_xid == 0) { - gtk_widget_show (folder_selection_dialog); - } else { - XClassHint class_hints; - XWMHints *parent_wm_hints; - - /* Set the WM class and the WindowGroup hint to be the same as - the foreign parent window's. This way smartass window - managers like Sawfish don't get confused. */ - - if (XGetClassHint (GDK_DISPLAY (), (Window) parent_xid, &class_hints)) { - gtk_window_set_wmclass (GTK_WINDOW (folder_selection_dialog), - class_hints.res_name, class_hints.res_class); - XFree (class_hints.res_name); - XFree (class_hints.res_class); - } - - gtk_widget_show (folder_selection_dialog); - - while (folder_selection_dialog->window == NULL) - gtk_main_iteration (); - - parent_wm_hints = XGetWMHints (GDK_DISPLAY (), (Window) parent_xid); - - if (parent_wm_hints != NULL && (parent_wm_hints->flags & WindowGroupHint)) { - XWMHints *wm_hints; - - wm_hints = XAllocWMHints (); - wm_hints->flags = WindowGroupHint; - wm_hints->window_group = parent_wm_hints->window_group; - XSetWMHints (GDK_DISPLAY (), GDK_WINDOW_XWINDOW (folder_selection_dialog->window), wm_hints); - XFree (wm_hints); - XFree (parent_wm_hints); - } - } -#else - gtk_widget_show (folder_selection_dialog); -#endif -} - -static GNOME_Evolution_Storage -impl_Shell_getLocalStorage (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - GNOME_Evolution_Storage local_storage_interface; - EShell *shell; - EShellPrivate *priv; - - bonobo_object = bonobo_object_from_servant (servant); - shell = E_SHELL (bonobo_object); - priv = shell->priv; - - if (priv->local_storage == NULL) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_Shell_NotReady, NULL); - return CORBA_OBJECT_NIL; - } - - local_storage_interface = e_local_storage_get_corba_interface (priv->local_storage); - - bonobo_object_dup_ref (local_storage_interface, ev); - - return local_storage_interface; -} - -static Bonobo_Control -impl_Shell_createStorageSetView (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - BonoboControl *control; - CORBA_Object dup_objref; - EShell *shell; - - if (raise_exception_if_not_ready (servant, ev)) - return CORBA_OBJECT_NIL; - - bonobo_object = bonobo_object_from_servant (servant); - shell = E_SHELL (bonobo_object); - - control = evolution_storage_set_view_factory_new_view (shell); - dup_objref = CORBA_Object_duplicate (bonobo_object_corba_objref (BONOBO_OBJECT (control)), ev); - - return dup_objref; -} - -static void -impl_Shell_setLineStatus (PortableServer_Servant servant, - CORBA_boolean online, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EShell *shell; - - if (raise_exception_if_not_ready (servant, ev)) - return; - - bonobo_object = bonobo_object_from_servant (servant); - shell = E_SHELL (bonobo_object); - - if (online) - e_shell_go_online (shell, NULL); - else - e_shell_go_offline (shell, NULL); -} - - -/* Set up the ::Activity interface. */ - -static void -setup_activity_interface (EShell *shell) -{ - EActivityHandler *activity_handler; - EShellPrivate *priv; - - priv = shell->priv; - - activity_handler = e_activity_handler_new (); - - bonobo_object_add_interface (BONOBO_OBJECT (shell), BONOBO_OBJECT (activity_handler)); - priv->activity_handler = activity_handler; -} - - -/* Set up the ::Shortcuts interface. */ - -static void -setup_shortcuts_interface (EShell *shell) -{ - ECorbaShortcuts *corba_shortcuts; - EShellPrivate *priv; - - priv = shell->priv; - - g_assert (priv->shortcuts != NULL); - - corba_shortcuts = e_corba_shortcuts_new (priv->shortcuts); - - bonobo_object_add_interface (BONOBO_OBJECT (shell), BONOBO_OBJECT (corba_shortcuts)); - priv->corba_shortcuts = corba_shortcuts; -} - - -/* 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)); - - 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; - EFolder *summary_folder; - - priv = shell->priv; - - g_assert (priv->folder_type_registry != NULL); - g_assert (priv->local_storage == NULL); - - local_storage_path = g_build_filename (priv->local_directory, LOCAL_STORAGE_DIRECTORY, NULL); - 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); - - e_storage_set_add_storage (priv->storage_set, local_storage); - priv->local_storage = E_LOCAL_STORAGE (local_storage); - - summary_folder = e_folder_new (_("Summary"), "summary", ""); - e_folder_set_physical_uri (summary_folder, "/"); - e_folder_set_is_stock (summary_folder, TRUE); - priv->summary_storage = e_storage_new (E_SUMMARY_STORAGE_NAME, - summary_folder); - e_storage_set_add_storage (priv->storage_set, priv->summary_storage); - - return TRUE; -} - - -/* Initialization of the components. */ - -static char * -get_icon_path_for_component_info (const Bonobo_ServerInfo *info) -{ - Bonobo_ActivationProperty *property; - const char *shell_component_icon_value; - - property = bonobo_server_info_prop_find ((Bonobo_ServerInfo *) info, - "evolution:shell_component_icon"); - - if (property == NULL || property->v._d != Bonobo_ACTIVATION_P_STRING) - return gnome_program_locate_file (NULL, GNOME_FILE_DOMAIN_PIXMAP, "gnome-question.png", - TRUE, NULL); - - shell_component_icon_value = property->v._u.value_string; - - if (g_path_is_absolute (shell_component_icon_value)) - return g_strdup (shell_component_icon_value); - - else - return g_build_filename (EVOLUTION_IMAGES, shell_component_icon_value, NULL); -} - -static void -setup_components (EShell *shell, - ESplash *splash) -{ - EShellPrivate *priv; - char *const selection_order[] = { "0-evolution:shell_component_launch_order", NULL }; - Bonobo_ServerInfoList *info_list; - CORBA_Environment ev; - int i; - - CORBA_exception_init (&ev); - - priv = shell->priv; - priv->component_registry = e_component_registry_new (shell); - - info_list = bonobo_activation_query ("repo_ids.has ('IDL:GNOME/Evolution/ShellComponent:1.0')", selection_order, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) - g_error ("Eeek! Cannot perform OAF query for Evolution components."); - - if (info_list->_length == 0) - g_warning ("No Evolution components installed."); - - for (i = 0; i < info_list->_length; i++) { - const Bonobo_ServerInfo *info; - GdkPixbuf *icon_pixbuf; - char *icon_path; - - info = info_list->_buffer + i; - - icon_path = get_icon_path_for_component_info (info); - - icon_pixbuf = gdk_pixbuf_new_from_file (icon_path, NULL); - - if (splash != NULL) - e_splash_add_icon (splash, icon_pixbuf); - - g_object_unref (icon_pixbuf); - - g_free (icon_path); - } - - while (gtk_events_pending ()) - gtk_main_iteration (); - - for (i = 0; i < info_list->_length; i++) { - const Bonobo_ServerInfo *info; - CORBA_Environment ev; - - info = info_list->_buffer + i; - - CORBA_exception_init (&ev); - - if (! e_component_registry_register_component (priv->component_registry, info->iid, &ev)) { - pop_up_activation_error_dialog (splash, info->iid, &ev); - } else { - e_shell_user_creatable_items_handler_add_component - (priv->user_creatable_items_handler, - info->iid, - e_component_registry_get_component_by_id (priv->component_registry, info->iid)); - } - - CORBA_exception_free (&ev); - - if (splash != NULL) - e_splash_set_icon_highlight (splash, i, TRUE); - - while (gtk_events_pending ()) - gtk_main_iteration (); - } - - CORBA_free (info_list); - - CORBA_exception_free (&ev); -} - -/* FIXME what if anything fails here? */ -static void -set_owner_on_components (EShell *shell, - ESplash *splash) -{ - GNOME_Evolution_Shell corba_shell; - EShellPrivate *priv; - const char *local_directory; - GList *id_list; - GList *p; - - priv = shell->priv; - local_directory = e_shell_get_local_directory (shell); - - corba_shell = BONOBO_OBJREF (shell); - - id_list = e_component_registry_get_id_list (priv->component_registry); - for (p = id_list; p != NULL; p = p->next) { - EvolutionShellComponentClient *component_client; - EvolutionShellComponentResult result; - const char *id; - - id = (const char *) p->data; - component_client = e_component_registry_get_component_by_id (priv->component_registry, id); - - result = evolution_shell_component_client_set_owner (component_client, corba_shell, local_directory); - if (result != EVOLUTION_SHELL_COMPONENT_OK) { - g_warning ("Error setting owner on component %s -- %s", - id, evolution_shell_component_result_to_string (result)); - - if (result == EVOLUTION_SHELL_COMPONENT_OLDOWNERHASDIED) { - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - component_client = e_component_registry_restart_component (priv->component_registry, - id, &ev); - - if (component_client == NULL) { - pop_up_activation_error_dialog (splash, id, &ev); - } else { - result = evolution_shell_component_client_set_owner (component_client, corba_shell, - local_directory); - if (result != EVOLUTION_SHELL_COMPONENT_OK) { - g_warning ("Error re-setting owner on component %s -- %s", - id, evolution_shell_component_result_to_string (result)); - /* (At this point, we give up.) */ - } - } - - CORBA_exception_free (&ev); - } - } - } - - e_free_string_list (id_list); -} - - -/* EStorageSet callbacks. */ - -static void -storage_set_moved_folder_callback (EStorageSet *storage_set, - const char *source_path, - const char *destination_path, - void *data) -{ - EShell *shell; - char *source_uri; - char *destination_uri; - - shell = E_SHELL (data); - - source_uri = g_strconcat (E_SHELL_URI_PREFIX, source_path, NULL); - destination_uri = g_strconcat (E_SHELL_URI_PREFIX, destination_path, NULL); - - e_shortcuts_update_shortcuts_for_changed_uri (e_shell_get_shortcuts (shell), - source_uri, - destination_uri); - - g_free (source_uri); - g_free (destination_uri); -} - - -/* EShellView handling and bookkeeping. */ - -static int -view_delete_event_cb (GtkWidget *widget, - GdkEventAny *ev, - void *data) -{ - EShell *shell; - - g_assert (E_IS_SHELL_VIEW (widget)); - shell = E_SHELL (data); - - return ! e_shell_request_close_view (shell, E_SHELL_VIEW (widget)); -} - -static gboolean -notify_no_views_left_idle_cb (void *data) -{ - EShell *shell; - - shell = E_SHELL (data); - - set_interactive (shell, FALSE); - - g_signal_emit (shell, signals [NO_VIEWS_LEFT], 0); - - bonobo_object_unref (BONOBO_OBJECT (shell)); - - return FALSE; -} - -static void -view_weak_notify (void *data, - GObject *where_the_object_was) -{ - EShell *shell; - int num_views; - - shell = E_SHELL (data); - - num_views = g_list_length (shell->priv->views); - - /* If this is our last view, save settings now because in the callback - for no_views_left shell->priv->views will be NULL and settings won't - be saved because of that. */ - if (num_views == 1) - e_shell_save_settings (shell); - - shell->priv->views = g_list_remove (shell->priv->views, where_the_object_was); - - if (shell->priv->views == NULL) { - bonobo_object_ref (BONOBO_OBJECT (shell)); - g_idle_add (notify_no_views_left_idle_cb, shell); - } -} - -static EShellView * -create_view (EShell *shell, - const char *uri, - EShellView *template_view) -{ - EShellPrivate *priv; - EShellView *view; - ETaskBar *task_bar; - - priv = shell->priv; - - view = e_shell_view_new (shell, uri); - - g_signal_connect (view, "delete_event", - G_CALLBACK (view_delete_event_cb), shell); - - g_object_weak_ref (G_OBJECT (view), view_weak_notify, shell); - - if (uri != NULL) - e_shell_view_display_uri (E_SHELL_VIEW (view), uri, TRUE); - - shell->priv->views = g_list_prepend (shell->priv->views, view); - - task_bar = e_shell_view_get_task_bar (view); - e_activity_handler_attach_task_bar (priv->activity_handler, task_bar); - - if (template_view != NULL) { - e_shell_view_show_folder_bar (view, e_shell_view_folder_bar_shown (template_view)); - e_shell_view_show_shortcut_bar (view, e_shell_view_shortcut_bar_shown (template_view)); - } - - g_signal_emit (shell, signals[NEW_VIEW_CREATED], 0, view); - - return view; -} - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - EShell *shell; - EShellPrivate *priv; - GList *p; - - shell = E_SHELL (object); - priv = shell->priv; - - priv->is_initialized = FALSE; - - if (priv->storage_set != NULL) { - g_object_unref (priv->storage_set); - priv->storage_set = NULL; - } - - if (priv->local_storage != NULL) { - g_object_unref (priv->local_storage); - priv->local_storage = NULL; - } - - if (priv->summary_storage != NULL) { - g_object_unref (priv->summary_storage); - priv->summary_storage = NULL; - } - - if (priv->shortcuts != NULL) { - g_object_unref (priv->shortcuts); - priv->shortcuts = NULL; - } - - if (priv->folder_type_registry != NULL) { - g_object_unref (priv->folder_type_registry); - priv->folder_type_registry = NULL; - } - - if (priv->uri_schema_registry != NULL) { - g_object_unref (priv->uri_schema_registry); - priv->uri_schema_registry = NULL; - } - - if (priv->component_registry != NULL) { - g_object_unref (priv->component_registry); - priv->component_registry = NULL; - } - - if (priv->user_creatable_items_handler != NULL) { - g_object_unref (priv->user_creatable_items_handler); - priv->user_creatable_items_handler = NULL; - } - - for (p = priv->views; p != NULL; p = p->next) { - EShellView *view; - - view = E_SHELL_VIEW (p->data); - - g_signal_handlers_disconnect_by_func (view, G_CALLBACK (view_delete_event_cb), shell); - - g_object_weak_unref (G_OBJECT (view), view_weak_notify, shell); - - gtk_object_destroy (GTK_OBJECT (view)); - } - - g_list_free (priv->views); - priv->views = NULL; - - /* No unreffing for these as they are aggregate. */ - /* bonobo_object_unref (BONOBO_OBJECT (priv->corba_storage_registry)); */ - /* bonobo_object_unref (BONOBO_OBJECT (priv->activity_handler)); */ - /* bonobo_object_unref (BONOBO_OBJECT (priv->corba_shortcuts)); */ - - /* FIXME. Maybe we should do something special here. */ - if (priv->offline_handler != NULL) { - g_object_unref (priv->offline_handler); - priv->offline_handler = NULL; - } - - if (priv->settings_dialog != NULL) { - gtk_widget_destroy (priv->settings_dialog); - priv->settings_dialog = NULL; - } - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EShell *shell; - EShellPrivate *priv; - - shell = E_SHELL (object); - priv = shell->priv; - - if (priv->iid != NULL) - bonobo_activation_active_server_unregister (priv->iid, - bonobo_object_corba_objref (BONOBO_OBJECT (shell))); - - g_free (priv->local_directory); - - e_free_string_list (priv->crash_type_names); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -/* Initialization. */ - -static void -e_shell_class_init (EShellClass *klass) -{ - GObjectClass *object_class; - POA_GNOME_Evolution_Shell__epv *epv; - - parent_class = g_type_class_ref(PARENT_TYPE); - - object_class = G_OBJECT_CLASS (klass); - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - signals[NO_VIEWS_LEFT] = - g_signal_new ("no_views_left", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EShellClass, no_views_left), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - signals[LINE_STATUS_CHANGED] = - g_signal_new ("line_status_changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EShellClass, line_status_changed), - NULL, NULL, - e_shell_marshal_NONE__INT, - G_TYPE_NONE, 1, - G_TYPE_INT); - - signals[NEW_VIEW_CREATED] = - g_signal_new ("new_view_created", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EShellClass, new_view_created), - NULL, NULL, - e_shell_marshal_NONE__POINTER, - G_TYPE_NONE, 1, - G_TYPE_POINTER); - - epv = & klass->epv; - epv->getComponentByType = impl_Shell_getComponentByType; - epv->getIconByType = impl_Shell_getIconByType; - epv->createNewView = impl_Shell_createNewView; - epv->handleURI = impl_Shell_handleURI; - epv->selectUserFolder = impl_Shell_selectUserFolder; - epv->getLocalStorage = impl_Shell_getLocalStorage; - epv->createStorageSetView = impl_Shell_createStorageSetView; - epv->setLineStatus = impl_Shell_setLineStatus; -} - -static void -e_shell_init (EShell *shell) -{ - EShellPrivate *priv; - - priv = g_new (EShellPrivate, 1); - - priv->views = NULL; - - priv->iid = NULL; - priv->local_directory = NULL; - priv->storage_set = NULL; - priv->local_storage = NULL; - priv->summary_storage = NULL; - priv->shortcuts = NULL; - priv->component_registry = NULL; - priv->user_creatable_items_handler = NULL; - priv->folder_type_registry = NULL; - priv->uri_schema_registry = NULL; - priv->corba_storage_registry = NULL; - priv->activity_handler = NULL; - priv->corba_shortcuts = NULL; - priv->offline_handler = NULL; - priv->crash_type_names = NULL; - priv->line_status = E_SHELL_LINE_STATUS_OFFLINE; - priv->settings_dialog = NULL; - priv->is_initialized = FALSE; - priv->is_interactive = FALSE; - priv->preparing_to_quit = FALSE; - - shell->priv = priv; -} - - -/** - * e_shell_construct: - * @shell: An EShell object to construct - * @iid: OAFIID for registering the shell into the name server - * @local_directory: Local directory for storing local information and folders - * @show_splash: Whether to display a splash screen. - * @startup_line_mode: How to set up the line mode (online or offline) initally. - * - * Construct @shell so that it uses the specified @local_directory and - * @corba_object. - * - * Return value: The result of the operation. - **/ -EShellConstructResult -e_shell_construct (EShell *shell, - const char *iid, - const char *local_directory, - gboolean show_splash, - EShellStartupLineMode startup_line_mode) -{ - GtkWidget *splash = NULL; - EShellPrivate *priv; - CORBA_Object corba_object; - gchar *shortcut_path; - gboolean start_online; - - g_return_val_if_fail (shell != NULL, E_SHELL_CONSTRUCT_RESULT_INVALIDARG); - g_return_val_if_fail (E_IS_SHELL (shell), E_SHELL_CONSTRUCT_RESULT_INVALIDARG); - g_return_val_if_fail (local_directory != NULL, E_SHELL_CONSTRUCT_RESULT_INVALIDARG); - g_return_val_if_fail (g_path_is_absolute (local_directory), E_SHELL_CONSTRUCT_RESULT_INVALIDARG); - g_return_val_if_fail (startup_line_mode == E_SHELL_STARTUP_LINE_MODE_CONFIG - || startup_line_mode == E_SHELL_STARTUP_LINE_MODE_ONLINE - || startup_line_mode == E_SHELL_STARTUP_LINE_MODE_OFFLINE, - E_SHELL_CONSTRUCT_RESULT_INVALIDARG); - - priv = shell->priv; - - priv->iid = g_strdup (iid); - priv->local_directory = g_strdup (local_directory); - priv->folder_type_registry = e_folder_type_registry_new (); - priv->uri_schema_registry = e_uri_schema_registry_new (); - priv->storage_set = e_storage_set_new (priv->folder_type_registry); - - g_signal_connect_object (priv->storage_set, "moved_folder", - G_CALLBACK (storage_set_moved_folder_callback), - shell, 0); - - e_folder_type_registry_register_type (priv->folder_type_registry, - "noselect", "empty.gif", - "noselect", "", FALSE, - 0, NULL, 0, NULL); - e_folder_type_registry_register_type (priv->folder_type_registry, - "working", "working-16.png", - "working", "", FALSE, - 0, NULL, 0, NULL); - - /* CORBA storages must be set up before the components, because otherwise components - cannot register their own storages. */ - if (! setup_corba_storages (shell)) - return FALSE; - - e_setup_check_config (local_directory); - - /* Now we can register into OAF. Notice that we shouldn't be - registering into OAF until we are sure we can complete. */ - - /* FIXME: Multi-display stuff. */ - corba_object = bonobo_object_corba_objref (BONOBO_OBJECT (shell)); - if (bonobo_activation_active_server_register (iid, corba_object) != Bonobo_ACTIVATION_REG_SUCCESS) - return E_SHELL_CONSTRUCT_RESULT_CANNOTREGISTER; - - if (show_splash - && (splash = e_splash_new ())) { - g_signal_connect (splash, "delete_event", - G_CALLBACK (gtk_widget_hide_on_delete), NULL); - gtk_widget_show (splash); - } - - while (gtk_events_pending ()) - gtk_main_iteration (); - - priv->user_creatable_items_handler = e_shell_user_creatable_items_handler_new (); - - setup_components (shell, (ESplash *)splash); - - /* Set up the shortcuts. */ - - shortcut_path = g_build_filename (local_directory, "shortcuts.xml", NULL); - priv->shortcuts = e_shortcuts_new_from_file (shell, shortcut_path); - g_assert (priv->shortcuts != NULL); - - if (e_shortcuts_get_num_groups (priv->shortcuts) == 0) - e_shortcuts_add_default_group (priv->shortcuts); - - g_free (shortcut_path); - - /* The local storage depends on the component registry. */ - setup_local_storage (shell); - - /* Set up the ::Activity interface. This must be done before we notify - the components, as they might want to use it. */ - setup_activity_interface (shell); - - /* Set up the shortcuts interface. This has to be done after the - shortcuts are actually initialized. */ - - setup_shortcuts_interface (shell); - - /* Now that we have a local storage and all the interfaces set up, we - can tell the components we are here. */ - set_owner_on_components (shell, (ESplash *)splash); - - if (splash) - gtk_widget_destroy (splash); - - if (e_shell_startup_wizard_create () == FALSE) { - e_shell_unregister_all (shell); - bonobo_object_unref (BONOBO_OBJECT (shell)); - - exit (0); - } - - priv->is_initialized = TRUE; - - switch (startup_line_mode) { - case E_SHELL_STARTUP_LINE_MODE_CONFIG: - start_online = ! get_config_start_offline (); - break; - case E_SHELL_STARTUP_LINE_MODE_ONLINE: - start_online = TRUE; - break; - case E_SHELL_STARTUP_LINE_MODE_OFFLINE: - start_online = FALSE; - break; - default: - start_online = FALSE; /* Make compiler happy. */ - g_assert_not_reached (); - } - - if (start_online) - e_shell_go_online (shell, NULL); - - return E_SHELL_CONSTRUCT_RESULT_OK; -} - -/** - * e_shell_new: - * @local_directory: Local directory for storing local information and folders. - * @show_splash: Whether to display a splash screen. - * @start_online: Whether to start in on-line mode or not. - * @construct_result_return: A pointer to an EShellConstructResult variable into - * which the result of the operation will be stored. - * - * Create a new EShell. - * - * Return value: - **/ -EShell * -e_shell_new (const char *local_directory, - gboolean show_splash, - EShellStartupLineMode startup_line_mode, - EShellConstructResult *construct_result_return) -{ - EShell *new; - EShellPrivate *priv; - EShellConstructResult construct_result; - - g_return_val_if_fail (local_directory != NULL, NULL); - g_return_val_if_fail (*local_directory != '\0', NULL); - - new = g_object_new (e_shell_get_type (), NULL); - - construct_result = e_shell_construct (new, - E_SHELL_OAFIID, - local_directory, - show_splash, - startup_line_mode); - - if (construct_result != E_SHELL_CONSTRUCT_RESULT_OK) { - *construct_result_return = construct_result; - bonobo_object_unref (BONOBO_OBJECT (new)); - return NULL; - } - - priv = new->priv; - - if (priv->shortcuts == NULL || priv->storage_set == NULL) { - /* FIXME? */ - *construct_result_return = E_SHELL_CONSTRUCT_RESULT_GENERICERROR; - bonobo_object_unref (BONOBO_OBJECT (new)); - return NULL; - } - - *construct_result_return = E_SHELL_CONSTRUCT_RESULT_OK; - return new; -} - - -/** - * e_shell_create_view: - * @shell: The shell for which to create a new view. - * @uri: URI for the new view. - * @template_view: Window from which to copy the view settings (can be %NULL). - * - * Create a new view for @uri. - * - * Return value: The new view. - **/ -EShellView * -e_shell_create_view (EShell *shell, - const char *uri, - EShellView *template_view) -{ - EShellView *view; - EShellPrivate *priv; - - g_return_val_if_fail (shell != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL (shell), NULL); - - priv = shell->priv; - - view = create_view (shell, uri, template_view); - - gtk_widget_show (GTK_WIDGET (view)); - - set_interactive (shell, TRUE); - - return view; -} - -gboolean -e_shell_request_close_view (EShell *shell, - EShellView *shell_view) -{ - g_return_val_if_fail (E_IS_SHELL (shell), FALSE); - g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), FALSE); - - e_shell_save_settings (shell); - - if (g_list_length (shell->priv->views) != 1) { - /* Not the last view. */ - return TRUE; - } - - if (shell->priv->preparing_to_quit) - return FALSE; - - /* If it's the last view, save settings and ask for confirmation before - quitting. */ - - e_shell_view_save_defaults (shell_view); - - if (e_shell_prepare_for_quit (shell)) - return TRUE; - else - return FALSE; -} - - -/** - * e_shell_get_local_directory: - * @shell: An EShell object. - * - * Get the local directory associated with @shell. - * - * Return value: A pointer to the path of the local directory. - **/ -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; -} - -/** - * e_shell_get_shortcuts: - * @shell: An EShell object. - * - * Get the shortcuts associated to @shell. - * - * Return value: A pointer to the EShortcuts associated to @shell. - **/ -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; -} - -/** - * e_shell_get_storage_set: - * @shell: An EShell object. - * - * Get the storage set associated to @shell. - * - * Return value: A pointer to the EStorageSet associated to @shell. - **/ -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; -} - -/** - * e_shell_get_folder_type_registry: - * @shell: An EShell object. - * - * Get the folder type registry associated to @shell. - * - * Return value: A pointer to the EFolderTypeRegistry associated to @shell. - **/ -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; -} - -/** - * e_shell_get_uri_schema_registry: - * @shell: An EShell object. - * - * Get the schema registry associated to @shell. - * - * Return value: A pointer to the EUriSchemaRegistry associated to @shell. - **/ -EUriSchemaRegistry * -e_shell_get_uri_schema_registry (EShell *shell) -{ - g_return_val_if_fail (shell != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL (shell), NULL); - - return shell->priv->uri_schema_registry; -} - -/** - * e_shell_get_local_storage: - * @shell: An EShell object. - * - * Get the local storage associated to @shell. - * - * Return value: A pointer to the ELocalStorage associated to @shell. - **/ -ELocalStorage * -e_shell_get_local_storage (EShell *shell) -{ - g_return_val_if_fail (shell != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL (shell), NULL); - - return shell->priv->local_storage; -} - - -static gboolean -save_settings_for_component (EShell *shell, - const char *id, - EvolutionShellComponentClient *client) -{ - Bonobo_Unknown unknown_interface; - GNOME_Evolution_Session session_interface; - CORBA_Environment ev; - char *prefix; - gboolean retval; - - unknown_interface = evolution_shell_component_client_corba_objref (client); - g_assert (unknown_interface != CORBA_OBJECT_NIL); - - CORBA_exception_init (&ev); - - session_interface = Bonobo_Unknown_queryInterface (unknown_interface, - "IDL:GNOME/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); - GNOME_Evolution_Session_saveConfiguration (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; -} - -static gboolean -save_misc_settings (EShell *shell) -{ - GConfClient *client; - EShellPrivate *priv; - gboolean is_offline; - - priv = shell->priv; - - is_offline = ( e_shell_get_line_status (shell) == E_SHELL_LINE_STATUS_OFFLINE ); - - client = gconf_client_get_default (); - gconf_client_set_bool (client, "/apps/evolution/shell/start_offline", is_offline, NULL); - g_object_unref (client); - - return TRUE; -} - -/** - * 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 components_saved; - gboolean misc_saved; - - g_return_val_if_fail (shell != NULL, FALSE); - g_return_val_if_fail (E_IS_SHELL (shell), FALSE); - - components_saved = save_settings_for_components (shell); - misc_saved = save_misc_settings (shell); - - return components_saved && misc_saved; -} - -/** - * e_shell_destroy_all_views: - * @shell: - * - * Destroy all the views in @shell. - **/ -void -e_shell_destroy_all_views (EShell *shell) -{ - EShellPrivate *priv; - GList *p, *pnext; - - g_return_if_fail (shell != NULL); - g_return_if_fail (E_IS_SHELL (shell)); - - if (shell->priv->views) - e_shell_save_settings (shell); - - priv = shell->priv; - - for (p = priv->views; p != NULL; p = pnext) { - EShellView *shell_view; - - pnext = p->next; - - shell_view = E_SHELL_VIEW (p->data); - gtk_widget_destroy (GTK_WIDGET (shell_view)); - } -} - - -/** - * e_shell_component_maybe_crashed: - * @shell: A pointer to an EShell object - * @uri: URI that caused the crash - * @type_name: The type of the folder that caused the crash - * @shell_view: Pointer to the EShellView over which we want the modal dialog - * to appear. - * - * Report that a maybe crash happened when trying to display a folder of type - * @type_name. The shell will pop up a crash dialog whose parent will be the - * @shell_view. - **/ -void -e_shell_component_maybe_crashed (EShell *shell, - const char *uri, - const char *type_name, - EShellView *shell_view) -{ - EShellPrivate *priv; - EvolutionShellComponentClient *component; - GList *p; - - g_return_if_fail (shell != NULL); - g_return_if_fail (E_IS_SHELL (shell)); - g_return_if_fail (type_name != NULL); - g_return_if_fail (shell_view != NULL); - g_return_if_fail (E_IS_SHELL_VIEW (shell_view)); - - priv = shell->priv; - - if (strncmp (uri, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN) == 0) { - const char *path; - - path = uri + E_SHELL_URI_PREFIX_LEN; - if (e_storage_set_get_folder (priv->storage_set, path) == NULL) - return; - } - - component = e_folder_type_registry_get_handler_for_type (priv->folder_type_registry, type_name); - if (component != NULL - && bonobo_unknown_ping (evolution_shell_component_client_corba_objref (component), NULL)) - return; - - /* See if that type has caused a crash already. */ - - for (p = priv->crash_type_names; p != NULL; p = p->next) { - const char *crash_type_name; - - crash_type_name = (const char *) p->data; - if (strcmp (type_name, crash_type_name) == 0) { - /* This type caused a crash already. */ - return; - } - } - - /* New crash. */ - - priv->crash_type_names = g_list_prepend (priv->crash_type_names, g_strdup (type_name)); - - e_notice (shell_view, GTK_MESSAGE_ERROR, - _("The Evolution component that handles folders of type \"%s\"\n" - "has unexpectedly quit. You will need to quit Evolution and restart\n" - "in order to access that data again."), - type_name); - - if (shell_view) - bonobo_ui_engine_deregister_dead_components (bonobo_window_get_ui_engine (BONOBO_WINDOW (shell_view))); - - /* FIXME: we should probably re-start the component here */ -} - - -/* Offline/online handling. */ - -static void -offline_procedure_started_cb (EShellOfflineHandler *offline_handler, - void *data) -{ - EShell *shell; - EShellPrivate *priv; - - shell = E_SHELL (data); - priv = shell->priv; - - priv->line_status = E_SHELL_LINE_STATUS_GOING_OFFLINE; - g_signal_emit (shell, signals[LINE_STATUS_CHANGED], 0, priv->line_status); -} - -static void -offline_procedure_finished_cb (EShellOfflineHandler *offline_handler, - gboolean now_offline, - void *data) -{ - EShell *shell; - EShellPrivate *priv; - - shell = E_SHELL (data); - priv = shell->priv; - - if (now_offline) - priv->line_status = E_SHELL_LINE_STATUS_OFFLINE; - else - priv->line_status = E_SHELL_LINE_STATUS_ONLINE; - - g_object_unref (priv->offline_handler); - priv->offline_handler = NULL; - - g_signal_emit (shell, signals[LINE_STATUS_CHANGED], 0, priv->line_status); -} - -/** - * e_shell_get_line_status: - * @shell: A pointer to an EShell object. - * - * Get the line status for @shell. - * - * Return value: The current line status for @shell. - **/ -EShellLineStatus -e_shell_get_line_status (EShell *shell) -{ - g_return_val_if_fail (shell != NULL, E_SHELL_LINE_STATUS_OFFLINE); - g_return_val_if_fail (E_IS_SHELL (shell), E_SHELL_LINE_STATUS_OFFLINE); - - return shell->priv->line_status; -} - -/** - * e_shell_go_offline: - * @shell: - * @action_view: - * - * Make the shell go into off-line mode. - **/ -void -e_shell_go_offline (EShell *shell, - EShellView *action_view) -{ - EShellPrivate *priv; - - g_return_if_fail (shell != NULL); - g_return_if_fail (E_IS_SHELL (shell)); - g_return_if_fail (action_view != NULL); - g_return_if_fail (action_view == NULL || E_IS_SHELL_VIEW (action_view)); - - priv = shell->priv; - - if (priv->line_status != E_SHELL_LINE_STATUS_ONLINE) - return; - - g_assert (priv->offline_handler == NULL); - - priv->offline_handler = e_shell_offline_handler_new (shell); - - g_signal_connect (priv->offline_handler, "offline_procedure_started", - G_CALLBACK (offline_procedure_started_cb), shell); - g_signal_connect (priv->offline_handler, "offline_procedure_finished", - G_CALLBACK (offline_procedure_finished_cb), shell); - - e_shell_offline_handler_put_components_offline (priv->offline_handler, action_view); -} - -/** - * e_shell_go_online: - * @shell: - * @action_view: - * - * Make the shell go into on-line mode. - **/ -void -e_shell_go_online (EShell *shell, - EShellView *action_view) -{ - EShellPrivate *priv; - GList *component_ids; - GList *p; - - g_return_if_fail (shell != NULL); - g_return_if_fail (E_IS_SHELL (shell)); - g_return_if_fail (action_view == NULL || E_IS_SHELL_VIEW (action_view)); - - priv = shell->priv; - - component_ids = e_component_registry_get_id_list (priv->component_registry); - - for (p = component_ids; p != NULL; p = p->next) { - CORBA_Environment ev; - EvolutionShellComponentClient *client; - GNOME_Evolution_Offline offline_interface; - const char *id; - - id = (const char *) p->data; - client = e_component_registry_get_component_by_id (priv->component_registry, id); - - CORBA_exception_init (&ev); - - offline_interface = evolution_shell_component_client_get_offline_interface (client); - - if (CORBA_Object_is_nil (offline_interface, &ev) || ev._major != CORBA_NO_EXCEPTION) { - CORBA_exception_free (&ev); - continue; - } - - GNOME_Evolution_Offline_goOnline (offline_interface, &ev); - if (ev._major != CORBA_NO_EXCEPTION) - g_warning ("Error putting component `%s' online.", id); - - CORBA_exception_free (&ev); - } - - e_free_string_list (component_ids); - - priv->line_status = E_SHELL_LINE_STATUS_ONLINE; - g_signal_emit (shell, signals[LINE_STATUS_CHANGED], 0, priv->line_status); -} - - -void -e_shell_send_receive (EShell *shell) -{ - EShellPrivate *priv; - GList *id_list; - GList *p; - - g_return_if_fail (E_IS_SHELL (shell)); - - priv = shell->priv; - - id_list = e_component_registry_get_id_list (priv->component_registry); - - for (p = id_list; p != NULL; p = p->next) { - EvolutionShellComponentClient *component_client; - CORBA_Environment ev; - const char *id; - - id = (const char *) p->data; - component_client = e_component_registry_get_component_by_id (priv->component_registry, id); - - CORBA_exception_init (&ev); - - GNOME_Evolution_ShellComponent_sendReceive - (evolution_shell_component_client_corba_objref (component_client), TRUE, &ev); - - if (BONOBO_EX (&ev)) - g_warning ("Error invoking Send/Receive on %s -- %s", id, BONOBO_EX_REPOID (&ev)); - - CORBA_exception_free (&ev); - } - - e_free_string_list (id_list); -} - -void -e_shell_show_settings (EShell *shell, const char *type, EShellView *shell_view) -{ - EShellPrivate *priv; - - g_return_if_fail (shell != NULL); - g_return_if_fail (E_IS_SHELL (shell)); - - priv = shell->priv; - - if (priv->settings_dialog != NULL) { - gdk_window_show (priv->settings_dialog->window); - gtk_widget_grab_focus (priv->settings_dialog); - return; - } - - priv->settings_dialog = e_shell_settings_dialog_new (); - - if (type != NULL) - e_shell_settings_dialog_show_type (E_SHELL_SETTINGS_DIALOG (priv->settings_dialog), type); - - g_object_add_weak_pointer (G_OBJECT (priv->settings_dialog), (void **) & priv->settings_dialog); - - gtk_widget_show (priv->settings_dialog); -} - - -EComponentRegistry * -e_shell_get_component_registry (EShell *shell) -{ - g_return_val_if_fail (shell != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL (shell), NULL); - - return shell->priv->component_registry; -} - -EShellUserCreatableItemsHandler * -e_shell_get_user_creatable_items_handler (EShell *shell) -{ - g_return_val_if_fail (shell != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL (shell), NULL); - - return shell->priv->user_creatable_items_handler; -} - - -/* FIXME: These are ugly hacks, they really should not be needed. */ - -void -e_shell_unregister_all (EShell *shell) -{ - EShellPrivate *priv; - - g_return_if_fail (E_IS_SHELL (shell)); - - /* FIXME: This really really sucks. */ - - priv = shell->priv; - - priv->is_initialized = FALSE; - - g_object_unref (priv->component_registry); - priv->component_registry = NULL; -} - - -const char * -e_shell_construct_result_to_string (EShellConstructResult result) -{ - switch (result) { - case E_SHELL_CONSTRUCT_RESULT_OK: - return _("OK"); - case E_SHELL_CONSTRUCT_RESULT_INVALIDARG: - return _("Invalid arguments"); - case E_SHELL_CONSTRUCT_RESULT_CANNOTREGISTER: - return _("Cannot register on OAF"); - case E_SHELL_CONSTRUCT_RESULT_NOCONFIGDB: - return _("Configuration Database not found"); - case E_SHELL_CONSTRUCT_RESULT_GENERICERROR: - return _("Generic error"); - default: - return _("Unknown error"); - } -} - - -static void -prepare_for_quit_callback (EvolutionShellComponentClient *client, - EvolutionShellComponentResult result, - void *data) -{ - GNOME_Evolution_ShellComponentListener_Result *result_return; - - result_return = (GNOME_Evolution_ShellComponentListener_Result *) data; - *result_return = result; -} - -gboolean -e_shell_prepare_for_quit (EShell *shell) -{ - EShellPrivate *priv; - GList *component_ids; - GList *p; - gboolean retval; - - g_return_val_if_fail (E_IS_SHELL (shell), FALSE); - - priv = shell->priv; - priv->preparing_to_quit = TRUE; - - /* Make all the views insensitive so we have some modal-like - behavior. */ - for (p = priv->views; p != NULL; p = p->next) - gtk_widget_set_sensitive (GTK_WIDGET (p->data), FALSE); - - component_ids = e_component_registry_get_id_list (priv->component_registry); - - for (p = component_ids; p != NULL; p = p->next) { - EvolutionShellComponentClient *client; - const char *id; - GNOME_Evolution_ShellComponentListener_Result result; - - id = (const char *) p->data; - client = e_component_registry_get_component_by_id (priv->component_registry, id); - - result = (GNOME_Evolution_ShellComponentListener_Result) -1; - - evolution_shell_component_client_request_quit (client, prepare_for_quit_callback, &result); - - while (result == (GNOME_Evolution_ShellComponentListener_Result) -1) - gtk_main_iteration (); - - if (result == GNOME_Evolution_ShellComponentListener_CANCEL) { - retval = FALSE; - goto end; - } - } - - retval = TRUE; - - end: - /* Restore all the views to be sensitive. */ - for (p = priv->views; p != NULL; p = p->next) - gtk_widget_set_sensitive (GTK_WIDGET (p->data), TRUE); - priv->preparing_to_quit = FALSE; - - e_free_string_list (component_ids); - return retval; -} - - -/* URI parsing. */ - -static gboolean -parse_default_uri (EShell *shell, - const char *uri, - char **path_return, - char **extra_return) -{ - GConfClient *client; - const char *component_start; - char *component; - const char *p; - char *config_path; - char *path; - - component_start = uri + E_SHELL_DEFAULTURI_PREFIX_LEN; - p = strchr (uri, '#'); - - if (p == NULL) - component = g_strdup (component_start); - else - component = g_strndup (component_start, p - component_start); - - client = gconf_client_get_default (); - - config_path = g_strdup_printf ("/apps/evolution/shell/default_folders/%s_path", component); - path = gconf_client_get_string (client, config_path, NULL); - g_object_unref (client); - g_free (component); - g_free (config_path); - - /* We expect an evolution: URI here, if we don't get it then something - is messed up. */ - if (path == NULL || strncmp (path, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN) != 0) { - g_free (path); - if (path_return != NULL) - *path_return = NULL; - if (extra_return != NULL) - *extra_return = NULL; - return FALSE; - } - - if (path_return != NULL) - *path_return = g_strdup (path + E_SHELL_URI_PREFIX_LEN); - - if (extra_return != NULL) { - if (p == NULL) - *extra_return = NULL; - else - *extra_return = g_strdup (p + 1); - } - - g_free (path); - return TRUE; -} - -static gboolean -parse_evolution_uri (EShell *shell, - const char *uri, - char **path_return, - char **extra_return) -{ - const char *path_start; - const char *p; - - path_start = uri + E_SHELL_URI_PREFIX_LEN; - p = strchr (path_start, '#'); - - if (p != NULL && path_return != NULL) - *path_return = g_strndup (path_start, p - path_start); - else - *path_return = g_strdup (path_start); - - if (extra_return != NULL) { - if (p == NULL) - *extra_return = NULL; - else - *extra_return = g_strdup (p + 1); - } - - return TRUE; -} - -gboolean -e_shell_parse_uri (EShell *shell, - const char *uri, - char **path_return, - char **extra_return) -{ - g_return_val_if_fail (uri != NULL, FALSE); - - if (strncmp (uri, E_SHELL_DEFAULTURI_PREFIX, E_SHELL_DEFAULTURI_PREFIX_LEN) == 0) - return parse_default_uri (shell, uri, path_return, extra_return); - - if (strncmp (uri, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN) == 0) - return parse_evolution_uri (shell, uri, path_return, extra_return); - - *path_return = NULL; - if (extra_return != NULL) - *extra_return = NULL; - return FALSE; -} - - -BONOBO_TYPE_FUNC_FULL (EShell, - GNOME_Evolution_Shell, - PARENT_TYPE, - e_shell) diff --git a/shell/e-shell.h b/shell/e-shell.h deleted file mode 100644 index 4f1b1aaf7b..0000000000 --- a/shell/e-shell.h +++ /dev/null @@ -1,170 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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_ - -#include <bonobo-activation/bonobo-activation.h> -#include <bonobo/bonobo-object.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -typedef struct _EShell EShell; -typedef struct _EShellPrivate EShellPrivate; -typedef struct _EShellClass EShellClass; - -#include "Evolution.h" - -#include "e-component-registry.h" -#include "e-shell-view.h" -#include "e-uri-schema-registry.h" -#include "e-shell-user-creatable-items-handler.h" -#include "e-local-storage.h" - - -#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)) - - -enum _EShellLineStatus { - E_SHELL_LINE_STATUS_ONLINE, - E_SHELL_LINE_STATUS_GOING_OFFLINE, - E_SHELL_LINE_STATUS_OFFLINE -}; -typedef enum _EShellLineStatus EShellLineStatus; - -enum _EShellStartupLineMode { - E_SHELL_STARTUP_LINE_MODE_CONFIG, - E_SHELL_STARTUP_LINE_MODE_ONLINE, - E_SHELL_STARTUP_LINE_MODE_OFFLINE -}; -typedef enum _EShellStartupLineMode EShellStartupLineMode; - -struct _EShell { - BonoboObject parent; - - EShellPrivate *priv; -}; - -struct _EShellClass { - BonoboObjectClass parent_class; - - POA_GNOME_Evolution_Shell__epv epv; - - void (* no_views_left) (EShell *shell); - void (* line_status_changed) (EShell *shell, EShellLineStatus status); - void (* new_view_created) (EShell *shell, EShellView *view); - -}; - - -/* ID for registering the shell in the OAF name service. */ -#define E_SHELL_OAFIID "OAFIID:GNOME_Evolution_Shell" - -enum _EShellConstructResult { - E_SHELL_CONSTRUCT_RESULT_OK, - E_SHELL_CONSTRUCT_RESULT_INVALIDARG, - E_SHELL_CONSTRUCT_RESULT_CANNOTREGISTER, - E_SHELL_CONSTRUCT_RESULT_NOCONFIGDB, - E_SHELL_CONSTRUCT_RESULT_GENERICERROR -}; -typedef enum _EShellConstructResult EShellConstructResult; - - -#include "e-shortcuts.h" - - -GtkType e_shell_get_type (void); -EShellConstructResult e_shell_construct (EShell *shell, - const char *iid, - const char *local_directory, - gboolean show_splash, - EShellStartupLineMode startup_line_mode); -EShell *e_shell_new (const char *local_directory, - gboolean show_splash, - EShellStartupLineMode startup_line_mode, - EShellConstructResult *construct_result_return); - -EShellView *e_shell_create_view (EShell *shell, - const char *uri, - EShellView *template_view); -EShellView *e_shell_create_view_from_uri_and_settings (EShell *shell, - const char *uri, - int view_num); -gboolean e_shell_request_close_view (EShell *shell, - EShellView *view); - - -const char *e_shell_get_local_directory (EShell *shell); -EShortcuts *e_shell_get_shortcuts (EShell *shell); -EStorageSet *e_shell_get_storage_set (EShell *shell); -ELocalStorage *e_shell_get_local_storage (EShell *shell); -EFolderTypeRegistry *e_shell_get_folder_type_registry (EShell *shell); -EUriSchemaRegistry *e_shell_get_uri_schema_registry (EShell *shell); - -gboolean e_shell_save_settings (EShell *shell); - -void e_shell_destroy_all_views (EShell *shell); - -void e_shell_unregister_all (EShell *shell); - -void e_shell_component_maybe_crashed (EShell *shell, - const char *uri, - const char *type_name, - EShellView *shell_view); - -EShellLineStatus e_shell_get_line_status (EShell *shell); -void e_shell_go_offline (EShell *shell, - EShellView *action_view); -void e_shell_go_online (EShell *shell, - EShellView *action_view); - -void e_shell_send_receive (EShell *shell); -void e_shell_show_settings (EShell *shell, - const char *type, - EShellView *shell_view); - -EComponentRegistry *e_shell_get_component_registry (EShell *shell); -EShellUserCreatableItemsHandler *e_shell_get_user_creatable_items_handler (EShell *shell); - -gboolean e_shell_prepare_for_quit (EShell *shell); - - -const char *e_shell_construct_result_to_string (EShellConstructResult result); - - -gboolean e_shell_parse_uri (EShell *shell, - const char *uri, - char **path_return, - char **extra_return); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_SHELL_H_ */ diff --git a/shell/e-shortcuts-view-model.c b/shell/e-shortcuts-view-model.c deleted file mode 100644 index e7fb8c23fb..0000000000 --- a/shell/e-shortcuts-view-model.c +++ /dev/null @@ -1,341 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shortcuts-view-model.c - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 - */ - -/* FIXME. This really sucks. We are using the model/view approach in the - dumbest possible way. */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-shortcuts-view-model.h" - -#include "e-icon-factory.h" - -#include <glib.h> -#include <gtk/gtksignal.h> -#include <libgnome/gnome-i18n.h> - -#include <gal/util/e-util.h> - - -#define PARENT_TYPE e_shortcut_model_get_type () -static EShortcutModelClass *parent_class = NULL; - -struct _EShortcutsViewModelPrivate { - EShortcuts *shortcuts; -}; - - -/* Utility functions. */ - -static GdkPixbuf * -get_icon_for_item (EShortcutsViewModel *shortcuts_view_model, - const EShortcutItem *item, - gboolean want_mini) -{ - EShortcutsViewModelPrivate *priv; - - priv = shortcuts_view_model->priv; - - if (item->custom_icon_name != NULL) - return e_icon_factory_get_icon (item->custom_icon_name, want_mini); - - if (item->type != NULL) { - EStorageSet *storage_set; - EFolderTypeRegistry *folder_type_registry; - - storage_set = e_shell_get_storage_set (e_shortcuts_get_shell (priv->shortcuts)); - folder_type_registry = e_storage_set_get_folder_type_registry (storage_set); - - return e_folder_type_registry_get_icon_for_type (folder_type_registry, - item->type, - want_mini); - } - - return NULL; -} - - -/* View initialization. */ - -static char * -get_name_with_unread (const EShortcutItem *item) -{ - if (item->unread_count > 0) - return g_strdup_printf ("%s (%d)", item->name, item->unread_count); - else - return g_strdup (item->name); -} - -static void -load_group_into_model (EShortcutsViewModel *shortcuts_view_model, - int group_num) -{ - EShortcutsViewModelPrivate *priv; - const GSList *shortcut_list; - const GSList *p; - - priv = shortcuts_view_model->priv; - - shortcut_list = e_shortcuts_get_shortcuts_in_group (priv->shortcuts, group_num); - if (shortcut_list == NULL) - return; - - for (p = shortcut_list; p != NULL; p = p->next) { - const EShortcutItem *item; - char *name_with_unread; - - item = (const EShortcutItem *) p->data; - name_with_unread = get_name_with_unread (item); - - e_shortcut_model_add_item (E_SHORTCUT_MODEL (shortcuts_view_model), - group_num, -1, - item->uri, - name_with_unread, - get_icon_for_item (shortcuts_view_model, item, FALSE)); - - g_free (name_with_unread); - } -} - -static void -load_all_shortcuts_into_model (EShortcutsViewModel *shortcuts_view_model) -{ - EShortcutsViewModelPrivate *priv; - const GSList *group_titles; - const GSList *p; - int group_num; - - priv = shortcuts_view_model->priv; - - group_titles = e_shortcuts_get_group_titles (priv->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_MODEL (shortcuts_view_model), -1, group_title); - - load_group_into_model (shortcuts_view_model, group_num); - } -} - - -/* EShortcuts callbacks. */ - -static void -shortcuts_new_group_cb (EShortcuts *shortcuts, - int group_num, - void *data) -{ - EShortcutsViewModel *shortcuts_view_model; - EShortcutsViewModelPrivate *priv; - const char *title; - - shortcuts_view_model = E_SHORTCUTS_VIEW_MODEL (data); - priv = shortcuts_view_model->priv; - - title = e_shortcuts_get_group_title (priv->shortcuts, group_num); - e_shortcut_model_add_group (E_SHORTCUT_MODEL (shortcuts_view_model), group_num, title); -} - -static void -shortcuts_remove_group_cb (EShortcuts *shortcuts, - int group_num, - void *data) -{ - EShortcutsViewModel *shortcuts_view_model; - - shortcuts_view_model = E_SHORTCUTS_VIEW_MODEL (data); - e_shortcut_model_remove_group (E_SHORTCUT_MODEL (shortcuts_view_model), group_num); -} - -static void -shortcuts_rename_group_cb (EShortcuts *shortcuts, - int group_num, - const char *new_title, - void *data) -{ - EShortcutsViewModel *shortcuts_view_model; - - shortcuts_view_model = E_SHORTCUTS_VIEW_MODEL (data); - - /* FIXME: Ideally there should be an - e_shortcut_model_rename_group(), removing then re-add - actually causes a flip to the next group, which we work - around in e-shortcuts-view.c */ - e_shortcut_model_remove_group (E_SHORTCUT_MODEL (shortcuts_view_model), group_num); - e_shortcut_model_add_group (E_SHORTCUT_MODEL (shortcuts_view_model), group_num, new_title); - load_group_into_model (shortcuts_view_model, group_num); -} - -static void -shortcuts_new_shortcut_cb (EShortcuts *shortcuts, - int group_num, - int item_num, - void *data) -{ - EShortcutsViewModel *shortcuts_view_model; - EShortcutsViewModelPrivate *priv; - const EShortcutItem *shortcut_item; - char *name_with_unread; - - shortcuts_view_model = E_SHORTCUTS_VIEW_MODEL (data); - priv = shortcuts_view_model->priv; - - shortcut_item = e_shortcuts_get_shortcut (priv->shortcuts, group_num, item_num); - g_assert (shortcut_item != NULL); - - name_with_unread = get_name_with_unread (shortcut_item); - e_shortcut_model_add_item (E_SHORTCUT_MODEL (shortcuts_view_model), - group_num, item_num, - shortcut_item->uri, - name_with_unread, - get_icon_for_item (shortcuts_view_model, shortcut_item, FALSE)); - - g_free (name_with_unread); -} - -static void -shortcuts_remove_shortcut_cb (EShortcuts *shortcuts, - int group_num, - int item_num, - void *data) -{ - EShortcutsViewModel *shortcuts_view_model; - - shortcuts_view_model = E_SHORTCUTS_VIEW_MODEL (data); - e_shortcut_model_remove_item (E_SHORTCUT_MODEL (shortcuts_view_model), group_num, item_num); -} - -static void -shortcuts_update_shortcut_cb (EShortcuts *shortcuts, - int group_num, - int item_num, - void *data) -{ - EShortcutsViewModel *shortcuts_view_model; - EShortcutsViewModelPrivate *priv; - const EShortcutItem *shortcut_item; - char *name_with_unread; - - shortcuts_view_model = E_SHORTCUTS_VIEW_MODEL (data); - priv = shortcuts_view_model->priv; - - shortcut_item = e_shortcuts_get_shortcut (priv->shortcuts, group_num, item_num); - g_assert (shortcut_item != NULL); - - name_with_unread = get_name_with_unread (shortcut_item); - e_shortcut_model_update_item (E_SHORTCUT_MODEL (shortcuts_view_model), - group_num, item_num, - shortcut_item->uri, - name_with_unread, - get_icon_for_item (shortcuts_view_model, shortcut_item, FALSE)); - - g_free (name_with_unread); -} - - -/* GObject methods. */ - -static void -impl_finalize (GObject *object) -{ - EShortcutsViewModel *view_model; - EShortcutsViewModelPrivate *priv; - - view_model = E_SHORTCUTS_VIEW_MODEL (object); - priv = view_model->priv; - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -class_init (EShortcutsViewModelClass *klass) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - object_class->finalize = impl_finalize; - - parent_class = g_type_class_ref(e_shortcut_model_get_type ()); -} - -static void -init (EShortcutsViewModel *shortcuts_view_model) -{ - EShortcutsViewModelPrivate *priv; - - priv = g_new (EShortcutsViewModelPrivate, 1); - priv->shortcuts = NULL; - - shortcuts_view_model->priv = priv; -} - - -void -e_shortcuts_view_model_construct (EShortcutsViewModel *model, - EShortcuts *shortcuts) -{ - EShortcutsViewModelPrivate *priv; - - g_return_if_fail (model != NULL); - g_return_if_fail (E_IS_SHORTCUTS_VIEW_MODEL (model)); - g_return_if_fail (shortcuts != NULL); - g_return_if_fail (E_IS_SHORTCUTS (shortcuts)); - - priv = model->priv; - g_return_if_fail (priv->shortcuts == NULL); - - priv->shortcuts = shortcuts; - - load_all_shortcuts_into_model (model); - - g_signal_connect_object (priv->shortcuts, "new_group", G_CALLBACK (shortcuts_new_group_cb), model, 0); - g_signal_connect_object (priv->shortcuts, "remove_group", G_CALLBACK (shortcuts_remove_group_cb), model, 0); - g_signal_connect_object (priv->shortcuts, "rename_group", G_CALLBACK (shortcuts_rename_group_cb), model, 0); - g_signal_connect_object (priv->shortcuts, "new_shortcut", G_CALLBACK (shortcuts_new_shortcut_cb), model, 0); - g_signal_connect_object (priv->shortcuts, "remove_shortcut", G_CALLBACK (shortcuts_remove_shortcut_cb), model, 0); - g_signal_connect_object (priv->shortcuts, "update_shortcut", G_CALLBACK (shortcuts_update_shortcut_cb), model, 0); -} - -EShortcutsViewModel * -e_shortcuts_view_model_new (EShortcuts *shortcuts) -{ - EShortcutsViewModel *new; - - g_return_val_if_fail (shortcuts != NULL, NULL); - g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), NULL); - - new = g_object_new (e_shortcuts_view_model_get_type (), NULL); - - e_shortcuts_view_model_construct (new, shortcuts); - - return new; -} - - -E_MAKE_TYPE (e_shortcuts_view_model, "EShortcutsViewModel", EShortcutsViewModel, class_init, init, PARENT_TYPE) diff --git a/shell/e-shortcuts-view-model.h b/shell/e-shortcuts-view-model.h deleted file mode 100644 index 45e680ecb3..0000000000 --- a/shell/e-shortcuts-view-model.h +++ /dev/null @@ -1,66 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shortcuts-view-model.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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_MODEL_H_ -#define _E_SHORTCUTS_VIEW_MODEL_H_ - -#include <gal/shortcut-bar/e-shortcut-model.h> - -#include "e-shortcuts.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_SHORTCUTS_VIEW_MODEL (e_shortcuts_view_model_get_type ()) -#define E_SHORTCUTS_VIEW_MODEL(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SHORTCUTS_VIEW_MODEL, EShortcutsViewModel)) -#define E_SHORTCUTS_VIEW_MODEL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SHORTCUTS_VIEW_MODEL, EShortcutsViewModelClass)) -#define E_IS_SHORTCUTS_VIEW_MODEL(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SHORTCUTS_VIEW_MODEL)) -#define E_IS_SHORTCUTS_VIEW_MODEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SHORTCUTS_VIEW_MODEL)) - - -typedef struct _EShortcutsViewModel EShortcutsViewModel; -typedef struct _EShortcutsViewModelPrivate EShortcutsViewModelPrivate; -typedef struct _EShortcutsViewModelClass EShortcutsViewModelClass; - -struct _EShortcutsViewModel { - EShortcutModel parent; - - EShortcutsViewModelPrivate *priv; -}; - -struct _EShortcutsViewModelClass { - EShortcutModelClass parent_class; -}; - - -GtkType e_shortcuts_view_model_get_type (void); -void e_shortcuts_view_model_construct (EShortcutsViewModel *model, - EShortcuts *shortcuts); -EShortcutsViewModel *e_shortcuts_view_model_new (EShortcuts *shortcuts); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_SHORTCUTS_VIEW_MODEL_H_ */ diff --git a/shell/e-shortcuts-view.c b/shell/e-shortcuts-view.c deleted file mode 100644 index 1837e67eab..0000000000 --- a/shell/e-shortcuts-view.c +++ /dev/null @@ -1,800 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shortcuts-view.c - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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-shortcuts-view.h" - -#include "e-folder-dnd-bridge.h" -#include "e-shell-constants.h" -#include "e-shell-marshal.h" -#include "e-shortcuts-view-model.h" - -#include "e-util/e-request.h" - -#include <glib.h> -#include <gtk/gtkcheckmenuitem.h> -#include <gtk/gtkentry.h> -#include <gtk/gtklabel.h> - -#include <libgnome/gnome-i18n.h> - -#include <libgnomeui/gnome-app.h> -#include <libgnomeui/gnome-app-helper.h> -#include <libgnomeui/gnome-popup-menu.h> -#include <libgnomeui/gnome-uidefs.h> - -#include <gtk/gtkmessagedialog.h> -#include <gtk/gtkstock.h> - -#include <gal/util/e-util.h> - -#include <string.h> - - -#define PARENT_TYPE E_TYPE_SHORTCUT_BAR -static EShortcutBarClass *parent_class = NULL; - -struct _EShortcutsViewPrivate { - EShortcuts *shortcuts; -}; - -enum { - ACTIVATE_SHORTCUT, - HIDE_REQUESTED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - - -/* Utility functions. */ - -static void -show_new_group_dialog (EShortcutsView *view) -{ - char *group_name; - - group_name = e_request_string (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view))), - _("Create New Shortcut Group"), - _("Group name:"), - NULL); - - if (group_name == NULL) - return; - - e_shortcuts_add_group (view->priv->shortcuts, -1, group_name); - - g_free (group_name); -} - - -/* 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; - - menu_data = (RightClickMenuData *) data; - - if (menu_data == NULL) - return; - - if (! GTK_CHECK_MENU_ITEM (widget)->active) - return; - - e_shortcuts_set_group_uses_small_icons (menu_data->shortcuts_view->priv->shortcuts, menu_data->group_num, FALSE); -} - -static void -toggle_small_icons_cb (GtkWidget *widget, - void *data) -{ - RightClickMenuData *menu_data; - - menu_data = (RightClickMenuData *) data; - if (menu_data == NULL) - return; - - if (! GTK_CHECK_MENU_ITEM (widget)->active) - return; - - e_shortcuts_set_group_uses_small_icons (menu_data->shortcuts_view->priv->shortcuts, menu_data->group_num, TRUE); -} - -static void -hide_shortcut_bar_cb (GtkWidget *widget, - void *data) -{ - RightClickMenuData *menu_data; - EShortcutsView *shortcut_view; - - menu_data = (RightClickMenuData *) data; - - shortcut_view = E_SHORTCUTS_VIEW (menu_data->shortcuts_view); - - g_signal_emit (shortcut_view, signals[HIDE_REQUESTED], 0); -} - -static void -create_new_group_cb (GtkWidget *widget, - void *data) -{ - RightClickMenuData *menu_data; - - menu_data = (RightClickMenuData *) data; - - show_new_group_dialog (menu_data->shortcuts_view); -} - -static void -destroy_group_cb (GtkWidget *widget, - void *data) -{ - RightClickMenuData *menu_data; - EShortcuts *shortcuts; - EShortcutsView *shortcuts_view; - EShortcutsViewPrivate *priv; - GtkWidget *message_dialog; - GtkResponseType response; - - menu_data = (RightClickMenuData *) data; - shortcuts_view = menu_data->shortcuts_view; - priv = shortcuts_view->priv; - shortcuts = priv->shortcuts; - - message_dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (menu_data->shortcuts_view))), - GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, - GTK_MESSAGE_QUESTION, - GTK_BUTTONS_NONE, - _("Do you really want to remove group " - "\"%s\" from the shortcut bar?"), - e_shortcuts_get_group_title (shortcuts, menu_data->group_num)); - - gtk_dialog_add_buttons (GTK_DIALOG (message_dialog), - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_DELETE, GTK_RESPONSE_OK, - NULL); - - gtk_window_set_title (GTK_WINDOW (message_dialog), "Remove Shortcut Group"); - - gtk_container_set_border_width (GTK_CONTAINER (message_dialog), 6); - - gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (message_dialog)->vbox), 6); - - gtk_dialog_set_default_response (GTK_DIALOG (message_dialog), GTK_RESPONSE_OK); - - response = gtk_dialog_run (GTK_DIALOG (message_dialog)); - gtk_widget_destroy (message_dialog); - - if (response == GTK_RESPONSE_OK) - e_shortcuts_remove_group (shortcuts, menu_data->group_num); -} - -static void -rename_group_cb (GtkWidget *widget, - void *data) -{ - RightClickMenuData *menu_data; - EShortcuts *shortcuts; - EShortcutsView *shortcuts_view; - EIconBarViewType original_view_type; - const char *old_name; - char *new_name; - int group; - - menu_data = (RightClickMenuData *) data; - shortcuts_view = menu_data->shortcuts_view; - shortcuts = shortcuts_view->priv->shortcuts; - - old_name = e_shortcuts_get_group_title (shortcuts, menu_data->group_num); - - new_name = e_request_string (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (shortcuts_view))), - _("Rename Shortcut Group"), - _("Rename selected shortcut group to:"), - old_name); - - if (new_name == NULL) - return; - - /* Remember the group and flip back to it. FIXME: This is a workaround - to an actual ShortcutBar bug. */ - - group = e_group_bar_get_current_group_num (E_GROUP_BAR (shortcuts_view)); - original_view_type = e_shortcut_bar_get_view_type (E_SHORTCUT_BAR (menu_data->shortcuts_view), group); - e_shortcuts_rename_group (shortcuts, menu_data->group_num, new_name); - - g_free (new_name); - e_group_bar_set_current_group_num (E_GROUP_BAR (shortcuts_view), group, FALSE); - e_shortcut_bar_set_view_type (E_SHORTCUT_BAR (menu_data->shortcuts_view), group, original_view_type); -} - -static void -create_default_shortcuts_cb (GtkWidget *widget, - void *data) -{ - RightClickMenuData *menu_data; - EShortcutsView *shortcuts_view; - - menu_data = (RightClickMenuData *) data; - shortcuts_view = menu_data->shortcuts_view; - e_shortcuts_add_default_shortcuts (shortcuts_view->priv->shortcuts, - e_group_bar_get_current_group_num (E_GROUP_BAR (shortcuts_view))); -} - -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_SEPARATOR, - - { GNOME_APP_UI_ITEM, N_("_Add Group..."), - N_("Create a new shortcut group"), create_new_group_cb, NULL, - NULL, 0, 0, 0, 0 }, - { GNOME_APP_UI_ITEM, N_("_Remove this Group..."), - N_("Remove this shortcut group"), destroy_group_cb, NULL, - NULL, 0, 0, 0, 0 }, - { GNOME_APP_UI_ITEM, N_("Re_name this Group..."), - N_("Rename this shortcut group"), rename_group_cb, NULL, - NULL, 0, 0, 0, 0 }, - - GNOMEUIINFO_SEPARATOR, - - { GNOME_APP_UI_ITEM, N_("_Hide the Shortcut Bar"), - N_("Hide the shortcut bar"), hide_shortcut_bar_cb, NULL, - NULL, 0, 0, 0, 0 }, - - GNOMEUIINFO_SEPARATOR, - - { GNOME_APP_UI_ITEM, N_("Create _Default Shortcuts"), - N_("Create Default Shortcuts"), create_default_shortcuts_cb, NULL, - NULL, 0, 0, 0, 0 }, - - 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); - - if (group_num == 0) - gtk_widget_set_sensitive (right_click_menu_uiinfo[3].widget, FALSE); - - gnome_popup_menu_do_popup_modal (popup_menu, NULL, NULL, event, menu_data, GTK_WIDGET (shortcuts_view)); - - g_free (menu_data); - gtk_widget_destroy (popup_menu); -} - - -/* Data to be passed around for the shortcut right-click menu items. */ - -struct _ShortcutRightClickMenuData { - EShortcutsView *shortcuts_view; - int group_num; - int item_num; -}; -typedef struct _ShortcutRightClickMenuData ShortcutRightClickMenuData; - - -/* "Open Shortcut" and "Open Shortcut in New Window" commands. */ - -static void -open_shortcut_helper (ShortcutRightClickMenuData *menu_data, - gboolean in_new_window) -{ - EShortcutsView *shortcuts_view; - EShortcuts *shortcuts; - const EShortcutItem *shortcut_item; - - shortcuts_view = menu_data->shortcuts_view; - shortcuts = shortcuts_view->priv->shortcuts; - - shortcut_item = e_shortcuts_get_shortcut (shortcuts, menu_data->group_num, menu_data->item_num); - if (shortcut_item == NULL) - return; - - g_signal_emit (shortcuts_view, signals[ACTIVATE_SHORTCUT], 0, - shortcuts, shortcut_item->uri, in_new_window); -} - -static void -open_shortcut_cb (GtkWidget *widget, - void *data) -{ - open_shortcut_helper ((ShortcutRightClickMenuData *) data, FALSE); -} - -static void -open_shortcut_in_new_window_cb (GtkWidget *widget, - void *data) -{ - open_shortcut_helper ((ShortcutRightClickMenuData *) data, TRUE); -} - - -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); -} - - -/* "Rename Shortcut" command. */ - -static void -rename_shortcut_cb (GtkWidget *widget, - void *data) -{ - ShortcutRightClickMenuData *menu_data; - EShortcutsView *shortcuts_view; - EShortcuts *shortcuts; - const EShortcutItem *shortcut_item; - char *new_name; - - menu_data = (ShortcutRightClickMenuData *) data; - shortcuts_view = menu_data->shortcuts_view; - shortcuts = shortcuts_view->priv->shortcuts; - - shortcut_item = e_shortcuts_get_shortcut (shortcuts, menu_data->group_num, menu_data->item_num); - - new_name = e_request_string (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (shortcuts_view))), - _("Rename Shortcut"), - _("Rename selected shortcut to:"), - shortcut_item->name); - - if (new_name == NULL) - return; - - e_shortcuts_update_shortcut (shortcuts, menu_data->group_num, menu_data->item_num, - shortcut_item->uri, new_name, shortcut_item->unread_count, - shortcut_item->type, shortcut_item->custom_icon_name); - g_free (new_name); -} - -static GnomeUIInfo shortcut_right_click_menu_uiinfo[] = { - GNOMEUIINFO_ITEM_STOCK (N_("_Open"), N_("Open the folder linked to this shortcut"), - open_shortcut_cb, GTK_STOCK_OPEN), - GNOMEUIINFO_ITEM_NONE (N_("Open in New _Window"), N_("Open the folder linked to this shortcut in a new window"), - open_shortcut_in_new_window_cb), - GNOMEUIINFO_SEPARATOR, - GNOMEUIINFO_ITEM_NONE (N_("_Rename"), N_("Rename this shortcut"), - rename_shortcut_cb), - GNOMEUIINFO_ITEM_STOCK (N_("Re_move"), N_("Remove this shortcut from the shortcut bar"), - remove_shortcut_cb, GTK_STOCK_REMOVE), - 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, GTK_WIDGET (shortcuts_view)); - - g_free (menu_data); - gtk_widget_destroy (popup_menu); -} - - -/* View callbacks. This part exists mostly because of breakage in the - EShortcutBar design. */ - -static void -group_change_icon_size_callback (EShortcuts *shortucts, - int group_num, - gboolean use_small_icons, - void *data) -{ - EShortcutsView *view; - - view = E_SHORTCUTS_VIEW (data); - - if (use_small_icons) - e_shortcut_bar_set_view_type (E_SHORTCUT_BAR (view), group_num, E_ICON_BAR_SMALL_ICONS); - else - e_shortcut_bar_set_view_type (E_SHORTCUT_BAR (view), group_num, E_ICON_BAR_LARGE_ICONS); -} - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - EShortcutsViewPrivate *priv; - EShortcutsView *shortcuts_view; - - shortcuts_view = E_SHORTCUTS_VIEW (object); - - priv = shortcuts_view->priv; - - if (priv->shortcuts != NULL) { - g_object_unref (priv->shortcuts); - priv->shortcuts = NULL; - } - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EShortcutsView *shortcuts_view; - - shortcuts_view = E_SHORTCUTS_VIEW (object); - - g_free (shortcuts_view->priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -/* EShortcutBar methods. */ - -static void -item_selected (EShortcutBar *shortcut_bar, - GdkEvent *event, - int group_num, - int item_num) -{ - EShortcuts *shortcuts; - EShortcutsView *shortcuts_view; - const EShortcutItem *shortcut_item; - - 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; - - shortcut_item = e_shortcuts_get_shortcut (shortcuts, group_num, item_num); - if (shortcut_item == NULL) - return; - - g_signal_emit (shortcuts_view, signals[ACTIVATE_SHORTCUT], 0, - shortcuts, shortcut_item->uri, FALSE); -} - -static void -get_shortcut_info (EShortcutsView *shortcuts_view, - const char *item_uri, - int *unread_count_return, - const char **type_return, - const char **custom_icon_name_return) -{ - EShortcutsViewPrivate *priv; - EStorageSet *storage_set; - EFolder *folder; - EShell *shell; - char *path; - - priv = shortcuts_view->priv; - - shell = e_shortcuts_get_shell (priv->shortcuts); - - if (! e_shell_parse_uri (shell, item_uri, &path, NULL)) { - *unread_count_return = 0; - *type_return = NULL; - *custom_icon_name_return = NULL; - return; - } - - storage_set = e_shell_get_storage_set (shell); - - folder = e_storage_set_get_folder (storage_set, path); - if (folder != NULL) { - *unread_count_return = e_folder_get_unread_count (folder); - *type_return = e_folder_get_type_string (folder); - *custom_icon_name_return = e_folder_get_custom_icon_name (folder); - } else { - *unread_count_return = 0; - *type_return = NULL; - *custom_icon_name_return = NULL; - } - - g_free (path); -} - -static void -impl_shortcut_dropped (EShortcutBar *shortcut_bar, - int group_num, - int position, - const char *item_url, - const char *item_name) -{ - EShortcutsView *shortcuts_view; - EShortcutsViewPrivate *priv; - int unread_count; - const char *type; - const char *custom_icon_name; - char *tmp; - char *tp; - char *name_without_unread; - - shortcuts_view = E_SHORTCUTS_VIEW (shortcut_bar); - priv = shortcuts_view->priv; - - get_shortcut_info (shortcuts_view, item_url, &unread_count, &type, &custom_icon_name); - - /* Looks funny, but keeps it from adding the unread count - repeatedly when dragging folders around */ - tmp = g_strdup_printf (" (%d)", unread_count); - if ((tp = strstr (item_name, tmp)) != NULL) - name_without_unread = g_strndup (item_name, strlen (item_name) - strlen (tp)); - else - name_without_unread = g_strdup (item_name); - - e_shortcuts_add_shortcut (priv->shortcuts, - group_num, position, - item_url, - name_without_unread, - unread_count, - type, - custom_icon_name); - - g_free (tmp); - g_free (name_without_unread); -} - -static void -impl_shortcut_dragged (EShortcutBar *shortcut_bar, - gint group_num, - gint item_num) -{ - EShortcutsView *shortcuts_view; - EShortcutsViewPrivate *priv; - - shortcuts_view = E_SHORTCUTS_VIEW (shortcut_bar); - priv = shortcuts_view->priv; - - e_shortcuts_remove_shortcut (priv->shortcuts, group_num, item_num); -} - -static gboolean -impl_shortcut_drag_motion (EShortcutBar *shortcut_bar, - GtkWidget *widget, - GdkDragContext *context, - guint time, - gint group_num, - gint item_num) -{ - EShortcutsView *view; - EShortcutsViewPrivate *priv; - const EShortcutItem *shortcut; - - view = E_SHORTCUTS_VIEW (shortcut_bar); - priv = view->priv; - - shortcut = e_shortcuts_get_shortcut (priv->shortcuts, group_num, item_num); - if (shortcut == NULL) - return FALSE; - if (strncmp (shortcut->uri, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN) != 0) - return FALSE; - - if (! e_folder_dnd_bridge_motion (widget, context, time, - e_shell_get_storage_set (e_shortcuts_get_shell (priv->shortcuts)), - shortcut->uri + E_SHELL_URI_PREFIX_LEN)) - gdk_drag_status (context, 0, time); - - return TRUE; -} - -static gboolean -impl_shortcut_drag_data_received (EShortcutBar *shortcut_bar, - GtkWidget *widget, - GdkDragContext *context, - GtkSelectionData *selection_data, - guint time, - gint group_num, - gint item_num) -{ - EShortcutsView *view; - EShortcutsViewPrivate *priv; - const EShortcutItem *shortcut; - - view = E_SHORTCUTS_VIEW (shortcut_bar); - priv = view->priv; - - shortcut = e_shortcuts_get_shortcut (priv->shortcuts, group_num, item_num); - if (shortcut == NULL) - return FALSE; - if (strncmp (shortcut->uri, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN) != 0) - return FALSE; - - e_folder_dnd_bridge_data_received (widget, context, selection_data, time, - e_shell_get_storage_set (e_shortcuts_get_shell (priv->shortcuts)), - shortcut->uri + E_SHELL_URI_PREFIX_LEN); - return TRUE; -} - - -static void -class_init (EShortcutsViewClass *klass) -{ - GObjectClass *object_class; - EShortcutBarClass *shortcut_bar_class; - - object_class = G_OBJECT_CLASS (klass); - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - shortcut_bar_class = E_SHORTCUT_BAR_CLASS (klass); - shortcut_bar_class->item_selected = item_selected; - shortcut_bar_class->shortcut_dropped = impl_shortcut_dropped; - shortcut_bar_class->shortcut_dragged = impl_shortcut_dragged; - shortcut_bar_class->shortcut_drag_motion = impl_shortcut_drag_motion; - shortcut_bar_class->shortcut_drag_data_received = impl_shortcut_drag_data_received; - - parent_class = g_type_class_ref(e_shortcut_bar_get_type ()); - - signals[ACTIVATE_SHORTCUT] = - g_signal_new ("activate_shortcut", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, - G_STRUCT_OFFSET (EShortcutsViewClass, activate_shortcut), - NULL, NULL, - e_shell_marshal_NONE__POINTER_STRING_BOOL, - G_TYPE_NONE, 3, - G_TYPE_POINTER, - G_TYPE_STRING, - G_TYPE_BOOLEAN); - - signals[HIDE_REQUESTED] = - g_signal_new ("hide_requested", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EShortcutsViewClass, - hide_requested), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); -} - -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; - int i, num_groups; - - g_return_if_fail (shortcuts != NULL); - g_return_if_fail (E_IS_SHORTCUTS (shortcuts)); - - priv = shortcuts_view->priv; - - priv->shortcuts = shortcuts; - g_object_ref (priv->shortcuts); - - e_shortcut_bar_set_model (E_SHORTCUT_BAR (shortcuts_view), - E_SHORTCUT_MODEL (e_shortcuts_view_model_new (shortcuts))); - - g_signal_connect_object (shortcuts, "group_change_icon_size", - G_CALLBACK (group_change_icon_size_callback), shortcuts_view, 0); - - num_groups = e_shortcuts_get_num_groups (shortcuts); - for (i = 0; i < num_groups; i ++) { - if (e_shortcuts_get_group_uses_small_icons (shortcuts, i)) - e_shortcut_bar_set_view_type (E_SHORTCUT_BAR (shortcuts_view), i, E_ICON_BAR_SMALL_ICONS); - else - e_shortcut_bar_set_view_type (E_SHORTCUT_BAR (shortcuts_view), i, E_ICON_BAR_LARGE_ICONS); - } -} - -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 = g_object_new (e_shortcuts_view_get_type (), NULL); - 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 e905fabdc8..0000000000 --- a/shell/e-shortcuts-view.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shortcuts-view.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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_ - -#include <gtk/gtkwidget.h> - -#include <gal/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, - gboolean in_new_window); - - void (* hide_requested) (EShortcutsView *view); -}; - - -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 5def82dcdb..0000000000 --- a/shell/e-shortcuts.c +++ /dev/null @@ -1,1288 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shortcuts.c - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 like this: - - <?xml version="1.0"?> - <shortcuts> - <group title="Evolution shortcuts"> - <item name="Inbox" type="mail">evolution:/local/Inbox</item> - <item name="Trash" type="vtrash">evolution:/local/Trash</item> - <item name="Calendar" type="calendar">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 "e-shortcuts.h" - -#include <string.h> - -#include <glib.h> -#include <gtk/gtkmain.h> -#include <gtk/gtkobject.h> -#include <gtk/gtksignal.h> -#include <gtk/gtktypeutils.h> - -#include <libxml/parser.h> -#include <libxml/xmlmemory.h> - -#include <libgnome/gnome-i18n.h> - -#include <gal/util/e-xml-utils.h> -#include <gal/util/e-util.h> -#include <gal/shortcut-bar/e-shortcut-bar.h> - -#include "e-shortcuts-view.h" - -#include "e-shell-constants.h" -#include "e-shell-marshal.h" - - -#define PARENT_TYPE GTK_TYPE_OBJECT -static GtkObjectClass *parent_class = NULL; - -struct _ShortcutGroup { - /* Title of the group. */ - char *title; - - /* A list of shortcuts. */ - GSList *shortcuts; - - /* Whether to use small icons for this group. */ - unsigned int use_small_icons : 1; -}; -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 shell that is associated with these shortcuts. */ - EShell *shell; - - /* Total number of groups. */ - int num_groups; - - /* A list of ShortcutGroups. */ - GSList *groups; - - /* A list of ShortcutViews. */ - GSList *views; -}; - -enum { - NEW_GROUP, - REMOVE_GROUP, - RENAME_GROUP, - GROUP_CHANGE_ICON_SIZE, - NEW_SHORTCUT, - REMOVE_SHORTCUT, - UPDATE_SHORTCUT, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - - -static void make_dirty (EShortcuts *shortcuts); - - -static EShortcutItem * -shortcut_item_new (const char *uri, - const char *name, - int unread_count, - const char *type, - const char *custom_icon_name) -{ - EShortcutItem *new; - - new = g_new (EShortcutItem, 1); - - if (name == NULL) - new->name = g_path_get_basename (uri); - else - new->name = g_strdup (name); - - new->uri = g_strdup (uri); - new->type = g_strdup (type); - new->custom_icon_name = g_strdup (custom_icon_name); - new->unread_count = unread_count; - - return new; -} - -static gboolean -shortcut_item_update (EShortcutItem *shortcut_item, - const char *uri, - const char *name, - int unread_count, - const char *type, - const char *custom_icon_name) -{ - char *base_name = g_path_get_basename (uri); - gboolean changed = FALSE; - - if (name == NULL) - name = base_name; - - if (shortcut_item->unread_count != unread_count) { - shortcut_item->unread_count = unread_count; - changed = TRUE; - } - -#define UPDATE_STRING(member) \ - if (shortcut_item->member == NULL || member == NULL || \ - strcmp (shortcut_item->member, member) != 0) { \ - g_free (shortcut_item->member); \ - shortcut_item->member = g_strdup (member); \ - changed = TRUE; \ - } - - UPDATE_STRING (uri); - UPDATE_STRING (name); - UPDATE_STRING (type); - UPDATE_STRING (custom_icon_name); - -#undef UPDATE_STRING - - g_free (base_name); - - return changed; -} - -static void -shortcut_item_free (EShortcutItem *shortcut_item) -{ - g_free (shortcut_item->uri); - g_free (shortcut_item->name); - g_free (shortcut_item->type); - - g_free (shortcut_item); -} - -static ShortcutGroup * -shortcut_group_new (const char *title) -{ - ShortcutGroup *new; - - new = g_new (ShortcutGroup, 1); - new->title = g_strdup (title); - new->shortcuts = NULL; - new->use_small_icons = FALSE; - - return new; -} - -static void -shortcut_group_free (ShortcutGroup *group) -{ - GSList *p; - - g_free (group->title); - - for (p = group->shortcuts; p != NULL; p = p->next) - shortcut_item_free ((EShortcutItem *) p->data); - g_slist_free (group->shortcuts); - - g_free (group); -} - - -/* Utility functions. */ - -static gboolean -update_shortcut_and_emit_signal (EShortcuts *shortcuts, - EShortcutItem *shortcut_item, - int group_num, - int num, - const char *uri, - const char *name, - int unread_count, - const char *type, - const char *custom_icon_name) -{ - gboolean shortcut_changed; - - shortcut_changed = shortcut_item_update (shortcut_item, uri, name, unread_count, type, custom_icon_name); - if (shortcut_changed) { - g_signal_emit (shortcuts, signals[UPDATE_SHORTCUT], 0, group_num, num); - return TRUE; - } - - return FALSE; -} - -static void -unload_shortcuts (EShortcuts *shortcuts) -{ - EShortcutsPrivate *priv; - GSList *orig_groups; - GSList *p; - - priv = shortcuts->priv; - orig_groups = priv->groups; - - for (p = priv->groups; p != NULL; p = p->next) { - ShortcutGroup *group; - - g_signal_emit (shortcuts, signals[REMOVE_GROUP], 0, 0); - - group = (ShortcutGroup *) p->data; - - shortcut_group_free (group); - - priv->groups = priv->groups->next; - } - - if (orig_groups != NULL) - g_slist_free (orig_groups); - - priv->groups = NULL; -} - -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->children; p != NULL; p = p->next) { - ShortcutGroup *shortcut_group; - xmlChar *shortcut_group_title; - xmlChar *icon_size; - - if (strcmp ((char *) p->name, "group") != 0) - continue; - - shortcut_group_title = xmlGetProp (p, "title"); - if (shortcut_group_title == NULL) - continue; - - shortcut_group = shortcut_group_new (shortcut_group_title); - xmlFree (shortcut_group_title); - - icon_size = xmlGetProp (p, "icon_size"); - if (icon_size != NULL && strcmp (icon_size, "small") == 0) - shortcut_group->use_small_icons = TRUE; - else - shortcut_group->use_small_icons = FALSE; - xmlFree (icon_size); - - for (q = p->children; q != NULL; q = q->next) { - EShortcutItem *shortcut_item; - xmlChar *uri; - xmlChar *name; - xmlChar *type; - xmlChar *icon; - char *path; - - if (strcmp ((char *) q->name, "item") != 0) - continue; - - uri = xmlNodeListGetString (doc, q->children, 1); - if (uri == NULL) - continue; - - if (e_shell_parse_uri (priv->shell, uri, &path, NULL)) { - EFolder *folder; - - folder = e_storage_set_get_folder (e_shell_get_storage_set (priv->shell), path); - if (folder != NULL) { - name = xmlMemStrdup (e_folder_get_name (folder)); - type = xmlMemStrdup (e_folder_get_type_string (folder)); - - if (e_folder_get_custom_icon_name (folder) != NULL) - icon = xmlMemStrdup (e_folder_get_custom_icon_name (folder)); - else - icon = NULL; - } else { - name = xmlGetProp (q, "name"); - type = xmlGetProp (q, "type"); - icon = xmlGetProp (q, "icon"); - } - - shortcut_item = shortcut_item_new (uri, name, 0, type, icon); - shortcut_group->shortcuts = g_slist_prepend (shortcut_group->shortcuts, - shortcut_item); - - if (name != NULL) - xmlFree (name); - if (type != NULL) - xmlFree (type); - if (icon != NULL) - xmlFree (icon); - } - - g_free (path); - xmlFree (uri); - } - - shortcut_group->shortcuts = g_slist_reverse (shortcut_group->shortcuts); - - priv->groups = g_slist_prepend (priv->groups, shortcut_group); - priv->num_groups ++; - } - - priv->groups = g_slist_reverse (priv->groups); - - xmlFreeDoc (doc); - - /* After loading, we always have to re-save ourselves as we have merged - the information we have with the information we got from the - StorageSet. */ - /* FIXME: Obviously, this sucks. */ - make_dirty (shortcuts); - - return TRUE; -} - -static gboolean -save_shortcuts (EShortcuts *shortcuts, - const char *file_name) -{ - EShortcutsPrivate *priv; - xmlDoc *doc; - xmlNode *root; - GSList *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); - - if (group->use_small_icons) - xmlSetProp (group_node, (xmlChar *) "icon_size", "small"); - else - xmlSetProp (group_node, (xmlChar *) "icon_size", "large"); - - for (q = group->shortcuts; q != NULL; q = q->next) { - EShortcutItem *shortcut; - xmlNode *shortcut_node; - - shortcut = (EShortcutItem *) q->data; - shortcut_node = xmlNewTextChild (group_node, NULL, (xmlChar *) "item", - (xmlChar *) shortcut->uri); - - if (shortcut->name != NULL) - xmlSetProp (shortcut_node, (xmlChar *) "name", shortcut->name); - - if (shortcut->type != NULL) - xmlSetProp (shortcut_node, (xmlChar *) "type", shortcut->type); - - if (shortcut->custom_icon_name != NULL) - xmlSetProp (shortcut_node, (xmlChar *) "icon", shortcut->custom_icon_name); - } - } - - 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) { - 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; - - priv->save_idle_id = gtk_idle_add (idle_cb, shortcuts); -} - -static void -make_dirty (EShortcuts *shortcuts) -{ - EShortcutsPrivate *priv; - - priv = shortcuts->priv; - - priv->dirty = TRUE; - schedule_idle (shortcuts); -} - -static void -update_shortcuts_by_path (EShortcuts *shortcuts, - const char *path) -{ - EShortcutsPrivate *priv; - EFolder *folder; - const GSList *p, *q; - char *evolution_uri; - int group_num, num; - gboolean changed = FALSE; - - priv = shortcuts->priv; - folder = e_storage_set_get_folder (e_shell_get_storage_set (priv->shell), path); - - evolution_uri = g_strconcat (E_SHELL_URI_PREFIX, path, NULL); - - group_num = 0; - for (p = priv->groups; p != NULL; p = p->next, group_num++) { - ShortcutGroup *group; - - group = (ShortcutGroup *) p->data; - num = 0; - for (q = group->shortcuts; q != NULL; q = q->next, num++) { - EShortcutItem *shortcut_item; - char *shortcut_path; - - shortcut_item = (EShortcutItem *) q->data; - - if (! e_shell_parse_uri (priv->shell, shortcut_item->uri, &shortcut_path, NULL)) { - /* Ignore bogus URIs. */ - continue; - } - - if (strcmp (shortcut_path, path) == 0) { - changed = update_shortcut_and_emit_signal (shortcuts, - shortcut_item, - group_num, - num, - shortcut_item->uri, - shortcut_item->name, - e_folder_get_unread_count (folder), - e_folder_get_type_string (folder), - e_folder_get_custom_icon_name (folder)); - } - - g_free (shortcut_path); - } - } - - g_free (evolution_uri); - - if (changed) - make_dirty (shortcuts); -} - - -static EShortcutItem * -get_item (EShortcuts *shortcuts, - int group_num, - int num) -{ - EShortcutsPrivate *priv; - ShortcutGroup *group; - GSList *group_element; - GSList *shortcut_element; - - g_return_val_if_fail (shortcuts != NULL, NULL); - g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), NULL); - - priv = shortcuts->priv; - - group_element = g_slist_nth (priv->groups, group_num); - if (group_element == NULL) - return NULL; - - group = (ShortcutGroup *) group_element->data; - - shortcut_element = g_slist_nth (group->shortcuts, num); - if (shortcut_element == NULL) - return NULL; - - return (EShortcutItem *) shortcut_element->data; -} - - -/* Signal handlers for the views. */ - -static void -view_weak_notify (void *data, - GObject *where_the_object_was) -{ - EShortcuts *shortcuts; - EShortcutsPrivate *priv; - - shortcuts = E_SHORTCUTS (data); - priv = shortcuts->priv; - - priv->views = g_slist_remove (priv->views, where_the_object_was); -} - - -/* Signal handlers for the EStorageSet. */ - -static void -storage_set_new_folder_callback (EStorageSet *storage_set, - const char *path, - void *data) -{ - EShortcuts *shortcuts; - - shortcuts = E_SHORTCUTS (data); - - update_shortcuts_by_path (shortcuts, path); -} - -static void -storage_set_updated_folder_callback (EStorageSet *storage_set, - const char *path, - void *data) -{ - EShortcuts *shortcuts; - - shortcuts = E_SHORTCUTS (data); - - update_shortcuts_by_path (shortcuts, path); -} - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - EShortcuts *shortcuts; - EShortcutsPrivate *priv; - GSList *p; - - shortcuts = E_SHORTCUTS (object); - priv = shortcuts->priv; - - unload_shortcuts (shortcuts); - - if (priv->save_idle_id != 0) { - gtk_idle_remove (priv->save_idle_id); - priv->save_idle_id = 0; - } - - if (priv->dirty) { - if (! e_shortcuts_save (shortcuts, NULL)) - g_warning (_("Error saving shortcuts.")); /* FIXME */ - priv->dirty = FALSE; - } - - for (p = priv->views; p != NULL; p = p->next) - g_object_weak_unref (G_OBJECT (p->data), view_weak_notify, shortcuts); - g_slist_free (priv->views); - priv->views = NULL; - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EShortcuts *shortcuts; - EShortcutsPrivate *priv; - - shortcuts = E_SHORTCUTS (object); - priv = shortcuts->priv; - - g_free (priv->file_name); - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -class_init (EShortcutsClass *klass) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - parent_class = g_type_class_ref(gtk_object_get_type ()); - - signals[NEW_GROUP] - = g_signal_new ("new_group", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EShortcutsClass, new_group), - NULL, NULL, - e_shell_marshal_NONE__INT, - G_TYPE_NONE, 1, - G_TYPE_INT); - - signals[REMOVE_GROUP] - = g_signal_new ("remove_group", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EShortcutsClass, remove_group), - NULL, NULL, - e_shell_marshal_NONE__INT, - G_TYPE_NONE, 1, - G_TYPE_INT); - - signals[RENAME_GROUP] - = g_signal_new ("rename_group", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EShortcutsClass, rename_group), - NULL, NULL, - e_shell_marshal_NONE__INT_STRING, - G_TYPE_NONE, 2, - G_TYPE_INT, - G_TYPE_STRING); - - signals[GROUP_CHANGE_ICON_SIZE] - = g_signal_new ("group_change_icon_size", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EShortcutsClass, group_change_icon_size), - NULL, NULL, - e_shell_marshal_NONE__INT_INT, - G_TYPE_NONE, 2, - G_TYPE_INT, - G_TYPE_INT); - - signals[NEW_SHORTCUT] - = g_signal_new ("new_shortcut", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EShortcutsClass, new_shortcut), - NULL, NULL, - e_shell_marshal_NONE__INT_INT, - G_TYPE_NONE, 2, - G_TYPE_INT, - G_TYPE_INT); - - signals[REMOVE_SHORTCUT] - = g_signal_new ("remove_shortcut", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EShortcutsClass, remove_shortcut), - NULL, NULL, - e_shell_marshal_NONE__INT_INT, - G_TYPE_NONE, 2, - G_TYPE_INT, - G_TYPE_INT); - - signals[UPDATE_SHORTCUT] - = g_signal_new ("update_shortcut", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EShortcutsClass, update_shortcut), - NULL, NULL, - e_shell_marshal_NONE__INT_INT, - G_TYPE_NONE, 2, - G_TYPE_INT, - G_TYPE_INT); -} - - -static void -init (EShortcuts *shortcuts) -{ - EShortcutsPrivate *priv; - - priv = g_new (EShortcutsPrivate, 1); - - priv->file_name = NULL; - priv->num_groups = 0; - priv->groups = NULL; - priv->views = NULL; - priv->dirty = 0; - priv->save_idle_id = 0; - priv->shell = NULL; - - shortcuts->priv = priv; -} - - -void -e_shortcuts_construct (EShortcuts *shortcuts, - EShell *shell) -{ - EShortcutsPrivate *priv; - EStorageSet *storage_set; - - g_return_if_fail (E_IS_SHORTCUTS (shortcuts)); - g_return_if_fail (E_IS_SHELL (shell)); - - GTK_OBJECT_UNSET_FLAGS (GTK_OBJECT (shortcuts), GTK_FLOATING); - - priv = shortcuts->priv; - - /* Don't ref it so we don't create a circular dependency. */ - priv->shell = shell; - - storage_set = e_shell_get_storage_set (shell); - - g_signal_connect_object (storage_set, "new_folder", - G_CALLBACK (storage_set_new_folder_callback), shortcuts, 0); - g_signal_connect_object (storage_set, "updated_folder", - G_CALLBACK (storage_set_updated_folder_callback), shortcuts, 0); -} - -EShortcuts * -e_shortcuts_new_from_file (EShell *shell, - const char *file_name) -{ - EShortcuts *new; - - g_return_val_if_fail (E_IS_SHELL (shell), NULL); - g_return_val_if_fail (file_name != NULL, NULL); - - new = g_object_new (e_shortcuts_get_type (), NULL); - e_shortcuts_construct (new, shell); - - if (! e_shortcuts_load (new, file_name)) - new->priv->file_name = g_strdup (file_name); - - return new; -} - - -int -e_shortcuts_get_num_groups (EShortcuts *shortcuts) -{ - g_return_val_if_fail (shortcuts != NULL, 0); - g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), 0); - - return shortcuts->priv->num_groups; -} - -GSList * -e_shortcuts_get_group_titles (EShortcuts *shortcuts) -{ - EShortcutsPrivate *priv; - ShortcutGroup *group; - GSList *list; - GSList *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_slist_prepend (list, g_strdup (group->title)); - } - - return g_slist_reverse (list); -} - -const GSList * -e_shortcuts_get_shortcuts_in_group (EShortcuts *shortcuts, - int group_num) -{ - EShortcutsPrivate *priv; - ShortcutGroup *shortcut_group; - GSList *shortcut_group_list_item; - - priv = shortcuts->priv; - - g_return_val_if_fail (shortcuts != NULL, NULL); - g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), NULL); - - shortcut_group_list_item = g_slist_nth (priv->groups, group_num); - if (shortcut_group_list_item == NULL) - return NULL; - - shortcut_group = (ShortcutGroup *) shortcut_group_list_item->data; - - return shortcut_group->shortcuts; -} - - -EShell * -e_shortcuts_get_shell (EShortcuts *shortcuts) -{ - g_return_val_if_fail (shortcuts != NULL, NULL); - g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), NULL); - - return shortcuts->priv->shell; -} - - -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_slist_prepend (priv->views, new); - - g_object_weak_ref (G_OBJECT (new), view_weak_notify, 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 EShortcutItem * -e_shortcuts_get_shortcut (EShortcuts *shortcuts, - int group_num, - int num) -{ - g_return_val_if_fail (shortcuts != NULL, NULL); - g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), NULL); - - return (const EShortcutItem *) get_item (shortcuts, group_num, num); -} - - -void -e_shortcuts_remove_shortcut (EShortcuts *shortcuts, - int group_num, - int num) -{ - EShortcutsPrivate *priv; - ShortcutGroup *group; - GSList *p; - EShortcutItem *item; - - g_return_if_fail (shortcuts != NULL); - g_return_if_fail (E_IS_SHORTCUTS (shortcuts)); - - priv = shortcuts->priv; - - p = g_slist_nth (priv->groups, group_num); - g_return_if_fail (p != NULL); - - group = (ShortcutGroup *) p->data; - - p = g_slist_nth (group->shortcuts, num); - g_return_if_fail (p != NULL); - - g_signal_emit (shortcuts, signals[REMOVE_SHORTCUT], 0, group_num, num); - - item = (EShortcutItem *) p->data; - shortcut_item_free (item); - - group->shortcuts = g_slist_remove_link (group->shortcuts, p); - - make_dirty (shortcuts); -} - -void -e_shortcuts_add_shortcut (EShortcuts *shortcuts, - int group_num, - int num, - const char *uri, - const char *name, - int unread_count, - const char *type, - const char *custom_icon_name) -{ - EShortcutsPrivate *priv; - ShortcutGroup *group; - EShortcutItem *item; - GSList *p; - - g_return_if_fail (shortcuts != NULL); - g_return_if_fail (E_IS_SHORTCUTS (shortcuts)); - - priv = shortcuts->priv; - - p = g_slist_nth (priv->groups, group_num); - g_return_if_fail (p != NULL); - - group = (ShortcutGroup *) p->data; - - if (num == -1) - num = g_slist_length (group->shortcuts); - - item = shortcut_item_new (uri, name, unread_count, type, custom_icon_name); - - group->shortcuts = g_slist_insert (group->shortcuts, item, num); - - g_signal_emit (shortcuts, signals[NEW_SHORTCUT], 0, group_num, num); - - make_dirty (shortcuts); -} - -void -e_shortcuts_update_shortcut (EShortcuts *shortcuts, - int group_num, - int num, - const char *uri, - const char *name, - int unread_count, - const char *type, - const char *custom_icon_name) -{ - EShortcutItem *shortcut_item; - - g_return_if_fail (shortcuts != NULL); - g_return_if_fail (E_IS_SHORTCUTS (shortcuts)); - - shortcut_item = get_item (shortcuts, group_num, num); - - update_shortcut_and_emit_signal (shortcuts, shortcut_item, group_num, num, - uri, name, unread_count, type, custom_icon_name); - - make_dirty (shortcuts); -} - - -void -e_shortcuts_add_default_shortcuts (EShortcuts *shortcuts, - int group_num) -{ - e_shortcuts_add_shortcut (shortcuts, 0, -1, E_SUMMARY_URI, _("Summary"), 0, "summary", NULL); - - e_shortcuts_add_shortcut (shortcuts, 0, -1, "default:mail", _("Inbox"), 0, "mail", "inbox"); - e_shortcuts_add_shortcut (shortcuts, 0, -1, "default:calendar", _("Calendar"), 0, "calendar", NULL); - e_shortcuts_add_shortcut (shortcuts, 0, -1, "default:tasks", _("Tasks"), 0, "tasks", NULL); - e_shortcuts_add_shortcut (shortcuts, 0, -1, "default:contacts", _("Contacts"), 0, "contacts", NULL); -} - -void -e_shortcuts_add_default_group (EShortcuts *shortcuts) -{ - g_return_if_fail (shortcuts != NULL); - g_return_if_fail (E_IS_SHORTCUTS (shortcuts)); - - e_shortcuts_add_group (shortcuts, -1, _("Shortcuts")); - - e_shortcuts_add_default_shortcuts (shortcuts, -1); -} - -void -e_shortcuts_remove_group (EShortcuts *shortcuts, - int group_num) -{ - EShortcutsPrivate *priv; - GSList *p; - - g_return_if_fail (shortcuts != NULL); - g_return_if_fail (E_IS_SHORTCUTS (shortcuts)); - - priv = shortcuts->priv; - - p = g_slist_nth (priv->groups, group_num); - g_return_if_fail (p != NULL); - - g_signal_emit (shortcuts, signals[REMOVE_GROUP], 0, group_num); - - shortcut_group_free ((ShortcutGroup *) p->data); - - priv->groups = g_slist_remove_link (priv->groups, p); - priv->num_groups --; - - make_dirty (shortcuts); -} - -void -e_shortcuts_rename_group (EShortcuts *shortcuts, - int group_num, - const char *new_title) -{ - EShortcutsPrivate *priv; - GSList *p; - ShortcutGroup *group; - - g_return_if_fail (shortcuts != NULL); - g_return_if_fail (E_IS_SHORTCUTS (shortcuts)); - - priv = shortcuts->priv; - - p = g_slist_nth (priv->groups, group_num); - g_return_if_fail (p != NULL); - - group = (ShortcutGroup *) p->data; - if (strcmp (group->title, new_title)) { - g_free (group->title); - group->title = g_strdup (new_title); - } else - return; - - g_signal_emit (shortcuts, signals[RENAME_GROUP], 0, group_num, new_title); - - 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 = shortcut_group_new (group_name); - - if (group_num == -1) - group_num = g_slist_length (priv->groups); - - priv->groups = g_slist_insert (priv->groups, group, group_num); - priv->num_groups ++; - - g_signal_emit (shortcuts, signals[NEW_GROUP], 0, group_num); - - make_dirty (shortcuts); -} - - -const char * -e_shortcuts_get_group_title (EShortcuts *shortcuts, - int group_num) -{ - EShortcutsPrivate *priv; - GSList *group_element; - const ShortcutGroup *group; - - g_return_val_if_fail (shortcuts != NULL, NULL); - g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), NULL); - - priv = shortcuts->priv; - - group_element = g_slist_nth (priv->groups, group_num); - if (group_element == NULL) - return NULL; - - group = (ShortcutGroup *) group_element->data; - - return group->title; -} - -void -e_shortcuts_set_group_uses_small_icons (EShortcuts *shortcuts, - int group_num, - gboolean use_small_icons) -{ - EShortcutsPrivate *priv; - ShortcutGroup *group; - GSList *group_element; - - g_return_if_fail (E_IS_SHORTCUTS (shortcuts)); - - priv = shortcuts->priv; - - group_element = g_slist_nth (priv->groups, group_num); - if (group_element == NULL) - return; - - group = (ShortcutGroup *) group_element->data; - - use_small_icons = !! use_small_icons; - if (group->use_small_icons != use_small_icons) { - group->use_small_icons = use_small_icons; - g_signal_emit (shortcuts, signals[GROUP_CHANGE_ICON_SIZE], 0, group_num, use_small_icons); - - make_dirty (shortcuts); - } -} - -gboolean -e_shortcuts_get_group_uses_small_icons (EShortcuts *shortcuts, - int group_num) -{ - EShortcutsPrivate *priv; - ShortcutGroup *group; - GSList *group_element; - - g_return_val_if_fail (E_IS_SHORTCUTS (shortcuts), FALSE); - - priv = shortcuts->priv; - - group_element = g_slist_nth (priv->groups, group_num); - if (group_element == NULL) - return FALSE; - - group = (ShortcutGroup *) group_element->data; - return group->use_small_icons; -} - - -void -e_shortcuts_update_shortcuts_for_changed_uri (EShortcuts *shortcuts, - const char *old_uri, - const char *new_uri) -{ - EShortcutsPrivate *priv; - GSList *p; - - g_return_if_fail (E_IS_SHORTCUTS (shortcuts)); - g_return_if_fail (old_uri != NULL); - g_return_if_fail (new_uri != NULL); - - priv = shortcuts->priv; - - for (p = priv->groups; p != NULL; p = p->next) { - ShortcutGroup *group; - GSList *q; - - group = (ShortcutGroup *) p->data; - for (q = group->shortcuts; q != NULL; q = q->next) { - EShortcutItem *item; - - item = (EShortcutItem *) q->data; - - if (strcmp (item->uri, old_uri) == 0) { - g_free (item->uri); - item->uri = g_strdup (new_uri); - - 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 30e2ff01e8..0000000000 --- a/shell/e-shortcuts.h +++ /dev/null @@ -1,167 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shortcuts.h - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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_ - -#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 _EShortcutItem { - /* URI of the shortcut. */ - char *uri; - - /* Name of the shortcut. */ - char *name; - - /* Folder type for the shortcut. If the shortcut doesn't point to a - folder, this is NULL. */ - char *type; - - /* Custom icon for the shortcut. If this is NULL, then the shortcut - should just use the icon for the type. */ - char *custom_icon_name; - - /* Number of unread items in the folder. Zero if not a folder. */ - int unread_count; -}; -typedef struct _EShortcutItem EShortcutItem; - -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 (* rename_group) (EShortcuts *shortcuts, int group_num, const char *new_title); - - void (* group_change_icon_size) (EShortcuts *shortcuts, int group_num, gboolean use_small_icons); - - void (* new_shortcut) (EShortcuts *shortcuts, int group_num, int item_num); - void (* remove_shortcut) (EShortcuts *shortcuts, int group_num, int item_num); - void (* update_shortcut) (EShortcuts *shortcuts, int group_num, int item_num); -}; - - -#include "e-shell.h" - - -GtkType e_shortcuts_get_type (void); -void e_shortcuts_construct (EShortcuts *shortcuts, - EShell *shell); -EShortcuts *e_shortcuts_new_from_file (EShell *shell, - const char *file_name); - -int e_shortcuts_get_num_groups (EShortcuts *shortcuts); - -GSList *e_shortcuts_get_group_titles (EShortcuts *shortcuts); -const char *e_shortcuts_get_group_title (EShortcuts *shortcuts, - int group_num); -const GSList *e_shortcuts_get_shortcuts_in_group (EShortcuts *shortcuts, - int group_num); - -const EShortcutItem *e_shortcuts_get_shortcut (EShortcuts *shortcuts, - int group_num, - int num); - -EShell *e_shortcuts_get_shell (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); - -void e_shortcuts_add_default_shortcuts (EShortcuts *shortcuts, - int group_num); -void e_shortcuts_add_default_group (EShortcuts *shortcuts); - -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, - const char *name, - int unread_count, - const char *type, - const char *custom_icon_name); -void e_shortcuts_update_shortcut (EShortcuts *shortcuts, - int group_num, - int num, - const char *uri, - const char *name, - int unread_count, - const char *type, - const char *custom_icon_name); - -void e_shortcuts_remove_group (EShortcuts *shortcuts, - int group_num); -void e_shortcuts_add_group (EShortcuts *shortcuts, - int group_num, - const char *group_title); -void e_shortcuts_rename_group (EShortcuts *shortcuts, - int group_num, - const char *new_title); - -void e_shortcuts_set_group_uses_small_icons (EShortcuts *shortcuts, - int group_num, - gboolean use_small_icons); -gboolean e_shortcuts_get_group_uses_small_icons (EShortcuts *shortcuts, - int group_num); - -void e_shortcuts_update_shortcuts_for_changed_uri (EShortcuts *shortcuts, - const char *old_uri_, - const char *new_uri); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_SHORTCUTS_H_ */ diff --git a/shell/e-splash.c b/shell/e-splash.c deleted file mode 100644 index a6bb79e98c..0000000000 --- a/shell/e-splash.c +++ /dev/null @@ -1,451 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-splash.c - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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-splash.h" - -#include "e-util/e-gtk-utils.h" - -#include <gtk/gtkframe.h> -#include <gtk/gtkmain.h> -#include <gtk/gtksignal.h> -#include <libgnomecanvas/gnome-canvas-pixbuf.h> -#include <libgnomeui/gnome-window-icon.h> -#include <gal/util/e-util.h> - - - -#define PARENT_TYPE gtk_window_get_type () -static GtkWindowClass *parent_class = NULL; - -struct _Icon { - GdkPixbuf *dark_pixbuf; - GdkPixbuf *light_pixbuf; - GnomeCanvasItem *canvas_item; -}; -typedef struct _Icon Icon; - -struct _ESplashPrivate { - GnomeCanvas *canvas; - GdkPixbuf *splash_image_pixbuf; - - GList *icons; /* (Icon *) */ - int num_icons; - - int layout_idle_id; -}; - - -/* Layout constants. These need to be changed if the splash changes. */ - -#define ICON_Y 280 -#define ICON_SIZE 32 - - -/* Icon management. */ - -static GdkPixbuf * -create_darkened_pixbuf (GdkPixbuf *pixbuf) -{ - GdkPixbuf *new; - unsigned char *rowp; - int width, height; - int rowstride; - int i, j; - - new = gdk_pixbuf_copy (pixbuf); - if (! gdk_pixbuf_get_has_alpha (new)) - return new; - - width = gdk_pixbuf_get_width (new); - height = gdk_pixbuf_get_height (new); - rowstride = gdk_pixbuf_get_rowstride (new); - - rowp = gdk_pixbuf_get_pixels (new); - for (i = 0; i < height; i ++) { - unsigned char *p; - - p = rowp; - for (j = 0; j < width; j++) { - p[3] *= .25; - p += 4; - } - - rowp += rowstride; - } - - return new; -} - -static Icon * -icon_new (ESplash *splash, - GdkPixbuf *image_pixbuf) -{ - ESplashPrivate *priv; - GnomeCanvasGroup *canvas_root_group; - Icon *icon; - - priv = splash->priv; - - icon = g_new (Icon, 1); - - icon->light_pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, ICON_SIZE, ICON_SIZE); - gdk_pixbuf_scale (image_pixbuf, icon->light_pixbuf, - 0, 0, - ICON_SIZE, ICON_SIZE, - 0, 0, - (double) ICON_SIZE / gdk_pixbuf_get_width (image_pixbuf), - (double) ICON_SIZE / gdk_pixbuf_get_height (image_pixbuf), - GDK_INTERP_HYPER); - - icon->dark_pixbuf = create_darkened_pixbuf (icon->light_pixbuf); - - /* Set up the canvas item to point to the dark pixbuf initially. */ - - canvas_root_group = GNOME_CANVAS_GROUP (GNOME_CANVAS (priv->canvas)->root); - - icon->canvas_item = gnome_canvas_item_new (canvas_root_group, - GNOME_TYPE_CANVAS_PIXBUF, - "pixbuf", icon->dark_pixbuf, - NULL); - - return icon; -} - -static void -icon_free (Icon *icon) -{ - g_object_unref (icon->dark_pixbuf); - g_object_unref (icon->light_pixbuf); - -/* g_object_unref (icon->canvas_item); */ - - g_free (icon); -} - - -/* Icon layout management. */ - -static void -layout_icons (ESplash *splash) -{ - ESplashPrivate *priv; - GList *p; - double x_step; - double x, y; - - priv = splash->priv; - - x_step = ((double) gdk_pixbuf_get_width (priv->splash_image_pixbuf)) / priv->num_icons; - - x = (x_step - ICON_SIZE) / 2.0; - y = ICON_Y; - - for (p = priv->icons; p != NULL; p = p->next) { - Icon *icon; - - icon = (Icon *) p->data; - - g_object_set((icon->canvas_item), - "x", (double) x, - "y", (double) ICON_Y, - NULL); - - x += x_step; - } -} - -static int -layout_idle_cb (void *data) -{ - ESplash *splash; - ESplashPrivate *priv; - - splash = E_SPLASH (data); - priv = splash->priv; - - layout_icons (splash); - - priv->layout_idle_id = 0; - - return FALSE; -} - -static void -schedule_relayout (ESplash *splash) -{ - ESplashPrivate *priv; - - priv = splash->priv; - - if (priv->layout_idle_id != 0) - return; - - priv->layout_idle_id = gtk_idle_add (layout_idle_cb, splash); -} - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - ESplash *splash; - ESplashPrivate *priv; - - splash = E_SPLASH (object); - priv = splash->priv; - - if (priv->splash_image_pixbuf != NULL) { - g_object_unref (priv->splash_image_pixbuf); - priv->splash_image_pixbuf = NULL; - } - - if (priv->layout_idle_id != 0) { - gtk_idle_remove (priv->layout_idle_id); - priv->layout_idle_id = 0; - } - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - ESplash *splash; - ESplashPrivate *priv; - GList *p; - - splash = E_SPLASH (object); - priv = splash->priv; - - for (p = priv->icons; p != NULL; p = p->next) { - Icon *icon; - - icon = (Icon *) p->data; - icon_free (icon); - } - - g_list_free (priv->icons); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -class_init (ESplashClass *klass) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - parent_class = g_type_class_ref(gtk_window_get_type ()); -} - -static void -init (ESplash *splash) -{ - ESplashPrivate *priv; - - priv = g_new (ESplashPrivate, 1); - priv->canvas = NULL; - priv->splash_image_pixbuf = NULL; - priv->icons = NULL; - priv->num_icons = 0; - priv->layout_idle_id = 0; - - splash->priv = priv; -} - -static gboolean -button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer data) -{ - ESplash *splash; - - splash = E_SPLASH (data); - - gtk_widget_hide (GTK_WIDGET (splash)); - - return TRUE; -} - - -/** - * e_splash_construct: - * @splash: A pointer to an ESplash widget - * @splash_image_pixbuf: The pixbuf for the image to appear in the splash dialog - * - * Construct @splash with @splash_image_pixbuf as the splash image. - **/ -void -e_splash_construct (ESplash *splash, - GdkPixbuf *splash_image_pixbuf) -{ - ESplashPrivate *priv; - GtkWidget *canvas, *frame; - int image_width, image_height; - - g_return_if_fail (splash != NULL); - g_return_if_fail (E_IS_SPLASH (splash)); - g_return_if_fail (splash_image_pixbuf != NULL); - - priv = splash->priv; - - priv->splash_image_pixbuf = g_object_ref (splash_image_pixbuf); - - canvas = gnome_canvas_new_aa (); - priv->canvas = GNOME_CANVAS (canvas); - - e_make_widget_backing_stored (canvas); - - image_width = gdk_pixbuf_get_width (splash_image_pixbuf); - image_height = gdk_pixbuf_get_height (splash_image_pixbuf); - - gtk_widget_set_size_request (canvas, image_width, image_height); - gnome_canvas_set_scroll_region (GNOME_CANVAS (canvas), 0, 0, image_width, image_height); - gtk_widget_show (canvas); - - frame = gtk_frame_new (NULL); - gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT); - gtk_container_add (GTK_CONTAINER (frame), canvas); - gtk_widget_show (frame); - - gtk_container_add (GTK_CONTAINER (splash), frame); - - gnome_canvas_item_new (GNOME_CANVAS_GROUP (priv->canvas->root), - GNOME_TYPE_CANVAS_PIXBUF, - "pixbuf", splash_image_pixbuf, - NULL); - - g_signal_connect (splash, "button-press-event", - G_CALLBACK (button_press_event), splash); - - g_object_set((splash), "type", GTK_WINDOW_TOPLEVEL, NULL); - gtk_window_set_position (GTK_WINDOW (splash), GTK_WIN_POS_CENTER); - gtk_window_set_resizable (GTK_WINDOW (splash), FALSE); - gtk_window_set_default_size (GTK_WINDOW (splash), image_width, image_height); - gtk_window_set_wmclass (GTK_WINDOW (splash), "evolution-splash", "Evolution"); - gnome_window_icon_set_from_file (GTK_WINDOW (splash), EVOLUTION_DATADIR "/pixmaps/evolution.png"); - gtk_window_set_title (GTK_WINDOW (splash), "Ximian Evolution"); - -} - -/** - * e_splash_new: - * - * Create a new ESplash widget. - * - * Return value: A pointer to the newly created ESplash widget. - **/ -GtkWidget * -e_splash_new (void) -{ - ESplash *new; - GdkPixbuf *splash_image_pixbuf; - - splash_image_pixbuf = gdk_pixbuf_new_from_file (EVOLUTION_IMAGES "/splash.png", NULL); - - if (splash_image_pixbuf == NULL) { - g_warning("Cannot find splash image: %s", EVOLUTION_IMAGES "/splash.png"); - return NULL; - } - - new = g_object_new (e_splash_get_type (), NULL); - e_splash_construct (new, splash_image_pixbuf); - - /* g_object_unref (splash_image_pixbuf); */ - - return GTK_WIDGET (new); -} - - -/** - * e_splash_add_icon: - * @splash: A pointer to an ESplash widget - * @icon_pixbuf: Pixbuf for the icon to be added - * - * Add @icon_pixbuf to the @splash. - * - * Return value: The total number of icons in the splash after the new icon has - * been added. - **/ -int -e_splash_add_icon (ESplash *splash, - GdkPixbuf *icon_pixbuf) -{ - ESplashPrivate *priv; - Icon *icon; - - g_return_val_if_fail (splash != NULL, 0); - g_return_val_if_fail (E_IS_SPLASH (splash), 0); - g_return_val_if_fail (icon_pixbuf != NULL, 0); - - priv = splash->priv; - - icon = icon_new (splash, icon_pixbuf); - priv->icons = g_list_append (priv->icons, icon); - - priv->num_icons ++; - - schedule_relayout (splash); - - return priv->num_icons; -} - -/** - * e_splash_set_icon_highlight: - * @splash: A pointer to an ESplash widget - * @num: Number of the icon whose highlight state must be changed - * @highlight: Whether the icon must be highlit or not - * - * Change the highlight state of the @num-th icon. - **/ -void -e_splash_set_icon_highlight (ESplash *splash, - int num, - gboolean highlight) -{ - ESplashPrivate *priv; - Icon *icon; - - g_return_if_fail (splash != NULL); - g_return_if_fail (E_IS_SPLASH (splash)); - - priv = splash->priv; - - icon = (Icon *) g_list_nth_data (priv->icons, num); - g_return_if_fail (icon != NULL); - - g_object_set((icon->canvas_item), - "pixbuf", highlight ? icon->light_pixbuf : icon->dark_pixbuf, - NULL); -} - - -E_MAKE_TYPE (e_splash, "ESplash", ESplash, class_init, init, PARENT_TYPE) diff --git a/shell/e-splash.h b/shell/e-splash.h deleted file mode 100644 index 209b815bfe..0000000000 --- a/shell/e-splash.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-splash.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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_SPLASH_H_ -#define _E_SPLASH_H_ - -#include <gdk-pixbuf/gdk-pixbuf.h> -#include <gtk/gtkwindow.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_SPLASH (e_splash_get_type ()) -#define E_SPLASH(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SPLASH, ESplash)) -#define E_SPLASH_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SPLASH, ESplashClass)) -#define E_IS_SPLASH(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SPLASH)) -#define E_IS_SPLASH_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SPLASH)) - - -typedef struct _ESplash ESplash; -typedef struct _ESplashPrivate ESplashPrivate; -typedef struct _ESplashClass ESplashClass; - -struct _ESplash { - GtkWindow parent; - - ESplashPrivate *priv; -}; - -struct _ESplashClass { - GtkWindowClass parent_class; -}; - - -GtkType e_splash_get_type (void); -void e_splash_construct (ESplash *splash, - GdkPixbuf *splash_image); -GtkWidget *e_splash_new (void); - -int e_splash_add_icon (ESplash *splash, - GdkPixbuf *icon); -void e_splash_set_icon_highlight (ESplash *splash, - int num, - gboolean highlight); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_SPLASH_H_ */ diff --git a/shell/e-storage-set-store.c b/shell/e-storage-set-store.c deleted file mode 100644 index e2816d87d2..0000000000 --- a/shell/e-storage-set-store.c +++ /dev/null @@ -1,1361 +0,0 @@ -/* e-storage-set-store.c - * Copyright (C) 2002 Ximian, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library 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 - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library 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. - */ - -#include <string.h> - -#include <gtk/gtktreemodel.h> -#include <gtk/gtktreednd.h> - -#include "e-icon-factory.h" -#include "e-storage-set-store.h" -#include "e-shell-constants.h" - -struct _EStorageSetStorePrivate { - EStorageSet *storage_set; - GHashTable *checkboxes; - GHashTable *path_to_node; - GHashTable *type_name_to_pixbuf; - GNode *root; - gint stamp; - EStorageSetStoreHasCheckBoxFunc has_checkbox_func; - gpointer has_checkbox_func_data; -}; - -#define G_NODE(node) ((GNode *)(node)) -#define VALID_ITER(iter, store) ((iter) != NULL && (iter)->user_data != NULL && (store)->priv->stamp == (iter)->stamp) -#define VALID_COL(col) ((col) >= 0 && (col) < E_STORAGE_SET_STORE_COLUMN_COUNT) - -static GObjectClass *parent_class = NULL; - -static gboolean -has_checkbox (EStorageSetStore *store, const gchar *folder_path) -{ - EStorageSetStorePrivate *priv = store->priv; - - g_return_val_if_fail (folder_path != NULL, FALSE); - - if (strchr (folder_path + 1, '/') == NULL) { - /* If it's a toplevel, never allow checking it. */ - return FALSE; - } - -#if 0 - if (priv->has_checkbox_func) - return (* priv->has_checkbox_func) (priv->storage_set, - folder_path, - priv->has_checkbox_func_data); -#endif - - return TRUE; -} - - -/* GtkTreeModel interface implementation */ - -static guint -esss_get_flags(GtkTreeModel *tree_model) -{ - g_return_val_if_fail(E_IS_STORAGE_SET_STORE(tree_model), 0); - - return GTK_TREE_MODEL_ITERS_PERSIST; -} - -static gint -esss_get_n_columns(GtkTreeModel *tree_model) -{ - g_return_val_if_fail(E_IS_STORAGE_SET_STORE(tree_model), 0); - - return E_STORAGE_SET_STORE_COLUMN_COUNT; -} - -static GType -esss_get_column_type(GtkTreeModel *tree_model, gint index) -{ - EStorageSetStore *store = (EStorageSetStore *) tree_model; - GType retval; - - g_return_val_if_fail(E_IS_STORAGE_SET_STORE(tree_model), G_TYPE_INVALID); - g_return_val_if_fail(VALID_COL(index), G_TYPE_INVALID); - - switch (index) { - case E_STORAGE_SET_STORE_COLUMN_NAME: - retval = G_TYPE_STRING; - break; - case E_STORAGE_SET_STORE_COLUMN_HIGHLIGHT: - retval = G_TYPE_INT; - break; - case E_STORAGE_SET_STORE_COLUMN_CHECKED: - case E_STORAGE_SET_STORE_COLUMN_CHECKABLE: - retval = G_TYPE_BOOLEAN; - break; - case E_STORAGE_SET_STORE_COLUMN_ICON: - retval = GDK_TYPE_PIXBUF; - break; - default: - g_assert_not_reached (); - } - - return retval; -} - -static gboolean -esss_get_iter(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreePath *path) -{ - EStorageSetStore *store = (EStorageSetStore *) tree_model; - GtkTreeIter parent; - gint *indices; - gint depth, i; - - g_return_val_if_fail(E_IS_STORAGE_SET_STORE(tree_model), FALSE); - g_return_val_if_fail(iter != NULL, FALSE); - - indices = gtk_tree_path_get_indices(path); - depth = gtk_tree_path_get_depth(path); - - g_return_val_if_fail(depth > 0, FALSE); - - parent.stamp = store->priv->stamp; - parent.user_data = store->priv->root; - - for (i = 0; i < depth; i++) { - if (!gtk_tree_model_iter_nth_child (tree_model, iter, &parent, indices[i])) - return FALSE; - parent = *iter; - } - - return TRUE; -} - -static GtkTreePath * -tree_path_from_node (EStorageSetStore *store, GNode *node) -{ - GtkTreePath *retval; - GNode *tmp_node, *curr_node; - gint i = 0; - - if (node == store->priv->root) - return NULL; - - retval = gtk_tree_path_new(); - - for (curr_node = node; curr_node != store->priv->root; curr_node = curr_node->parent) { - - if (curr_node->parent == NULL) { - gtk_tree_path_free(retval); - return NULL; - } - - for (i = 0, tmp_node = curr_node->parent->children; - tmp_node && tmp_node != curr_node; - i++, tmp_node = tmp_node->next); - - if (tmp_node == NULL) { - gtk_tree_path_free(retval); - return NULL; - } - - gtk_tree_path_prepend_index(retval, i); - } - - return retval; -} - -static GtkTreePath * -esss_get_path(GtkTreeModel *tree_model, GtkTreeIter *iter) -{ - EStorageSetStore *store = (EStorageSetStore *) tree_model; - - g_return_val_if_fail(E_IS_STORAGE_SET_STORE(tree_model), NULL); - g_return_val_if_fail(VALID_ITER(iter, store), NULL); - - if (iter->user_data == store->priv->root) - return NULL; - - return tree_path_from_node (store, G_NODE (iter->user_data)); -} - -static GdkPixbuf * -get_pixbuf_for_folder (EStorageSetStore *store, EFolder *folder) -{ - const char *type_name; - EStorageSetStorePrivate *priv; - EFolderTypeRegistry *folder_type_registry; - EStorageSet *storage_set; - GdkPixbuf *icon_pixbuf; - GdkPixbuf *scaled_pixbuf; - const char *custom_icon_name; - int icon_pixbuf_width, icon_pixbuf_height; - - priv = store->priv; - - custom_icon_name = e_folder_get_custom_icon_name (folder); - if (custom_icon_name != NULL) - return e_icon_factory_get_icon (custom_icon_name, TRUE); - - type_name = e_folder_get_type_string (folder); - - scaled_pixbuf = g_hash_table_lookup (priv->type_name_to_pixbuf, type_name); - if (scaled_pixbuf != NULL) - return scaled_pixbuf; - - storage_set = priv->storage_set; - folder_type_registry = e_storage_set_get_folder_type_registry (storage_set); - - icon_pixbuf = e_folder_type_registry_get_icon_for_type (folder_type_registry, - type_name, TRUE); - - if (icon_pixbuf == NULL) - return NULL; - - icon_pixbuf_width = gdk_pixbuf_get_width (icon_pixbuf); - icon_pixbuf_height = gdk_pixbuf_get_height (icon_pixbuf); - - if (icon_pixbuf_width == E_SHELL_MINI_ICON_SIZE && icon_pixbuf_height == E_SHELL_MINI_ICON_SIZE) { - scaled_pixbuf = g_object_ref (icon_pixbuf); - } else { - 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); - } - - g_hash_table_insert (priv->type_name_to_pixbuf, g_strdup (type_name), scaled_pixbuf); - - return scaled_pixbuf; -} - -static void -esss_get_value(GtkTreeModel *tree_model, GtkTreeIter *iter, gint column, GValue *value) -{ - gchar *folder_path; - const gchar *folder_name; - int unread_count; - EStorageSetStore *store = (EStorageSetStore *) tree_model; - EFolder *folder; - GNode *node; - gboolean is_storage; - - g_return_if_fail(E_IS_STORAGE_SET_STORE(tree_model)); - g_return_if_fail(VALID_ITER(iter, store)); - g_return_if_fail(VALID_COL(column)); - - node = G_NODE (iter->user_data); - g_value_init(value, esss_get_column_type(tree_model, column)); - - is_storage = (node->parent == store->priv->root); - - if (is_storage) - folder_path = g_strconcat ("/", node->data, NULL); - else - folder_path = g_strdup (node->data); - - folder = e_storage_set_get_folder(store->priv->storage_set, folder_path); - g_free (folder_path); - - switch (column) { - case E_STORAGE_SET_STORE_COLUMN_NAME: - if (!folder) { - g_value_set_string(value, "?"); - return; - } - folder_name = e_folder_get_name(folder); - unread_count = e_folder_get_unread_count(folder); - if (unread_count > 0) { - gchar *with_unread = g_strdup_printf("%s (%d)", folder_name, unread_count); - g_object_set_data_full(G_OBJECT(folder), "name_with_unread", - with_unread, g_free); - g_value_set_string(value, with_unread); - } else - g_value_set_string(value, folder_name); - break; - - case E_STORAGE_SET_STORE_COLUMN_HIGHLIGHT: - if (!folder) { - g_value_set_boolean(value, FALSE); - return; - } - g_value_set_int(value, is_storage || e_folder_get_highlighted(folder) ? PANGO_WEIGHT_BOLD : 0); - break; - - case E_STORAGE_SET_STORE_COLUMN_CHECKED: - if (is_storage || !store->priv->checkboxes) { - g_value_set_boolean(value, FALSE); - return; - } - g_value_set_boolean(value, - g_hash_table_lookup(store->priv->checkboxes, folder_path) ? TRUE : FALSE); - break; - - case E_STORAGE_SET_STORE_COLUMN_CHECKABLE: - g_value_set_boolean(value, !is_storage && has_checkbox(store, (gchar *)node->data)); - break; - - case E_STORAGE_SET_STORE_COLUMN_ICON: - if (!is_storage) - g_value_set_object (value, get_pixbuf_for_folder (store, folder)); - break; - - default: - g_assert_not_reached (); - break; - } -} - -static gboolean -esss_iter_next(GtkTreeModel *tree_model, GtkTreeIter *iter) -{ - g_return_val_if_fail(E_IS_STORAGE_SET_STORE(tree_model), FALSE); - g_return_val_if_fail(VALID_ITER(iter, E_STORAGE_SET_STORE(tree_model)), FALSE); - - if (G_NODE(iter->user_data)->next) { - iter->user_data = G_NODE(iter->user_data)->next; - return TRUE; - } else - return FALSE; -} - -static gboolean -esss_iter_children(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent) -{ - GNode *children; - EStorageSetStore *store = (EStorageSetStore *) tree_model; - - g_return_val_if_fail(E_IS_STORAGE_SET_STORE(tree_model), FALSE); - g_return_val_if_fail(iter != NULL, FALSE); - g_return_val_if_fail(parent == NULL || parent->user_data != NULL, FALSE); - g_return_val_if_fail(parent == NULL || parent->stamp == store->priv->stamp, FALSE); - - if (parent) - children = G_NODE(parent->user_data)->children; - else - children = - G_NODE(store->priv->root)->children; - - if (children) { - iter->stamp = store->priv->stamp; - iter->user_data = children; - return TRUE; - } else - return FALSE; -} - -static gboolean -esss_iter_has_child(GtkTreeModel *tree_model, GtkTreeIter *iter) -{ - EStorageSetStore *store = (EStorageSetStore *) tree_model; - - g_return_val_if_fail(E_IS_STORAGE_SET_STORE(tree_model), FALSE); - g_return_val_if_fail(VALID_ITER(iter, store), FALSE); - - return G_NODE(iter->user_data)->children != NULL; -} - -static gint -esss_iter_n_children(GtkTreeModel *tree_model, GtkTreeIter *iter) -{ - GNode *node; - gint i = 0; - EStorageSetStore *store = (EStorageSetStore *) tree_model; - - g_return_val_if_fail(E_IS_STORAGE_SET_STORE(tree_model), 0); - g_return_val_if_fail(iter == NULL || iter->user_data != NULL, FALSE); - - if (iter == NULL) - node = G_NODE(store->priv->root)->children; - else - node = G_NODE(iter->user_data)->children; - - while (node) { - i++; - node = node->next; - } - - return i; -} - -static gboolean -esss_iter_nth_child(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent, gint n) -{ - GNode *parent_node; - GNode *child; - EStorageSetStore *store = (EStorageSetStore *) tree_model; - - g_return_val_if_fail(E_IS_STORAGE_SET_STORE(tree_model), FALSE); - g_return_val_if_fail(iter != NULL, FALSE); - g_return_val_if_fail(parent == NULL || parent->user_data != NULL, FALSE); - - if (parent == NULL) - parent_node = store->priv->root; - else - parent_node = parent->user_data; - - child = g_node_nth_child(parent_node, n); - - if (child) { - iter->user_data = child; - iter->stamp = store->priv->stamp; - return TRUE; - } else - return FALSE; -} - -static gboolean -esss_iter_parent(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *child) -{ - GNode *parent; - EStorageSetStore *store = (EStorageSetStore *) tree_model; - - g_return_val_if_fail(E_IS_STORAGE_SET_STORE(tree_model), FALSE); - g_return_val_if_fail(iter != NULL, FALSE); - g_return_val_if_fail(VALID_ITER(child, store), FALSE); - - parent = G_NODE(child->user_data)->parent; - - g_assert(parent != NULL); - - if (parent != store->priv->root) { - iter->user_data = parent; - iter->stamp = store->priv->stamp; - return TRUE; - } else - return FALSE; -} - -static void -esss_tree_model_init(GtkTreeModelIface *iface) -{ - iface->get_flags = esss_get_flags; - iface->get_n_columns = esss_get_n_columns; - iface->get_column_type = esss_get_column_type; - iface->get_iter = esss_get_iter; - iface->get_path = esss_get_path; - iface->get_value = esss_get_value; - iface->iter_next = esss_iter_next; - iface->iter_children = esss_iter_children; - iface->iter_has_child = esss_iter_has_child; - iface->iter_n_children = esss_iter_n_children; - iface->iter_nth_child = esss_iter_nth_child; - iface->iter_parent = esss_iter_parent; -} - -/* GtkTreeDragSource interface implementation */ - -static gboolean -esss_drag_data_delete(GtkTreeDragSource *source, GtkTreePath *path) -{ - GtkTreeIter iter; - - g_return_val_if_fail(E_IS_STORAGE_SET_STORE(source), FALSE); - - if (gtk_tree_model_get_iter(GTK_TREE_MODEL(source), &iter, path)) { -#if 0 - e_storage_set_store_remove(E_STORAGE_SET_STORE(source), &iter); -#endif - return TRUE; - } else { - return FALSE; - } -} - -static gboolean -esss_drag_data_get(GtkTreeDragSource *source, GtkTreePath *path, GtkSelectionData *selection_data) -{ - g_return_val_if_fail(E_IS_STORAGE_SET_STORE(source), FALSE); - - /* Note that we don't need to handle the GTK_TREE_MODEL_ROW - * target, because the default handler does it for us, but - * we do anyway for the convenience of someone maybe overriding the - * default handler. - */ - - if (gtk_tree_set_row_drag_data(selection_data, GTK_TREE_MODEL(source), path)) { - return TRUE; - } else { - /* FIXME handle text targets at least. */ - } - - return FALSE; -} - -static void -esss_drag_source_init(GtkTreeDragSourceIface * iface) -{ - iface->drag_data_delete = esss_drag_data_delete; - iface->drag_data_get = esss_drag_data_get; -} - -/* GtkTreeDragDest interface implementation */ - -static void -copy_node_data(EStorageSetStore *store, GtkTreeIter *src_iter, GtkTreeIter *dest_iter) -{ -} - -static void -recursive_node_copy(EStorageSetStore * store, - GtkTreeIter * src_iter, GtkTreeIter * dest_iter) -{ -} - -static gboolean -esss_drag_data_received(GtkTreeDragDest * drag_dest, - GtkTreePath * dest, - GtkSelectionData * selection_data) -{ -#if 0 - GtkTreeModel *tree_model; - EStorageSetStore *store; - GtkTreeModel *src_model = NULL; - GtkTreePath *src_path = NULL; - gboolean retval = FALSE; - - g_return_val_if_fail(E_IS_STORAGE_SET_STORE(drag_dest), FALSE); - - tree_model = GTK_TREE_MODEL(drag_dest); - store = E_STORAGE_SET_STORE(drag_dest); - - validate_tree(store); - - if (gtk_tree_get_row_drag_data(selection_data, - &src_model, - &src_path) && - src_model == tree_model) { - /* Copy the given row to a new position */ - GtkTreeIter src_iter; - GtkTreeIter dest_iter; - GtkTreePath *prev; - - if (!gtk_tree_model_get_iter(src_model, - &src_iter, src_path)) { - goto out; - } - - /* Get the path to insert _after_ (dest is the path to insert _before_) */ - prev = gtk_tree_path_copy(dest); - - if (!gtk_tree_path_prev(prev)) { - GtkTreeIter dest_parent; - GtkTreePath *parent; - GtkTreeIter *dest_parent_p; - - /* dest was the first spot at the current depth; which means - * we are supposed to prepend. - */ - - /* Get the parent, NULL if parent is the root */ - dest_parent_p = NULL; - parent = gtk_tree_path_copy(dest); - if (gtk_tree_path_up(parent) && - gtk_tree_path_get_depth(parent) > 0) { - gtk_tree_model_get_iter(tree_model, - &dest_parent, - parent); - dest_parent_p = &dest_parent; - } - gtk_tree_path_free(parent); - parent = NULL; - - e_storage_set_store_prepend(E_STORAGE_SET_STORE(tree_model), - &dest_iter, dest_parent_p); - - retval = TRUE; - } else { - if (gtk_tree_model_get_iter - (GTK_TREE_MODEL(tree_model), &dest_iter, - prev)) { - GtkTreeIter tmp_iter = dest_iter; - - if (GPOINTER_TO_INT - (g_object_get_data - (G_OBJECT(tree_model), - "gtk-tree-model-drop-append"))) { - GtkTreeIter parent; - - if (gtk_tree_model_iter_parent - (GTK_TREE_MODEL(tree_model), - &parent, &tmp_iter)) - e_storage_set_store_append - (E_STORAGE_SET_STORE - (tree_model), - &dest_iter, &parent); - else - e_storage_set_store_append - (E_STORAGE_SET_STORE - (tree_model), - &dest_iter, NULL); - } else - e_storage_set_store_insert_after - (E_STORAGE_SET_STORE(tree_model), - &dest_iter, NULL, &tmp_iter); - retval = TRUE; - - } - } - - g_object_set_data(G_OBJECT(tree_model), - "gtk-tree-model-drop-append", NULL); - - gtk_tree_path_free(prev); - - /* If we succeeded in creating dest_iter, walk src_iter tree branch, - * duplicating it below dest_iter. - */ - - if (retval) { - recursive_node_copy(store, - &src_iter, &dest_iter); - } - } else { - /* FIXME maybe add some data targets eventually, or handle text - * targets in the simple case. - */ - - } - - out: - - if (src_path) - gtk_tree_path_free(src_path); - - return retval; -#else - return FALSE; -#endif -} - -static gboolean -esss_row_drop_possible(GtkTreeDragDest * drag_dest, - GtkTreePath * dest_path, - GtkSelectionData * selection_data) -{ -#if 0 - GtkTreeModel *src_model = NULL; - GtkTreePath *src_path = NULL; - GtkTreePath *tmp = NULL; - gboolean retval = FALSE; - - if (!gtk_tree_get_row_drag_data(selection_data, - &src_model, &src_path)) - goto out; - - /* can only drag to ourselves */ - if (src_model != GTK_TREE_MODEL(drag_dest)) - goto out; - - /* Can't drop into ourself. */ - if (gtk_tree_path_is_ancestor(src_path, dest_path)) - goto out; - - /* Can't drop if dest_path's parent doesn't exist */ - { - GtkTreeIter iter; - - if (gtk_tree_path_get_depth(dest_path) > 1) { - tmp = gtk_tree_path_copy(dest_path); - gtk_tree_path_up(tmp); - - if (!gtk_tree_model_get_iter - (GTK_TREE_MODEL(drag_dest), &iter, tmp)) - goto out; - } - } - - /* Can otherwise drop anywhere. */ - retval = TRUE; - - out: - - if (src_path) - gtk_tree_path_free(src_path); - if (tmp) - gtk_tree_path_free(tmp); - - return retval; -#else - return FALSE; -#endif -} - -static void -esss_drag_dest_init(GtkTreeDragDestIface * iface) -{ - iface->drag_data_received = esss_drag_data_received; - iface->row_drop_possible = esss_row_drop_possible; -} - -typedef struct { - gint offset; - GNode *node; -} SortTuple; - -static gint -folder_sort_callback (gconstpointer a, gconstpointer b, gpointer user_data) -{ - EStorageSetStore *store = (EStorageSetStore *) user_data; - EStorageSetStorePrivate *priv = store->priv; - EFolder *folder_1, *folder_2; - char *folder_path_1, *folder_path_2; - int priority_1, priority_2; - - - folder_path_1 = (gchar *)((SortTuple *)a)->node->data; - folder_path_2 = (gchar *)((SortTuple *)b)->node->data; - - folder_1 = e_storage_set_get_folder (priv->storage_set, folder_path_1); - folder_2 = e_storage_set_get_folder (priv->storage_set, folder_path_2); - - priority_1 = e_folder_get_sorting_priority (folder_1); - priority_2 = e_folder_get_sorting_priority (folder_2); - - if (priority_1 == priority_2) - return g_utf8_collate (e_folder_get_name (folder_1), e_folder_get_name (folder_2)); - else if (priority_1 < priority_2) - return -1; - else /* priority_1 > priority_2 */ - return +1; -} - -static gint -storage_sort_callback (gconstpointer a, gconstpointer b, gpointer user_data) -{ - char *folder_path_1; - char *folder_path_2; - gboolean path_1_local; - gboolean path_2_local; - - folder_path_1 = (gchar *)((SortTuple *)a)->node->data; - folder_path_2 = (gchar *)((SortTuple *)b)->node->data; - - /* FIXME bad hack to put the "my evolution" and "local" storages on - * top. */ - - if (strcmp (folder_path_1, E_SUMMARY_STORAGE_NAME) == 0) - return -1; - if (strcmp (folder_path_2, E_SUMMARY_STORAGE_NAME) == 0) - return +1; - - path_1_local = ! strcmp (folder_path_1, E_LOCAL_STORAGE_NAME); - path_2_local = ! strcmp (folder_path_2, E_LOCAL_STORAGE_NAME); - - if (path_1_local && path_2_local) - return 0; - if (path_1_local) - return -1; - if (path_2_local) - return 1; - - return g_utf8_collate (folder_path_1, folder_path_2); -} - -static void -esss_sort (EStorageSetStore *store, GNode *parent, GCompareDataFunc callback) -{ - GtkTreeIter iter; - GArray *sort_array; - GNode *node; - GNode *tmp_node; - gint list_length; - gint i; - gint *new_order; - GtkTreePath *path; - - node = parent->children; - if (node == NULL || node->next == NULL) - return; - - list_length = 0; - for (tmp_node = node; tmp_node; tmp_node = tmp_node->next) - list_length++; - - sort_array = g_array_sized_new(FALSE, FALSE, sizeof(SortTuple), list_length); - - i = 0; - for (tmp_node = node; tmp_node; tmp_node = tmp_node->next) { - SortTuple tuple; - - tuple.offset = i; - tuple.node = tmp_node; - g_array_append_val(sort_array, tuple); - i++; - } - - /* Sort the array */ - g_array_sort_with_data(sort_array, callback, store); - - for (i = 0; i < list_length - 1; i++) { - g_array_index(sort_array, SortTuple, i).node->next = - g_array_index(sort_array, SortTuple, i + 1).node; - g_array_index(sort_array, SortTuple, i + 1).node->prev = - g_array_index(sort_array, SortTuple, i).node; - } - g_array_index(sort_array, SortTuple, list_length - 1).node->next = NULL; - g_array_index(sort_array, SortTuple, 0).node->prev = NULL; - parent->children = g_array_index(sort_array, SortTuple, 0).node; - - /* Let the world know about our new order */ - new_order = g_new(gint, list_length); - for (i = 0; i < list_length; i++) - new_order[i] = g_array_index(sort_array, SortTuple, i).offset; - - iter.stamp = store->priv->stamp; - iter.user_data = parent; - path = esss_get_path(GTK_TREE_MODEL(store), &iter); - gtk_tree_model_rows_reordered(GTK_TREE_MODEL(store), path, &iter, new_order); - if (path) - gtk_tree_path_free(path); - g_free(new_order); - g_array_free(sort_array, TRUE); -} - -static void -esss_init(EStorageSetStore *store) -{ - store->priv = g_new0(EStorageSetStorePrivate, 1); - - store->priv->storage_set = NULL; - store->priv->checkboxes = NULL; - store->priv->root = g_node_new(NULL); - do { - store->priv->stamp = g_random_int(); - } while (store->priv->stamp == 0); - - store->priv->path_to_node = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); - store->priv->type_name_to_pixbuf = g_hash_table_new (g_str_hash, g_str_equal); -} - -static void -esss_dispose(GObject *object) -{ - EStorageSetStore *store = E_STORAGE_SET_STORE(object); - - if (store->priv->storage_set) - g_object_unref(store->priv->storage_set); - store->priv->storage_set = NULL; - - (*parent_class->dispose) (object); -} - -static void -node_free (GNode *node, gpointer data) -{ - g_free (node->data); -} - -static void -pixbuf_free_func (gpointer key, gpointer value, gpointer user_data) -{ - g_free (key); - g_object_unref (value); -} - -static void -esss_finalize(GObject *object) -{ - EStorageSetStore *store = E_STORAGE_SET_STORE(object); - - g_node_children_foreach(store->priv->root, G_TRAVERSE_ALL, node_free, NULL); - - g_hash_table_foreach (store->priv->type_name_to_pixbuf, pixbuf_free_func, NULL); - g_hash_table_destroy (store->priv->type_name_to_pixbuf); - g_hash_table_destroy (store->priv->path_to_node); - if (store->priv->checkboxes) - g_hash_table_destroy (store->priv->checkboxes); - - g_free (store->priv); - - (*parent_class->finalize) (object); -} - -static void -esss_class_init(EStorageSetStoreClass *class) -{ - GObjectClass *object_class; - - parent_class = g_type_class_peek_parent(class); - object_class = (GObjectClass *) class; - - object_class->dispose = esss_dispose; - object_class->finalize = esss_finalize; -} - -GType -e_storage_set_store_get_type(void) -{ - static GType store_type = 0; - - if (!store_type) { - static const GTypeInfo store_info = { - sizeof(EStorageSetStoreClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) esss_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof(EStorageSetStore), - 0, /* n_preallocs */ - (GInstanceInitFunc) esss_init - }; - - static const GInterfaceInfo tree_model_info = { - (GInterfaceInitFunc) - esss_tree_model_init, - NULL, - NULL - }; - - static const GInterfaceInfo drag_source_info = { - (GInterfaceInitFunc) - esss_drag_source_init, - NULL, - NULL - }; - - static const GInterfaceInfo drag_dest_info = { - (GInterfaceInitFunc) esss_drag_dest_init, - NULL, - NULL - }; - - store_type = g_type_register_static(G_TYPE_OBJECT, "EStorageSetStore", &store_info, 0); - - g_type_add_interface_static(store_type, GTK_TYPE_TREE_MODEL, &tree_model_info); - g_type_add_interface_static(store_type, GTK_TYPE_TREE_DRAG_SOURCE, &drag_source_info); - g_type_add_interface_static(store_type, GTK_TYPE_TREE_DRAG_DEST, &drag_dest_info); - } - - return store_type; -} - -/* Handling of the "changed" signal in EFolders displayed in the EStorageSetStore. */ - -typedef struct { - EStorageSetStore *store; - GNode * node; -} FolderChangedCallbackData; - -static void -folder_changed_cb (EFolder *folder, void *data) -{ - FolderChangedCallbackData *callback_data; - GtkTreePath *path; - GtkTreeIter iter; - - callback_data = (FolderChangedCallbackData *) data; - iter.user_data = callback_data->node; - iter.stamp = callback_data->store->priv->stamp; - path = esss_get_path (GTK_TREE_MODEL (callback_data->store), &iter); - - gtk_tree_model_row_changed (GTK_TREE_MODEL (callback_data->store), path, &iter); - if (path) - gtk_tree_path_free (path); -} - -static void -folder_name_changed_cb (EFolder *folder, void *data) -{ - FolderChangedCallbackData *callback_data; - - callback_data = (FolderChangedCallbackData *) data; - - esss_sort (callback_data->store, callback_data->node->parent, folder_sort_callback); -} - -static void -setup_folder_changed_callbacks (EStorageSetStore *store, EFolder *folder, GNode *node) -{ - FolderChangedCallbackData *callback_data = g_new0 (FolderChangedCallbackData, 1); - callback_data->store = store; - callback_data->node = node; - - g_signal_connect (G_OBJECT (folder), "changed", - G_CALLBACK (folder_changed_cb), callback_data); - - g_signal_connect_data (G_OBJECT (folder), "name_changed", - G_CALLBACK (folder_name_changed_cb), - callback_data, (GClosureNotify)g_free, 0); -} - -static void -insert_folders (EStorageSetStore *store, GNode *parent, EStorage *storage, const gchar *path) -{ - EStorageSetStorePrivate *priv; - GList *folder_path_list, *p; - const gchar *storage_name = e_storage_get_name (storage); - - priv = store->priv; - - folder_path_list = e_storage_get_subfolder_paths (storage, path); - if (folder_path_list == NULL) - return; - - for (p = folder_path_list; p != NULL; p = p->next) { - EFolder *folder; - const char *subpath = (const char *) p->data; - char *folder_path = g_strconcat ("/", storage_name, subpath, NULL); - gchar *key = g_strdup (folder_path+1); - GNode *node = g_node_new (folder_path); - - g_node_append (parent, node); - g_hash_table_replace (priv->path_to_node, key, node); - - folder = e_storage_get_folder (storage, subpath); - setup_folder_changed_callbacks (store, folder, node); - - insert_folders (store, node, storage, subpath); - } - - esss_sort (store, parent, folder_sort_callback); - - e_free_string_list (folder_path_list); -} - -/* StorageSet signal handling. */ - -static void -new_storage_cb (EStorageSet *storage_set, EStorage *storage, void *data) -{ - EStorageSetStore *store = E_STORAGE_SET_STORE (data); - EStorageSetStorePrivate *priv = store->priv; - gchar *storage_name = g_strdup (e_storage_get_name (storage)); - GNode *node = g_node_new (g_strdup (e_storage_get_name (storage))); - GtkTreePath *path; - GtkTreeIter iter; - - g_hash_table_replace (priv->path_to_node, storage_name, node); - g_node_append (priv->root, node); - esss_sort (store, priv->root, storage_sort_callback); - - iter.user_data = node; - iter.stamp = store->priv->stamp; - path = esss_get_path (GTK_TREE_MODEL (store), &iter); - gtk_tree_model_row_inserted (GTK_TREE_MODEL (store), path, &iter); - if (path) - gtk_tree_path_free (path); -} - -static void -removed_storage_cb (EStorageSet *storage_set, EStorage *storage, void *data) -{ - EStorageSetStore *store = E_STORAGE_SET_STORE (data); - EStorageSetStorePrivate *priv = store->priv; - const gchar *name = e_storage_get_name (storage); - GNode *node = g_hash_table_lookup (priv->path_to_node, name); - GtkTreePath *path; - - if (node == NULL) { - g_warning ("EStorageSetStore: unknown storage removed -- %s", name); - return; - } - - g_hash_table_remove (priv->path_to_node, name); - /* FIXME: subfolder hashtable entries might be leaked */ - - path = tree_path_from_node (store, node); - gtk_tree_model_row_deleted (GTK_TREE_MODEL (store), path); - if (path) - gtk_tree_path_free (path); - g_node_destroy (node); -} - -static void -new_folder_cb (EStorageSet *storage_set, const char *path, void *data) -{ - EStorageSetStore *store = E_STORAGE_SET_STORE (data); - EStorageSetStorePrivate *priv = store->priv; - GNode *parent_node, *new_node; - const char *last_separator; - char *parent_path; - char *copy_of_path; - GtkTreeIter iter; - GtkTreePath *treepath; - - last_separator = strrchr (path, E_PATH_SEPARATOR); - - parent_path = g_strndup (path + 1, last_separator - path - 1); - parent_node = g_hash_table_lookup (priv->path_to_node, parent_path); - g_free (parent_path); - if (parent_node == NULL) { - g_warning ("EStorageSetStore: EStorageSet reported new subfolder for non-existing folder -- %s", parent_path); - return; - } - - copy_of_path = g_strdup (path); - new_node = g_node_new (copy_of_path); - g_node_append (parent_node, new_node); - iter.user_data = new_node; - iter.stamp = priv->stamp; - treepath = esss_get_path (GTK_TREE_MODEL (store), &iter); - gtk_tree_model_row_inserted (GTK_TREE_MODEL (store), treepath, &iter); - if (treepath) - gtk_tree_path_free (treepath); - - g_hash_table_replace (priv->path_to_node, g_strdup (path + 1), new_node); - - setup_folder_changed_callbacks (store, e_storage_set_get_folder (storage_set, path), new_node); - esss_sort (store, parent_node, folder_sort_callback); -} - -static void -updated_folder_cb (EStorageSet *storage_set, const char *path, void *data) -{ - EStorageSetStore *store = E_STORAGE_SET_STORE (data); - EStorageSetStorePrivate *priv = store->priv; - GNode *node; - GtkTreeIter iter; - GtkTreePath *treepath; - - node = g_hash_table_lookup (priv->path_to_node, path+1); - if (node == NULL) { - g_warning ("EStorageSetStore: unknown folder updated -- %s", path); - return; - } - - iter.user_data = node; - iter.stamp = priv->stamp; - treepath = esss_get_path (GTK_TREE_MODEL (store), &iter); - gtk_tree_model_row_changed (GTK_TREE_MODEL (store), treepath, &iter); - if (treepath) - gtk_tree_path_free (treepath); -} - -static void -removed_folder_cb (EStorageSet *storage_set, const char *path, void *data) -{ - EStorageSetStore *store = E_STORAGE_SET_STORE (data); - EStorageSetStorePrivate *priv = store->priv; - GNode *node; - GtkTreePath *treepath; - - node = g_hash_table_lookup (priv->path_to_node, path+1); - if (node == NULL) { - g_warning ("EStorageSetStore: unknown folder removed -- %s", path); - return; - } - - g_hash_table_remove (priv->path_to_node, path+1); - /* FIXME: subfolder hashtable entries might be leaked */ - - treepath = tree_path_from_node (store, node); - gtk_tree_model_row_deleted (GTK_TREE_MODEL (store), treepath); - if (treepath) - gtk_tree_path_free (treepath); - g_node_destroy (node); -} - -static void -close_folder_cb (EStorageSet *storage_set, - const char *path, - void *data) -{ - g_warning ("FIXME: EStorageSetStore: needs to handle close_folder properly"); -#if 0 - EStorageSetStore *store; - EStorageSetStorePrivate *priv; - ETreeModel *etree; - ETreePath node; - - store = E_STORAGE_SET_STORE (data); - priv = store->priv; - etree = priv->etree_model; - - node = lookup_node_in_hash (store, path); - e_tree_model_node_request_collapse (priv->etree_model, node); -#endif -} - -static void -connect_storage_set (EStorageSetStore *store, EStorageSet *storage_set, gboolean show_folders) -{ - EStorageSetStorePrivate *priv; - GList *storage_list; - GList *p; - - priv = store->priv; - priv->storage_set = storage_set; - g_object_ref (storage_set); - - storage_list = e_storage_set_get_storage_list (storage_set); - - for (p = storage_list; p != NULL; p = p->next) { - EStorage *storage = E_STORAGE (p->data); - const char *name = e_storage_get_name (storage); - GNode *node = g_node_new (g_strdup (name)); - g_node_append (priv->root, node); - g_hash_table_replace (priv->path_to_node, g_strdup (name), node); - - if (show_folders) - insert_folders (store, node, storage, "/"); - } - - esss_sort (store, priv->root, storage_sort_callback); - - e_free_object_list (storage_list); - - g_signal_connect_object (storage_set, "new_storage", G_CALLBACK (new_storage_cb), store, 0); - g_signal_connect_object (storage_set, "removed_storage", G_CALLBACK (removed_storage_cb), store, 0); - if (!show_folders) - return; - - g_signal_connect_object (storage_set, "new_folder", G_CALLBACK (new_folder_cb), store, 0); - g_signal_connect_object (storage_set, "updated_folder", G_CALLBACK (updated_folder_cb), store, 0); - g_signal_connect_object (storage_set, "removed_folder", G_CALLBACK (removed_folder_cb), store, 0); - g_signal_connect_object (storage_set, "close_folder", G_CALLBACK (close_folder_cb), store, 0); -} - -/** - * e_storage_set_store_new: - * @storage_set: the #EStorageSet that the store exposes - * @show_folders: flag indicating if subfolders should be shown - * - * Creates a new tree store from the provided #EStorageSet. - * - * Return value: a new #EStorageSetStore - **/ -EStorageSetStore * -e_storage_set_store_new(EStorageSet *storage_set, gboolean show_folders) -{ - EStorageSetStore *store; - g_return_val_if_fail (E_IS_STORAGE_SET(storage_set), NULL); - - store = E_STORAGE_SET_STORE (g_object_new (E_STORAGE_SET_STORE_TYPE, NULL)); - connect_storage_set (store, storage_set, show_folders); - - return store; -} - -static gboolean -esss_real_set_value(EStorageSetStore *store, GtkTreeIter *iter, gint column, GValue *value) -{ - gchar *path; - - if (column != E_STORAGE_SET_STORE_COLUMN_CHECKED) - return FALSE; - - path = G_NODE (iter->user_data)->data; - - if (g_value_get_boolean (value)) { - g_hash_table_insert (store->priv->checkboxes, path, path); - } else { - g_hash_table_remove (store->priv->checkboxes, path); - } - - return TRUE; -} - -/** - * e_storage_set_store_set_value: - * @store: a #EStorageSetStore - * @iter: A valid #GtkTreeIter for the row being modified - * @column: column number to modify - * @value: new value for the cell - * - * Sets the data in the cell specified by @iter and @column. - * The type of @value must be convertible to the type of the - * column. - * - **/ -void -e_storage_set_store_set_value(EStorageSetStore *store, GtkTreeIter *iter, - gint column, GValue *value) -{ - g_return_if_fail(E_IS_STORAGE_SET_STORE(store)); - g_return_if_fail(VALID_ITER(iter, store)); - g_return_if_fail(VALID_COL(column)); - g_return_if_fail(G_IS_VALUE(value)); - - if (esss_real_set_value (store, iter, column, value)) { - GtkTreePath *path; - - path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), iter); - gtk_tree_model_row_changed(GTK_TREE_MODEL(store), path, iter); - if (path) - gtk_tree_path_free(path); - } -} - -/** - * e_storage_set_store_get_tree_path: - * @store: a #EStorageSetStore - * @folder_path: a string representing the #EStorageSet folder path - * - * Gets a #GtkTreePath corresponding to the folder path specified. - * - * Return value: the tree path of the folder - **/ -GtkTreePath * -e_storage_set_store_get_tree_path (EStorageSetStore *store, const gchar *folder_path) -{ - GNode *node; - - g_return_if_fail(E_IS_STORAGE_SET_STORE(store)); - - node = g_hash_table_lookup (store->priv->path_to_node, folder_path+1); - - return tree_path_from_node (store, node); -} - -/** - * e_storage_set_store_get_folder_path: - * @store: a #EStorageSetStore - * @folder_path: a string representing the #EStorageSet folder path - * - * Gets a #GtkTreePath corresponding to the folder path specified. - * - * Return value: the tree path of the folder - **/ -const gchar * -e_storage_set_store_get_folder_path (EStorageSetStore *store, GtkTreePath *tree_path) -{ - GtkTreeIter iter; - GNode *node; - - g_return_if_fail(E_IS_STORAGE_SET_STORE(store)); - - if (!esss_get_iter (GTK_TREE_MODEL (store), &iter, tree_path)) - return NULL; - - node = G_NODE (iter.user_data); - - return (const gchar *)node->data; -} - -/** - * e_storage_set_store_set_has_checkbox_func: - * @store: a #EStorageSetStore - * @func: a callback to determine if a row is checked - * @data: callback data - * - * Sets a callback function for checkbox visibility determination - **/ -void -e_storage_set_store_set_has_checkbox_func (EStorageSetStore *store, EStorageSetStoreHasCheckBoxFunc func, gpointer data) -{ - g_return_if_fail(E_IS_STORAGE_SET_STORE(store)); - - store->priv->has_checkbox_func = func; - store->priv->has_checkbox_func_data = data; -} - diff --git a/shell/e-storage-set-store.h b/shell/e-storage-set-store.h deleted file mode 100644 index 251b61e519..0000000000 --- a/shell/e-storage-set-store.h +++ /dev/null @@ -1,91 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-storage-set-store.h - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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: Mike Kestner - */ - -#ifndef __E_STORAGE_SET_STORE_H__ -#define __E_STORAGE_SET_STORE_H__ - -#include <gtk/gtktreemodel.h> -#include "e-storage-set.h" -#include "e-storage-set-store.h" - -G_BEGIN_DECLS - -#define E_STORAGE_SET_STORE_TYPE (e_storage_set_store_get_type ()) -#define E_STORAGE_SET_STORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_STORAGE_SET_STORE_TYPE, EStorageSetStore)) -#define E_STORAGE_SET_STORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_STORAGE_SET_STORE_TYPE, EStorageSetStoreClass)) -#define E_IS_STORAGE_SET_STORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_STORAGE_SET_STORE_TYPE)) -#define E_IS_STORAGE_SET_STORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_STORAGE_SET_STORE_TYPE)) -#define E_STORAGE_SET_STORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), E_STORAGE_SET_STORE_TYPE, EStorageSetStoreClass)) - -typedef gboolean (* EStorageSetStoreHasCheckBoxFunc) (EStorageSet *storage_set, - const char *path, - void *data); - -typedef enum { - E_STORAGE_SET_STORE_COLUMN_NAME, - E_STORAGE_SET_STORE_COLUMN_HIGHLIGHT, - E_STORAGE_SET_STORE_COLUMN_CHECKED, - E_STORAGE_SET_STORE_COLUMN_CHECKABLE, - E_STORAGE_SET_STORE_COLUMN_ICON, - E_STORAGE_SET_STORE_COLUMN_COUNT -} E_STORAGE_SET_STORE_COLUMN_TYPE; - -typedef struct _EStorageSetStore EStorageSetStore; -typedef struct _EStorageSetStorePrivate EStorageSetStorePrivate; -typedef struct _EStorageSetStoreClass EStorageSetStoreClass; - -struct _EStorageSetStore { - GObject parent; - - EStorageSetStorePrivate *priv; -}; - -struct _EStorageSetStoreClass { - GObjectClass parent_class; -}; - - -GType e_storage_set_store_get_type (void); - -EStorageSetStore *e_storage_set_store_new (EStorageSet *storage_set, gboolean show_folders); - -EStorageSet *e_storage_set_store_get_storage_set (EStorageSetStore *storage_set_store); - -void e_storage_set_store_set_checkboxes_list (EStorageSetStore *storage_set_store, - GSList *checkboxes); -GSList *e_storage_set_store_get_checkboxes_list (EStorageSetStore *storage_set_store); - -void e_storage_set_store_set_allow_dnd (EStorageSetStore *storage_set_store, - gboolean allow_dnd); -gboolean e_storage_set_store_get_allow_dnd (EStorageSetStore *storage_set_store); - -GtkTreePath *e_storage_set_store_get_tree_path (EStorageSetStore *store, const gchar *folder_path); - -const gchar *e_storage_set_store_get_folder_path (EStorageSetStore *store, GtkTreePath *tree_path); - -void e_storage_set_store_set_has_checkbox_func (EStorageSetStore *storage_set_store, - EStorageSetStoreHasCheckBoxFunc func, - gpointer data); - -G_END_DECLS - -#endif /* __E_STORAGE_SET_STORE_H__ */ diff --git a/shell/e-storage-set-view-checkboxes.etstate b/shell/e-storage-set-view-checkboxes.etstate deleted file mode 100644 index 302fb15321..0000000000 --- a/shell/e-storage-set-view-checkboxes.etstate +++ /dev/null @@ -1,5 +0,0 @@ -<ETableState> - <column source="1"/> - <column source="0"/> - <grouping></grouping> -</ETableState> diff --git a/shell/e-storage-set-view-no-checkboxes.etstate b/shell/e-storage-set-view-no-checkboxes.etstate deleted file mode 100644 index f3df4f8991..0000000000 --- a/shell/e-storage-set-view-no-checkboxes.etstate +++ /dev/null @@ -1,4 +0,0 @@ -<ETableState> - <column source="0"/> - <grouping></grouping> -</ETableState> diff --git a/shell/e-storage-set-view.c b/shell/e-storage-set-view.c deleted file mode 100644 index 735da0ab21..0000000000 --- a/shell/e-storage-set-view.c +++ /dev/null @@ -1,2444 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-storage-set-view.c - * - * Copyright (C) 2000, 2001, 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 - * Etree-ification: Chris Toshok - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-storage-set-view.h" - -#include "e-util/e-gtk-utils.h" - -#include "e-corba-storage.h" -#include "e-icon-factory.h" -#include "e-folder-dnd-bridge.h" -#include "e-shell-constants.h" -#include "e-shell-marshal.h" - -#include <gal/util/e-util.h> -#include <gal/widgets/e-gui-utils.h> -#include <gal/e-table/e-tree-memory-callbacks.h> -#include <gal/e-table/e-cell-text.h> -#include <gal/e-table/e-cell-toggle.h> -#include <gal/e-table/e-cell-tree.h> - -#include <libgnome/gnome-util.h> -#include <libgnomeui/gnome-popup-menu.h> - -#include <bonobo/bonobo-window.h> -#include <bonobo/bonobo-ui-util.h> - -#include <gtk/gtksignal.h> - -#include <string.h> - -#include "check-empty.xpm" -#include "check-filled.xpm" -#include "check-missing.xpm" - - -static GdkPixbuf *checks [3]; - - -/*#define DEBUG_XML*/ - -#define ROOT_NODE_NAME "/RootNode" - - -/* This is used on the source side to define the two basic types that we always - export. */ -enum _DndTargetTypeIdx { - E_FOLDER_DND_PATH_TARGET_TYPE_IDX = 0, - E_SHORTCUT_TARGET_TYPE_IDX = 1 -}; -typedef enum _DndTargetTypeIdx DndTargetTypeIdx; - -#define E_SHORTCUT_TARGET_TYPE "E-SHORTCUT" - - -#define PARENT_TYPE E_TREE_TYPE -static ETreeClass *parent_class = NULL; - -struct _EStorageSetViewPrivate { - EStorageSet *storage_set; - - BonoboUIComponent *ui_component; - BonoboUIContainer *ui_container; - - ETreeModel *etree_model; - ETreePath root_node; - - GHashTable *path_to_etree_node; - - GHashTable *type_name_to_pixbuf; - - /* Path of the row selected by the latest "cursor_activated" signal. */ - char *selected_row_path; - - /* Path of the row selected by a right click. */ - char *right_click_row_path; - - unsigned int show_folders : 1; - unsigned int show_checkboxes : 1; - unsigned int allow_dnd : 1; - unsigned int search_enabled : 1; - - /* The `Evolution::ShellComponentDnd::SourceFolder' interface for the - folder we are dragging from, or CORBA_OBJECT_NIL if no dragging is - happening. */ - GNOME_Evolution_ShellComponentDnd_SourceFolder drag_corba_source_interface; - - /* Source context information. NULL if no dragging is in progress. */ - GNOME_Evolution_ShellComponentDnd_SourceFolder_Context *drag_corba_source_context; - - /* The data. */ - GNOME_Evolution_ShellComponentDnd_Data *drag_corba_data; - - GHashTable *checkboxes; - - /* Callback to determine whether the row should have a checkbox or - not, when show_checkboxes is TRUE. */ - EStorageSetViewHasCheckBoxFunc has_checkbox_func; - void *has_checkbox_func_data; -}; - - -enum { - FOLDER_SELECTED, - FOLDER_OPENED, - DND_ACTION, - FOLDER_CONTEXT_MENU_POPPING_UP, - FOLDER_CONTEXT_MENU_POPPED_DOWN, - CHECKBOXES_CHANGED, - LAST_SIGNAL -}; - -static unsigned int signals[LAST_SIGNAL] = { 0 }; - - -/* Forward declarations. */ - -static void setup_folder_changed_callbacks (EStorageSetView *storage_set_view, - EFolder *folder, - const char *path); - - -/* 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" - - -/* Sorting callbacks. */ - -static int -storage_sort_callback (ETreeMemory *etmm, - ETreePath node1, - ETreePath node2, - void *closure) -{ - char *folder_path_1; - char *folder_path_2; - gboolean path_1_local; - gboolean path_2_local; - - folder_path_1 = e_tree_memory_node_get_data(etmm, node1); - folder_path_2 = e_tree_memory_node_get_data(etmm, node2); - - /* FIXME bad hack to put the "my evolution" and "local" storages on - top. */ - - if (strcmp (folder_path_1, E_PATH_SEPARATOR_S E_SUMMARY_STORAGE_NAME) == 0) - return -1; - if (strcmp (folder_path_2, E_PATH_SEPARATOR_S E_SUMMARY_STORAGE_NAME) == 0) - return +1; - - path_1_local = ! strcmp (folder_path_1, E_PATH_SEPARATOR_S E_LOCAL_STORAGE_NAME); - path_2_local = ! strcmp (folder_path_2, E_PATH_SEPARATOR_S E_LOCAL_STORAGE_NAME); - - if (path_1_local && path_2_local) - return 0; - if (path_1_local) - return -1; - if (path_2_local) - return 1; - - return g_utf8_collate (e_tree_model_value_at (E_TREE_MODEL (etmm), node1, 0), - e_tree_model_value_at (E_TREE_MODEL (etmm), node2, 0)); -} - -static int -folder_sort_callback (ETreeMemory *etmm, - ETreePath node1, - ETreePath node2, - void *closure) -{ - EStorageSetViewPrivate *priv; - EFolder *folder_1, *folder_2; - const char *folder_path_1, *folder_path_2; - int priority_1, priority_2; - - priv = E_STORAGE_SET_VIEW (closure)->priv; - - folder_path_1 = e_tree_memory_node_get_data(etmm, node1); - folder_path_2 = e_tree_memory_node_get_data(etmm, node2); - - folder_1 = e_storage_set_get_folder (priv->storage_set, folder_path_1); - folder_2 = e_storage_set_get_folder (priv->storage_set, folder_path_2); - - priority_1 = e_folder_get_sorting_priority (folder_1); - priority_2 = e_folder_get_sorting_priority (folder_2); - - if (priority_1 == priority_2) - return g_utf8_collate (e_tree_model_value_at (E_TREE_MODEL (etmm), node1, 0), - e_tree_model_value_at (E_TREE_MODEL (etmm), node2, 0)); - else if (priority_1 < priority_2) - return -1; - else /* priority_1 > priority_2 */ - return +1; -} - - -/* Helper functions. */ - -static gboolean -add_node_to_hash (EStorageSetView *storage_set_view, - const char *path, - ETreePath 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_etree_node, path) != NULL) { - g_warning ("EStorageSetView: Node already existing while adding -- %s", path); - return FALSE; - } - - hash_path = g_strdup (path); - - g_hash_table_insert (priv->path_to_etree_node, hash_path, node); - - return TRUE; -} - -static ETreePath -lookup_node_in_hash (EStorageSetView *storage_set_view, - const char *path) -{ - EStorageSetViewPrivate *priv; - ETreePath node; - - priv = storage_set_view->priv; - - node = g_hash_table_lookup (priv->path_to_etree_node, path); - if (node == NULL) - g_warning ("EStorageSetView: Node not found while updating -- %s", path); - - return node; -} - -static ETreePath -remove_node_from_hash (EStorageSetView *storage_set_view, - const char *path) -{ - EStorageSetViewPrivate *priv; - ETreePath node; - - priv = storage_set_view->priv; - - node = g_hash_table_lookup (priv->path_to_etree_node, path); - if (node == NULL) { - g_warning ("EStorageSetView: Node not found while removing -- %s", path); - return NULL; - } - - g_hash_table_remove (priv->path_to_etree_node, path); - - return node; -} - -static GdkPixbuf * -get_pixbuf_for_folder (EStorageSetView *storage_set_view, - EFolder *folder) -{ - const char *type_name; - EStorageSetViewPrivate *priv; - EFolderTypeRegistry *folder_type_registry; - EStorageSet *storage_set; - GdkPixbuf *icon_pixbuf; - GdkPixbuf *scaled_pixbuf; - const char *custom_icon_name; - int icon_pixbuf_width, icon_pixbuf_height; - - priv = storage_set_view->priv; - - custom_icon_name = e_folder_get_custom_icon_name (folder); - if (custom_icon_name != NULL) - return e_icon_factory_get_icon (custom_icon_name, TRUE); - - type_name = e_folder_get_type_string (folder); - - scaled_pixbuf = g_hash_table_lookup (priv->type_name_to_pixbuf, type_name); - if (scaled_pixbuf != NULL) - return scaled_pixbuf; - - storage_set = priv->storage_set; - folder_type_registry = e_storage_set_get_folder_type_registry (storage_set); - - icon_pixbuf = e_folder_type_registry_get_icon_for_type (folder_type_registry, - type_name, TRUE); - - if (icon_pixbuf == NULL) - return NULL; - - icon_pixbuf_width = gdk_pixbuf_get_width (icon_pixbuf); - icon_pixbuf_height = gdk_pixbuf_get_height (icon_pixbuf); - - if (icon_pixbuf_width == E_SHELL_MINI_ICON_SIZE && icon_pixbuf_height == E_SHELL_MINI_ICON_SIZE) { - scaled_pixbuf = g_object_ref (icon_pixbuf); - } else { - 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); - } - - g_hash_table_insert (priv->type_name_to_pixbuf, g_strdup (type_name), scaled_pixbuf); - - return scaled_pixbuf; -} - -static EFolder * -get_folder_at_node (EStorageSetView *storage_set_view, - ETreePath path) -{ - EStorageSetViewPrivate *priv; - const char *folder_path; - - priv = storage_set_view->priv; - - if (path == NULL) - return NULL; - - folder_path = e_tree_memory_node_get_data (E_TREE_MEMORY(priv->etree_model), path); - g_assert (folder_path != NULL); - - return e_storage_set_get_folder (priv->storage_set, folder_path); -} - -static EvolutionShellComponentClient * -get_component_at_node (EStorageSetView *storage_set_view, - ETreePath path) -{ - EStorageSetViewPrivate *priv; - EvolutionShellComponentClient *component_client; - EFolderTypeRegistry *folder_type_registry; - EFolder *folder; - - priv = storage_set_view->priv; - - folder = get_folder_at_node (storage_set_view, path); - if (folder == NULL) - return NULL; - - folder_type_registry = e_storage_set_get_folder_type_registry (priv->storage_set); - g_assert (folder_type_registry != NULL); - - component_client = e_folder_type_registry_get_handler_for_type (folder_type_registry, - e_folder_get_type_string (folder)); - - return component_client; -} - -static GNOME_Evolution_ShellComponentDnd_ActionSet -convert_gdk_drag_action_set_to_corba (GdkDragAction action) -{ - GNOME_Evolution_ShellComponentDnd_Action retval; - - retval = GNOME_Evolution_ShellComponentDnd_ACTION_DEFAULT; - - if (action & GDK_ACTION_COPY) - retval |= GNOME_Evolution_ShellComponentDnd_ACTION_COPY; - if (action & GDK_ACTION_MOVE) - retval |= GNOME_Evolution_ShellComponentDnd_ACTION_MOVE; - if (action & GDK_ACTION_LINK) - retval |= GNOME_Evolution_ShellComponentDnd_ACTION_LINK; - if (action & GDK_ACTION_ASK) - retval |= GNOME_Evolution_ShellComponentDnd_ACTION_ASK; - - return retval; -} - - -/* The weakref callback for priv->ui_component. */ - -static void -ui_container_destroy_notify (void *data, - GObject *where_the_object_was) -{ - EStorageSetViewPrivate *priv = (EStorageSetViewPrivate *) data; - - priv->ui_container = NULL; -} - - -/* DnD selection setup stuff. */ - -/* This will create an array of GtkTargetEntries from the specified list of DND - types. The type name will *not* be allocated in the list, as this is - supposed to be used only temporarily to set up the cell as a drag source. */ -static GtkTargetEntry * -create_target_entries_from_dnd_type_list (GList *dnd_types, - int *num_entries_return) -{ - GtkTargetEntry *entries; - GList *p; - int num_entries; - int i; - - if (dnd_types == NULL) - num_entries = 0; - else - num_entries = g_list_length (dnd_types); - - /* We always add two entries, one for an Evolution URI type, and one - for e-shortcuts. This will let us do drag & drop within Evolution - at least. */ - num_entries += 2; - - entries = g_new (GtkTargetEntry, num_entries); - - i = 0; - - /* The Evolution URI will always come first. */ - entries[i].target = E_FOLDER_DND_PATH_TARGET_TYPE; - entries[i].flags = 0; - entries[i].info = i; - g_assert (i == E_FOLDER_DND_PATH_TARGET_TYPE_IDX); - i ++; - - /* ...Then the shortcut type. */ - entries[i].target = E_SHORTCUT_TARGET_TYPE; - entries[i].flags = 0; - entries[i].info = i; - g_assert (i == E_SHORTCUT_TARGET_TYPE_IDX); - i ++; - - for (p = dnd_types; p != NULL; p = p->next, i++) { - const char *dnd_type; - - g_assert (i < num_entries); - - dnd_type = (const char *) p->data; - - entries[i].target = (char *) dnd_type; - entries[i].flags = 0; - entries[i].info = i; - } - - *num_entries_return = num_entries; - return entries; -} - -static void -free_target_entries (GtkTargetEntry *entries) -{ - g_assert (entries != NULL); - - /* The target names are not strdup()ed so a simple free will do. */ - g_free (entries); -} - -static GtkTargetList * -create_target_list_for_node (EStorageSetView *storage_set_view, - ETreePath node) -{ - EStorageSetViewPrivate *priv; - GtkTargetList *target_list; - EFolderTypeRegistry *folder_type_registry; - GList *exported_dnd_types; - GtkTargetEntry *target_entries; - EFolder *folder; - const char *folder_type; - int num_target_entries; - - priv = storage_set_view->priv; - - folder_type_registry = e_storage_set_get_folder_type_registry (priv->storage_set); - - folder = get_folder_at_node (storage_set_view, node); - folder_type = e_folder_get_type_string (folder); - - exported_dnd_types = e_folder_type_registry_get_exported_dnd_types_for_type (folder_type_registry, - folder_type); - - target_entries = create_target_entries_from_dnd_type_list (exported_dnd_types, - &num_target_entries); - g_assert (target_entries != NULL); - - target_list = gtk_target_list_new (target_entries, num_target_entries); - - free_target_entries (target_entries); - - return target_list; -} - -static void -set_e_shortcut_selection (EStorageSetView *storage_set_view, - GtkSelectionData *selection_data) -{ - EStorageSetViewPrivate *priv; - ETreePath node; - EFolder *folder; - int shortcut_len; - char *shortcut; - const char *name; - const char *folder_path; - - g_assert (storage_set_view != NULL); - g_assert (selection_data != NULL); - - priv = storage_set_view->priv; - - node = lookup_node_in_hash (storage_set_view, priv->selected_row_path); - - folder_path = e_tree_memory_node_get_data (E_TREE_MEMORY(priv->etree_model), node); - g_assert (folder_path != NULL); - - folder = e_storage_set_get_folder (priv->storage_set, folder_path); - if (folder != NULL) - name = e_folder_get_name (folder); - else - name = NULL; - - /* 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 -set_evolution_path_selection (EStorageSetView *storage_set_view, - GtkSelectionData *selection_data) -{ - EStorageSetViewPrivate *priv; - - g_assert (storage_set_view != NULL); - g_assert (selection_data != NULL); - - priv = storage_set_view->priv; - - gtk_selection_data_set (selection_data, selection_data->target, - 8, (guchar *) priv->selected_row_path, strlen (priv->selected_row_path) + 1); -} - - -/* Folder context menu. */ - -struct _FolderPropertyItemsData { - EStorageSetView *storage_set_view; - ECorbaStorage *corba_storage; - int num_items; -}; -typedef struct _FolderPropertyItemsData FolderPropertyItemsData; - -static void -folder_property_item_verb_callback (BonoboUIComponent *component, - void *user_data, - const char *cname) -{ - FolderPropertyItemsData *data; - GtkWidget *toplevel_widget; - const char *p, *path; - int item_number; - - data = (FolderPropertyItemsData *) user_data; - - p = strrchr (cname, ':'); - g_assert (p != NULL); - - item_number = atoi (p + 1) - 1; - g_assert (item_number >= 0); - - toplevel_widget = gtk_widget_get_toplevel (GTK_WIDGET (data->storage_set_view)); - - path = strchr (data->storage_set_view->priv->right_click_row_path + 1, E_PATH_SEPARATOR); - if (path == NULL) - path = "/"; - e_corba_storage_show_folder_properties (data->corba_storage, path, - item_number, toplevel_widget->window); -} - -static FolderPropertyItemsData * -setup_folder_properties_items_if_corba_storage_clicked (EStorageSetView *storage_set_view) -{ - EStorageSetViewPrivate *priv; - EStorage *storage; - GSList *items, *p; - GString *xml; - FolderPropertyItemsData *data; - const char *slash; - char *storage_name; - int num_property_items; - int i; - - priv = storage_set_view->priv; - - slash = strchr (priv->right_click_row_path + 1, E_PATH_SEPARATOR); - if (slash == NULL) - storage_name = g_strdup (priv->right_click_row_path + 1); - - else - storage_name = g_strndup (priv->right_click_row_path + 1, - slash - (priv->right_click_row_path + 1)); - - storage = e_storage_set_get_storage (priv->storage_set, storage_name); - g_free (storage_name); - - if (storage == NULL || ! E_IS_CORBA_STORAGE (storage)) - return 0; - - items = e_corba_storage_get_folder_property_items (E_CORBA_STORAGE (storage)); - if (items == NULL) - return 0; - - xml = g_string_new ("<placeholder name=\"StorageFolderPropertiesPlaceholder\">"); - g_string_append (xml, "<separator f=\"\" name=\"EStorageSetViewFolderPropertiesSeparator\"/>"); - - num_property_items = 0; - for (p = items; p != NULL; p = p->next) { - const ECorbaStoragePropertyItem *item; - char *encoded_label; - char *encoded_tooltip; - - item = (const ECorbaStoragePropertyItem *) p->data; - num_property_items ++; - - g_string_append_printf (xml, "<menuitem name=\"EStorageSetView:FolderPropertyItem:%d\"", - num_property_items); - g_string_append_printf (xml, " verb=\"EStorageSetView:FolderPropertyItem:%d\"", - num_property_items); - - encoded_tooltip = bonobo_ui_util_encode_str (item->tooltip); - g_string_append_printf (xml, " tip=\"%s\"", encoded_tooltip); - - encoded_label = bonobo_ui_util_encode_str (item->label); - g_string_append_printf (xml, " label=\"%s\"/>", encoded_label); - - g_free (encoded_tooltip); - g_free (encoded_label); - } - - g_string_append (xml, "</placeholder>"); - - data = g_new (FolderPropertyItemsData, 1); - data->storage_set_view = storage_set_view; - data->corba_storage = E_CORBA_STORAGE (storage); - data->num_items = num_property_items; - - g_object_ref (data->storage_set_view); - g_object_ref (data->corba_storage); - - for (i = 1; i <= num_property_items; i ++) { - char *verb; - - verb = g_strdup_printf ("EStorageSetView:FolderPropertyItem:%d", i); - bonobo_ui_component_add_verb (priv->ui_component, verb, - folder_property_item_verb_callback, - data); - } - - bonobo_ui_component_set (priv->ui_component, "/popups/FolderPopup", xml->str, NULL); - - g_string_free (xml, TRUE); - e_corba_storage_free_property_items_list (items); - - return data; -} - -static void -remove_property_items (EStorageSetView *storage_set_view, - FolderPropertyItemsData *data) -{ - EStorageSetViewPrivate *priv; - - priv = storage_set_view->priv; - - if (data->num_items > 0) { - int i; - - bonobo_ui_component_rm (priv->ui_component, - "/popups/FolderPopup/StorageFolderPropertiesPlaceholder/EStorageSetViewFolderPropertiesSeparator", - NULL); - - for (i = 1; i <= data->num_items; i ++) { - char *path; - char *verb; - - path = g_strdup_printf ("/popups/FolderPopup/StorageFolderPropertiesPlaceholder/EStorageSetView:FolderPropertyItem:%d", i); - bonobo_ui_component_rm (priv->ui_component, path, NULL); - g_free (path); - - verb = g_strdup_printf ("EStorageSetView:FolderPropertyItem:%d", i); - bonobo_ui_component_remove_verb (priv->ui_component, verb); - g_free (verb); - } - } - - g_object_unref (data->storage_set_view); - g_object_unref (data->corba_storage); - - g_free (data); -} - -static void -popup_folder_menu (EStorageSetView *storage_set_view, - GdkEventButton *event) -{ - EvolutionShellComponentClient *handler; - EStorageSetViewPrivate *priv; - EFolderTypeRegistry *folder_type_registry; - EFolder *folder; - GtkWidget *menu, *window; - FolderPropertyItemsData *folder_property_items_data; - - priv = storage_set_view->priv; - - folder = e_storage_set_get_folder (priv->storage_set, priv->right_click_row_path); - g_object_ref (folder); - - 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)); - menu = gtk_menu_new (); - - window = gtk_widget_get_ancestor (GTK_WIDGET (storage_set_view), - BONOBO_TYPE_WINDOW); - bonobo_window_add_popup (BONOBO_WINDOW (window), - GTK_MENU (menu), "/popups/FolderPopup"); - - bonobo_ui_component_set (priv->ui_component, - "/popups/FolderPopup/ComponentPlaceholder", - "<placeholder name=\"Items\"/>", NULL); - - if (handler != NULL) - evolution_shell_component_client_populate_folder_context_menu (handler, - priv->ui_container, - e_folder_get_physical_uri (folder), - e_folder_get_type_string (folder)); - - folder_property_items_data = setup_folder_properties_items_if_corba_storage_clicked (storage_set_view); - - gtk_widget_show (GTK_WIDGET (menu)); - - gnome_popup_menu_do_popup_modal (GTK_WIDGET (menu), NULL, NULL, event, NULL, - GTK_WIDGET (storage_set_view)); - - if (folder_property_items_data != NULL) - remove_property_items (storage_set_view, folder_property_items_data); - - if (handler != NULL) - evolution_shell_component_client_unpopulate_folder_context_menu (handler, - priv->ui_container, - e_folder_get_physical_uri (folder), - e_folder_get_type_string (folder)); - - g_object_unref (folder); - gtk_widget_destroy (GTK_WIDGET (menu)); - - e_tree_right_click_up (E_TREE (storage_set_view)); -} - - -/* GtkObject methods. */ - -static void -pixbuf_free_func (gpointer key, gpointer value, gpointer user_data) -{ - g_free (key); - g_object_unref ((GdkPixbuf*)value); -} - -static void -impl_dispose (GObject *object) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - - storage_set_view = E_STORAGE_SET_VIEW (object); - priv = storage_set_view->priv; - - if (priv->etree_model != NULL) { - /* Destroy the tree. */ - e_tree_memory_node_remove (E_TREE_MEMORY(priv->etree_model), priv->root_node); - g_object_unref (priv->etree_model); - priv->etree_model = NULL; - - /* (The data in the hash table was all freed by freeing the tree.) */ - g_hash_table_destroy (priv->path_to_etree_node); - priv->path_to_etree_node = NULL; - } - - if (priv->storage_set != NULL) { - g_object_unref (priv->storage_set); - priv->storage_set = NULL; - } - - if (priv->drag_corba_source_interface != CORBA_OBJECT_NIL) { - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - g_assert (priv->drag_corba_source_context != NULL); - - GNOME_Evolution_ShellComponentDnd_SourceFolder_endDrag (priv->drag_corba_source_interface, - priv->drag_corba_source_context, - &ev); - - Bonobo_Unknown_unref (priv->drag_corba_source_interface, &ev); - CORBA_Object_release (priv->drag_corba_source_interface, &ev); - - CORBA_exception_free (&ev); - - priv->drag_corba_source_interface = CORBA_OBJECT_NIL; - } - - if (priv->ui_component != NULL) { - bonobo_object_unref (BONOBO_OBJECT (priv->ui_component)); - priv->ui_component = NULL; - } - - /* (No unreffing for priv->ui_container since we use a weakref.) */ - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - - storage_set_view = E_STORAGE_SET_VIEW (object); - priv = storage_set_view->priv; - - g_hash_table_foreach (priv->type_name_to_pixbuf, pixbuf_free_func, NULL); - g_hash_table_destroy (priv->type_name_to_pixbuf); - - if (priv->checkboxes != NULL) { - g_hash_table_foreach (priv->checkboxes, (GHFunc) g_free, NULL); - g_hash_table_destroy (priv->checkboxes); - } - - if (priv->drag_corba_source_context != NULL) - CORBA_free (priv->drag_corba_source_context); - - if (priv->drag_corba_data != NULL) - CORBA_free (priv->drag_corba_data); - - g_free (priv->selected_row_path); - g_free (priv->right_click_row_path); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -/* ETree methods. */ - -/* -- Source-side DnD. */ - -static gint -impl_tree_start_drag (ETree *tree, - int row, - ETreePath path, - int col, - GdkEvent *event) -{ - GdkDragContext *context; - GtkTargetList *target_list; - GdkDragAction actions; - EStorageSetView *storage_set_view; - - storage_set_view = E_STORAGE_SET_VIEW (tree); - - if (! storage_set_view->priv->allow_dnd) - return FALSE; - - target_list = create_target_list_for_node (storage_set_view, path); - if (target_list == NULL) - return FALSE; - - actions = GDK_ACTION_MOVE | GDK_ACTION_COPY; - - context = e_tree_drag_begin (tree, row, col, - target_list, - actions, - 1, event); - - gtk_drag_set_icon_default (context); - - gtk_target_list_unref (target_list); - - return TRUE; -} - -static void -impl_tree_drag_begin (ETree *etree, - int row, - ETreePath path, - int col, - GdkDragContext *context) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - EFolder *folder; - EvolutionShellComponentClient *component_client; - GNOME_Evolution_ShellComponent corba_component; - GNOME_Evolution_ShellComponentDnd_ActionSet possible_actions; - GNOME_Evolution_ShellComponentDnd_Action suggested_action; - CORBA_Environment ev; - - storage_set_view = E_STORAGE_SET_VIEW (etree); - priv = storage_set_view->priv; - - g_free (priv->selected_row_path); - priv->selected_row_path = g_strdup (e_tree_memory_node_get_data (E_TREE_MEMORY(priv->etree_model), path)); - - g_assert (priv->drag_corba_source_interface == CORBA_OBJECT_NIL); - - folder = get_folder_at_node (storage_set_view, path); - component_client = get_component_at_node (storage_set_view, path); - - if (component_client == NULL) - return; - - /* Query the `ShellComponentDnd::SourceFolder' interface on the - component. */ - /* FIXME we could use the new - `evolution_shell_component_client_get_dnd_source_interface()' - call. */ - - CORBA_exception_init (&ev); - - corba_component = evolution_shell_component_client_corba_objref (component_client); - priv->drag_corba_source_interface = Bonobo_Unknown_queryInterface (corba_component, - "IDL:GNOME/Evolution/ShellComponentDnd/SourceFolder:1.0", - &ev); - if (ev._major != CORBA_NO_EXCEPTION - || priv->drag_corba_source_interface == CORBA_OBJECT_NIL) { - priv->drag_corba_source_interface = CORBA_OBJECT_NIL; - - CORBA_exception_free (&ev); - return; - } - - GNOME_Evolution_ShellComponentDnd_SourceFolder_beginDrag (priv->drag_corba_source_interface, - e_folder_get_physical_uri (folder), - e_folder_get_type_string (folder), - &possible_actions, - &suggested_action, - &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - Bonobo_Unknown_unref (priv->drag_corba_source_interface, &ev); - CORBA_Object_release (priv->drag_corba_source_interface, &ev); - - priv->drag_corba_source_interface = CORBA_OBJECT_NIL; - - CORBA_exception_free (&ev); - return; - } - - CORBA_exception_free (&ev); - - if (priv->drag_corba_source_context != NULL) - CORBA_free (priv->drag_corba_source_context); - - priv->drag_corba_source_context = GNOME_Evolution_ShellComponentDnd_SourceFolder_Context__alloc (); - priv->drag_corba_source_context->physicalUri = CORBA_string_dup (e_folder_get_physical_uri (folder)); - priv->drag_corba_source_context->folderType = CORBA_string_dup (e_folder_get_type_string (folder)); - priv->drag_corba_source_context->possibleActions = possible_actions; - priv->drag_corba_source_context->suggestedAction = suggested_action; -} - -static void -impl_tree_drag_end (ETree *tree, - int row, - ETreePath path, - int col, - GdkDragContext *context) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - CORBA_Environment ev; - - storage_set_view = E_STORAGE_SET_VIEW (tree); - priv = storage_set_view->priv; - - if (priv->drag_corba_source_interface == CORBA_OBJECT_NIL) - return; - - CORBA_exception_init (&ev); - - GNOME_Evolution_ShellComponentDnd_SourceFolder_endDrag (priv->drag_corba_source_interface, - priv->drag_corba_source_context, - &ev); - - CORBA_free (priv->drag_corba_source_context); - priv->drag_corba_source_context = NULL; - - Bonobo_Unknown_unref (priv->drag_corba_source_interface, &ev); - CORBA_Object_release (priv->drag_corba_source_interface, &ev); - - CORBA_exception_free (&ev); -} - -static void -impl_tree_drag_data_get (ETree *etree, - int drag_row, - ETreePath drag_path, - int drag_col, - GdkDragContext *context, - GtkSelectionData *selection_data, - unsigned int info, - guint32 time) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - CORBA_Environment ev; - char *target_type; - - storage_set_view = E_STORAGE_SET_VIEW (etree); - priv = storage_set_view->priv; - - switch (info) { - case E_SHORTCUT_TARGET_TYPE_IDX: - set_e_shortcut_selection (storage_set_view, selection_data); - return; - case E_FOLDER_DND_PATH_TARGET_TYPE_IDX: - set_evolution_path_selection (storage_set_view, selection_data); - return; - } - - g_assert (info > 0); - - if (priv->drag_corba_source_interface == CORBA_OBJECT_NIL) - return; - - target_type = gdk_atom_name ((GdkAtom) context->targets->data); - - CORBA_exception_init (&ev); - - GNOME_Evolution_ShellComponentDnd_SourceFolder_getData (priv->drag_corba_source_interface, - priv->drag_corba_source_context, - convert_gdk_drag_action_set_to_corba (context->action), - target_type, - & priv->drag_corba_data, - &ev); - - if (ev._major != CORBA_NO_EXCEPTION) - gtk_selection_data_set (selection_data, - selection_data->target, 8, "", -1); - else - gtk_selection_data_set (selection_data, - gdk_atom_intern (priv->drag_corba_data->target, FALSE), - priv->drag_corba_data->format, - priv->drag_corba_data->bytes._buffer, - priv->drag_corba_data->bytes._length); - - g_free (target_type); - - CORBA_exception_free (&ev); -} - -static void -impl_tree_drag_data_delete (ETree *tree, - int row, - ETreePath path, - int col, - GdkDragContext *context) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - CORBA_Environment ev; - - storage_set_view = E_STORAGE_SET_VIEW (tree); - priv = storage_set_view->priv; - - if (priv->drag_corba_source_interface == CORBA_OBJECT_NIL) - return; - - CORBA_exception_init (&ev); - - GNOME_Evolution_ShellComponentDnd_SourceFolder_deleteData (priv->drag_corba_source_interface, - priv->drag_corba_source_context, - &ev); - - CORBA_exception_free (&ev); -} - -/* -- Destination-side DnD. */ - -static gboolean -impl_tree_drag_motion (ETree *tree, - int row, - ETreePath path, - int col, - GdkDragContext *context, - int x, - int y, - unsigned int time) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - const char *folder_path; - - storage_set_view = E_STORAGE_SET_VIEW (tree); - priv = storage_set_view->priv; - - if (! priv->allow_dnd) - return FALSE; - - folder_path = e_tree_memory_node_get_data (E_TREE_MEMORY (priv->etree_model), - e_tree_node_at_row (E_TREE (storage_set_view), row)); - if (folder_path == NULL) - return FALSE; - - e_tree_drag_highlight (E_TREE (storage_set_view), row, -1); - - return e_folder_dnd_bridge_motion (GTK_WIDGET (storage_set_view), context, time, - priv->storage_set, folder_path); -} - -static void -impl_tree_drag_leave (ETree *etree, - int row, - ETreePath path, - int col, - GdkDragContext *context, - unsigned int time) -{ - e_tree_drag_unhighlight (etree); -} - -static gboolean -impl_tree_drag_drop (ETree *etree, - int row, - ETreePath path, - int col, - GdkDragContext *context, - int x, - int y, - unsigned int time) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - const char *folder_path; - - storage_set_view = E_STORAGE_SET_VIEW (etree); - priv = storage_set_view->priv; - - e_tree_drag_unhighlight (etree); - - folder_path = e_tree_memory_node_get_data (E_TREE_MEMORY (priv->etree_model), - e_tree_node_at_row (E_TREE (storage_set_view), row)); - if (folder_path == NULL) - return FALSE; - - return e_folder_dnd_bridge_drop (GTK_WIDGET (etree), context, time, - priv->storage_set, folder_path); -} - -static void -impl_tree_drag_data_received (ETree *etree, - int row, - ETreePath path, - int col, - GdkDragContext *context, - int x, - int y, - GtkSelectionData *selection_data, - unsigned int info, - unsigned int time) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - const char *folder_path; - - storage_set_view = E_STORAGE_SET_VIEW (etree); - priv = storage_set_view->priv; - - folder_path = e_tree_memory_node_get_data (E_TREE_MEMORY (priv->etree_model), - e_tree_node_at_row (E_TREE (storage_set_view), row)); - if (path == NULL) { - gtk_drag_finish (context, FALSE, FALSE, time); - return; - } - - e_folder_dnd_bridge_data_received (GTK_WIDGET (etree), - context, - selection_data, - time, - priv->storage_set, - folder_path); -} - -static gboolean -impl_right_click (ETree *etree, - int row, - ETreePath path, - int col, - GdkEvent *event) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - - storage_set_view = E_STORAGE_SET_VIEW (etree); - priv = storage_set_view->priv; - - /* This should never happen, but you never know with ETree. */ - if (priv->right_click_row_path != NULL) - g_free (priv->right_click_row_path); - priv->right_click_row_path = g_strdup (e_tree_memory_node_get_data (E_TREE_MEMORY(priv->etree_model), path)); - - if (priv->ui_container) { - g_signal_emit (storage_set_view, signals[FOLDER_CONTEXT_MENU_POPPING_UP], 0, priv->right_click_row_path); - - popup_folder_menu (storage_set_view, (GdkEventButton *) event); - - g_signal_emit (storage_set_view, signals[FOLDER_CONTEXT_MENU_POPPED_DOWN], 0); - } - - g_free (priv->right_click_row_path); - priv->right_click_row_path = NULL; - - return TRUE; -} - -static void -impl_cursor_activated (ETree *tree, - int row, - ETreePath path) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - - storage_set_view = E_STORAGE_SET_VIEW (tree); - - priv = storage_set_view->priv; - - g_free (priv->selected_row_path); - if (path) { - priv->selected_row_path = g_strdup (e_tree_memory_node_get_data (E_TREE_MEMORY (priv->etree_model), path)); - - g_signal_emit (storage_set_view, signals[FOLDER_SELECTED], 0, - priv->selected_row_path); - } - else - priv->selected_row_path = NULL; -} - - -/* ETreeModel Methods */ - -static gboolean -path_is_storage (ETreeModel *etree, - ETreePath tree_path) -{ - return e_tree_model_node_depth (etree, tree_path) == 1; -} - -static GdkPixbuf* -etree_icon_at (ETreeModel *etree, - ETreePath tree_path, - void *model_data) -{ - EStorageSetView *storage_set_view; - EStorageSet *storage_set; - EFolder *folder; - char *path; - - storage_set_view = E_STORAGE_SET_VIEW (model_data); - storage_set = storage_set_view->priv->storage_set; - - path = (char*) e_tree_memory_node_get_data (E_TREE_MEMORY(etree), tree_path); - - folder = e_storage_set_get_folder (storage_set, path); - if (folder == NULL) - return NULL; - - /* No icon for a storage with children (or with no real root folder) */ - if (path_is_storage (etree, tree_path)) { - EStorage *storage; - GList *subfolder_paths; - - if (! strcmp (e_folder_get_type_string (folder), "noselect")) - return NULL; - - storage = e_storage_set_get_storage (storage_set, path + 1); - subfolder_paths = e_storage_get_subfolder_paths (storage, "/"); - if (subfolder_paths != NULL) { - e_free_string_list (subfolder_paths); - return NULL; - } - } - - return get_pixbuf_for_folder (storage_set_view, folder); -} - -/* This function returns the number of columns in our ETreeModel. */ -static int -etree_column_count (ETreeModel *etc, - void *data) -{ - return 3; -} - -static gboolean -etree_has_save_id (ETreeModel *etm, - void *data) -{ - return TRUE; -} - -static gchar * -etree_get_save_id (ETreeModel *etm, - ETreePath node, - void *model_data) -{ - return g_strdup(e_tree_memory_node_get_data (E_TREE_MEMORY(etm), node)); -} - -static gboolean -etree_has_get_node_by_id (ETreeModel *etm, - void *data) -{ - return TRUE; -} - -static ETreePath -etree_get_node_by_id (ETreeModel *etm, - const char *save_id, - void *model_data) -{ - EStorageSetView *storage_set_view; - storage_set_view = E_STORAGE_SET_VIEW (model_data); - - return g_hash_table_lookup (storage_set_view->priv->path_to_etree_node, save_id); -} - -static gboolean -has_checkbox (EStorageSetView *storage_set_view, ETreePath tree_path) -{ - EStorageSetViewPrivate *priv; - const char *folder_path; - - priv = storage_set_view->priv; - - folder_path = e_tree_memory_node_get_data (E_TREE_MEMORY(storage_set_view->priv->etree_model), - tree_path); - g_assert (folder_path != NULL); - - if (strchr (folder_path + 1, '/') == NULL) { - /* If it's a toplevel, never allow checking it. */ - return FALSE; - } - - if (priv->has_checkbox_func) - return (* priv->has_checkbox_func) (priv->storage_set, - folder_path, - priv->has_checkbox_func_data); - - return TRUE; -} - -static void * -etree_value_at (ETreeModel *etree, - ETreePath tree_path, - int col, - void *model_data) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - EStorageSet *storage_set; - EFolder *folder; - char *path; - const char *folder_name; - int unread_count; - - storage_set_view = E_STORAGE_SET_VIEW (model_data); - priv = storage_set_view->priv; - storage_set = priv->storage_set; - - /* Storages are always highlighted. */ - if (col == 1 && path_is_storage (etree, tree_path)) - return (void *) TRUE; - - path = (char *) e_tree_memory_node_get_data (E_TREE_MEMORY(etree), tree_path); - - folder = e_storage_set_get_folder (storage_set, path); - - switch (col) { - case 0: /* Title */ - if (folder == NULL) - return (void *) "?"; - folder_name = e_folder_get_name (folder); - unread_count = e_folder_get_unread_count (folder); - - if (unread_count > 0) { - char *name_with_unread; - - name_with_unread = g_strdup_printf ("%s (%d)", folder_name, - unread_count); - g_object_set_data_full (G_OBJECT (folder), "name_with_unread", name_with_unread, g_free); - - return (void *) name_with_unread; - } else - return (void *) folder_name; - case 1: /* bold */ - if (folder == NULL) - return GINT_TO_POINTER (FALSE); - return GINT_TO_POINTER (e_folder_get_highlighted (folder)); - case 2: /* checkbox */ - if (!has_checkbox (storage_set_view, tree_path)) - return GINT_TO_POINTER (2); - if (priv->checkboxes == NULL) - return GINT_TO_POINTER (0); - return GINT_TO_POINTER(g_hash_table_lookup (priv->checkboxes, - path) ? 1 : 0); - default: - return NULL; - } - -} - -static void -etree_fill_in_children (ETreeModel *etree, - ETreePath tree_path, - void *model_data) -{ - EStorageSetView *storage_set_view; - EStorageSet *storage_set; - ETreePath *parent; - char *path; - - storage_set_view = E_STORAGE_SET_VIEW (model_data); - storage_set = storage_set_view->priv->storage_set; - - parent = e_tree_model_node_get_parent (etree, tree_path); - path = (char *) e_tree_memory_node_get_data (E_TREE_MEMORY(etree), parent); - if (tree_path == e_tree_model_node_get_first_child (etree, parent)) { - g_signal_emit (storage_set_view, signals[FOLDER_OPENED], 0, path); - } -} - -static void -etree_set_value_at (ETreeModel *etree, - ETreePath tree_path, - int col, - const void *val, - void *model_data) -{ - gboolean value; - char *path; - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - char *old_path; - - storage_set_view = E_STORAGE_SET_VIEW (model_data); - priv = storage_set_view->priv; - - switch (col) { - case 2: /* checkbox */ - if (!has_checkbox (storage_set_view, tree_path)) - return; - - e_tree_model_pre_change (etree); - - value = GPOINTER_TO_INT (val); - path = (char *) e_tree_memory_node_get_data (E_TREE_MEMORY(etree), tree_path); - if (!priv->checkboxes) { - priv->checkboxes = g_hash_table_new (g_str_hash, g_str_equal); - } - - old_path = g_hash_table_lookup (priv->checkboxes, path); - - if (old_path) { - g_hash_table_remove (priv->checkboxes, path); - g_free (old_path); - } else { - path = g_strdup (path); - g_hash_table_insert (priv->checkboxes, path, path); - } - - e_tree_model_node_col_changed (etree, tree_path, col); - g_signal_emit (storage_set_view, signals[CHECKBOXES_CHANGED], 0); - break; - } -} - -static gboolean -etree_is_editable (ETreeModel *etree, - ETreePath path, - int col, - void *model_data) -{ - if (col == 2) - return TRUE; - else - return FALSE; -} - - -/* This function duplicates the value passed to it. */ -static void * -etree_duplicate_value (ETreeModel *etc, - int col, - const void *value, - void *data) -{ - if (col == 0) - return (void *)g_strdup (value); - else - return (void *)value; -} - -/* This function frees the value passed to it. */ -static void -etree_free_value (ETreeModel *etc, - int col, - void *value, - void *data) -{ - if (col == 0) - g_free (value); -} - -/* This function creates an empty value. */ -static void * -etree_initialize_value (ETreeModel *etc, - int col, - void *data) -{ - if (col == 0) - return g_strdup (""); - else - return NULL; -} - -/* This function reports if a value is empty. */ -static gboolean -etree_value_is_empty (ETreeModel *etc, - int col, - const void *value, - void *data) -{ - if (col == 0) - return !(value && *(char *)value); - else - return !value; -} - -/* This function reports if a value is empty. */ -static char * -etree_value_to_string (ETreeModel *etc, - int col, - const void *value, - void *data) -{ - if (col == 0) - return g_strdup(value); - else - return g_strdup(value ? "Yes" : "No"); -} - -static void -etree_node_destroy_func (void *data, - void *user_data) -{ - EStorageSetView *storage_set_view; - char *path; - - path = (char *) data; - storage_set_view = E_STORAGE_SET_VIEW (user_data); - - if (strcmp (path, ROOT_NODE_NAME)) - remove_node_from_hash (storage_set_view, path); - g_free (path); -} - - -/* StorageSet signal handling. */ - -static void -new_storage_cb (EStorageSet *storage_set, - EStorage *storage, - void *data) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - ETreePath node; - char *path; - - storage_set_view = E_STORAGE_SET_VIEW (data); - priv = storage_set_view->priv; - - path = g_strconcat (E_PATH_SEPARATOR_S, e_storage_get_name (storage), NULL); - - node = e_tree_memory_node_insert (E_TREE_MEMORY(priv->etree_model), priv->root_node, -1, path); - e_tree_memory_sort_node (E_TREE_MEMORY(priv->etree_model), priv->root_node, - storage_sort_callback, storage_set_view); - - if (! add_node_to_hash (storage_set_view, path, node)) { - e_tree_memory_node_remove (E_TREE_MEMORY(priv->etree_model), node); - return; - } -} - -static void -removed_storage_cb (EStorageSet *storage_set, - EStorage *storage, - void *data) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - ETreeModel *etree; - ETreePath node; - char *path; - - storage_set_view = E_STORAGE_SET_VIEW (data); - priv = storage_set_view->priv; - etree = priv->etree_model; - - path = g_strconcat (E_PATH_SEPARATOR_S, e_storage_get_name (storage), NULL); - node = lookup_node_in_hash (storage_set_view, path); - g_free (path); - - e_tree_memory_node_remove (E_TREE_MEMORY(etree), node); -} - -static void -new_folder_cb (EStorageSet *storage_set, - const char *path, - void *data) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - ETreeModel *etree; - ETreePath parent_node; - ETreePath new_node; - const char *last_separator; - char *parent_path; - char *copy_of_path; - - g_return_if_fail (g_path_is_absolute (path)); - - storage_set_view = E_STORAGE_SET_VIEW (data); - priv = storage_set_view->priv; - etree = priv->etree_model; - - last_separator = strrchr (path, E_PATH_SEPARATOR); - - parent_path = g_strndup (path, last_separator - path); - parent_node = g_hash_table_lookup (priv->path_to_etree_node, parent_path); - if (parent_node == NULL) { - g_warning ("EStorageSetView: EStorageSet reported new subfolder for non-existing folder -- %s", - parent_path); - g_free (parent_path); - return; - } - - g_free (parent_path); - - copy_of_path = g_strdup (path); - new_node = e_tree_memory_node_insert (E_TREE_MEMORY(etree), parent_node, -1, copy_of_path); - e_tree_memory_sort_node (E_TREE_MEMORY(etree), parent_node, folder_sort_callback, storage_set_view); - - if (! add_node_to_hash (storage_set_view, path, new_node)) { - e_tree_memory_node_remove (E_TREE_MEMORY(etree), new_node); - return; - } - - setup_folder_changed_callbacks (storage_set_view, - e_storage_set_get_folder (storage_set, path), - path); -} - -static void -updated_folder_cb (EStorageSet *storage_set, - const char *path, - void *data) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - ETreeModel *etree; - ETreePath node; - - storage_set_view = E_STORAGE_SET_VIEW (data); - priv = storage_set_view->priv; - etree = priv->etree_model; - - node = lookup_node_in_hash (storage_set_view, path); - e_tree_model_pre_change (etree); - e_tree_model_node_data_changed (etree, node); -} - -static void -removed_folder_cb (EStorageSet *storage_set, - const char *path, - void *data) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - ETreeModel *etree; - ETreePath node; - - storage_set_view = E_STORAGE_SET_VIEW (data); - priv = storage_set_view->priv; - etree = priv->etree_model; - - node = lookup_node_in_hash (storage_set_view, path); - e_tree_memory_node_remove (E_TREE_MEMORY(etree), node); -} - -static void -close_folder_cb (EStorageSet *storage_set, - const char *path, - void *data) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - ETreeModel *etree; - ETreePath node; - - storage_set_view = E_STORAGE_SET_VIEW (data); - priv = storage_set_view->priv; - etree = priv->etree_model; - - node = lookup_node_in_hash (storage_set_view, path); - e_tree_model_node_request_collapse (priv->etree_model, node); -} - - -static void -class_init (EStorageSetViewClass *klass) -{ - GObjectClass *object_class; - ETreeClass *etree_class; - - parent_class = g_type_class_ref(PARENT_TYPE); - - object_class = G_OBJECT_CLASS (klass); - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - etree_class = E_TREE_CLASS (klass); - etree_class->right_click = impl_right_click; - etree_class->cursor_activated = impl_cursor_activated; - etree_class->start_drag = impl_tree_start_drag; - etree_class->tree_drag_begin = impl_tree_drag_begin; - etree_class->tree_drag_end = impl_tree_drag_end; - etree_class->tree_drag_data_get = impl_tree_drag_data_get; - etree_class->tree_drag_data_delete = impl_tree_drag_data_delete; - etree_class->tree_drag_motion = impl_tree_drag_motion; - etree_class->tree_drag_drop = impl_tree_drag_drop; - etree_class->tree_drag_leave = impl_tree_drag_leave; - etree_class->tree_drag_data_received = impl_tree_drag_data_received; - - signals[FOLDER_SELECTED] - = g_signal_new ("folder_selected", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EStorageSetViewClass, folder_selected), - NULL, NULL, - e_shell_marshal_NONE__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); - - signals[FOLDER_OPENED] - = g_signal_new ("folder_opened", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EStorageSetViewClass, folder_opened), - NULL, NULL, - e_shell_marshal_NONE__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); - - signals[DND_ACTION] - = g_signal_new ("dnd_action", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EStorageSetViewClass, dnd_action), - NULL, NULL, - e_shell_marshal_NONE__POINTER_POINTER_POINTER_POINTER, - G_TYPE_NONE, 4, - G_TYPE_POINTER, - G_TYPE_POINTER, - G_TYPE_POINTER, - G_TYPE_POINTER); - - signals[FOLDER_CONTEXT_MENU_POPPING_UP] - = g_signal_new ("folder_context_menu_popping_up", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EStorageSetViewClass, folder_context_menu_popping_up), - NULL, NULL, - e_shell_marshal_NONE__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); - - signals[FOLDER_CONTEXT_MENU_POPPED_DOWN] - = g_signal_new ("folder_context_menu_popped_down", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EStorageSetViewClass, folder_context_menu_popped_down), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - signals[CHECKBOXES_CHANGED] - = g_signal_new ("checkboxes_changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EStorageSetViewClass, checkboxes_changed), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - checks [0] = gdk_pixbuf_new_from_xpm_data (check_empty_xpm); - checks [1] = gdk_pixbuf_new_from_xpm_data (check_filled_xpm); - checks [2] = gdk_pixbuf_new_from_xpm_data (check_missing_xpm); -} - -static void -init (EStorageSetView *storage_set_view) -{ - EStorageSetViewPrivate *priv; - - priv = g_new (EStorageSetViewPrivate, 1); - - priv->storage_set = NULL; - priv->path_to_etree_node = g_hash_table_new (g_str_hash, g_str_equal); - priv->type_name_to_pixbuf = g_hash_table_new (g_str_hash, g_str_equal); - - priv->ui_component = NULL; - priv->ui_container = NULL; - - priv->selected_row_path = NULL; - priv->right_click_row_path = NULL; - - priv->show_folders = TRUE; - priv->show_checkboxes = FALSE; - priv->allow_dnd = TRUE; - priv->search_enabled = FALSE; - - priv->drag_corba_source_interface = CORBA_OBJECT_NIL; - - priv->drag_corba_source_context = NULL; - priv->drag_corba_data = NULL; - - priv->checkboxes = NULL; - - priv->has_checkbox_func = NULL; - priv->has_checkbox_func_data = NULL; - - storage_set_view->priv = priv; -} - - -/* Handling of the "changed" signal in EFolders displayed in the EStorageSetView. */ - -struct _FolderChangedCallbackData { - EStorageSetView *storage_set_view; - char *path; -}; -typedef struct _FolderChangedCallbackData FolderChangedCallbackData; - -static void -folder_changed_callback_data_destroy_notify (void *data) -{ - FolderChangedCallbackData *callback_data; - - callback_data = (FolderChangedCallbackData *) data; - - g_free (callback_data->path); - g_free (callback_data); -} - -static void -folder_changed_cb (EFolder *folder, - void *data) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - FolderChangedCallbackData *callback_data; - ETreePath node; - - callback_data = (FolderChangedCallbackData *) data; - - storage_set_view = callback_data->storage_set_view; - priv = callback_data->storage_set_view->priv; - - node = g_hash_table_lookup (priv->path_to_etree_node, callback_data->path); - if (node == NULL) { - g_warning ("EStorageSetView -- EFolder::changed emitted for a folder whose path I don't know."); - return; - } - - e_tree_model_pre_change (priv->etree_model); - e_tree_model_node_data_changed (priv->etree_model, node); -} - -static void -folder_name_changed_cb (EFolder *folder, - void *data) -{ - EStorageSetView *storage_set_view; - EStorageSetViewPrivate *priv; - FolderChangedCallbackData *callback_data; - ETreePath parent_node; - const char *last_separator; - char *parent_path; - - callback_data = (FolderChangedCallbackData *) data; - - storage_set_view = callback_data->storage_set_view; - priv = storage_set_view->priv; - - last_separator = strrchr (callback_data->path, E_PATH_SEPARATOR); - - parent_path = g_strndup (callback_data->path, last_separator - callback_data->path); - parent_node = g_hash_table_lookup (priv->path_to_etree_node, parent_path); - g_free (parent_path); - - if (parent_node == NULL) { - g_warning ("EStorageSetView -- EFolder::name_changed emitted for a folder whose path I don't know."); - return; - } - - e_tree_memory_sort_node (E_TREE_MEMORY (priv->etree_model), parent_node, - folder_sort_callback, storage_set_view); -} - -static void -setup_folder_changed_callbacks (EStorageSetView *storage_set_view, - EFolder *folder, - const char *path) -{ - FolderChangedCallbackData *folder_changed_callback_data; - - folder_changed_callback_data = g_new (FolderChangedCallbackData, 1); - folder_changed_callback_data->storage_set_view = storage_set_view; - folder_changed_callback_data->path = g_strdup (path); - - e_signal_connect_while_alive (folder, "name_changed", - G_CALLBACK (folder_name_changed_cb), - folder_changed_callback_data, - storage_set_view); - - e_signal_connect_full_while_alive (folder, "changed", - G_CALLBACK (folder_changed_cb), - NULL, - folder_changed_callback_data, - folder_changed_callback_data_destroy_notify, - FALSE, FALSE, - storage_set_view); -} - - -static void -insert_folders (EStorageSetView *storage_set_view, - ETreePath parent, - EStorage *storage, - const char *path) -{ - EStorageSetViewPrivate *priv; - ETreeModel *etree; - ETreePath node; - GList *folder_path_list; - GList *p; - const char *storage_name; - - priv = storage_set_view->priv; - etree = priv->etree_model; - - storage_name = e_storage_get_name (storage); - - folder_path_list = e_storage_get_subfolder_paths (storage, path); - if (folder_path_list == NULL) - return; - - for (p = folder_path_list; p != NULL; p = p->next) { - EFolder *folder; - const char *folder_name; - const char *folder_path; - char *full_path; - - folder_path = (const char *) p->data; - folder = e_storage_get_folder (storage, folder_path); - folder_name = e_folder_get_name (folder); - - full_path = g_strconcat ("/", storage_name, folder_path, NULL); - - setup_folder_changed_callbacks (storage_set_view, folder, full_path); - - node = e_tree_memory_node_insert (E_TREE_MEMORY(etree), parent, -1, (void *) full_path); - e_tree_memory_sort_node(E_TREE_MEMORY(etree), parent, folder_sort_callback, storage_set_view); - add_node_to_hash (storage_set_view, full_path, node); - - insert_folders (storage_set_view, node, storage, folder_path); - } - - e_free_string_list (folder_path_list); -} - -static void -insert_storages (EStorageSetView *storage_set_view) -{ - EStorageSetViewPrivate *priv; - EStorageSet *storage_set; - GList *storage_list; - GList *p; - - priv = storage_set_view->priv; - - storage_set = priv->storage_set; - - storage_list = e_storage_set_get_storage_list (storage_set); - - for (p = storage_list; p != NULL; p = p->next) { - EStorage *storage = E_STORAGE (p->data); - const char *name; - char *path; - ETreePath parent; - - name = e_storage_get_name (storage); - path = g_strconcat ("/", name, NULL); - - parent = e_tree_memory_node_insert (E_TREE_MEMORY(priv->etree_model), priv->root_node, -1, path); - e_tree_memory_sort_node (E_TREE_MEMORY(priv->etree_model), - priv->root_node, - storage_sort_callback, storage_set_view); - - g_hash_table_insert (priv->path_to_etree_node, path, parent); - - if (priv->show_folders) - insert_folders (storage_set_view, parent, storage, "/"); - } - - e_free_object_list (storage_list); -} - -void -e_storage_set_view_construct (EStorageSetView *storage_set_view, - EStorageSet *storage_set, - BonoboUIContainer *ui_container) -{ - EStorageSetViewPrivate *priv; - ETableExtras *extras; - ECell *cell; - - g_return_if_fail (E_IS_STORAGE_SET_VIEW (storage_set_view)); - g_return_if_fail (E_IS_STORAGE_SET (storage_set)); - - priv = storage_set_view->priv; - - priv->ui_container = ui_container; - if (ui_container != NULL) { - g_object_weak_ref (G_OBJECT (ui_container), ui_container_destroy_notify, priv); - - priv->ui_component = bonobo_ui_component_new_default (); - bonobo_ui_component_set_container (priv->ui_component, - bonobo_object_corba_objref (BONOBO_OBJECT (ui_container)), - NULL); - } - - priv->etree_model = e_tree_memory_callbacks_new (etree_icon_at, - - etree_column_count, - - etree_has_save_id, - etree_get_save_id, - etree_has_get_node_by_id, - etree_get_node_by_id, - - etree_value_at, - etree_set_value_at, - etree_is_editable, - - etree_duplicate_value, - etree_free_value, - etree_initialize_value, - etree_value_is_empty, - etree_value_to_string, - - storage_set_view); - - e_tree_memory_set_node_destroy_func (E_TREE_MEMORY (priv->etree_model), - etree_node_destroy_func, storage_set_view); - e_tree_memory_set_expanded_default (E_TREE_MEMORY (priv->etree_model), FALSE); - - priv->root_node = e_tree_memory_node_insert (E_TREE_MEMORY(priv->etree_model), NULL, -1, - g_strdup (ROOT_NODE_NAME)); - add_node_to_hash (storage_set_view, ROOT_NODE_NAME, priv->root_node); - - extras = e_table_extras_new (); - cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT); - g_object_set((cell), "bold_column", 1, NULL); - e_table_extras_add_cell (extras, "render_tree", - e_cell_tree_new (NULL, NULL, TRUE, cell)); - - e_table_extras_add_cell (extras, "optional_checkbox", - e_cell_toggle_new (2, 3, checks)); - - e_tree_construct_from_spec_file (E_TREE (storage_set_view), priv->etree_model, extras, - EVOLUTION_ETSPECDIR "/e-storage-set-view.etspec", NULL); - - e_tree_root_node_set_visible (E_TREE(storage_set_view), FALSE); - - g_object_unref (extras); - - g_object_ref (storage_set); - priv->storage_set = storage_set; - - e_tree_drag_dest_set (E_TREE (storage_set_view), 0, NULL, 0, GDK_ACTION_MOVE | GDK_ACTION_COPY); - - g_signal_connect_object (storage_set, "new_storage", G_CALLBACK (new_storage_cb), storage_set_view, 0); - g_signal_connect_object (storage_set, "removed_storage", G_CALLBACK (removed_storage_cb), storage_set_view, 0); - g_signal_connect_object (storage_set, "new_folder", G_CALLBACK (new_folder_cb), storage_set_view, 0); - g_signal_connect_object (storage_set, "updated_folder", G_CALLBACK (updated_folder_cb), storage_set_view, 0); - g_signal_connect_object (storage_set, "removed_folder", G_CALLBACK (removed_folder_cb), storage_set_view, 0); - g_signal_connect_object (storage_set, "close_folder", G_CALLBACK (close_folder_cb), storage_set_view, 0); - - g_signal_connect_object (priv->etree_model, "fill_in_children", G_CALLBACK (etree_fill_in_children), storage_set_view, 0); - - insert_storages (storage_set_view); -} - -/* DON'T USE THIS. Use e_storage_set_new_view() instead. */ -GtkWidget * -e_storage_set_view_new (EStorageSet *storage_set, - BonoboUIContainer *ui_container) -{ - GtkWidget *new; - - g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), NULL); - - new = g_object_new (e_storage_set_view_get_type (), NULL); - - e_storage_set_view_construct (E_STORAGE_SET_VIEW (new), storage_set, ui_container); - - return new; -} - - -EStorageSet * -e_storage_set_view_get_storage_set (EStorageSetView *storage_set_view) -{ - EStorageSetViewPrivate *priv; - - g_return_val_if_fail (E_IS_STORAGE_SET_VIEW (storage_set_view), NULL); - - priv = storage_set_view->priv; - return priv->storage_set; -} - -void -e_storage_set_view_set_current_folder (EStorageSetView *storage_set_view, - const char *path) -{ - EStorageSetViewPrivate *priv; - ETreePath 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; - - node = g_hash_table_lookup (priv->path_to_etree_node, path); - if (node == NULL) - return; - - e_tree_show_node (E_TREE (storage_set_view), node); - e_tree_set_cursor (E_TREE (storage_set_view), node); - - g_free (priv->selected_row_path); - priv->selected_row_path = g_strdup (path); - - g_signal_emit (storage_set_view, signals[FOLDER_SELECTED], 0, path); -} - -const char * -e_storage_set_view_get_current_folder (EStorageSetView *storage_set_view) -{ - EStorageSetViewPrivate *priv; - ETreePath etree_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; - - if (!priv->show_folders) - return NULL; /* Mmh! */ - - etree_node = e_tree_get_cursor (E_TREE (storage_set_view)); - - if (etree_node == NULL) - return NULL; /* Mmh? */ - - path = (char*)e_tree_memory_node_get_data(E_TREE_MEMORY(priv->etree_model), etree_node); - - return path; -} - -void -e_storage_set_view_set_show_folders (EStorageSetView *storage_set_view, - gboolean show) -{ - EStorageSetViewPrivate *priv; - - g_return_if_fail (storage_set_view != NULL); - g_return_if_fail (E_IS_STORAGE_SET_VIEW (storage_set_view)); - - priv = storage_set_view->priv; - - if (show == priv->show_folders) - return; - - /* tear down existing tree and hash table mappings */ - e_tree_memory_node_remove (E_TREE_MEMORY(priv->etree_model), priv->root_node); - - /* now re-add the root node */ - priv->root_node = e_tree_memory_node_insert (E_TREE_MEMORY(priv->etree_model), NULL, -1, - g_strdup (ROOT_NODE_NAME)); - add_node_to_hash (storage_set_view, ROOT_NODE_NAME, priv->root_node); - - /* then reinsert the storages after setting the "show_folders" - flag. insert_storages will call insert_folders if - show_folders is TRUE */ - - priv->show_folders = show; - insert_storages (storage_set_view); -} - -gboolean -e_storage_set_view_get_show_folders (EStorageSetView *storage_set_view) -{ - return storage_set_view->priv->show_folders; -} - - - -void -e_storage_set_view_set_show_checkboxes (EStorageSetView *storage_set_view, - gboolean show, - EStorageSetViewHasCheckBoxFunc has_checkbox_func, - void *func_data) -{ - EStorageSetViewPrivate *priv; - ETableState *state; - - g_return_if_fail (storage_set_view != NULL); - g_return_if_fail (E_IS_STORAGE_SET_VIEW (storage_set_view)); - - priv = storage_set_view->priv; - - show = !! show; - - if (show == priv->show_checkboxes) - return; - - priv->show_checkboxes = show; - - state = e_tree_get_state_object (E_TREE (storage_set_view)); - g_free (state->columns); - state->col_count = show ? 2 : 1; - state->columns = g_new(int, state->col_count); - state->columns [state->col_count - 1] = 0; - if (show) - state->columns [0] = 1; - e_tree_set_state_object (E_TREE (storage_set_view), state); - - priv->has_checkbox_func = has_checkbox_func; - priv->has_checkbox_func_data = func_data; -} - -gboolean -e_storage_set_view_get_show_checkboxes (EStorageSetView *storage_set_view) -{ - g_return_val_if_fail (storage_set_view != NULL, FALSE); - g_return_val_if_fail (E_IS_STORAGE_SET_VIEW (storage_set_view), FALSE); - - return storage_set_view->priv->show_checkboxes; -} - -void -e_storage_set_view_enable_search (EStorageSetView *storage_set_view, - gboolean enable) -{ - g_return_if_fail (storage_set_view != NULL); - g_return_if_fail (E_IS_STORAGE_SET_VIEW (storage_set_view)); - - enable = !! enable; - - if (enable == storage_set_view->priv->search_enabled) - return; - - storage_set_view->priv->search_enabled = enable; - e_tree_set_search_column (E_TREE (storage_set_view), enable ? 0 : -1); -} - -void -e_storage_set_view_set_checkboxes_list (EStorageSetView *storage_set_view, - GSList *checkboxes) -{ - gboolean changed = FALSE; - EStorageSetViewPrivate *priv = storage_set_view->priv; - - e_tree_model_pre_change (priv->etree_model); - if (priv->checkboxes) { - g_hash_table_foreach (priv->checkboxes, (GHFunc) g_free, NULL); - g_hash_table_destroy (priv->checkboxes); - changed = TRUE; - } - - if (checkboxes) { - priv->checkboxes = g_hash_table_new (g_str_hash, g_str_equal); - for (; checkboxes; checkboxes = g_slist_next (checkboxes)) { - char *path = checkboxes->data; - - if (g_hash_table_lookup (priv->checkboxes, path)) - continue; - path = g_strdup (path); - g_hash_table_insert (priv->checkboxes, path, path); - } - changed = TRUE; - } - - if (changed) - e_tree_model_node_changed (priv->etree_model, - e_tree_model_get_root (priv->etree_model)); - else - e_tree_model_no_change (priv->etree_model); -} - -static void -essv_add_to_list (gpointer key, - gpointer value, - gpointer user_data) -{ - GSList **list = user_data; - - *list = g_slist_prepend (*list, g_strdup (key)); -} - -GSList * -e_storage_set_view_get_checkboxes_list (EStorageSetView *storage_set_view) -{ - GSList *list = NULL; - - if (storage_set_view->priv->checkboxes) { - g_hash_table_foreach (storage_set_view->priv->checkboxes, essv_add_to_list, &list); - - list = g_slist_reverse (list); - } - - return list; -} - - -void -e_storage_set_view_set_allow_dnd (EStorageSetView *storage_set_view, - gboolean allow_dnd) -{ - g_return_if_fail (storage_set_view != NULL); - g_return_if_fail (E_IS_STORAGE_SET_VIEW (storage_set_view)); - - storage_set_view->priv->allow_dnd = !! allow_dnd; -} - -gboolean -e_storage_set_view_get_allow_dnd (EStorageSetView *storage_set_view) -{ - g_return_val_if_fail (storage_set_view != NULL, FALSE); - g_return_val_if_fail (E_IS_STORAGE_SET_VIEW (storage_set_view), FALSE); - - return storage_set_view->priv->allow_dnd; -} - -const char * -e_storage_set_view_get_right_click_path (EStorageSetView *storage_set_view) -{ - g_return_val_if_fail (storage_set_view != NULL, NULL); - g_return_val_if_fail (E_IS_STORAGE_SET_VIEW (storage_set_view), NULL); - - return storage_set_view->priv->right_click_row_path; -} - - -E_MAKE_TYPE (e_storage_set_view, "EStorageSetView", EStorageSetView, class_init, init, PARENT_TYPE) diff --git a/shell/e-storage-set-view.etspec b/shell/e-storage-set-view.etspec deleted file mode 100644 index f0a8bbfc11..0000000000 --- a/shell/e-storage-set-view.etspec +++ /dev/null @@ -1,8 +0,0 @@ -<ETableSpecification no-headers="true" selection-mode="single" cursor-mode="line" draw-grid="false" horizontal-scrolling="true"> - <ETableColumn model_col="0" _title="Folder" expansion="1.0" minimum_width="20" resizable="true" cell="render_tree" compare="string" search="string"/> - <ETableColumn model_col="2" _title="Checkbox" expansion="0.0" minimum_width="18" resizable="false" cell="optional_checkbox" compare="integer"/> - <ETableState> - <column source="0"/> - <grouping></grouping> - </ETableState> -</ETableSpecification>
\ No newline at end of file diff --git a/shell/e-storage-set-view.h b/shell/e-storage-set-view.h deleted file mode 100644 index 65a2e7ae14..0000000000 --- a/shell/e-storage-set-view.h +++ /dev/null @@ -1,122 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-storage-set-view.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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__ - -#include <gal/e-table/e-tree.h> -#include <bonobo/bonobo-ui-container.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 gboolean (* EStorageSetViewHasCheckBoxFunc) (EStorageSet *storage_set, - const char *path, - void *data); - -typedef struct _EStorageSetView EStorageSetView; -typedef struct _EStorageSetViewPrivate EStorageSetViewPrivate; -typedef struct _EStorageSetViewClass EStorageSetViewClass; - -struct _EStorageSetView { - ETree parent; - - EStorageSetViewPrivate *priv; -}; - -struct _EStorageSetViewClass { - ETreeClass parent_class; - - /* Signals. */ - - void (* folder_selected) (EStorageSetView *storage_set_view, - const char *path); - void (* folder_opened) (EStorageSetView *storage_set_view, - const char *path); - - void (* dnd_action) (EStorageSetView *storage_set_view, - GdkDragContext *context, - const char *source_data, - const char *source_data_type, - const char *target_path); - - void (* folder_context_menu_popping_up) (EStorageSetView *storage_set_view, - const char *path); - void (* folder_context_menu_popped_down) (EStorageSetView *storage_set_view); - void (* checkboxes_changed) (EStorageSetView *storage_set_view); -}; - - -GtkType e_storage_set_view_get_type (void); - -/* DON'T USE THIS. Use e_storage_set_new_view() instead. */ -GtkWidget *e_storage_set_view_new (EStorageSet *storage_set, - BonoboUIContainer *ui_container); -void e_storage_set_view_construct (EStorageSetView *storage_set_view, - EStorageSet *storage_set, - BonoboUIContainer *ui_container); - -EStorageSet *e_storage_set_view_get_storage_set (EStorageSetView *storage_set_view); - -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); - -void e_storage_set_view_set_show_folders (EStorageSetView *storage_set_view, - gboolean show); -gboolean e_storage_set_view_get_show_folders (EStorageSetView *storage_set_view); - -void e_storage_set_view_set_show_checkboxes (EStorageSetView *storage_set_view, - gboolean show, - EStorageSetViewHasCheckBoxFunc has_checkbox_func, - void *func_data); -gboolean e_storage_set_view_get_show_checkboxes (EStorageSetView *storage_set_view); - -void e_storage_set_view_enable_search (EStorageSetView *storage_set_view, - gboolean enable); - -void e_storage_set_view_set_checkboxes_list (EStorageSetView *storage_set_view, - GSList *checkboxes); -GSList *e_storage_set_view_get_checkboxes_list (EStorageSetView *storage_set_view); - -void e_storage_set_view_set_allow_dnd (EStorageSetView *storage_set_view, - gboolean allow_dnd); -gboolean e_storage_set_view_get_allow_dnd (EStorageSetView *storage_set_view); - -const char *e_storage_set_view_get_right_click_path (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 2978ea7572..0000000000 --- a/shell/e-storage-set.c +++ /dev/null @@ -1,885 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-storage-set.c - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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-storage-set.h" - -#include "e-storage-set-view.h" -#include "e-shell-constants.h" -#include "e-shell-marshal.h" - -#include <glib.h> -#include <gtk/gtkobject.h> -#include <gtk/gtksignal.h> -#include <gtk/gtktypeutils.h> - -#include <gal/util/e-util.h> - -#include <string.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, - UPDATED_FOLDER, - REMOVED_FOLDER, - MOVED_FOLDER, - CLOSE_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; -} - - -/* "Callback converter", from `EStorageResultCallback' to - `EStorageSetResultCallback'. */ - -enum _StorageOperation { - OPERATION_COPY, - OPERATION_MOVE, - OPERATION_REMOVE, - OPERATION_CREATE -}; -typedef enum _StorageOperation StorageOperation; - -struct _StorageCallbackData { - EStorageSet *storage_set; - EStorageSetResultCallback storage_set_result_callback; - char *source_path; - char *destination_path; - StorageOperation operation; - void *data; -}; -typedef struct _StorageCallbackData StorageCallbackData; - -static StorageCallbackData * -storage_callback_data_new (EStorageSet *storage_set, - EStorageSetResultCallback callback, - const char *source_path, - const char *destination_path, - StorageOperation operation, - void *data) -{ - StorageCallbackData *new; - - new = g_new (StorageCallbackData, 1); - new->storage_set = storage_set; - new->storage_set_result_callback = callback; - new->source_path = g_strdup (source_path); - new->destination_path = g_strdup (destination_path); - new->operation = operation; - new->data = data; - - return new; -} - -static void -storage_callback_data_free (StorageCallbackData *data) -{ - g_free (data->source_path); - g_free (data->destination_path); - - g_free (data); -} - -static void -storage_callback (EStorage *storage, - EStorageResult result, - void *data) -{ - StorageCallbackData *storage_callback_data; - - storage_callback_data = (StorageCallbackData *) data; - - (* storage_callback_data->storage_set_result_callback) (storage_callback_data->storage_set, - result, - storage_callback_data->data); - - if (storage_callback_data->operation == OPERATION_MOVE) - g_signal_emit (storage_callback_data->storage_set, signals[MOVED_FOLDER], 0, - storage_callback_data->source_path, storage_callback_data->destination_path); - - storage_callback_data_free (storage_callback_data); -} - - -/* 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 (strcmp (path, E_PATH_SEPARATOR_S) == 0) - full_path = g_strconcat (E_PATH_SEPARATOR_S, storage_name, - NULL); - else if (! g_path_is_absolute (path)) - full_path = g_strconcat (E_PATH_SEPARATOR_S, storage_name, - E_PATH_SEPARATOR_S, path, NULL); - else - full_path = g_strconcat (E_PATH_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); - g_signal_emit (storage_set, signals[NEW_FOLDER], 0, full_path); - g_free (full_path); -} - -static void -storage_updated_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_signal_emit (storage_set, signals[UPDATED_FOLDER], 0, 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_signal_emit (storage_set, signals[REMOVED_FOLDER], 0, 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); - g_return_val_if_fail (path[1] != E_PATH_SEPARATOR, NULL); - - /* Skip initial separator. */ - path++; - - first_separator = strchr (path, E_PATH_SEPARATOR); - - if (first_separator == NULL || first_separator[1] == 0) { - storage = e_storage_set_get_storage (storage_set, path); - *subpath_return = E_PATH_SEPARATOR_S; - } else { - 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; -} - -static void -signal_new_folder_for_all_folders_under_paths (EStorageSet *storage_set, - EStorage *storage, - GList *path_list) -{ - GList *p; - - for (p = path_list; p != NULL; p = p->next) { - GList *sub_path_list; - const char *path; - char *path_with_storage; - - path = (const char *) p->data; - - path_with_storage = g_strconcat (E_PATH_SEPARATOR_S, e_storage_get_name (storage), path, NULL); - g_signal_emit (storage_set, signals[NEW_FOLDER], 0, path_with_storage); - g_free (path_with_storage); - - sub_path_list = e_storage_get_subfolder_paths (storage, path); - - signal_new_folder_for_all_folders_under_paths (storage_set, storage, sub_path_list); - - e_free_string_list (sub_path_list); - } -} - -static void -signal_new_folder_for_all_folders_in_storage (EStorageSet *storage_set, - EStorage *storage) -{ - GList *path_list; - - path_list = e_storage_get_subfolder_paths (storage, E_PATH_SEPARATOR_S); - - signal_new_folder_for_all_folders_under_paths (storage_set, storage, path_list); - - e_free_string_list (path_list); -} - - -/* GtkObject methods. */ - -static void -impl_dispose (GObject *object) -{ - EStorageSet *storage_set; - EStorageSetPrivate *priv; - - storage_set = E_STORAGE_SET (object); - priv = storage_set->priv; - - if (priv->storages != NULL) { - e_free_object_list (priv->storages); - priv->storages = NULL; - } - - if (priv->folder_type_registry != NULL) { - g_object_unref (priv->folder_type_registry); - priv->folder_type_registry = NULL; - } - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EStorageSet *storage_set; - EStorageSetPrivate *priv; - - storage_set = E_STORAGE_SET (object); - priv = storage_set->priv; - - g_hash_table_foreach (priv->name_to_named_storage, (GHFunc) name_to_named_storage_foreach_destroy, NULL); - g_hash_table_destroy (priv->name_to_named_storage); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -class_init (EStorageSetClass *klass) -{ - GObjectClass *object_class; - - parent_class = g_type_class_ref(gtk_object_get_type ()); - object_class = G_OBJECT_CLASS (klass); - - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - signals[NEW_STORAGE] = - g_signal_new ("new_storage", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EStorageSetClass, new_storage), - NULL, NULL, - e_shell_marshal_NONE__POINTER, - G_TYPE_NONE, 1, - G_TYPE_POINTER); - signals[REMOVED_STORAGE] = - g_signal_new ("removed_storage", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EStorageSetClass, removed_storage), - NULL, NULL, - e_shell_marshal_NONE__POINTER, - G_TYPE_NONE, 1, - G_TYPE_POINTER); - signals[NEW_FOLDER] = - g_signal_new ("new_folder", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EStorageSetClass, new_folder), - NULL, NULL, - e_shell_marshal_NONE__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); - signals[UPDATED_FOLDER] = - g_signal_new ("updated_folder", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EStorageSetClass, updated_folder), - NULL, NULL, - e_shell_marshal_NONE__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); - signals[REMOVED_FOLDER] = - g_signal_new ("removed_folder", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EStorageSetClass, removed_folder), - NULL, NULL, - e_shell_marshal_NONE__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); - signals[MOVED_FOLDER] = - g_signal_new ("moved_folder", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EStorageSetClass, moved_folder), - NULL, NULL, - e_shell_marshal_NONE__STRING_STRING, - G_TYPE_NONE, 2, - G_TYPE_STRING, - G_TYPE_STRING); - signals[CLOSE_FOLDER] = - g_signal_new ("close_folder", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EStorageSetClass, close_folder), - NULL, NULL, - e_shell_marshal_NONE__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); -} - -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); - - g_object_ref (folder_type_registry); - storage_set->priv->folder_type_registry = folder_type_registry; -} - -EStorageSet * -e_storage_set_new (EFolderTypeRegistry *folder_type_registry) -{ - EStorageSet *new; - - new = g_object_new (e_storage_set_get_type (), NULL); - - 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) { - g_object_ref (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; - - g_object_ref (storage); - - g_signal_connect (storage, "new_folder", - G_CALLBACK (storage_new_folder_cb), storage_set); - g_signal_connect (storage, "updated_folder", - G_CALLBACK (storage_updated_folder_cb), storage_set); - g_signal_connect (storage, "removed_folder", - G_CALLBACK (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); - - g_signal_emit (storage_set, signals[NEW_STORAGE], 0, storage); - - signal_new_folder_for_all_folders_in_storage (storage_set, 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); - - g_signal_emit (storage_set, signals[REMOVED_STORAGE], 0, storage); - g_object_unref (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); - - g_signal_emit (storage_set, signals[REMOVED_STORAGE], 0, storage); - g_object_unref (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); - if (storage == NULL) - return NULL; - - return e_storage_get_folder (storage, subpath); -} - - -static void -async_open_cb (EStorage *storage, EStorageResult result, - const char *path, gpointer storage_set) -{ - if (result != E_STORAGE_OK) { - char *full_path; - - full_path = make_full_path (storage, path); - g_signal_emit (storage_set, signals[CLOSE_FOLDER], 0, full_path); - g_free (full_path); - } -} - -static void -storage_set_view_folder_opened (EStorageSetView *storage_set_view, - const char *path, - EStorageSet *storage_set) -{ - EStorage *storage; - const char *subpath; - - storage = get_storage_for_path (storage_set, path, &subpath); - if (storage == NULL) - return; - - e_storage_async_open_folder (storage, subpath, - async_open_cb, storage_set); -} - -GtkWidget * -e_storage_set_create_new_view (EStorageSet *storage_set, - BonoboUIContainer *ui_container) -{ - 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, ui_container); - g_signal_connect (storage_set_view, "folder_opened", - G_CALLBACK (storage_set_view_folder_opened), - 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, - EStorageSetResultCallback callback, - void *data) -{ - EStorage *storage; - const char *subpath; - StorageCallbackData *storage_callback_data; - - 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 (description != NULL); - g_return_if_fail (callback != NULL); - - storage = get_storage_for_path (storage_set, path, &subpath); - - storage_callback_data = storage_callback_data_new (storage_set, callback, - path, NULL, OPERATION_CREATE, - data); - - e_storage_async_create_folder (storage, subpath, type, description, - storage_callback, storage_callback_data); -} - -void -e_storage_set_async_remove_folder (EStorageSet *storage_set, - const char *path, - EStorageSetResultCallback callback, - void *data) -{ - EStorage *storage; - const char *subpath; - StorageCallbackData *storage_callback_data; - - 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); - - storage_callback_data = storage_callback_data_new (storage_set, callback, - path, NULL, OPERATION_REMOVE, - data); - - e_storage_async_remove_folder (storage, subpath, - storage_callback, storage_callback_data); -} - -void -e_storage_set_async_xfer_folder (EStorageSet *storage_set, - const char *source_path, - const char *destination_path, - gboolean remove_source, - EStorageSetResultCallback callback, - void *data) -{ - EStorage *source_storage; - EStorage *destination_storage; - const char *source_subpath; - const char *destination_subpath; - StorageCallbackData *storage_callback_data; - - g_return_if_fail (storage_set != NULL); - g_return_if_fail (E_IS_STORAGE_SET (storage_set)); - g_return_if_fail (source_path != NULL); - g_return_if_fail (g_path_is_absolute (source_path)); - g_return_if_fail (destination_path != NULL); - g_return_if_fail (g_path_is_absolute (destination_path)); - g_return_if_fail (callback != NULL); - - source_storage = get_storage_for_path (storage_set, source_path, &source_subpath); - destination_storage = get_storage_for_path (storage_set, destination_path, &destination_subpath); - - if (source_storage != destination_storage) { - g_warning ("e_storage_set_async_xfer_folder(): " - "Attempt to xfer folders between different storages -- not supported yet."); - (* callback) (storage_set, E_STORAGE_UNSUPPORTEDOPERATION, data); - return; - } - - storage_callback_data = storage_callback_data_new (storage_set, - callback, - source_path, - destination_path, - remove_source ? OPERATION_MOVE : OPERATION_COPY, - data); - - e_storage_async_xfer_folder (source_storage, - source_subpath, destination_subpath, remove_source, - storage_callback, storage_callback_data); -} - -void -e_storage_set_async_remove_shared_folder (EStorageSet *storage_set, - const char *path, - EStorageSetResultCallback callback, - void *data) -{ - EStorage *storage; - const char *subpath; - StorageCallbackData *storage_callback_data; - - 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); - - if (!e_storage_supports_shared_folders (storage)) { - (* callback) (storage_set, E_STORAGE_NOTIMPLEMENTED, data); - return; - } - - storage_callback_data = storage_callback_data_new (storage_set, callback, - path, NULL, OPERATION_REMOVE, - data); - - e_storage_async_remove_shared_folder (storage, subpath, - storage_callback, - storage_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; -} - - -/** - * 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 (E_PATH_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 35c83a3eb5..0000000000 --- a/shell/e-storage-set.h +++ /dev/null @@ -1,123 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-storage-set.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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_ - -#include <gtk/gtkwidget.h> - -#include <bonobo/bonobo-ui-container.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; - -typedef void (* EStorageSetResultCallback) (EStorageSet *storage_set, EStorageResult result, void *data); - -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 (* updated_folder) (EStorageSet *storage_set, const char *path); - void (* removed_folder) (EStorageSet *storage_set, const char *path); - void (* moved_folder) (EStorageSet *storage_set, const char *source_path, const char *destination_path); - void (* close_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_create_new_view (EStorageSet *storage_set, - BonoboUIContainer *container); - -void e_storage_set_async_create_folder (EStorageSet *storage_set, - const char *path, - const char *type, - const char *description, - EStorageSetResultCallback callback, - void *data); -void e_storage_set_async_remove_folder (EStorageSet *storage_set, - const char *path, - EStorageSetResultCallback callback, - void *data); -void e_storage_set_async_xfer_folder (EStorageSet *storage_set, - const char *source_path, - const char *destination_path, - gboolean remove_source, - EStorageSetResultCallback callback, - void *data); - -void e_storage_set_async_remove_shared_folder (EStorageSet *storage_set, - const char *path, - EStorageSetResultCallback 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 f4a8e5ff26..0000000000 --- a/shell/e-storage.c +++ /dev/null @@ -1,848 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-storage.c - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 - */ - -/* FIXME: The EFolderTree is kept both in the EStorage and the - * EvolutionStorage. Bad design. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-storage.h" - -#include "e-folder-tree.h" -#include "e-shell-constants.h" -#include "e-shell-marshal.h" - -#include <gtk/gtkobject.h> -#include <gtk/gtksignal.h> - -#include <libgnome/gnome-i18n.h> -#include <gal/util/e-util.h> - -#include <string.h> - - -#define PARENT_TYPE GTK_TYPE_OBJECT -static GtkObjectClass *parent_class = NULL; - -#define ES_CLASS(obj) \ - E_STORAGE_CLASS (GTK_OBJECT_GET_CLASS (obj)) - -struct _EStoragePrivate { - /* The set of folders we have in this storage. */ - EFolderTree *folder_tree; - - /* Internal name of the storage */ - char *name; -}; - -enum { - NEW_FOLDER, - UPDATED_FOLDER, - REMOVED_FOLDER, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - - -/* Destroy notification function for the folders in the tree. */ - -static void -folder_destroy_notify (EFolderTree *tree, - const char *path, - void *data, - void *closure) -{ - EFolder *e_folder; - - if (data == NULL) { - /* The root folder has no EFolder associated to it. */ - return; - } - - e_folder = E_FOLDER (data); - g_object_unref (e_folder); -} - - -/* Signal callbacks for the EFolders. */ - -static void -folder_changed_cb (EFolder *folder, - void *data) -{ - EStorage *storage; - EStoragePrivate *priv; - const char *path, *p; - gboolean highlight; - - g_assert (E_IS_STORAGE (data)); - - storage = E_STORAGE (data); - priv = storage->priv; - - path = e_folder_tree_get_path_for_data (priv->folder_tree, folder); - g_assert (path != NULL); - - g_signal_emit (storage, signals[UPDATED_FOLDER], 0, path); - - highlight = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (folder), "last_highlight")); - if (highlight != e_folder_get_highlighted (folder)) { - highlight = !highlight; - g_object_set_data (G_OBJECT (folder), "last_highlight", GINT_TO_POINTER (highlight)); - p = strrchr (path, '/'); - if (p && p != path) { - char *name; - - name = g_strndup (path, p - path); - folder = e_folder_tree_get_folder (priv->folder_tree, name); - g_free (name); - if (folder) - e_folder_set_child_highlight (folder, highlight); - } - } -} - - -/* GObject methods. */ - -static void -impl_finalize (GObject *object) -{ - EStorage *storage; - EStoragePrivate *priv; - - storage = E_STORAGE (object); - priv = storage->priv; - - if (priv->folder_tree != NULL) - e_folder_tree_destroy (priv->folder_tree); - - g_free (priv->name); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -/* EStorage methods. */ - -static GList * -impl_get_subfolder_paths (EStorage *storage, - const char *path) -{ - EStoragePrivate *priv; - - priv = storage->priv; - - return e_folder_tree_get_subfolders (priv->folder_tree, path); -} - -static EFolder * -impl_get_folder (EStorage *storage, - const char *path) -{ - EStoragePrivate *priv; - EFolder *e_folder; - - priv = storage->priv; - - e_folder = (EFolder *) e_folder_tree_get_folder (priv->folder_tree, path); - - return e_folder; -} - -static const char * -impl_get_name (EStorage *storage) -{ - return storage->priv->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); -} - -static void -impl_async_xfer_folder (EStorage *storage, - const char *source_path, - const char *destination_path, - gboolean remove_source, - EStorageResultCallback callback, - void *data) -{ - (* callback) (storage, E_STORAGE_NOTIMPLEMENTED, data); -} - -static void -impl_async_open_folder (EStorage *storage, - const char *path, - EStorageDiscoveryCallback callback, - void *data) -{ - (*callback) (storage, E_STORAGE_NOTIMPLEMENTED, path, data); -} - -static gboolean -impl_supports_shared_folders (EStorage *storage) -{ - return FALSE; -} - -static void -impl_async_discover_shared_folder (EStorage *storage, - const char *owner, - const char *folder_name, - EStorageDiscoveryCallback callback, - void *data) -{ - (* callback) (storage, E_STORAGE_NOTIMPLEMENTED, NULL, data); -} - -static void -impl_async_remove_shared_folder (EStorage *storage, - const char *path, - EStorageResultCallback callback, - void *data) -{ - (* callback) (storage, E_STORAGE_NOTIMPLEMENTED, data); -} - - -/* Initialization. */ - -static void -class_init (EStorageClass *class) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (class); - parent_class = g_type_class_ref(gtk_object_get_type ()); - - object_class->finalize = impl_finalize; - - class->get_subfolder_paths = impl_get_subfolder_paths; - 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; - class->async_xfer_folder = impl_async_xfer_folder; - class->async_open_folder = impl_async_open_folder; - - class->supports_shared_folders = impl_supports_shared_folders; - class->async_discover_shared_folder = impl_async_discover_shared_folder; - class->async_remove_shared_folder = impl_async_remove_shared_folder; - - signals[NEW_FOLDER] = - g_signal_new ("new_folder", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EStorageClass, new_folder), - NULL, NULL, - e_shell_marshal_NONE__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); - signals[UPDATED_FOLDER] = - g_signal_new ("updated_folder", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EStorageClass, updated_folder), - NULL, NULL, - e_shell_marshal_NONE__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); - signals[REMOVED_FOLDER] = - g_signal_new ("removed_folder", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EStorageClass, removed_folder), - NULL, NULL, - e_shell_marshal_NONE__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); -} - -static void -init (EStorage *storage) -{ - EStoragePrivate *priv; - - priv = g_new (EStoragePrivate, 1); - - priv->folder_tree = e_folder_tree_new (folder_destroy_notify, NULL); - priv->name = NULL; - - storage->priv = priv; -} - - -/* Creation. */ - -void -e_storage_construct (EStorage *storage, - const char *name, - EFolder *root_folder) -{ - EStoragePrivate *priv; - - g_return_if_fail (storage != NULL); - g_return_if_fail (E_IS_STORAGE (storage)); - - priv = storage->priv; - - priv->name = g_strdup (name); - - e_storage_new_folder (storage, "/", root_folder); - - GTK_OBJECT_UNSET_FLAGS (GTK_OBJECT (storage), GTK_FLOATING); -} - -EStorage * -e_storage_new (const char *name, - EFolder *root_folder) -{ - EStorage *new; - - new = g_object_new (e_storage_get_type (), NULL); - - e_storage_construct (new, name, root_folder); - - return new; -} - - -gboolean -e_storage_path_is_absolute (const char *path) -{ - g_return_val_if_fail (path != NULL, FALSE); - - return *path == E_PATH_SEPARATOR; -} - -gboolean -e_storage_path_is_relative (const char *path) -{ - g_return_val_if_fail (path != NULL, FALSE); - - return *path != E_PATH_SEPARATOR; -} - - -GList * -e_storage_get_subfolder_paths (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)->get_subfolder_paths) (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); -} - -void -e_storage_async_xfer_folder (EStorage *storage, - const char *source_path, - const char *destination_path, - const gboolean remove_source, - EStorageResultCallback callback, - void *data) -{ - g_return_if_fail (storage != NULL); - g_return_if_fail (E_IS_STORAGE (storage)); - g_return_if_fail (source_path != NULL); - g_return_if_fail (g_path_is_absolute (source_path)); - g_return_if_fail (destination_path != NULL); - g_return_if_fail (g_path_is_absolute (destination_path)); - - if (strcmp (source_path, destination_path) == 0) { - (* callback) (storage, E_STORAGE_OK, data); - return; - } - - if (remove_source) { - int destination_len; - int source_len; - - source_len = strlen (source_path); - destination_len = strlen (destination_path); - - if (source_len < destination_len - && destination_path[source_len] == E_PATH_SEPARATOR - && strncmp (destination_path, source_path, source_len) == 0) { - (* callback) (storage, E_STORAGE_CANTMOVETODESCENDANT, data); - return; - } - } - - (* ES_CLASS (storage)->async_xfer_folder) (storage, source_path, destination_path, remove_source, callback, data); -} - -void -e_storage_async_open_folder (EStorage *storage, - const char *path, - EStorageDiscoveryCallback callback, - void *data) -{ - EStoragePrivate *priv; - EFolder *folder; - - 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)); - - priv = storage->priv; - - folder = e_folder_tree_get_folder (priv->folder_tree, path); - if (folder == NULL) { - (* callback) (storage, E_STORAGE_NOTFOUND, path, data); - return; - } - - if (! e_folder_get_has_subfolders (folder)) { - (* callback) (storage, E_STORAGE_OK, path, data); - return; - } - - (* ES_CLASS (storage)->async_open_folder) (storage, path, callback, data); -} - - -/* Shared folders. */ - -gboolean -e_storage_supports_shared_folders (EStorage *storage) -{ - g_return_val_if_fail (storage != NULL, FALSE); - g_return_val_if_fail (E_IS_STORAGE (storage), FALSE); - - return (* ES_CLASS (storage)->supports_shared_folders) (storage); -} - -void -e_storage_async_discover_shared_folder (EStorage *storage, - const char *owner, - const char *folder_name, - EStorageDiscoveryCallback callback, - void *data) -{ - g_return_if_fail (storage != NULL); - g_return_if_fail (E_IS_STORAGE (storage)); - g_return_if_fail (owner != NULL); - g_return_if_fail (folder_name != NULL); - - (* ES_CLASS (storage)->async_discover_shared_folder) (storage, owner, folder_name, callback, data); -} - -void -e_storage_cancel_discover_shared_folder (EStorage *storage, - const char *owner, - const char *folder_name) -{ - g_return_if_fail (E_IS_STORAGE (storage)); - g_return_if_fail (owner != NULL); - g_return_if_fail (folder_name != NULL); - g_return_if_fail (ES_CLASS (storage)->cancel_discover_shared_folder != NULL); - - (* ES_CLASS (storage)->cancel_discover_shared_folder) (storage, owner, folder_name); -} - -void -e_storage_async_remove_shared_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)); - - (* ES_CLASS (storage)->async_remove_shared_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_NOTEMPTY: - return _("The folder is not empty"); - 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"); - case E_STORAGE_CANTCHANGESTOCKFOLDER: - return _("The specified folder cannot be modified or removed"); - case E_STORAGE_CANTMOVETODESCENDANT: - return _("Cannot make a folder a child of one of its descendants"); - case E_STORAGE_INVALIDNAME: - return _("Cannot create a folder with that name"); - case E_STORAGE_NOTONLINE: - return _("This operation cannot be performed in off-line mode"); - default: - return _("Unknown error"); - } -} - - -/* Public utility functions. */ - -struct _GetPathForPhysicalUriForeachData { - const char *physical_uri; - char *retval; -}; -typedef struct _GetPathForPhysicalUriForeachData GetPathForPhysicalUriForeachData; - -static void -get_path_for_physical_uri_foreach (EFolderTree *folder_tree, - const char *path, - void *path_data, - void *user_data) -{ - GetPathForPhysicalUriForeachData *foreach_data; - const char *physical_uri; - EFolder *e_folder; - - foreach_data = (GetPathForPhysicalUriForeachData *) user_data; - if (foreach_data->retval != NULL) - return; - - e_folder = (EFolder *) path_data; - if (e_folder == NULL) - return; - - physical_uri = e_folder_get_physical_uri (e_folder); - if (physical_uri == NULL) - return; - - if (strcmp (foreach_data->physical_uri, physical_uri) == 0) - 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; - - e_folder_tree_foreach (priv->folder_tree, 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. */ - -static void -remove_subfolders_except (EStorage *storage, const char *path, const char *except) -{ - EStoragePrivate *priv; - GList *subfolders, *f; - const char *folder_path; - - priv = storage->priv; - - subfolders = e_folder_tree_get_subfolders (priv->folder_tree, path); - for (f = subfolders; f; f = f->next) { - folder_path = f->data; - if (!except || strcmp (folder_path, except) != 0) - e_storage_removed_folder (storage, folder_path); - } - e_free_string_list (subfolders); -} - -gboolean -e_storage_new_folder (EStorage *storage, - const char *path, - EFolder *e_folder) -{ - EStoragePrivate *priv; - char *parent_path, *p; - EFolder *parent; - - 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; - - if (! e_folder_tree_add (priv->folder_tree, path, e_folder)) - return FALSE; - - /* If this is the child of a folder that has a pseudo child, - * remove the pseudo child now. - */ - p = strrchr (path, '/'); - if (p && p != path) - parent_path = g_strndup (path, p - path); - else - parent_path = g_strdup ("/"); - parent = e_folder_tree_get_folder (priv->folder_tree, parent_path); - if (parent && e_folder_get_has_subfolders (parent)) { - remove_subfolders_except (storage, parent_path, path); - e_folder_set_has_subfolders (parent, FALSE); - } - g_free (parent_path); - - g_signal_connect_object (e_folder, "changed", G_CALLBACK (folder_changed_cb), storage, 0); - - g_signal_emit (storage, signals[NEW_FOLDER], 0, path); - - folder_changed_cb (e_folder, storage); - - return TRUE; -} - -/* This really should be called e_storage_set_has_subfolders, but then - * it would look like it was an EStorageSet function. (Fact o' the - * day: The word "set" has more distinct meanings than any other word - * in the English language.) Anyway, we now return you to your - * regularly scheduled source code, already in progress. - */ -gboolean -e_storage_declare_has_subfolders (EStorage *storage, - const char *path, - const char *message) -{ - EStoragePrivate *priv; - EFolder *parent, *pseudofolder; - char *pseudofolder_path; - gboolean ok; - - 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 (message != NULL, FALSE); - - priv = storage->priv; - - parent = e_folder_tree_get_folder (priv->folder_tree, path); - if (parent == NULL) - return FALSE; - if (e_folder_get_has_subfolders (parent)) - return TRUE; - - remove_subfolders_except (storage, path, NULL); - - pseudofolder = e_folder_new (message, "working", ""); - if (strcmp (path, "/") == 0) - pseudofolder_path = g_strdup_printf ("/%s", message); - else - pseudofolder_path = g_strdup_printf ("%s/%s", path, message); - e_folder_set_physical_uri (pseudofolder, pseudofolder_path); - - ok = e_storage_new_folder (storage, pseudofolder_path, pseudofolder); - g_free (pseudofolder_path); - if (!ok) { - g_object_unref (pseudofolder); - return FALSE; - } - - e_folder_set_has_subfolders (parent, TRUE); - return TRUE; -} - -gboolean -e_storage_get_has_subfolders (EStorage *storage, - const char *path) -{ - EStoragePrivate *priv; - EFolder *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 = e_folder_tree_get_folder (priv->folder_tree, path); - - return folder && e_folder_get_has_subfolders (folder); -} - -gboolean -e_storage_removed_folder (EStorage *storage, - const char *path) -{ - EStoragePrivate *priv; - EFolder *folder; - const char *p; - - 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 = e_folder_tree_get_folder (priv->folder_tree, path); - if (folder == NULL) - return FALSE; - - p = strrchr (path, '/'); - if (p != NULL && p != path) { - EFolder *parent_folder; - char *parent_path; - - parent_path = g_strndup (path, p - path); - parent_folder = e_folder_tree_get_folder (priv->folder_tree, parent_path); - - if (e_folder_get_highlighted (folder)) - e_folder_set_child_highlight (parent_folder, FALSE); - - g_free (parent_path); - } - - g_signal_emit (storage, signals[REMOVED_FOLDER], 0, path); - - e_folder_tree_remove (priv->folder_tree, path); - - 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 bd0cc5da22..0000000000 --- a/shell/e-storage.h +++ /dev/null @@ -1,214 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-storage.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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_ - -#include <gtk/gtkobject.h> - -#include "evolution-shell-component-client.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_NOTEMPTY, - E_STORAGE_NOTFOUND, - E_STORAGE_NOTIMPLEMENTED, - E_STORAGE_PERMISSIONDENIED, - E_STORAGE_UNSUPPORTEDOPERATION, - E_STORAGE_UNSUPPORTEDTYPE, - E_STORAGE_CANTCHANGESTOCKFOLDER, - E_STORAGE_CANTMOVETODESCENDANT, - E_STORAGE_NOTONLINE, - E_STORAGE_INVALIDNAME -}; -typedef enum _EStorageResult EStorageResult; - -typedef void (* EStorageResultCallback) (EStorage *storage, EStorageResult result, void *data); -typedef void (* EStorageDiscoveryCallback) (EStorage *storage, EStorageResult result, const char *path, 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 (* updated_folder) (EStorage *storage, const char *path); - void (* removed_folder) (EStorage *storage, const char *path); - void (* close_folder) (EStorage *storage, const char *path); - - /* Virtual methods. */ - - GList * (* get_subfolder_paths) (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); - - void (* async_xfer_folder) (EStorage *storage, - const char *source_path, - const char *destination_path, - const gboolean remove_source, - EStorageResultCallback callback, - void *data); - - void (* async_open_folder) (EStorage *storage, - const char *path, - EStorageDiscoveryCallback callback, - void *data); - - gboolean (* supports_shared_folders) (EStorage *storage); - void (* async_discover_shared_folder) (EStorage *storage, - const char *owner, - const char *folder_name, - EStorageDiscoveryCallback callback, - void *data); - void (* cancel_discover_shared_folder) (EStorage *storage, - const char *owner, - const char *folder_name); - void (* async_remove_shared_folder) (EStorage *storage, - const char *path, - EStorageResultCallback callback, - void *data); -}; - - -GtkType e_storage_get_type (void); -void e_storage_construct (EStorage *storage, - const char *name, - EFolder *root_folder); -EStorage *e_storage_new (const char *name, - EFolder *root_folder); - -gboolean e_storage_path_is_relative (const char *path); -gboolean e_storage_path_is_absolute (const char *path); - -GList *e_storage_get_subfolder_paths (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); -void e_storage_async_xfer_folder (EStorage *storage, - const char *source_path, - const char *destination_path, - const gboolean remove_source, - EStorageResultCallback callback, - void *data); -void e_storage_async_open_folder (EStorage *storage, - const char *path, - EStorageDiscoveryCallback callback, - void *data); - -const char *e_storage_result_to_string (EStorageResult result); - -/* Shared folders. */ -gboolean e_storage_supports_shared_folders (EStorage *storage); -void e_storage_async_discover_shared_folder (EStorage *storage, - const char *owner, - const char *folder_name, - EStorageDiscoveryCallback callback, - void *data); -void e_storage_cancel_discover_shared_folder (EStorage *storage, - const char *owner, - const char *folder_name); -void e_storage_async_remove_shared_folder (EStorage *storage, - const char *path, - EStorageResultCallback callback, - void *data); - -/* 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); - -gboolean e_storage_declare_has_subfolders (EStorage *storage, - const char *path, - const char *message); -gboolean e_storage_get_has_subfolders (EStorage *storage, - const char *path); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_STORAGE_H_ */ diff --git a/shell/e-task-bar.c b/shell/e-task-bar.c deleted file mode 100644 index 522d473373..0000000000 --- a/shell/e-task-bar.c +++ /dev/null @@ -1,187 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-task-bar.c - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-task-bar.h" - -#include <gal/util/e-util.h> - - -#define PARENT_TYPE gtk_hbox_get_type () -static GtkHBoxClass *parent_class = NULL; - - -/* WARNING: Ugly hack starts here. */ - -#define MAX_ACTIVITIES_PER_COMPONENT 2 - -static void -reduce_displayed_activities_per_component (ETaskBar *task_bar) -{ - GHashTable *component_ids_hash; - GtkBox *box; - GList *p; - - component_ids_hash = g_hash_table_new (g_str_hash, g_str_equal); - - box = GTK_BOX (task_bar); - - for (p = box->children; p != NULL; p = p->next) { - GtkBoxChild *child; - const char *component_id; - void *hash_item; - - child = (GtkBoxChild *) p->data; - component_id = e_task_widget_get_component_id (E_TASK_WIDGET (child->widget)); - - hash_item = g_hash_table_lookup (component_ids_hash, component_id); - - if (hash_item == NULL) { - gtk_widget_show (child->widget); - g_hash_table_insert (component_ids_hash, (void *) component_id, GINT_TO_POINTER (1)); - } else { - int num_items; - - num_items = GPOINTER_TO_INT (hash_item); - g_assert (num_items <= MAX_ACTIVITIES_PER_COMPONENT); - - if (num_items == MAX_ACTIVITIES_PER_COMPONENT) { - gtk_widget_hide (child->widget); - } else { - num_items ++; - gtk_widget_show (child->widget); - g_hash_table_insert (component_ids_hash, (void *) component_id, GINT_TO_POINTER (num_items)); - } - } - } - - g_hash_table_destroy (component_ids_hash); -} - - -static void -class_init (GtkObjectClass *object_class) -{ - parent_class = g_type_class_ref(PARENT_TYPE); -} - -static void -init (ETaskBar *task_bar) -{ - /* Nothing to do here. */ -} - - -void -e_task_bar_construct (ETaskBar *task_bar) -{ - g_return_if_fail (task_bar != NULL); - g_return_if_fail (E_IS_TASK_BAR (task_bar)); - - /* Nothing to do here. */ -} - -GtkWidget * -e_task_bar_new (void) -{ - ETaskBar *task_bar; - - task_bar = g_object_new (e_task_bar_get_type (), NULL); - e_task_bar_construct (task_bar); - - return GTK_WIDGET (task_bar); -} - -void -e_task_bar_prepend_task (ETaskBar *task_bar, - ETaskWidget *task_widget) -{ - GtkBoxChild *child_info; - GtkBox *box; - - g_return_if_fail (task_bar != NULL); - g_return_if_fail (E_IS_TASK_BAR (task_bar)); - g_return_if_fail (task_widget != NULL); - g_return_if_fail (E_IS_TASK_WIDGET (task_widget)); - - /* Hah hah. GTK+ sucks. This is adapted from `gtkhbox.c'. */ - - child_info = g_new (GtkBoxChild, 1); - child_info->widget = GTK_WIDGET (task_widget); - child_info->padding = 0; - child_info->expand = TRUE; - child_info->fill = TRUE; - child_info->pack = GTK_PACK_START; - - box = GTK_BOX (task_bar); - - box->children = g_list_prepend (box->children, child_info); - - gtk_widget_set_parent (GTK_WIDGET (task_widget), GTK_WIDGET (task_bar)); - - if (GTK_WIDGET_REALIZED (task_bar)) - gtk_widget_realize (GTK_WIDGET (task_widget)); - - if (GTK_WIDGET_VISIBLE (task_bar) && GTK_WIDGET_VISIBLE (task_widget)) { - if (GTK_WIDGET_MAPPED (task_bar)) - gtk_widget_map (GTK_WIDGET (task_widget)); - gtk_widget_queue_resize (GTK_WIDGET (task_widget)); - } - - reduce_displayed_activities_per_component (task_bar); -} - -void -e_task_bar_remove_task (ETaskBar *task_bar, - int n) -{ - ETaskWidget *task_widget; - - g_return_if_fail (task_bar != NULL); - g_return_if_fail (E_IS_TASK_BAR (task_bar)); - g_return_if_fail (n >= 0); - - task_widget = e_task_bar_get_task_widget (task_bar, n); - gtk_widget_destroy (GTK_WIDGET (task_widget)); - - reduce_displayed_activities_per_component (task_bar); -} - -ETaskWidget * -e_task_bar_get_task_widget (ETaskBar *task_bar, - int n) -{ - GtkBoxChild *child_info; - - g_return_val_if_fail (task_bar != NULL, NULL); - g_return_val_if_fail (E_IS_TASK_BAR (task_bar), NULL); - - child_info = (GtkBoxChild *) g_list_nth (GTK_BOX (task_bar)->children, n)->data; - - return E_TASK_WIDGET (child_info->widget); -} - - -E_MAKE_TYPE (e_task_bar, "ETaskBar", ETaskBar, class_init, init, PARENT_TYPE) diff --git a/shell/e-task-bar.h b/shell/e-task-bar.h deleted file mode 100644 index c20ca1871c..0000000000 --- a/shell/e-task-bar.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-task-bar.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifndef _E_TASK_BAR_H_ -#define _E_TASK_BAR_H_ - -#include "e-task-widget.h" - -#include <gtk/gtkhbox.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_TASK_BAR (e_task_bar_get_type ()) -#define E_TASK_BAR(obj) (GTK_CHECK_CAST ((obj), E_TYPE_TASK_BAR, ETaskBar)) -#define E_TASK_BAR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_TASK_BAR, ETaskBarClass)) -#define E_IS_TASK_BAR(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_TASK_BAR)) -#define E_IS_TASK_BAR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_TASK_BAR)) - - -typedef struct _ETaskBar ETaskBar; -typedef struct _ETaskBarPrivate ETaskBarPrivate; -typedef struct _ETaskBarClass ETaskBarClass; - -struct _ETaskBar { - GtkHBox parent; -}; - -struct _ETaskBarClass { - GtkHBoxClass parent_class; -}; - - -GtkType e_task_bar_get_type (void); -void e_task_bar_construct (ETaskBar *task_bar); -GtkWidget *e_task_bar_new (void); - -void e_task_bar_prepend_task (ETaskBar *task_bar, - ETaskWidget *task_widget); -void e_task_bar_remove_task (ETaskBar *task_bar, - int n); - -ETaskWidget *e_task_bar_get_task_widget (ETaskBar *task_bar, - int n); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_TASK_BAR_H_ */ diff --git a/shell/e-task-widget.c b/shell/e-task-widget.c deleted file mode 100644 index c6cd524c2f..0000000000 --- a/shell/e-task-widget.c +++ /dev/null @@ -1,251 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-task-widget.c - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-task-widget.h" - -#include <gtk/gtkframe.h> -#include <gtk/gtkhbox.h> -#include <gtk/gtklabel.h> -#include <gtk/gtkimage.h> -#include <gtk/gtktooltips.h> - -#include <libgnome/gnome-i18n.h> - -#include <gal/util/e-util.h> - - -#define SPACING 2 - -#define PARENT_TYPE (gtk_event_box_get_type ()) -static GtkEventBoxClass *parent_class = NULL; - -struct _ETaskWidgetPrivate { - char *component_id; - - GtkTooltips *tooltips; - - GdkPixbuf *icon_pixbuf; - GtkWidget *label; - GtkWidget *image; -}; - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - ETaskWidget *task_widget; - ETaskWidgetPrivate *priv; - - task_widget = E_TASK_WIDGET (object); - - priv = task_widget->priv; - - if (priv->tooltips != NULL) { - g_object_unref (priv->tooltips); - priv->tooltips = NULL; - } - - if (priv->icon_pixbuf != NULL) { - g_object_unref (priv->icon_pixbuf); - priv->icon_pixbuf = NULL; - } - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - ETaskWidget *task_widget; - ETaskWidgetPrivate *priv; - - task_widget = E_TASK_WIDGET (object); - priv = task_widget->priv; - - g_free (priv->component_id); - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -class_init (GObjectClass *object_class) -{ - parent_class = g_type_class_ref(PARENT_TYPE); - - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; -} - -static void -init (ETaskWidget *task_widget) -{ - ETaskWidgetPrivate *priv; - - priv = g_new (ETaskWidgetPrivate, 1); - - priv->component_id = NULL; - priv->tooltips = NULL; - priv->icon_pixbuf = NULL; - priv->label = NULL; - priv->image = NULL; - - task_widget->priv = priv; -} - - -void -e_task_widget_construct (ETaskWidget *task_widget, - GdkPixbuf *icon_pixbuf, - const char *component_id, - const char *information) -{ - ETaskWidgetPrivate *priv; - GdkPixmap *pixmap; - GdkBitmap *mask; - GtkWidget *box; - GtkWidget *frame; - - g_return_if_fail (task_widget != NULL); - g_return_if_fail (E_IS_TASK_WIDGET (task_widget)); - g_return_if_fail (icon_pixbuf != NULL); - g_return_if_fail (component_id != NULL); - g_return_if_fail (information != NULL); - - priv = task_widget->priv; - - priv->component_id = g_strdup (component_id); - - frame = gtk_frame_new (NULL); - gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); - gtk_container_add (GTK_CONTAINER (task_widget), frame); - gtk_widget_show (frame); - - box = gtk_hbox_new (FALSE, 0); - gtk_container_add (GTK_CONTAINER (frame), box); - gtk_widget_show (box); - - gtk_widget_set_size_request (box, 1, -1); - - priv->icon_pixbuf = g_object_ref (icon_pixbuf); - - gdk_pixbuf_render_pixmap_and_mask (icon_pixbuf, &pixmap, &mask, 128); - - priv->image = gtk_image_new_from_pixmap (pixmap, mask); - gtk_widget_show (priv->image); - gtk_box_pack_start (GTK_BOX (box), priv->image, FALSE, TRUE, 0); - - priv->label = gtk_label_new (""); - gtk_misc_set_alignment (GTK_MISC (priv->label), 0.0, 0.5); - gtk_widget_show (priv->label); - gtk_box_pack_start (GTK_BOX (box), priv->label, TRUE, TRUE, 0); - - gdk_pixmap_unref (pixmap); - g_object_unref (mask); - - priv->tooltips = gtk_tooltips_new (); - g_object_ref (priv->tooltips); - gtk_object_sink (GTK_OBJECT (priv->tooltips)); - - e_task_widget_update (task_widget, information, -1.0); -} - -GtkWidget * -e_task_widget_new (GdkPixbuf *icon_pixbuf, - const char *component_id, - const char *information) -{ - ETaskWidget *task_widget; - - g_return_val_if_fail (icon_pixbuf != NULL, NULL); - g_return_val_if_fail (information != NULL, NULL); - - task_widget = g_object_new (e_task_widget_get_type (), NULL); - e_task_widget_construct (task_widget, icon_pixbuf, component_id, information); - - return GTK_WIDGET (task_widget); -} - - -void -e_task_widget_update (ETaskWidget *task_widget, - const char *information, - double completion) -{ - ETaskWidgetPrivate *priv; - char *text; - - g_return_if_fail (task_widget != NULL); - g_return_if_fail (E_IS_TASK_WIDGET (task_widget)); - g_return_if_fail (information != NULL); - - priv = task_widget->priv; - - if (completion < 0.0) { - text = g_strdup_printf (_("%s (...)"), information); - } else { - int percent_complete; - - percent_complete = (int) (completion * 100.0 + .5); - text = g_strdup_printf (_("%s (%d%% complete)"), information, percent_complete); - } - - gtk_label_set_text (GTK_LABEL (priv->label), text); - - gtk_tooltips_set_tip (priv->tooltips, GTK_WIDGET (task_widget), text, NULL); - - g_free (text); -} - -void -e_task_wiget_alert (ETaskWidget *task_widget) -{ - g_return_if_fail (task_widget != NULL); - g_return_if_fail (E_IS_TASK_WIDGET (task_widget)); -} - -void -e_task_wiget_unalert (ETaskWidget *task_widget) -{ - g_return_if_fail (task_widget != NULL); - g_return_if_fail (E_IS_TASK_WIDGET (task_widget)); -} - - -const char * -e_task_widget_get_component_id (ETaskWidget *task_widget) -{ - g_return_val_if_fail (task_widget != NULL, NULL); - g_return_val_if_fail (E_IS_TASK_WIDGET (task_widget), NULL); - - return task_widget->priv->component_id; -} - - -E_MAKE_TYPE (e_task_widget, "ETaskWidget", ETaskWidget, class_init, init, PARENT_TYPE) diff --git a/shell/e-task-widget.h b/shell/e-task-widget.h deleted file mode 100644 index 6173623a80..0000000000 --- a/shell/e-task-widget.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-task-widget.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifndef _E_TASK_WIDGET_H_ -#define _E_TASK_WIDGET_H_ - -#include <gtk/gtkeventbox.h> -#include <gdk-pixbuf/gdk-pixbuf.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_TASK_WIDGET (e_task_widget_get_type ()) -#define E_TASK_WIDGET(obj) (GTK_CHECK_CAST ((obj), E_TYPE_TASK_WIDGET, ETaskWidget)) -#define E_TASK_WIDGET_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_TASK_WIDGET, ETaskWidgetClass)) -#define E_IS_TASK_WIDGET(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_TASK_WIDGET)) -#define E_IS_TASK_WIDGET_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_TASK_WIDGET)) - - -typedef struct _ETaskWidget ETaskWidget; -typedef struct _ETaskWidgetPrivate ETaskWidgetPrivate; -typedef struct _ETaskWidgetClass ETaskWidgetClass; - -struct _ETaskWidget { - GtkEventBox parent; - - ETaskWidgetPrivate *priv; -}; - -struct _ETaskWidgetClass { - GtkEventBoxClass parent_class; -}; - - -GtkType e_task_widget_get_type (void); -void e_task_widget_construct (ETaskWidget *task_widget, - GdkPixbuf *icon_pixbuf, - const char *component_id, - const char *information); -GtkWidget *e_task_widget_new (GdkPixbuf *icon_pixbuf, - const char *component_id, - const char *information); - -void e_task_widget_update (ETaskWidget *task_widget, - const char *information, - double completion); - -void e_task_wiget_alert (ETaskWidget *task_widget); -void e_task_wiget_unalert (ETaskWidget *task_widget); - -const char *e_task_widget_get_component_id (ETaskWidget *task_widget); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_TASK_WIDGET_H_ */ diff --git a/shell/e-uri-schema-registry.c b/shell/e-uri-schema-registry.c deleted file mode 100644 index 468d640fd3..0000000000 --- a/shell/e-uri-schema-registry.c +++ /dev/null @@ -1,181 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-uri-schema-registry.c - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-uri-schema-registry.h" - -#include <gal/util/e-util.h> - - -#define PARENT_TYPE gtk_object_get_type () -static GtkObjectClass *parent_class = NULL; - -struct _SchemaHandler { - char *schema; - EvolutionShellComponentClient *component; -}; -typedef struct _SchemaHandler SchemaHandler; - -struct _EUriSchemaRegistryPrivate { - GHashTable *schema_to_handler; -}; - - -/* SchemaHandler. */ - -static SchemaHandler * -schema_handler_new (const char *schema, - EvolutionShellComponentClient *component) -{ - SchemaHandler *handler; - - handler = g_new (SchemaHandler, 1); - handler->schema = g_strdup (schema); - handler->component = component; - - g_object_ref (component); - - return handler; -} - -static void -schema_handler_free (SchemaHandler *handler) -{ - g_free (handler->schema); - g_object_unref (handler->component); - - g_free (handler); -} - - -static void -schema_to_handler_destroy_foreach_callback (void *key, - void *value, - void *data) -{ - schema_handler_free ((SchemaHandler *) value); -} - - -/* GtkObject methods. */ - -static void -impl_finalize (GObject *object) -{ - EUriSchemaRegistry *registry; - EUriSchemaRegistryPrivate *priv; - - registry = E_URI_SCHEMA_REGISTRY (object); - priv = registry->priv; - - g_hash_table_foreach (priv->schema_to_handler, schema_to_handler_destroy_foreach_callback, NULL); - g_hash_table_destroy (priv->schema_to_handler); - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -class_init (GObjectClass *object_class) -{ - parent_class = g_type_class_ref(PARENT_TYPE); - - object_class->finalize = impl_finalize; -} - -static void -init (EUriSchemaRegistry *uri_schema_registry) -{ - EUriSchemaRegistryPrivate *priv; - - priv = g_new (EUriSchemaRegistryPrivate, 1); - priv->schema_to_handler = g_hash_table_new (g_str_hash, g_str_equal); - - uri_schema_registry->priv = priv; - - GTK_OBJECT_UNSET_FLAGS (uri_schema_registry, GTK_FLOATING); -} - - -EUriSchemaRegistry * -e_uri_schema_registry_new (void) -{ - EUriSchemaRegistry *registry; - - registry = g_object_new (e_uri_schema_registry_get_type (), NULL); - - return registry; -} - - -void -e_uri_schema_registry_set_handler_for_schema (EUriSchemaRegistry *registry, - const char *schema, - EvolutionShellComponentClient *shell_component) -{ - EUriSchemaRegistryPrivate *priv; - SchemaHandler *existing_handler; - SchemaHandler *new_handler; - - g_return_if_fail (registry != NULL); - g_return_if_fail (E_IS_URI_SCHEMA_REGISTRY (registry)); - g_return_if_fail (schema != NULL); - g_return_if_fail (shell_component == NULL || EVOLUTION_IS_SHELL_COMPONENT_CLIENT (shell_component)); - - priv = registry->priv; - - existing_handler = g_hash_table_lookup (priv->schema_to_handler, schema); - if (existing_handler != NULL) { - g_hash_table_remove (priv->schema_to_handler, existing_handler->schema); - schema_handler_free (existing_handler); - } - - new_handler = schema_handler_new (schema, shell_component); - g_hash_table_insert (priv->schema_to_handler, new_handler->schema, new_handler); -} - -EvolutionShellComponentClient * -e_uri_schema_registry_get_handler_for_schema (EUriSchemaRegistry *registry, - const char *schema) -{ - EUriSchemaRegistryPrivate *priv; - const SchemaHandler *handler; - - g_return_val_if_fail (registry != NULL, NULL); - g_return_val_if_fail (E_IS_URI_SCHEMA_REGISTRY (registry), NULL); - g_return_val_if_fail (schema != NULL, NULL); - - priv = registry->priv; - - handler = g_hash_table_lookup (priv->schema_to_handler, schema); - if (handler == NULL) - return NULL; - - return handler->component; -} - - -E_MAKE_TYPE (e_uri_schema_registry, "EUriSchemaRegistry", EUriSchemaRegistry, class_init, init, PARENT_TYPE) diff --git a/shell/e-uri-schema-registry.h b/shell/e-uri-schema-registry.h deleted file mode 100644 index 1826f8a65a..0000000000 --- a/shell/e-uri-schema-registry.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-uri-schema-registry.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifndef _E_URI_SCHEMA_REGISTRY_H_ -#define _E_URI_SCHEMA_REGISTRY_H_ - -#include "evolution-shell-component-client.h" - -#include <gtk/gtkobject.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_URI_SCHEMA_REGISTRY (e_uri_schema_registry_get_type ()) -#define E_URI_SCHEMA_REGISTRY(obj) (GTK_CHECK_CAST ((obj), E_TYPE_URI_SCHEMA_REGISTRY, EUriSchemaRegistry)) -#define E_URI_SCHEMA_REGISTRY_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_URI_SCHEMA_REGISTRY, EUriSchemaRegistryClass)) -#define E_IS_URI_SCHEMA_REGISTRY(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_URI_SCHEMA_REGISTRY)) -#define E_IS_URI_SCHEMA_REGISTRY_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_URI_SCHEMA_REGISTRY)) - - -typedef struct _EUriSchemaRegistry EUriSchemaRegistry; -typedef struct _EUriSchemaRegistryPrivate EUriSchemaRegistryPrivate; -typedef struct _EUriSchemaRegistryClass EUriSchemaRegistryClass; - -struct _EUriSchemaRegistry { - GtkObject parent; - - EUriSchemaRegistryPrivate *priv; -}; - -struct _EUriSchemaRegistryClass { - GtkObjectClass parent_class; -}; - - -GtkType e_uri_schema_registry_get_type (void); -EUriSchemaRegistry *e_uri_schema_registry_new (void); - -void e_uri_schema_registry_set_handler_for_schema (EUriSchemaRegistry *registry, - const char *schema, - EvolutionShellComponentClient *shell_component); -EvolutionShellComponentClient *e_uri_schema_registry_get_handler_for_schema (EUriSchemaRegistry *registry, - const char *schema); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _E_URI_SCHEMA_REGISTRY_H_ */ diff --git a/shell/evolution-activity-client.c b/shell/evolution-activity-client.c deleted file mode 100644 index 1ab93402d0..0000000000 --- a/shell/evolution-activity-client.c +++ /dev/null @@ -1,449 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-activity-client.c - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -/* Another evil GTK+ object wrapper for a CORBA API. In this case, the wrapper - is needed to avoid sending too frequent CORBA requests across the wire, thus - slowing the client down. The wrapper makes sure that there is a minimum - amount of time between each CORBA method invocation. */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "evolution-activity-client.h" - -#include "e-shell-corba-icon-utils.h" - -#include "e-shell-marshal.h" - -#include <string.h> - -#include <gtk/gtksignal.h> -#include <gtk/gtkmain.h> - -#include <bonobo/bonobo-listener.h> -#include <bonobo/bonobo-exception.h> - -#include <gal/util/e-util.h> - - -#define PARENT_TYPE gtk_object_get_type () -static GtkObjectClass *parent_class = NULL; - -/* The minimum time between updates, in msecs. */ -#define UPDATE_DELAY 1000 - -enum { - SHOW_DETAILS, - CANCEL, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -struct _EvolutionActivityClientPrivate { - /* The ::Activity interface that we QI from the shell. */ - GNOME_Evolution_Activity activity_interface; - - /* BonoboListener used to get notification about actions that the user - requested on the activity. */ - BonoboListener *listener; - - /* Id of this activity. */ - GNOME_Evolution_Activity_ActivityId activity_id; - - /* Id for the GTK+ timeout used to do updates. */ - int next_update_timeout_id; - - /* Wether we have to actually push an update at this timeout. */ - int have_pending_update; - - /* Data for the next update. */ - char *new_information; - double new_progress; -}; - - -/* Utility functions. */ - -static gboolean -corba_update_progress (EvolutionActivityClient *activity_client, - const char *information, - double progress) -{ - EvolutionActivityClientPrivate *priv; - CORBA_Environment ev; - gboolean retval; - - priv = activity_client->priv; - - CORBA_exception_init (&ev); - - GNOME_Evolution_Activity_operationProgressing (priv->activity_interface, - priv->activity_id, - information, - progress, - &ev); - - if (! BONOBO_EX (&ev)) { - retval = TRUE; - } else { - g_warning ("EvolutionActivityClient: Error updating progress -- %s", - BONOBO_EX_REPOID (&ev)); - retval = FALSE; - } - - CORBA_exception_free (&ev); - - return retval; -} - -static gboolean -update_timeout_callback (void *data) -{ - EvolutionActivityClient *activity_client; - EvolutionActivityClientPrivate *priv; - - activity_client = EVOLUTION_ACTIVITY_CLIENT (data); - priv = activity_client->priv; - - if (priv->have_pending_update) { - priv->have_pending_update = FALSE; - corba_update_progress (activity_client, priv->new_information, priv->new_progress); - return TRUE; - } else { - priv->next_update_timeout_id = 0; - return FALSE; - } -} - - -/* BonoboListener callback. */ - -static void -listener_callback (BonoboListener *listener, - const char *event_name, - const CORBA_any *any, - CORBA_Environment *ev, - void *data) -{ - EvolutionActivityClient *activity_client; - - activity_client = EVOLUTION_ACTIVITY_CLIENT (data); - - if (strcmp (event_name, "ShowDetails") == 0) - g_signal_emit (activity_client, signals[SHOW_DETAILS], 0); - else if (strcmp (event_name, "Cancel") == 0) - g_signal_emit (activity_client, signals[CANCEL], 0); - else - g_warning ("EvolutionActivityClient: Unknown event from listener -- %s", event_name); -} - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - EvolutionActivityClient *activity_client; - EvolutionActivityClientPrivate *priv; - CORBA_Environment ev; - - activity_client = EVOLUTION_ACTIVITY_CLIENT (object); - priv = activity_client->priv; - - if (priv->next_update_timeout_id != 0) { - g_source_remove (priv->next_update_timeout_id); - priv->next_update_timeout_id = 0; - } - - CORBA_exception_init (&ev); - - if (! CORBA_Object_is_nil (priv->activity_interface, &ev)) { - GNOME_Evolution_Activity_operationFinished (priv->activity_interface, - priv->activity_id, - &ev); - if (BONOBO_EX (&ev)) - g_warning ("EvolutionActivityClient: Error reporting completion of operation -- %s", - BONOBO_EX_REPOID (&ev)); - - CORBA_Object_release (priv->activity_interface, &ev); - - priv->activity_interface = CORBA_OBJECT_NIL; - } - - CORBA_exception_free (&ev); - - if (priv->listener != NULL) { - bonobo_object_unref (BONOBO_OBJECT (priv->listener)); - priv->listener = NULL; - } - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EvolutionActivityClient *activity_client; - EvolutionActivityClientPrivate *priv; - - activity_client = EVOLUTION_ACTIVITY_CLIENT (object); - priv = activity_client->priv; - - g_free (priv->new_information); - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -class_init (EvolutionActivityClientClass *klass) -{ - GObjectClass *object_class; - - parent_class = g_type_class_ref(PARENT_TYPE); - - object_class = G_OBJECT_CLASS (klass); - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - signals[SHOW_DETAILS] - = g_signal_new ("show_details", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionActivityClientClass, show_details), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - signals[CANCEL] - = g_signal_new ("cancel", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionActivityClientClass, cancel), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); -} - - -static void -init (EvolutionActivityClient *activity_client) -{ - EvolutionActivityClientPrivate *priv; - - priv = g_new (EvolutionActivityClientPrivate, 1); - priv->activity_interface = CORBA_OBJECT_NIL; - priv->listener = bonobo_listener_new (listener_callback, activity_client); - priv->activity_id = (GNOME_Evolution_Activity_ActivityId) 0; - priv->next_update_timeout_id = 0; - priv->have_pending_update = FALSE; - priv->new_information = NULL; - priv->new_progress = 0.0; - - activity_client->priv = priv; -} - - -gboolean -evolution_activity_client_construct (EvolutionActivityClient *activity_client, - EvolutionShellClient *shell_client, - const char *component_id, - GdkPixbuf **animated_icon, - const char *information, - gboolean cancellable, - gboolean *suggest_display_return) -{ - EvolutionActivityClientPrivate *priv; - GNOME_Evolution_Activity activity_interface; - CORBA_Environment ev; - CORBA_boolean suggest_display; - GNOME_Evolution_AnimatedIcon *corba_animated_icon; - - g_return_val_if_fail (activity_client != NULL, FALSE); - g_return_val_if_fail (EVOLUTION_IS_ACTIVITY_CLIENT (activity_client), FALSE); - g_return_val_if_fail (shell_client != NULL, FALSE); - g_return_val_if_fail (EVOLUTION_IS_SHELL_CLIENT (shell_client), FALSE); - g_return_val_if_fail (animated_icon != NULL, FALSE); - g_return_val_if_fail (*animated_icon != NULL, FALSE); - g_return_val_if_fail (information != NULL, FALSE); - g_return_val_if_fail (suggest_display_return != NULL, FALSE); - - priv = activity_client->priv; - g_return_val_if_fail (priv->activity_interface == CORBA_OBJECT_NIL, FALSE); - - GTK_OBJECT_UNSET_FLAGS (activity_client, GTK_FLOATING); - - CORBA_exception_init (&ev); - - activity_interface = evolution_shell_client_get_activity_interface (shell_client); - priv->activity_interface = CORBA_Object_duplicate (activity_interface, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - priv->activity_interface = CORBA_OBJECT_NIL; - CORBA_exception_free (&ev); - return FALSE; - } - - corba_animated_icon = e_new_corba_animated_icon_from_pixbuf_array (animated_icon); - - GNOME_Evolution_Activity_operationStarted (activity_interface, - component_id, - corba_animated_icon, - information, - cancellable, - bonobo_object_corba_objref (BONOBO_OBJECT (priv->listener)), - &priv->activity_id, - &suggest_display, - &ev); - - CORBA_free (corba_animated_icon); - - if (ev._major != CORBA_NO_EXCEPTION) { - CORBA_exception_free (&ev); - return FALSE; - } - - *suggest_display_return = (gboolean) suggest_display; - - CORBA_exception_free (&ev); - return TRUE; -} - -EvolutionActivityClient * -evolution_activity_client_new (EvolutionShellClient *shell_client, - const char *component_id, - GdkPixbuf **animated_icon, - const char *information, - gboolean cancellable, - gboolean *suggest_display_return) -{ - EvolutionActivityClient *activity_client; - - g_return_val_if_fail (shell_client != NULL, NULL); - g_return_val_if_fail (EVOLUTION_IS_SHELL_CLIENT (shell_client), NULL); - g_return_val_if_fail (animated_icon != NULL, NULL); - g_return_val_if_fail (*animated_icon != NULL, NULL); - g_return_val_if_fail (information != NULL, NULL); - g_return_val_if_fail (suggest_display_return != NULL, NULL); - - activity_client = g_object_new (evolution_activity_client_get_type (), NULL); - - if (! evolution_activity_client_construct (activity_client, - shell_client, - component_id, - animated_icon, - information, - cancellable, - suggest_display_return)) { - g_object_unref (activity_client); - return NULL; - } - - return activity_client; -} - - -gboolean -evolution_activity_client_update (EvolutionActivityClient *activity_client, - const char *information, - double progress) -{ - EvolutionActivityClientPrivate *priv; - gboolean retval; - - g_return_val_if_fail (activity_client != NULL, FALSE); - g_return_val_if_fail (EVOLUTION_IS_ACTIVITY_CLIENT (activity_client), FALSE); - g_return_val_if_fail (information != NULL, FALSE); - g_return_val_if_fail (progress == -1.0 || (progress >= 0.0 && progress <= 1.0), FALSE); - - priv = activity_client->priv; - - if (priv->next_update_timeout_id == 0) { - /* There is no pending timeout, so the last CORBA update - happened more than UPDATE_DELAY msecs ago. So we set up a - timeout so we can check against it at the next update - request. - - Notice that GLib timeouts or other operations on this object - can be invoked within a remote CORBA invocation, so we need - to set `next_update_timeout_id' and `have_pending_update' - before doing the CORBA call, or nasty race conditions might - happen. */ - - priv->have_pending_update = FALSE; - - priv->next_update_timeout_id = g_timeout_add (UPDATE_DELAY, - update_timeout_callback, - activity_client); - - retval = corba_update_progress (activity_client, information, progress); - } else { - /* There is a pending timeout, so the last CORBA update - happened less than UPDATE_DELAY msecs ago. So just queue an - update instead. */ - - g_free (priv->new_information); - priv->new_information = g_strdup (information); - priv->new_progress = progress; - - priv->have_pending_update = TRUE; - - retval = TRUE; - } - - return retval; -} - -GNOME_Evolution_Activity_DialogAction -evolution_activity_client_request_dialog (EvolutionActivityClient *activity_client, - GNOME_Evolution_Activity_DialogType dialog_type) -{ - EvolutionActivityClientPrivate *priv; - GNOME_Evolution_Activity_DialogAction retval; - CORBA_Environment ev; - - g_return_val_if_fail (activity_client != NULL, GNOME_Evolution_Activity_DIALOG_ACTION_ERROR); - g_return_val_if_fail (EVOLUTION_IS_ACTIVITY_CLIENT (activity_client), GNOME_Evolution_Activity_DIALOG_ACTION_ERROR); - - priv = activity_client->priv; - - CORBA_exception_init (&ev); - - retval = GNOME_Evolution_Activity_requestDialog (priv->activity_interface, - priv->activity_id, - dialog_type, - &ev); - if (BONOBO_EX (&ev) != CORBA_NO_EXCEPTION) { - g_warning ("EvolutionActivityClient: Error requesting a dialog -- %s", BONOBO_EX_REPOID (&ev)); - retval = GNOME_Evolution_Activity_DIALOG_ACTION_ERROR; - } - - CORBA_exception_free (&ev); - - return retval; -} - - -E_MAKE_TYPE (evolution_activity_client, "EvolutionActivityClient", EvolutionActivityClient, - class_init, init, PARENT_TYPE) diff --git a/shell/evolution-activity-client.h b/shell/evolution-activity-client.h deleted file mode 100644 index d212dad219..0000000000 --- a/shell/evolution-activity-client.h +++ /dev/null @@ -1,91 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-activity-client.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <ettore@ximian.com> - */ - -#ifndef _EVOLUTION_ACTIVITY_CLIENT_H_ -#define _EVOLUTION_ACTIVITY_CLIENT_H_ - -#include "evolution-shell-client.h" - -#include "Evolution.h" - -#include <gtk/gtkobject.h> -#include <gdk-pixbuf/gdk-pixbuf.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define EVOLUTION_TYPE_ACTIVITY_CLIENT (evolution_activity_client_get_type ()) -#define EVOLUTION_ACTIVITY_CLIENT(obj) (GTK_CHECK_CAST ((obj), EVOLUTION_TYPE_ACTIVITY_CLIENT, EvolutionActivityClient)) -#define EVOLUTION_ACTIVITY_CLIENT_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_ACTIVITY_CLIENT, EvolutionActivityClientClass)) -#define EVOLUTION_IS_ACTIVITY_CLIENT(obj) (GTK_CHECK_TYPE ((obj), EVOLUTION_TYPE_ACTIVITY_CLIENT)) -#define EVOLUTION_IS_ACTIVITY_CLIENT_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_ACTIVITY_CLIENT)) - - -typedef struct _EvolutionActivityClient EvolutionActivityClient; -typedef struct _EvolutionActivityClientPrivate EvolutionActivityClientPrivate; -typedef struct _EvolutionActivityClientClass EvolutionActivityClientClass; - -struct _EvolutionActivityClient { - GtkObject parent; - - EvolutionActivityClientPrivate *priv; -}; - -struct _EvolutionActivityClientClass { - GtkObjectClass parent_class; - - /* Signals. */ - void (* show_details) (EvolutionActivityClient *activity_client); - void (* cancel) (EvolutionActivityClient *activity_client); -}; - - -GtkType evolution_activity_client_get_type (void); -gboolean evolution_activity_client_construct (EvolutionActivityClient *activity_client, - EvolutionShellClient *shell_client, - const char *component_id, - GdkPixbuf **animated_icon, - const char *information, - gboolean cancellable, - gboolean *suggest_display_return); -EvolutionActivityClient *evolution_activity_client_new (EvolutionShellClient *shell_client, - const char *component_id, - GdkPixbuf **animated_icon, - const char *information, - gboolean cancellable, - gboolean *suggest_display_return); - -gboolean evolution_activity_client_update (EvolutionActivityClient *activity_client, - const char *information, - double progress); - -GNOME_Evolution_Activity_DialogAction -evolution_activity_client_request_dialog (EvolutionActivityClient *activity_client, - GNOME_Evolution_Activity_DialogType dialog_type); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _EVOLUTION_ACTIVITY_CLIENT_H_ */ diff --git a/shell/evolution-config-control.c b/shell/evolution-config-control.c deleted file mode 100644 index 4b8c884867..0000000000 --- a/shell/evolution-config-control.c +++ /dev/null @@ -1,241 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-config-control.c - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 "evolution-config-control.h" - -#include "e-shell-marshal.h" - -#include <gal/util/e-util.h> - -#include <gtk/gtksignal.h> - -#include <bonobo/bonobo-control.h> -#include <bonobo/bonobo-event-source.h> - - -#define PARENT_TYPE BONOBO_OBJECT_TYPE -static BonoboObjectClass *parent_class = NULL; - -struct _EvolutionConfigControlPrivate { - gboolean changed; - BonoboControl *control; - BonoboEventSource *event_source; -}; - -enum { - APPLY, - LAST_SIGNAL -}; -static int signals[LAST_SIGNAL] = { 0 }; - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - EvolutionConfigControl *config_control; - EvolutionConfigControlPrivate *priv; - - config_control = EVOLUTION_CONFIG_CONTROL (object); - priv = config_control->priv; - - if (priv->control != NULL) { - bonobo_object_unref (BONOBO_OBJECT (priv->control)); - priv->control = NULL; - } - - if (priv->event_source != NULL) { - bonobo_object_unref (BONOBO_OBJECT (priv->event_source)); - priv->event_source = NULL; - } - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EvolutionConfigControl *config_control; - EvolutionConfigControlPrivate *priv; - - config_control = EVOLUTION_CONFIG_CONTROL (object); - priv = config_control->priv; - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -/* Evolution::ConfigControl CORBA methods. */ - -static void -impl_apply (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - EvolutionConfigControl *config_control; - EvolutionConfigControlPrivate *priv; - - config_control = EVOLUTION_CONFIG_CONTROL (bonobo_object_from_servant (servant)); - priv = config_control->priv; - - g_signal_emit (config_control, signals[APPLY], 0); - - priv->changed = FALSE; -} - -static Bonobo_Control -impl__get_control (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - EvolutionConfigControl *config_control; - EvolutionConfigControlPrivate *priv; - - config_control = EVOLUTION_CONFIG_CONTROL (bonobo_object_from_servant (servant)); - priv = config_control->priv; - - bonobo_object_ref (BONOBO_OBJECT (priv->control)); - - return CORBA_Object_duplicate (bonobo_object_corba_objref (BONOBO_OBJECT (priv->control)), ev); -} - -static Bonobo_EventSource -impl__get_eventSource (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - EvolutionConfigControl *config_control; - EvolutionConfigControlPrivate *priv; - - config_control = EVOLUTION_CONFIG_CONTROL (bonobo_object_from_servant (servant)); - priv = config_control->priv; - - bonobo_object_ref (BONOBO_OBJECT (priv->event_source)); - - return CORBA_Object_duplicate (bonobo_object_corba_objref (BONOBO_OBJECT (priv->event_source)), ev); -} - - -static void -evolution_config_control_class_init (EvolutionConfigControlClass *class) -{ - POA_GNOME_Evolution_ConfigControl__epv *epv; - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (class); - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - epv = &class->epv; - epv->apply = impl_apply; - epv->_get_control = impl__get_control; - epv->_get_eventSource = impl__get_eventSource; - - signals[APPLY] = g_signal_new ("apply", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionConfigControlClass, apply), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - parent_class = g_type_class_ref (PARENT_TYPE); -} - -static void -evolution_config_control_init (EvolutionConfigControl *config_control) -{ - EvolutionConfigControlPrivate *priv; - - priv = g_new (EvolutionConfigControlPrivate, 1); - priv->changed = FALSE; - priv->control = NULL; - priv->event_source = bonobo_event_source_new (); - - config_control->priv = priv; -} - - -void -evolution_config_control_construct (EvolutionConfigControl *control, - GtkWidget *widget) -{ - EvolutionConfigControlPrivate *priv; - - g_return_if_fail (EVOLUTION_IS_CONFIG_CONTROL (control)); - g_return_if_fail (GTK_IS_WIDGET (widget)); - - priv = control->priv; - - priv->control = bonobo_control_new (widget); -} - -EvolutionConfigControl * -evolution_config_control_new (GtkWidget *widget) -{ - EvolutionConfigControl *new; - - g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL); - - new = g_object_new (evolution_config_control_get_type (), NULL); - evolution_config_control_construct (new, widget); - - return new; -} - -void -evolution_config_control_changed (EvolutionConfigControl *config_control) -{ - EvolutionConfigControlPrivate *priv; - CORBA_Environment ev; - CORBA_any *null_value; - - g_return_if_fail (EVOLUTION_IS_CONFIG_CONTROL (config_control)); - - priv = config_control->priv; - - if (priv->changed) - return; - - priv->changed = TRUE; - - CORBA_exception_init (&ev); - - null_value = CORBA_any__alloc (); - null_value->_type = TC_null; - - bonobo_event_source_notify_listeners (priv->event_source, "changed", null_value, &ev); - - CORBA_free (null_value); - - CORBA_exception_free (&ev); -} - - -BONOBO_TYPE_FUNC_FULL (EvolutionConfigControl, - GNOME_Evolution_ConfigControl, - PARENT_TYPE, - evolution_config_control) diff --git a/shell/evolution-config-control.h b/shell/evolution-config-control.h deleted file mode 100644 index 41e5da856c..0000000000 --- a/shell/evolution-config-control.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-config-control.h - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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_CONFIG_CONTROL_H -#define EVOLUTION_CONFIG_CONTROL_H - -#include "Evolution.h" - -#include <bonobo/bonobo-object.h> -#include <gtk/gtkwidget.h> - -#ifdef cplusplus -extern "C" { -#pragma } -#endif /* cplusplus */ - -#define EVOLUTION_TYPE_CONFIG_CONTROL (evolution_config_control_get_type ()) -#define EVOLUTION_CONFIG_CONTROL(obj) (GTK_CHECK_CAST ((obj), EVOLUTION_TYPE_CONFIG_CONTROL, EvolutionConfigControl)) -#define EVOLUTION_CONFIG_CONTROL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_CONFIG_CONTROL, EvolutionConfigControlClass)) -#define EVOLUTION_IS_CONFIG_CONTROL(obj) (GTK_CHECK_TYPE ((obj), EVOLUTION_TYPE_CONFIG_CONTROL)) -#define EVOLUTION_IS_CONFIG_CONTROL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_CONFIG_CONTROL)) - -typedef struct _EvolutionConfigControl EvolutionConfigControl; -typedef struct _EvolutionConfigControlPrivate EvolutionConfigControlPrivate; -typedef struct _EvolutionConfigControlClass EvolutionConfigControlClass; - -struct _EvolutionConfigControl { - BonoboObject parent; - - EvolutionConfigControlPrivate *priv; -}; - -struct _EvolutionConfigControlClass { - BonoboObjectClass parent_class; - - POA_GNOME_Evolution_ConfigControl__epv epv; - - /* Signals. */ - - void (* apply) (EvolutionConfigControl *control); -}; - - -GtkType evolution_config_control_get_type (void); -EvolutionConfigControl *evolution_config_control_new (GtkWidget *widget); -void evolution_config_control_construct (EvolutionConfigControl *control, - GtkWidget *widget); - -void evolution_config_control_changed (EvolutionConfigControl *config_control); - -#endif /* EVOLUTION_CONFIG_CONTROL_H */ diff --git a/shell/evolution-folder-selector-button.c b/shell/evolution-folder-selector-button.c deleted file mode 100644 index f3b9ab6179..0000000000 --- a/shell/evolution-folder-selector-button.c +++ /dev/null @@ -1,455 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-folder-selector-button.c - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "evolution-folder-selector-button.h" - -#include "e-shell-marshal.h" - -#include <gal/util/e-util.h> - -#include <gtk/gtkhbox.h> -#include <gtk/gtkimage.h> -#include <gtk/gtklabel.h> - -#include <libgnome/gnome-i18n.h> - -#include <string.h> - - -struct _EvolutionFolderSelectorButtonPrivate { - EvolutionShellClient *shell_client; - GNOME_Evolution_StorageRegistry corba_storage_registry; - GNOME_Evolution_Folder *selected_folder; - GtkWidget *icon, *label; - char *title, **possible_types; -}; - -enum { - POPPED_UP, - SELECTED, - CANCELED, - LAST_SIGNAL -}; -static guint signals[LAST_SIGNAL] = { 0 }; - -#define PARENT_TYPE gtk_button_get_type () -static GtkButtonClass *parent_class = NULL; - - -static GNOME_Evolution_Folder * -get_folder_for_uri (EvolutionFolderSelectorButton *folder_selector_button, - const char *uri) -{ - EvolutionFolderSelectorButtonPrivate *priv = folder_selector_button->priv; - CORBA_Environment ev; - GNOME_Evolution_Folder *folder; - - if (!uri) - return NULL; - - CORBA_exception_init (&ev); - folder = GNOME_Evolution_StorageRegistry_getFolderByUri ( - priv->corba_storage_registry, uri, &ev); - if (ev._major != CORBA_NO_EXCEPTION) - folder = CORBA_OBJECT_NIL; - CORBA_exception_free (&ev); - - return folder; -} - -static void -set_folder (EvolutionFolderSelectorButton *folder_selector_button, - GNOME_Evolution_Folder *folder) -{ - EvolutionFolderSelectorButtonPrivate *priv; - GdkPixbuf *pixbuf; - char *storage_lname; - char *label_text; - const char *p; - - priv = folder_selector_button->priv; - - if (priv->selected_folder) - CORBA_free (priv->selected_folder); - priv->selected_folder = folder; - - if (!folder) { - gtk_image_set_from_pixbuf (GTK_IMAGE (priv->icon), NULL); - gtk_label_set_text (GTK_LABEL (priv->label), - _("<click here to select a folder>")); - return; - } - - pixbuf = evolution_shell_client_get_pixbuf_for_type (priv->shell_client, folder->type, TRUE); - if (pixbuf != NULL) { - gtk_image_set_from_pixbuf (GTK_IMAGE (priv->icon), pixbuf); - g_object_unref (pixbuf); - } - - storage_lname = NULL; - p = strchr (folder->evolutionUri, '/'); - if (p) { - p = strchr (p + 1, '/'); - if (p) { - GNOME_Evolution_Folder *storage_folder; - char *storage_uri; - - storage_uri = g_strndup (folder->evolutionUri, - p - folder->evolutionUri); - storage_folder = get_folder_for_uri (folder_selector_button, storage_uri); - storage_lname = g_strdup (storage_folder->displayName); - CORBA_free (storage_folder); - g_free (storage_uri); - } - } - - if (storage_lname) { - label_text = g_strdup_printf (_("\"%s\" in \"%s\""), folder->displayName, - storage_lname); - g_free (storage_lname); - } else { - label_text = g_strdup_printf ("\"%s\"", folder->displayName); - } - - gtk_label_set_text (GTK_LABEL (priv->label), label_text); - g_free (label_text); -} - -static void -clicked (GtkButton *button) -{ - EvolutionFolderSelectorButton *folder_selector_button; - EvolutionFolderSelectorButtonPrivate *priv; - GNOME_Evolution_Folder *return_folder; - GtkWidget *toplevel_container; - GtkWindow *parent_window; - char *initial_uri; - - /* We want to disable the window the button is in, since the - * folder selection dialog may be in another process and the WM - * won't enforce modality cross-process. In Evo 1.2, this code - * called gtk_widget_set_sensitive on the button's parent - * window, but in GNOME 2 that seems to cause bad things to - * happen (the window doesn't resensitize properly at the end). - * So we desensitize the top-level container inside the window - * instead. - */ - toplevel_container = GTK_WIDGET (button); - while (toplevel_container->parent && - !GTK_IS_WINDOW (toplevel_container->parent)) - toplevel_container = toplevel_container->parent; - parent_window = (GtkWindow *)toplevel_container->parent; - - gtk_widget_set_sensitive (GTK_WIDGET (toplevel_container), FALSE); - - folder_selector_button = EVOLUTION_FOLDER_SELECTOR_BUTTON (button); - priv = folder_selector_button->priv; - - if (priv->selected_folder) - initial_uri = priv->selected_folder->evolutionUri; - else - initial_uri = ""; - - g_signal_emit (folder_selector_button, signals[POPPED_UP], 0); - - g_object_add_weak_pointer (G_OBJECT (button), (void **) &button); - - evolution_shell_client_user_select_folder (priv->shell_client, - parent_window, - priv->title, - initial_uri, - (const char **)priv->possible_types, - &return_folder); - - /* Bail out if the parent window was destroyed */ - if (button == NULL) - return; - g_object_remove_weak_pointer (G_OBJECT (button), (void **) &button); - - gtk_widget_set_sensitive (GTK_WIDGET (toplevel_container), TRUE); - - if (!return_folder) { - g_signal_emit (folder_selector_button, signals[CANCELED], 0); - return; - } - - set_folder (folder_selector_button, return_folder); - - g_signal_emit (folder_selector_button, signals[SELECTED], 0, return_folder); -} - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - EvolutionFolderSelectorButton *folder_selector_button; - EvolutionFolderSelectorButtonPrivate *priv; - - folder_selector_button = EVOLUTION_FOLDER_SELECTOR_BUTTON (object); - priv = folder_selector_button->priv; - - if (priv->shell_client != NULL) { - g_object_unref (priv->shell_client); - priv->shell_client = NULL; - } - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EvolutionFolderSelectorButton *folder_selector_button; - EvolutionFolderSelectorButtonPrivate *priv; - int i; - - folder_selector_button = EVOLUTION_FOLDER_SELECTOR_BUTTON (object); - priv = folder_selector_button->priv; - - g_free (priv->title); - - if (priv->possible_types != NULL) { - for (i = 0; priv->possible_types[i]; i++) - g_free (priv->possible_types[i]); - g_free (priv->possible_types); - } - - if (priv->selected_folder) - CORBA_free (priv->selected_folder); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -class_init (EvolutionFolderSelectorButtonClass *klass) -{ - GObjectClass *object_class; - GtkButtonClass *button_class; - - parent_class = g_type_class_ref(PARENT_TYPE); - - object_class = G_OBJECT_CLASS (klass); - button_class = GTK_BUTTON_CLASS (klass); - - button_class->clicked = clicked; - - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - signals[POPPED_UP] = g_signal_new ("popped_up", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionFolderSelectorButtonClass, popped_up), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); - signals[SELECTED] = g_signal_new ("selected", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionFolderSelectorButtonClass, selected), - NULL, NULL, - e_shell_marshal_NONE__POINTER, - G_TYPE_NONE, 1, - G_TYPE_POINTER); - signals[CANCELED] = g_signal_new ("canceled", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionFolderSelectorButtonClass, canceled), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); -} - -static void -init (EvolutionFolderSelectorButton *folder_selector_button) -{ - EvolutionFolderSelectorButtonPrivate *priv; - GtkWidget *box; - - priv = g_new0 (EvolutionFolderSelectorButtonPrivate, 1); - - priv->icon = gtk_image_new (); - priv->label = gtk_label_new (""); - gtk_label_set_justify (GTK_LABEL (priv->label), GTK_JUSTIFY_LEFT); - gtk_misc_set_alignment (GTK_MISC (priv->label), 0.0, 0.0); - box = gtk_hbox_new (FALSE, 4); - gtk_box_pack_start (GTK_BOX (box), priv->icon, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (box), priv->label, TRUE, TRUE, 0); - gtk_widget_show_all (GTK_WIDGET (box)); - gtk_container_add (GTK_CONTAINER (folder_selector_button), box); - - folder_selector_button->priv = priv; -} - - - -/** - * evolution_folder_selector_button_construct: - * @folder_selector_button: - * @shell_client: the shell client that will be used for folder selection - * @title: the title to use for the selection dialog - * @initial_uri: the URI (evolution: or physical) of the - * initially-selected folder - * @possible_types: a %NULL-terminated array of selectable types. - * - * Construct @folder_selector_button. - **/ -void -evolution_folder_selector_button_construct (EvolutionFolderSelectorButton *folder_selector_button, - EvolutionShellClient *shell_client, - const char *title, - const char *initial_uri, - const char *possible_types[]) -{ - EvolutionFolderSelectorButtonPrivate *priv; - GNOME_Evolution_Folder *folder; - int count; - - g_return_if_fail (EVOLUTION_IS_FOLDER_SELECTOR_BUTTON (folder_selector_button)); - g_return_if_fail (EVOLUTION_IS_SHELL_CLIENT (shell_client)); - g_return_if_fail (possible_types != NULL); - - priv = folder_selector_button->priv; - - priv->shell_client = shell_client; - g_object_ref (shell_client); - priv->corba_storage_registry = evolution_shell_client_get_storage_registry_interface (shell_client); - - priv->title = g_strdup (title); - - folder = get_folder_for_uri (folder_selector_button, initial_uri); - set_folder (folder_selector_button, folder); - - for (count = 0; possible_types[count]; count++) - ; - priv->possible_types = g_new (char *, count + 1); - for (count = 0; possible_types[count]; count++) - priv->possible_types[count] = g_strdup (possible_types[count]); - priv->possible_types[count] = NULL; -} - -/** - * evolution_folder_selector_button_new: - * @shell_client: the shell client that will be used for folder selection - * @title: the title to use for the selection dialog - * @initial_uri: the URI (evolution: or physical) of the - * initially-selected folder - * @possible_types: a %NULL-terminated array of selectable types. - * - * Return value: a new folder selector button. - **/ -GtkWidget * -evolution_folder_selector_button_new (EvolutionShellClient *shell_client, - const char *title, - const char *initial_uri, - const char *possible_types[]) -{ - EvolutionFolderSelectorButton *folder_selector_button; - - folder_selector_button = g_object_new (evolution_folder_selector_button_get_type (), NULL); - - evolution_folder_selector_button_construct (folder_selector_button, - shell_client, - title, - initial_uri, - possible_types); - return (GtkWidget *)folder_selector_button; -} - -/** - * evolution_folder_selector_button_set_uri: - * @folder_selector_button: - * @uri: the URI (evolution: or physical) to select, or %NULL - * - * Attempts to make @folder_selector_button select @uri. If @uri - * doesn't point to a folder, or points to a folder of an incorrect - * type for this button, then the selected URI will be unchanged. - * - * If @uri is %NULL, the button will be returned to an unselected - * state. - * - * Return value: whether or not the URI was successfully set. - **/ -gboolean -evolution_folder_selector_button_set_uri (EvolutionFolderSelectorButton *folder_selector_button, - const char *uri) -{ - EvolutionFolderSelectorButtonPrivate *priv; - GNOME_Evolution_Folder *folder; - char *slash; - int i; - - g_return_val_if_fail (EVOLUTION_IS_FOLDER_SELECTOR_BUTTON (folder_selector_button), FALSE); - g_return_val_if_fail (uri != NULL, FALSE); - - priv = folder_selector_button->priv; - - if (!uri) { - set_folder (folder_selector_button, NULL); - return TRUE; - } - - folder = get_folder_for_uri (folder_selector_button, uri); - if (!folder) - return FALSE; - - for (i = 0; priv->possible_types[i]; i++) { - if (!strcmp (folder->type, priv->possible_types[i])) { - set_folder (folder_selector_button, folder); - return TRUE; - } - slash = strchr (priv->possible_types[i], '/'); - if (slash && slash[1] == '*' && - !strncmp (folder->type, priv->possible_types[i], - slash - priv->possible_types[i])) { - set_folder (folder_selector_button, folder); - return TRUE; - } - } - - CORBA_free (folder); - return FALSE; -} - -/** - * evolution_folder_selector_button_get_folder: - * @folder_selector_button: - * - * Return value: the currently-selected folder, or %NULL - **/ -GNOME_Evolution_Folder * -evolution_folder_selector_button_get_folder (EvolutionFolderSelectorButton *folder_selector_button) -{ - g_return_val_if_fail (EVOLUTION_IS_FOLDER_SELECTOR_BUTTON (folder_selector_button), NULL); - - return folder_selector_button->priv->selected_folder; -} - - -E_MAKE_TYPE (evolution_folder_selector_button, "EvolutionFolderSelectorButton", EvolutionFolderSelectorButton, class_init, init, PARENT_TYPE) diff --git a/shell/evolution-folder-selector-button.h b/shell/evolution-folder-selector-button.h deleted file mode 100644 index b438a54862..0000000000 --- a/shell/evolution-folder-selector-button.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-folder-selector-button.h - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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. - */ - -#ifndef __EVOLUTION_FOLDER_SELECTOR_BUTTON_H__ -#define __EVOLUTION_FOLDER_SELECTOR_BUTTON_H__ - -#include <gtk/gtkbutton.h> -#include "evolution-shell-client.h" - -#include "Evolution.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define EVOLUTION_TYPE_FOLDER_SELECTOR_BUTTON (evolution_folder_selector_button_get_type ()) -#define EVOLUTION_FOLDER_SELECTOR_BUTTON(obj) (GTK_CHECK_CAST ((obj), EVOLUTION_TYPE_FOLDER_SELECTOR_BUTTON, EvolutionFolderSelectorButton)) -#define EVOLUTION_FOLDER_SELECTOR_BUTTON_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_FOLDER_SELECTOR_BUTTON, EvolutionFolderSelectorButtonClass)) -#define EVOLUTION_IS_FOLDER_SELECTOR_BUTTON(obj) (GTK_CHECK_TYPE ((obj), EVOLUTION_TYPE_FOLDER_SELECTOR_BUTTON)) -#define EVOLUTION_IS_FOLDER_SELECTOR_BUTTON_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_FOLDER_SELECTOR_BUTTON)) - - -typedef struct _EvolutionFolderSelectorButton EvolutionFolderSelectorButton; -typedef struct _EvolutionFolderSelectorButtonPrivate EvolutionFolderSelectorButtonPrivate; -typedef struct _EvolutionFolderSelectorButtonClass EvolutionFolderSelectorButtonClass; - -struct _EvolutionFolderSelectorButton { - GtkButton parent; - - EvolutionFolderSelectorButtonPrivate *priv; -}; - -struct _EvolutionFolderSelectorButtonClass { - GtkButtonClass parent_class; - - /* signals */ - void (*popped_up) (EvolutionFolderSelectorButton *button); - void (*selected) (EvolutionFolderSelectorButton *button, GNOME_Evolution_Folder *folder); - void (*canceled) (EvolutionFolderSelectorButton *button); -}; - - -GtkType evolution_folder_selector_button_get_type (void); - -void evolution_folder_selector_button_construct (EvolutionFolderSelectorButton *folder_selector_button, - EvolutionShellClient *shell_client, - const char *title, - const char *initial_uri, - const char *possible_types[]); -GtkWidget *evolution_folder_selector_button_new (EvolutionShellClient *shell_client, - const char *title, - const char *initial_uri, - const char *possible_types[]); - -gboolean evolution_folder_selector_button_set_uri (EvolutionFolderSelectorButton *folder_selector_button, - const char *uri); -GNOME_Evolution_Folder *evolution_folder_selector_button_get_folder (EvolutionFolderSelectorButton *folder_selector_button); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __EVOLUTION_FOLDER_SELECTOR_BUTTON_H__ */ diff --git a/shell/evolution-nognome.in b/shell/evolution-nognome.in deleted file mode 100644 index bd6f15789b..0000000000 --- a/shell/evolution-nognome.in +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh - -prefix=@prefix@ -exec_prefix=@exec_prefix@ - -PATH=@prefix@/bin:/usr/gnome/bin:${PATH} -GNOME2_PATH=@prefix@:/usr/gnome -LD_LIBRARY_PATH=@prefix@/lib:/usr/gnome/lib:${LD_LIBRARY_PATH} - -export LD_LIBRARY_PATH GNOME2_PATH PATH - -exec @libexecdir@/evolution-1.3 "$@" - diff --git a/shell/evolution-session.c b/shell/evolution-session.c deleted file mode 100644 index c447dec36c..0000000000 --- a/shell/evolution-session.c +++ /dev/null @@ -1,169 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-session.c - * - * Copyright (C) 2000, 2001, 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <gal/util/e-util.h> - -#include "Evolution.h" - -#include "evolution-session.h" - -#include "e-shell-marshal.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]; - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - /* Nothing to do here. */ - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EvolutionSession *session; - EvolutionSessionPrivate *priv; - - session = EVOLUTION_SESSION (object); - priv = session->priv; - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -/* CORBA interface implementation. */ - -static void -impl_GNOME_Evolution_Session_saveConfiguration (PortableServer_Servant servant, - const CORBA_char *prefix, - CORBA_Environment *ev) -{ - BonoboObject *self; - - self = bonobo_object_from_servant (servant); - g_signal_emit (self, signals[SAVE_CONFIGURATION], 0, prefix); -} - -static void -impl_GNOME_Evolution_Session_loadConfiguration (PortableServer_Servant servant, - const CORBA_char *prefix, - CORBA_Environment *ev) -{ - BonoboObject *self; - - self = bonobo_object_from_servant (servant); - g_signal_emit (self, signals[LOAD_CONFIGURATION], 0, prefix); -} - - -/* Initialization. */ - -static void -corba_class_init (EvolutionSessionClass *klass) -{ - POA_GNOME_Evolution_Session__epv *epv = & (EVOLUTION_SESSION_CLASS (klass)->epv); - - epv = g_new0 (POA_GNOME_Evolution_Session__epv, 1); - epv->saveConfiguration = impl_GNOME_Evolution_Session_saveConfiguration; - epv->loadConfiguration = impl_GNOME_Evolution_Session_loadConfiguration; -} - -static void -evolution_session_class_init (EvolutionSessionClass *klass) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - parent_class = g_type_class_ref(PARENT_TYPE); - - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - signals[LOAD_CONFIGURATION] - = g_signal_new ("load_configuration", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionSessionClass, load_configuration), - NULL, NULL, - e_shell_marshal_NONE__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); - signals[SAVE_CONFIGURATION] - = g_signal_new ("save_configuration", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionSessionClass, save_configuration), - NULL, NULL, - e_shell_marshal_NONE__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); - - corba_class_init (klass); -} - -static void -evolution_session_init (EvolutionSession *session) -{ - EvolutionSessionPrivate *priv; - - priv = g_new (EvolutionSessionPrivate, 1); - - session->priv = priv; -} - - -EvolutionSession * -evolution_session_new (void) -{ - return g_object_new (evolution_session_get_type (), NULL); -} - - -BONOBO_TYPE_FUNC_FULL (EvolutionSession, - GNOME_Evolution_Session, - PARENT_TYPE, - evolution_session) diff --git a/shell/evolution-session.h b/shell/evolution-session.h deleted file mode 100644 index 48d4f18d4d..0000000000 --- a/shell/evolution-session.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-session.h - * - * Copyright (C) 2000, 2001, 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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__ - -#include <bonobo/bonobo-object.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; - - POA_GNOME_Evolution_Session__epv epv; - - void (* save_configuration) (EvolutionSession *session, const char *prefix); - void (* load_configuration) (EvolutionSession *session, const char *prefix); -}; - - -GtkType evolution_session_get_type (void); -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 f21e9860b6..0000000000 --- a/shell/evolution-shell-client.c +++ /dev/null @@ -1,698 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-shell-client.c - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <gdk/gdkx.h> -#include <gtk/gtkmain.h> - -#include <bonobo/bonobo-exception.h> -#include <bonobo/bonobo-main.h> -#include <bonobo/bonobo-object.h> -#include <bonobo/bonobo-widget.h> - -#include <gal/util/e-util.h> - -#include "evolution-shell-client.h" -#include "e-shell-corba-icon-utils.h" - - -struct _EvolutionShellClientPrivate { - GNOME_Evolution_Shell corba_objref; - - GNOME_Evolution_Activity activity_interface; - GNOME_Evolution_Shortcuts shortcuts_interface; - GNOME_Evolution_StorageRegistry storage_registry_interface; - GHashTable *icons; -}; - -#define PARENT_TYPE G_TYPE_OBJECT -static GObjectClass *parent_class = NULL; - - -/* Easy-to-use wrapper for Evolution::user_select_folder. */ - -static PortableServer_ServantBase__epv FolderSelectionListener_base_epv; -static POA_GNOME_Evolution_FolderSelectionListener__epv FolderSelectionListener_epv; -static POA_GNOME_Evolution_FolderSelectionListener__vepv FolderSelectionListener_vepv; -static gboolean FolderSelectionListener_vtables_initialized = FALSE; - -struct _FolderSelectionListenerServant { - POA_GNOME_Evolution_FolderSelectionListener servant; - GNOME_Evolution_Folder **folder_return; -}; -typedef struct _FolderSelectionListenerServant FolderSelectionListenerServant; - - -/* Helper functions. */ - -static CORBA_Object -query_shell_interface (EvolutionShellClient *shell_client, - const char *interface_name) -{ - CORBA_Environment ev; - CORBA_Object interface_object; - EvolutionShellClientPrivate *priv; - - priv = shell_client->priv; - - CORBA_exception_init (&ev); - - interface_object = Bonobo_Unknown_queryInterface (evolution_shell_client_corba_objref (shell_client), - interface_name, &ev); - - if (BONOBO_EX (&ev)) { - g_warning ("EvolutionShellClient: Error querying interface %s on %p -- %s", - interface_name, shell_client, BONOBO_EX_REPOID (&ev)); - interface_object = CORBA_OBJECT_NIL; - } else if (CORBA_Object_is_nil (interface_object, &ev)) { - g_warning ("No interface %s for ShellClient %p", interface_name, shell_client); - } - - CORBA_exception_free (&ev); - - return interface_object; -} - - -static void -impl_FolderSelectionListener_selected (PortableServer_Servant servant, - const GNOME_Evolution_Folder *folder, - CORBA_Environment *ev) -{ - FolderSelectionListenerServant *listener_servant; - - listener_servant = (FolderSelectionListenerServant *) servant; - - if (listener_servant->folder_return != NULL) { - GNOME_Evolution_Folder *ret_folder = GNOME_Evolution_Folder__alloc (); - - ret_folder->type = CORBA_string_dup (folder->type); - ret_folder->description = CORBA_string_dup (folder->description); - ret_folder->displayName = CORBA_string_dup (folder->displayName); - ret_folder->physicalUri = CORBA_string_dup (folder->physicalUri); - ret_folder->customIconName = CORBA_string_dup (folder->customIconName); - ret_folder->evolutionUri = CORBA_string_dup (folder->evolutionUri); - ret_folder->unreadCount = folder->unreadCount; - ret_folder->sortingPriority = folder->sortingPriority; - - * (listener_servant->folder_return) = ret_folder; - } - - gtk_main_quit (); -} - -static void -impl_FolderSelectionListener_cancel (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - FolderSelectionListenerServant *listener_servant; - - listener_servant = (FolderSelectionListenerServant *) servant; - - if (listener_servant->folder_return != NULL) - * (listener_servant->folder_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.notifySelected = impl_FolderSelectionListener_selected; - FolderSelectionListener_epv.notifyCanceled = impl_FolderSelectionListener_cancel; - - FolderSelectionListener_vepv._base_epv = &FolderSelectionListener_base_epv; - FolderSelectionListener_vepv.GNOME_Evolution_FolderSelectionListener_epv = &FolderSelectionListener_epv; - - FolderSelectionListener_vtables_initialized = TRUE; -} - -static GNOME_Evolution_FolderSelectionListener -create_folder_selection_listener_interface (char **result, - GNOME_Evolution_Folder **folder_return) -{ - GNOME_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->folder_return = folder_return; - - listener_servant = (PortableServer_Servant) servant; - - CORBA_exception_init (&ev); - - POA_GNOME_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, - GtkWindow *parent, - const char *title, - const char *default_folder, - const char **possible_types, - GNOME_Evolution_Folder **folder_return) -{ - GNOME_Evolution_FolderSelectionListener listener_interface; - GNOME_Evolution_Shell corba_shell; - CORBA_Environment ev; - GNOME_Evolution_Shell_FolderTypeNameList corba_type_name_list; - CORBA_long_long parent_xid; - int num_possible_types; - char *result; - - result = NULL; - - listener_interface = create_folder_selection_listener_interface (&result, - folder_return); - if (listener_interface == CORBA_OBJECT_NIL) - return; - - CORBA_exception_init (&ev); - - corba_shell = evolution_shell_client_corba_objref (shell_client); - - num_possible_types = count_string_items (possible_types); - - corba_type_name_list._length = num_possible_types; - corba_type_name_list._maximum = num_possible_types; - corba_type_name_list._buffer = (CORBA_char **) possible_types; - - parent_xid = (CORBA_long_long) GDK_WINDOW_XWINDOW (GTK_WIDGET (parent)->window); - - GNOME_Evolution_Shell_selectUserFolder (corba_shell, parent_xid, - listener_interface, - title, - default_folder, - &corba_type_name_list, - &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - CORBA_exception_free (&ev); - return; - } - - gtk_main(); - - CORBA_Object_release (listener_interface, &ev); - - CORBA_exception_free (&ev); -} - - -/* GObject methods. */ - -static void -unref_pixbuf (gpointer name, gpointer pixbuf, gpointer data) -{ - g_free (name); - g_object_unref (pixbuf); -} - -static void -impl_dispose (GObject *object) -{ - EvolutionShellClient *shell_client; - EvolutionShellClientPrivate *priv; - CORBA_Environment ev; - - shell_client = EVOLUTION_SHELL_CLIENT (object); - priv = shell_client->priv; - - CORBA_exception_init (&ev); - - if (priv->corba_objref != CORBA_OBJECT_NIL) { - Bonobo_Unknown_unref (priv->corba_objref, &ev); - if (ev._major != CORBA_NO_EXCEPTION) - g_warning ("EvolutionShellClient::destroy: " - "Error unreffing the ::Shell interface -- %s\n", - BONOBO_EX_REPOID (&ev)); - CORBA_Object_release (priv->corba_objref, &ev); - priv->corba_objref = CORBA_OBJECT_NIL; - } - - if (priv->activity_interface != CORBA_OBJECT_NIL) { - Bonobo_Unknown_unref (priv->activity_interface, &ev); - if (ev._major != CORBA_NO_EXCEPTION) - g_warning ("EvolutionShellClient::destroy: " - "Error unreffing the ::Activity interface -- %s\n", - BONOBO_EX_REPOID (&ev)); - CORBA_Object_release (priv->activity_interface, &ev); - priv->activity_interface = CORBA_OBJECT_NIL; - } - - if (priv->shortcuts_interface != CORBA_OBJECT_NIL) { - Bonobo_Unknown_unref (priv->shortcuts_interface, &ev); - if (ev._major != CORBA_NO_EXCEPTION) - g_warning ("EvolutionShellClient::destroy: " - "Error unreffing the ::Shortcuts interface -- %s\n", - BONOBO_EX_REPOID (&ev)); - CORBA_Object_release (priv->shortcuts_interface, &ev); - priv->shortcuts_interface = CORBA_OBJECT_NIL; - } - - if (priv->storage_registry_interface != CORBA_OBJECT_NIL) { - Bonobo_Unknown_unref (priv->storage_registry_interface, &ev); - if (ev._major != CORBA_NO_EXCEPTION) - g_warning ("EvolutionShellClient::destroy: " - "Error unreffing the ::StorageRegistry interface -- %s\n", - BONOBO_EX_REPOID (&ev)); - CORBA_Object_release (priv->storage_registry_interface, &ev); - priv->storage_registry_interface = CORBA_OBJECT_NIL; - } - - CORBA_exception_free (&ev); - - g_hash_table_foreach (priv->icons, unref_pixbuf, NULL); - g_hash_table_destroy (priv->icons); - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EvolutionShellClient *shell_client; - EvolutionShellClientPrivate *priv; - - shell_client = EVOLUTION_SHELL_CLIENT (object); - priv = shell_client->priv; - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -class_init (EvolutionShellClientClass *klass) -{ - GObjectClass *object_class; - - parent_class = g_type_class_ref(PARENT_TYPE); - - object_class = G_OBJECT_CLASS (klass); - - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; -} - -static void -init (EvolutionShellClient *shell_client) -{ - EvolutionShellClientPrivate *priv; - - priv = g_new (EvolutionShellClientPrivate, 1); - priv->corba_objref = CORBA_OBJECT_NIL; - priv->activity_interface = CORBA_OBJECT_NIL; - priv->shortcuts_interface = CORBA_OBJECT_NIL; - priv->storage_registry_interface = CORBA_OBJECT_NIL; - priv->icons = g_hash_table_new (g_str_hash, g_str_equal); - - 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, - GNOME_Evolution_Shell corba_shell) -{ - EvolutionShellClientPrivate *priv; - CORBA_Environment ev; - - 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); - - priv = shell_client->priv; - g_return_if_fail (priv->activity_interface == CORBA_OBJECT_NIL); - - CORBA_exception_init (&ev); - - priv->corba_objref = CORBA_Object_duplicate (corba_shell, &ev); - Bonobo_Unknown_ref (priv->corba_objref, &ev); - - CORBA_exception_free (&ev); - - priv->activity_interface = query_shell_interface (shell_client, "IDL:GNOME/Evolution/Activity:1.0"); - priv->shortcuts_interface = query_shell_interface (shell_client, "IDL:GNOME/Evolution/Shortcuts:1.0"); - priv->storage_registry_interface = query_shell_interface (shell_client, "IDL:GNOME/Evolution/StorageRegistry:1.0"); -} - -/** - * 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 (GNOME_Evolution_Shell corba_shell) -{ - EvolutionShellClient *shell_client; - - shell_client = g_object_new (evolution_shell_client_get_type (), NULL); - - evolution_shell_client_construct (shell_client, corba_shell); - - if (evolution_shell_client_corba_objref (shell_client) == CORBA_OBJECT_NIL) { - g_object_unref (shell_client); - return NULL; - } - - return shell_client; -} - -/** - * evolution_shell_client_corba_objref: - * @shell_client: - * - * Return value: Return the CORBA objref associated with this shell client. - **/ -GNOME_Evolution_Shell -evolution_shell_client_corba_objref (EvolutionShellClient *shell_client) -{ - g_return_val_if_fail (EVOLUTION_IS_SHELL_CLIENT (shell_client), CORBA_OBJECT_NIL); - - return shell_client->priv->corba_objref; -} - - -/** - * evolution_shell_client_user_select_folder: - * @shell_client: A EvolutionShellClient object - * @parent: Parent window for the dialog (must be realized when invoking) - * @title: The title for the folder selection dialog - * @default_folder: URI (physical or evolution:) of the folder initially selected on the dialog - * @folder_return: - * - * Pop up the shell's folder selection dialog with the specified - * @title and @default_folder as the initially selected folder. On - * return, set *@folder_return to the folder structure for 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, - GtkWindow *parent, - const char *title, - const char *default_folder, - const char **possible_types, - GNOME_Evolution_Folder **folder_return) -{ - /* Do this first so it can be checked as a return value, even - * if we g_return_if_fail. - */ - if (folder_return) - *folder_return = CORBA_OBJECT_NIL; - - 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); - g_return_if_fail (parent == NULL || GTK_WIDGET_REALIZED (parent)); - - user_select_folder (shell_client, parent, title, default_folder, - possible_types, folder_return); -} - - -/** - * evolution_shell_client_get_activity_interface: - * @shell_client: An EvolutionShellClient object - * - * Get the GNOME::Evolution::Activity for the shell associated with - * @shell_client. - * - * Return value: A CORBA Object represeting the GNOME::Evolution::Activity - * interface. - **/ -GNOME_Evolution_Activity -evolution_shell_client_get_activity_interface (EvolutionShellClient *shell_client) -{ - g_return_val_if_fail (shell_client != NULL, CORBA_OBJECT_NIL); - g_return_val_if_fail (EVOLUTION_IS_SHELL_CLIENT (shell_client), CORBA_OBJECT_NIL); - - return shell_client->priv->activity_interface; -} - -/** - * evolution_shell_client_get_shortcuts_interface: - * @shell_client: An EvolutionShellClient object - * - * Get the GNOME::Evolution::Shortcuts for the shell associated with - * @shell_client. - * - * Return value: A CORBA Object represeting the GNOME::Evolution::Shortcuts - * interface. - **/ -GNOME_Evolution_Shortcuts -evolution_shell_client_get_shortcuts_interface (EvolutionShellClient *shell_client) -{ - g_return_val_if_fail (shell_client != NULL, CORBA_OBJECT_NIL); - g_return_val_if_fail (EVOLUTION_IS_SHELL_CLIENT (shell_client), CORBA_OBJECT_NIL); - - return shell_client->priv->shortcuts_interface; -} - -/** - * evolution_shell_client_get_storage_registry_interface: - * @shell_client: An EvolutionShellClient object - * - * Get the GNOME::Evolution::StorageRegistry for the shell associated - * with @shell_client. - * - * Return value: A CORBA Object represeting the - * GNOME::Evolution::StorageRegistry interface. - **/ -GNOME_Evolution_StorageRegistry -evolution_shell_client_get_storage_registry_interface (EvolutionShellClient *shell_client) -{ - g_return_val_if_fail (shell_client != NULL, CORBA_OBJECT_NIL); - g_return_val_if_fail (EVOLUTION_IS_SHELL_CLIENT (shell_client), CORBA_OBJECT_NIL); - - return shell_client->priv->storage_registry_interface; -} - - -/** - * evolution_shell_client_get_local_storage: - * @shell_client: An EvolutionShellClient object - * - * Retrieve the local storage interface for this shell. - * - * Return value: a pointer to the CORBA object implementing the local storage - * in the shell associated with @shell_client. - **/ -GNOME_Evolution_Storage -evolution_shell_client_get_local_storage (EvolutionShellClient *shell_client) -{ - GNOME_Evolution_Shell corba_shell; - GNOME_Evolution_Storage corba_local_storage; - CORBA_Environment ev; - - g_return_val_if_fail (shell_client != NULL, CORBA_OBJECT_NIL); - g_return_val_if_fail (EVOLUTION_IS_SHELL_CLIENT (shell_client), CORBA_OBJECT_NIL); - - CORBA_exception_init (&ev); - - corba_shell = evolution_shell_client_corba_objref (shell_client); - if (corba_shell == CORBA_OBJECT_NIL) { - g_warning ("evolution_shell_client_get_local_storage() invoked on an " - "EvolutionShellClient that doesn't have a CORBA objref???"); - CORBA_exception_free (&ev); - return CORBA_OBJECT_NIL; - } - - corba_local_storage = GNOME_Evolution_Shell_getLocalStorage (corba_shell, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("evolution_shell_client_get_local_storage() failing -- %s ???", - BONOBO_EX_REPOID (&ev)); - CORBA_exception_free (&ev); - return CORBA_OBJECT_NIL; - } - - CORBA_exception_free (&ev); - - return corba_local_storage; -} - -void -evolution_shell_client_set_line_status (EvolutionShellClient *shell_client, - gboolean line_status) -{ - GNOME_Evolution_Shell corba_shell; - CORBA_Environment ev; - - g_return_if_fail (shell_client != NULL); - g_return_if_fail (EVOLUTION_IS_SHELL_CLIENT (shell_client)); - - CORBA_exception_init (&ev); - - corba_shell = evolution_shell_client_corba_objref (shell_client); - if (corba_shell == CORBA_OBJECT_NIL) - return; - - GNOME_Evolution_Shell_setLineStatus (corba_shell, line_status, &ev); - - CORBA_exception_free (&ev); -} - - -GdkPixbuf * -evolution_shell_client_get_pixbuf_for_type (EvolutionShellClient *shell_client, - const char *folder_type, - gboolean mini) -{ - GNOME_Evolution_Shell corba_shell; - CORBA_Environment ev; - GNOME_Evolution_Icon *icon; - GdkPixbuf *pixbuf; - char *hash_name; - - g_return_val_if_fail (EVOLUTION_IS_SHELL_CLIENT (shell_client), NULL); - - hash_name = g_strdup_printf ("%s/%s", folder_type, - mini ? "mini" : "large"); - pixbuf = g_hash_table_lookup (shell_client->priv->icons, hash_name); - if (!pixbuf) { - corba_shell = evolution_shell_client_corba_objref (shell_client); - g_return_val_if_fail (corba_shell != CORBA_OBJECT_NIL, NULL); - - CORBA_exception_init (&ev); - icon = GNOME_Evolution_Shell_getIconByType (corba_shell, - folder_type, mini, - &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_free (hash_name); - return NULL; - } - CORBA_exception_free (&ev); - - pixbuf = e_new_gdk_pixbuf_from_corba_icon (icon, icon->width, - icon->height); - CORBA_free (icon); - - g_hash_table_insert (shell_client->priv->icons, - hash_name, pixbuf); - } else - g_free (hash_name); - - g_object_ref (pixbuf); - return pixbuf; -} - - -GtkWidget * -evolution_shell_client_create_storage_set_view (EvolutionShellClient *shell_client, - Bonobo_UIComponent uic, - Bonobo_Control *bonobo_control_iface_return, - GNOME_Evolution_StorageSetView *storage_set_view_iface_return, - CORBA_Environment *ev) -{ - GNOME_Evolution_Shell corba_shell; - CORBA_Environment my_ev; - Bonobo_Control control; - GtkWidget *control_widget; - - g_return_val_if_fail (EVOLUTION_IS_SHELL_CLIENT (shell_client), NULL); - - CORBA_exception_init (&my_ev); - if (ev == NULL) - ev = &my_ev; - - corba_shell = evolution_shell_client_corba_objref (shell_client); - - control = GNOME_Evolution_Shell_createStorageSetView (corba_shell, ev); - if (BONOBO_EX (ev)) { - g_warning ("Cannot create StorageSetView -- %s", BONOBO_EX_REPOID (ev)); - CORBA_exception_free (&my_ev); - return NULL; - } - - if (bonobo_control_iface_return != NULL) - *bonobo_control_iface_return = control; - - control_widget = bonobo_widget_new_control_from_objref (control, uic); - - if (storage_set_view_iface_return != NULL) { - *storage_set_view_iface_return = Bonobo_Unknown_queryInterface (control, - "IDL:GNOME/Evolution/StorageSetView:1.0", - ev); - if (BONOBO_EX (ev)) - *storage_set_view_iface_return = NULL; - } - - CORBA_exception_free (&my_ev); - return control_widget; -} - - -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 18fe144929..0000000000 --- a/shell/evolution-shell-client.h +++ /dev/null @@ -1,97 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-shell-client.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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__ - -#include <gtk/gtkwindow.h> -#include <gdk-pixbuf/gdk-pixbuf.h> - -#include <glib-object.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 { - GObject base; - - EvolutionShellClientPrivate *priv; -}; - -struct _EvolutionShellClientClass { - GObjectClass parent_class; -}; - - -GtkType evolution_shell_client_get_type (void); -void evolution_shell_client_construct (EvolutionShellClient *shell_client, - GNOME_Evolution_Shell corba_shell); -EvolutionShellClient *evolution_shell_client_new (GNOME_Evolution_Shell shell); - -GNOME_Evolution_Shell evolution_shell_client_corba_objref (EvolutionShellClient *shell_client); - -void evolution_shell_client_user_select_folder (EvolutionShellClient *shell_client, - GtkWindow *parent, - const char *title, - const char *default_folder, - const char **possible_types, - GNOME_Evolution_Folder **folder_return); - -GNOME_Evolution_Activity evolution_shell_client_get_activity_interface (EvolutionShellClient *shell_client); -GNOME_Evolution_Shortcuts evolution_shell_client_get_shortcuts_interface (EvolutionShellClient *shell_client); -GNOME_Evolution_StorageRegistry evolution_shell_client_get_storage_registry_interface (EvolutionShellClient *shell_client); - -GNOME_Evolution_Storage evolution_shell_client_get_local_storage (EvolutionShellClient *shell_client); - -void evolution_shell_client_set_line_status (EvolutionShellClient *shell_client, - gboolean online); - -GdkPixbuf *evolution_shell_client_get_pixbuf_for_type (EvolutionShellClient *shell_client, - const char *folder_type, - gboolean mini); - -GtkWidget *evolution_shell_client_create_storage_set_view (EvolutionShellClient *shell_client, - Bonobo_UIComponent uic, - Bonobo_Control *bonobo_control_iface_return, - GNOME_Evolution_StorageSetView *storage_set_view_iface_return, - CORBA_Environment *ev); - -#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 621741a66f..0000000000 --- a/shell/evolution-shell-component-client.c +++ /dev/null @@ -1,924 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-shell-component-client.c - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <string.h> -#include <glib.h> -#include <gtk/gtksignal.h> -#include <gtk/gtktypeutils.h> - -#include <bonobo-activation/bonobo-activation.h> - -#include <bonobo/bonobo-exception.h> -#include <bonobo/bonobo-main.h> -#include <bonobo/bonobo-widget.h> - -#include <gal/util/e-util.h> - -#include "evolution-shell-component-client.h" - - -char *evolution_debug_log; - -#define PARENT_TYPE G_TYPE_OBJECT -static GObjectClass *parent_class = NULL; - -struct _EvolutionShellComponentClientPrivate { - GNOME_Evolution_ShellComponent corba_objref; - - char *id; - - EvolutionShellComponentClientCallback callback; - void *callback_data; - - GNOME_Evolution_ShellComponentListener listener_interface; - PortableServer_Servant listener_servant; - - GNOME_Evolution_ShellComponentDnd_SourceFolder dnd_source_folder_interface; - GNOME_Evolution_ShellComponentDnd_DestinationFolder dnd_destination_folder_interface; - GNOME_Evolution_Offline offline_interface; -}; - - -#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 (BONOBO_EX_REPOID (ev), ex_GNOME_Evolution_ShellComponent_AlreadyOwned) == 0) - return EVOLUTION_SHELL_COMPONENT_ALREADYOWNED; - if (strcmp (BONOBO_EX_REPOID (ev), ex_GNOME_Evolution_ShellComponent_OldOwnerHasDied) == 0) - return EVOLUTION_SHELL_COMPONENT_OLDOWNERHASDIED; - if (strcmp (BONOBO_EX_REPOID (ev), ex_GNOME_Evolution_ShellComponent_NotOwned) == 0) - return EVOLUTION_SHELL_COMPONENT_NOTOWNED; - if (strcmp (BONOBO_EX_REPOID (ev), ex_GNOME_Evolution_ShellComponent_NotFound) == 0) - return EVOLUTION_SHELL_COMPONENT_NOTFOUND; - if (strcmp (BONOBO_EX_REPOID (ev), ex_GNOME_Evolution_ShellComponent_UnsupportedType) == 0) - return EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDTYPE; - if (strcmp (BONOBO_EX_REPOID (ev), ex_GNOME_Evolution_ShellComponent_InternalError) == 0) - return EVOLUTION_SHELL_COMPONENT_INTERNALERROR; - if (strcmp (BONOBO_EX_REPOID (ev), ex_GNOME_Evolution_ShellComponent_Busy) == 0) - return EVOLUTION_SHELL_COMPONENT_BUSY; - if (strcmp (BONOBO_EX_REPOID (ev), ex_GNOME_Evolution_ShellComponent_UnsupportedSchema) == 0) - return EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDSCHEMA; - - return EVOLUTION_SHELL_COMPONENT_UNKNOWNERROR; - } else { - /* FIXME maybe we need something more specific here. */ - return EVOLUTION_SHELL_COMPONENT_CORBAERROR; - } -} - -static EvolutionShellComponentResult -shell_component_result_from_corba_exception (const CORBA_Environment *ev) -{ - if (ev->_major == CORBA_NO_EXCEPTION) - return EVOLUTION_SHELL_COMPONENT_OK; - if (ev->_major == CORBA_SYSTEM_EXCEPTION) - return EVOLUTION_SHELL_COMPONENT_CORBAERROR; - return EVOLUTION_SHELL_COMPONENT_CORBAERROR; /* FIXME? */ -} - - -/* CORBA listener interface implementation. */ - -static PortableServer_ServantBase__epv ShellComponentListener_base_epv; -static POA_GNOME_Evolution_ShellComponentListener__epv ShellComponentListener_epv; -static POA_GNOME_Evolution_ShellComponentListener__vepv ShellComponentListener_vepv; -static gboolean ShellComponentListener_vepv_initialized = FALSE; - -static void ShellComponentListener_vepv_initialize (void); -static void dispatch_callback (EvolutionShellComponentClient *shell_component_client, - EvolutionShellComponentResult result); - -struct _ShellComponentListenerServant { - POA_GNOME_Evolution_ShellComponentListener servant; - EvolutionShellComponentClient *component_client; -}; -typedef struct _ShellComponentListenerServant ShellComponentListenerServant; - -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 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 (GNOME_Evolution_ShellComponentListener_Result async_corba_result) -{ - switch (async_corba_result) { - case GNOME_Evolution_ShellComponentListener_OK: - return EVOLUTION_SHELL_COMPONENT_OK; - case GNOME_Evolution_ShellComponentListener_CANCEL: - return EVOLUTION_SHELL_COMPONENT_CANCEL; - case GNOME_Evolution_ShellComponentListener_UNSUPPORTED_OPERATION: - return EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDOPERATION; - case GNOME_Evolution_ShellComponentListener_EXISTS: - return EVOLUTION_SHELL_COMPONENT_EXISTS; - case GNOME_Evolution_ShellComponentListener_INVALID_URI: - return EVOLUTION_SHELL_COMPONENT_INVALIDURI; - case GNOME_Evolution_ShellComponentListener_PERMISSION_DENIED: - return EVOLUTION_SHELL_COMPONENT_PERMISSIONDENIED; - case GNOME_Evolution_ShellComponentListener_HAS_SUBFOLDERS: - return EVOLUTION_SHELL_COMPONENT_HASSUBFOLDERS; - case GNOME_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 GNOME_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.notifyResult = impl_ShellComponentListener_report_result; - - ShellComponentListener_vepv._base_epv = & ShellComponentListener_base_epv; - ShellComponentListener_vepv.GNOME_Evolution_ShellComponentListener_epv = & ShellComponentListener_epv; - - ShellComponentListener_vepv_initialized = TRUE; -} - -static void -create_listener_interface (EvolutionShellComponentClient *shell_component_client) -{ - EvolutionShellComponentClientPrivate *priv; - PortableServer_Servant listener_servant; - GNOME_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_GNOME_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; -} - -static void -destroy_listener_interface (EvolutionShellComponentClient *client) -{ - EvolutionShellComponentClientPrivate *priv; - CORBA_Environment ev; - PortableServer_ObjectId *oid; - - priv = client->priv; - CORBA_exception_init (&ev); - - oid = PortableServer_POA_servant_to_id (bonobo_poa (), priv->listener_servant, &ev); - PortableServer_POA_deactivate_object (bonobo_poa (), oid, &ev); - CORBA_free (oid); - - CORBA_Object_release (priv->listener_interface, &ev); - /* free_ShellComponentListener_servant (priv->listener_servant); */ - - CORBA_exception_free (&ev); -} - -static void -dispatch_callback (EvolutionShellComponentClient *shell_component_client, - EvolutionShellComponentResult result) -{ - EvolutionShellComponentClientPrivate *priv; - EvolutionShellComponentClientCallback callback; - void *callback_data; - - 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. */ - - destroy_listener_interface (shell_component_client); - - 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); -} - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - EvolutionShellComponentClient *shell_component_client; - EvolutionShellComponentClientPrivate *priv; - CORBA_Environment ev; - - shell_component_client = EVOLUTION_SHELL_COMPONENT_CLIENT (object); - priv = shell_component_client->priv; - - if (priv == NULL) - return; - - g_free (priv->id); - priv->id = NULL; - - if (priv->callback != NULL) { - dispatch_callback (shell_component_client, EVOLUTION_SHELL_COMPONENT_INTERRUPTED); - priv->callback = NULL; - } - - CORBA_exception_init (&ev); - - if (priv->corba_objref != CORBA_OBJECT_NIL) { - Bonobo_Unknown_unref (priv->corba_objref, &ev); - CORBA_Object_release (priv->corba_objref, &ev); - priv->corba_objref = CORBA_OBJECT_NIL; - } - - if (priv->dnd_source_folder_interface != CORBA_OBJECT_NIL) { - Bonobo_Unknown_unref (priv->dnd_source_folder_interface, &ev); - CORBA_Object_release (priv->dnd_source_folder_interface, &ev); - priv->dnd_source_folder_interface = CORBA_OBJECT_NIL; - } - - if (priv->dnd_destination_folder_interface != CORBA_OBJECT_NIL) { - Bonobo_Unknown_unref (priv->dnd_destination_folder_interface, &ev); - CORBA_Object_release (priv->dnd_destination_folder_interface, &ev); - priv->dnd_destination_folder_interface = CORBA_OBJECT_NIL; - } - - if (priv->offline_interface != CORBA_OBJECT_NIL) { - Bonobo_Unknown_unref (priv->offline_interface, &ev); - CORBA_Object_release (priv->offline_interface, &ev); - priv->offline_interface = CORBA_OBJECT_NIL; - } - - if (priv->listener_interface != CORBA_OBJECT_NIL) { - destroy_listener_interface (shell_component_client); - priv->listener_interface = CORBA_OBJECT_NIL; - } - - CORBA_exception_free (&ev); - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EvolutionShellComponentClient *client; - - client = EVOLUTION_SHELL_COMPONENT_CLIENT (object); - - g_free (client->priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -class_init (EvolutionShellComponentClientClass *klass) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - parent_class = g_type_class_ref(PARENT_TYPE); - - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; -} - -static void -init (EvolutionShellComponentClient *shell_component_client) -{ - EvolutionShellComponentClientPrivate *priv; - - priv = g_new (EvolutionShellComponentClientPrivate, 1); - - priv->corba_objref = CORBA_OBJECT_NIL; - - priv->id = NULL; - - priv->listener_interface = CORBA_OBJECT_NIL; - priv->listener_servant = NULL; - - priv->callback = NULL; - priv->callback_data = NULL; - - priv->dnd_source_folder_interface = CORBA_OBJECT_NIL; - priv->dnd_destination_folder_interface = CORBA_OBJECT_NIL; - priv->offline_interface = CORBA_OBJECT_NIL; - - shell_component_client->priv = priv; -} - - -/* Construction. */ - -void -evolution_shell_component_client_construct (EvolutionShellComponentClient *shell_component_client, - const char *id, - CORBA_Object corba_object) -{ - EvolutionShellComponentClientPrivate *priv; - - 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); - - priv = shell_component_client->priv; - priv->corba_objref = corba_object; - priv->id = g_strdup (id); -} - -EvolutionShellComponentClient * -evolution_shell_component_client_new (const char *id, - CORBA_Environment *ev) -{ - EvolutionShellComponentClient *new; - CORBA_Object corba_object; - CORBA_Environment *local_ev; - CORBA_Environment static_ev; - - g_return_val_if_fail (id != NULL, NULL); - - CORBA_exception_init (&static_ev); - - if (ev == NULL) - local_ev = &static_ev; - else - local_ev = ev; - - corba_object = bonobo_activation_activate_from_id ((char *) id, 0, NULL, ev); - if (ev->_major != CORBA_NO_EXCEPTION || corba_object == NULL) { - CORBA_exception_free (&static_ev); - return NULL; - } - - CORBA_exception_free (&static_ev); - - new = g_object_new (evolution_shell_component_client_get_type (), NULL); - evolution_shell_component_client_construct (new, id, corba_object); - - return new; -} - -GNOME_Evolution_ShellComponent -evolution_shell_component_client_corba_objref (EvolutionShellComponentClient *component_client) -{ - g_return_val_if_fail (EVOLUTION_IS_SHELL_COMPONENT_CLIENT (component_client), NULL); - - return component_client->priv->corba_objref; -} - - -/* Properties. */ - -const char * -evolution_shell_component_client_get_id (EvolutionShellComponentClient *shell_component_client) -{ - EvolutionShellComponentClientPrivate *priv; - - g_return_val_if_fail (shell_component_client != NULL, NULL); - g_return_val_if_fail (EVOLUTION_IS_SHELL_COMPONENT_CLIENT (shell_component_client), NULL); - - priv = shell_component_client->priv; - - return priv->id; -} - - -/* Querying DnD interfaces. */ - -GNOME_Evolution_ShellComponentDnd_SourceFolder -evolution_shell_component_client_get_dnd_source_interface (EvolutionShellComponentClient *shell_component_client) -{ - EvolutionShellComponentClientPrivate *priv; - GNOME_Evolution_ShellComponentDnd_SourceFolder interface; - CORBA_Environment ev; - - g_return_val_if_fail (shell_component_client != NULL, CORBA_OBJECT_NIL); - g_return_val_if_fail (EVOLUTION_IS_SHELL_COMPONENT_CLIENT (shell_component_client), CORBA_OBJECT_NIL); - - priv = shell_component_client->priv; - - if (priv->dnd_source_folder_interface != CORBA_OBJECT_NIL) - return priv->dnd_source_folder_interface; - - CORBA_exception_init (&ev); - - interface = Bonobo_Unknown_queryInterface (priv->corba_objref, - "IDL:GNOME/Evolution/ShellComponentDnd/SourceFolder:1.0", - &ev); - - if (ev._major != CORBA_NO_EXCEPTION) - interface = CORBA_OBJECT_NIL; - - CORBA_exception_free (&ev); - - priv->dnd_source_folder_interface = interface; - return interface; -} - -GNOME_Evolution_ShellComponentDnd_DestinationFolder -evolution_shell_component_client_get_dnd_destination_interface (EvolutionShellComponentClient *shell_component_client) -{ - EvolutionShellComponentClientPrivate *priv; - GNOME_Evolution_ShellComponentDnd_DestinationFolder interface; - CORBA_Environment ev; - - g_return_val_if_fail (shell_component_client != NULL, CORBA_OBJECT_NIL); - g_return_val_if_fail (EVOLUTION_IS_SHELL_COMPONENT_CLIENT (shell_component_client), CORBA_OBJECT_NIL); - - priv = shell_component_client->priv; - - if (priv->dnd_destination_folder_interface != CORBA_OBJECT_NIL) - return priv->dnd_destination_folder_interface; - - CORBA_exception_init (&ev); - - interface = Bonobo_Unknown_queryInterface (priv->corba_objref, - "IDL:GNOME/Evolution/ShellComponentDnd/DestinationFolder:1.0", - &ev); - - if (ev._major != CORBA_NO_EXCEPTION) - interface = CORBA_OBJECT_NIL; - - CORBA_exception_free (&ev); - - priv->dnd_destination_folder_interface = interface; - return interface; -} - - -/* Querying the offline interface. */ - -GNOME_Evolution_Offline -evolution_shell_component_client_get_offline_interface (EvolutionShellComponentClient *shell_component_client) -{ - EvolutionShellComponentClientPrivate *priv; - GNOME_Evolution_Offline interface; - CORBA_Environment ev; - - priv = shell_component_client->priv; - - if (priv->offline_interface != CORBA_OBJECT_NIL) - return priv->offline_interface; - - CORBA_exception_init (&ev); - - interface = Bonobo_Unknown_queryInterface (priv->corba_objref, "IDL:GNOME/Evolution/Offline:1.0", &ev); - - if (ev._major != CORBA_NO_EXCEPTION) - interface = CORBA_OBJECT_NIL; - - CORBA_exception_free (&ev); - - priv->offline_interface = interface; - return interface; -} - - -/* Synchronous operations. */ - -EvolutionShellComponentResult -evolution_shell_component_client_set_owner (EvolutionShellComponentClient *shell_component_client, - GNOME_Evolution_Shell shell, - const char *evolution_homedir) -{ - EvolutionShellComponentResult result; - EvolutionShellComponentClientPrivate *priv; - 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); - - priv = shell_component_client->priv; - - CORBA_exception_init (&ev); - - GNOME_Evolution_ShellComponent_setOwner (priv->corba_objref, shell, evolution_homedir, &ev); - - result = corba_exception_to_result (&ev); - - if (result == EVOLUTION_SHELL_COMPONENT_OK && evolution_debug_log) - GNOME_Evolution_ShellComponent_debug (priv->corba_objref, evolution_debug_log, &ev); - - CORBA_exception_free (&ev); - - return result; -} - -EvolutionShellComponentResult -evolution_shell_component_client_unset_owner (EvolutionShellComponentClient *shell_component_client, - GNOME_Evolution_Shell shell) -{ - 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); - - GNOME_Evolution_ShellComponent_unsetOwner (shell_component_client->priv->corba_objref, &ev); - - result = corba_exception_to_result (&ev); - - CORBA_exception_free (&ev); - - return result; -} - -EvolutionShellComponentResult -evolution_shell_component_client_create_view (EvolutionShellComponentClient *shell_component_client, - BonoboUIComponent *uih, - const char *physical_uri, - const char *type_string, - const char *view_info, - BonoboControl **control_return) -{ - EvolutionShellComponentResult result; - CORBA_Environment ev; - EvolutionShellComponentClientPrivate *priv; - 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_COMPONENT (uih)); - RETURN_ERROR_IF_FAIL (physical_uri != NULL); - RETURN_ERROR_IF_FAIL (type_string != NULL); - RETURN_ERROR_IF_FAIL (view_info != NULL); - RETURN_ERROR_IF_FAIL (control_return != NULL); - - priv = shell_component_client->priv; - - CORBA_exception_init (&ev); - - corba_control = GNOME_Evolution_ShellComponent_createView (priv->corba_objref, physical_uri, type_string, view_info, &ev); - - result = corba_exception_to_result (&ev); - - if (result != EVOLUTION_SHELL_COMPONENT_OK) { - *control_return = NULL; - } else { - Bonobo_UIContainer 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; -} - -EvolutionShellComponentResult -evolution_shell_component_client_handle_external_uri (EvolutionShellComponentClient *shell_component_client, - const char *uri) -{ - EvolutionShellComponentResult result; - EvolutionShellComponentClientPrivate *priv; - 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 (uri != NULL); - - CORBA_exception_init (&ev); - - priv = shell_component_client->priv; - - GNOME_Evolution_ShellComponent_handleExternalURI (priv->corba_objref, uri, &ev); - - result = corba_exception_to_result (&ev); - - 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; - 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); - - priv->callback = callback; - priv->callback_data = data; - - GNOME_Evolution_ShellComponent_createFolderAsync (priv->corba_objref, priv->listener_interface, physical_uri, type, &ev); - - if (ev._major != CORBA_NO_EXCEPTION && priv->callback != NULL) { - (* callback) (shell_component_client, - shell_component_result_from_corba_exception (&ev), - data); - priv->callback = NULL; - priv->callback_data = NULL; - } - - CORBA_exception_free (&ev); -} - -void -evolution_shell_component_client_async_remove_folder (EvolutionShellComponentClient *shell_component_client, - const char *physical_uri, - const char *type, - EvolutionShellComponentClientCallback callback, - void *data) -{ - EvolutionShellComponentClientPrivate *priv; - 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 (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); - - priv->callback = callback; - priv->callback_data = data; - - GNOME_Evolution_ShellComponent_removeFolderAsync (priv->corba_objref, priv->listener_interface, physical_uri, type, &ev); - - if (ev._major != CORBA_NO_EXCEPTION && priv->callback != NULL) { - (* callback) (shell_component_client, - shell_component_result_from_corba_exception (&ev), - data); - priv->callback = NULL; - priv->callback_data = NULL; - } - - CORBA_exception_free (&ev); -} - -void -evolution_shell_component_client_async_xfer_folder (EvolutionShellComponentClient *shell_component_client, - const char *source_physical_uri, - const char *destination_physical_uri, - const char *type, - gboolean remove_source, - EvolutionShellComponentClientCallback callback, - void *data) -{ - EvolutionShellComponentClientPrivate *priv; - 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 (source_physical_uri != NULL); - g_return_if_fail (destination_physical_uri != NULL); - g_return_if_fail (data != 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); - - priv->callback = callback; - priv->callback_data = data; - - GNOME_Evolution_ShellComponent_xferFolderAsync (priv->corba_objref, priv->listener_interface, - source_physical_uri, destination_physical_uri, type, remove_source, - &ev); - - if (ev._major != CORBA_NO_EXCEPTION && priv->callback != NULL) { - (* callback) (shell_component_client, - shell_component_result_from_corba_exception (&ev), - data); - priv->callback = NULL; - priv->callback_data = NULL; - } - - CORBA_exception_free (&ev); -} - -void -evolution_shell_component_client_populate_folder_context_menu (EvolutionShellComponentClient *shell_component_client, - BonoboUIContainer *container, - const char *physical_uri, - const char *type) -{ - Bonobo_UIContainer corba_container; - EvolutionShellComponentClientPrivate *priv; - 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_container = bonobo_object_corba_objref (BONOBO_OBJECT (container)); - - GNOME_Evolution_ShellComponent_populateFolderContextMenu (priv->corba_objref, corba_container, physical_uri, type, &ev); - - CORBA_exception_free (&ev); -} - -void -evolution_shell_component_client_unpopulate_folder_context_menu (EvolutionShellComponentClient *shell_component_client, - BonoboUIContainer *container, - const char *physical_uri, - const char *type) -{ - Bonobo_UIContainer corba_container; - EvolutionShellComponentClientPrivate *priv; - 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_container = bonobo_object_corba_objref (BONOBO_OBJECT (container)); - - GNOME_Evolution_ShellComponent_unpopulateFolderContextMenu (priv->corba_objref, corba_container, physical_uri, type, &ev); - - CORBA_exception_free (&ev); -} - - -void -evolution_shell_component_client_request_quit (EvolutionShellComponentClient *shell_component_client, - EvolutionShellComponentClientCallback callback, - void *data) -{ - EvolutionShellComponentClientPrivate *priv; - GNOME_Evolution_ShellComponent corba_shell_component; - CORBA_Environment ev; - - g_return_if_fail (EVOLUTION_IS_SHELL_COMPONENT_CLIENT (shell_component_client)); - 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 = evolution_shell_component_client_corba_objref (shell_component_client); - - priv->callback = callback; - priv->callback_data = data; - - GNOME_Evolution_ShellComponent_requestQuit (corba_shell_component, priv->listener_interface, &ev); - - if (ev._major != CORBA_NO_EXCEPTION && priv->callback != NULL) { - (* callback) (shell_component_client, - shell_component_result_from_corba_exception (&ev), - data); - priv->callback = NULL; - priv->callback_data = NULL; - } - - 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 e396b17082..0000000000 --- a/shell/evolution-shell-component-client.h +++ /dev/null @@ -1,142 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-shell-component-client.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <glib-object.h> - -#include <bonobo/bonobo-ui-container.h> -#include <bonobo/bonobo-ui-component.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 { - GObject parent; - - EvolutionShellComponentClientPrivate *priv; -}; - -struct _EvolutionShellComponentClientClass { - GObjectClass 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, - const char *id, - CORBA_Object corba_object); -EvolutionShellComponentClient *evolution_shell_component_client_new (const char *id, - CORBA_Environment *optional_ev); - -GNOME_Evolution_ShellComponent evolution_shell_component_client_corba_objref (EvolutionShellComponentClient *client); - -/* Properties. */ - -const char *evolution_shell_component_client_get_id (EvolutionShellComponentClient *shell_component_client); - -/* Querying DnD interfaces. */ - -GNOME_Evolution_ShellComponentDnd_SourceFolder -evolution_shell_component_client_get_dnd_source_interface (EvolutionShellComponentClient *shell_component_client); -GNOME_Evolution_ShellComponentDnd_DestinationFolder -evolution_shell_component_client_get_dnd_destination_interface (EvolutionShellComponentClient *shell_component_client); - -/* Querying the offline interface. */ -GNOME_Evolution_Offline -evolution_shell_component_client_get_offline_interface (EvolutionShellComponentClient *shell_component_client); - -/* Synchronous operations. */ - -EvolutionShellComponentResult evolution_shell_component_client_set_owner (EvolutionShellComponentClient *shell_component_client, - GNOME_Evolution_Shell shell, - const char *evolution_homedir); -EvolutionShellComponentResult evolution_shell_component_client_unset_owner (EvolutionShellComponentClient *shell_component_client, - GNOME_Evolution_Shell shell); -EvolutionShellComponentResult evolution_shell_component_client_create_view (EvolutionShellComponentClient *shell_component_client, - BonoboUIComponent *uih, - const char *physical_uri, - const char *type_string, - const char *view_info, - BonoboControl **control_return); - -EvolutionShellComponentResult evolution_shell_component_client_handle_external_uri (EvolutionShellComponentClient *shell_component_client, - const char *uri); - -/* 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, - const char *type, - EvolutionShellComponentClientCallback callback, - void *data); -void evolution_shell_component_client_async_xfer_folder (EvolutionShellComponentClient *shell_component_client, - const char *source_physical_uri, - const char *destination_physical_uri, - const char *type, - gboolean remove_source, - EvolutionShellComponentClientCallback callback, - void *data); - -void evolution_shell_component_client_populate_folder_context_menu (EvolutionShellComponentClient *shell_component_client, - BonoboUIContainer *container, - const char *physical_uri, - const char *type); -void evolution_shell_component_client_unpopulate_folder_context_menu (EvolutionShellComponentClient *shell_component_client, - BonoboUIContainer *container, - const char *physical_uri, - const char *type); - -void evolution_shell_component_client_request_quit (EvolutionShellComponentClient *shell_component_client, - EvolutionShellComponentClientCallback callback, - void *data); - -#ifdef cplusplus -} -#endif /* cplusplus */ - -#endif /* EVOLUTION_SHELL_COMPONENT_CLIENT_H */ diff --git a/shell/evolution-shell-component-dnd.c b/shell/evolution-shell-component-dnd.c deleted file mode 100644 index 61bb3565e1..0000000000 --- a/shell/evolution-shell-component-dnd.c +++ /dev/null @@ -1,294 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-shell-component-dnd.c - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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: Chris Toshok - */ - -#include "Evolution.h" -#include "evolution-shell-component-dnd.h" - -#include <gal/util/e-util.h> - -#include <gtk/gtkobject.h> - -#define PARENT_TYPE (bonobo_object_get_type ()) - -static BonoboObjectClass *parent_class; - -/* Source Folder stuff */ - -struct _DndSourceFolderPrivate { - DndSourceFolderBeginDragFn begin_drag; - DndSourceFolderGetDataFn get_data; - DndSourceFolderDeleteDataFn delete_data; - DndSourceFolderEndDragFn end_drag; - gpointer user_data; -}; - -/* GObject methods */ -static void -dnd_source_finalize (GObject *object) -{ - EvolutionShellComponentDndSourceFolder *folder; - DndSourceFolderPrivate *priv; - - folder = EVOLUTION_SHELL_COMPONENT_DND_SOURCE_FOLDER (object); - priv = folder->priv; - - g_return_if_fail (priv != NULL); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - -static void -impl_GNOME_Evolution_ShellComponentDnd_SourceFolder_beginDrag (PortableServer_Servant servant, const CORBA_char * physical_uri, - const CORBA_char * folder_type, GNOME_Evolution_ShellComponentDnd_ActionSet * possible_actions, - GNOME_Evolution_ShellComponentDnd_Action * suggested_action, CORBA_Environment * ev) -{ - BonoboObject *bonobo_object; - EvolutionShellComponentDndSourceFolder *folder; - DndSourceFolderPrivate *priv; - - bonobo_object = bonobo_object_from_servant (servant); - folder = EVOLUTION_SHELL_COMPONENT_DND_SOURCE_FOLDER (bonobo_object); - priv = folder->priv; - - priv->begin_drag (folder, physical_uri, folder_type, possible_actions, suggested_action, priv->user_data); -} - -static void -impl_GNOME_Evolution_ShellComponentDnd_SourceFolder_getData (PortableServer_Servant servant, - const GNOME_Evolution_ShellComponentDnd_SourceFolder_Context * source_context, - const GNOME_Evolution_ShellComponentDnd_Action action, const CORBA_char * dnd_type, - GNOME_Evolution_ShellComponentDnd_Data ** data, CORBA_Environment * ev) -{ - BonoboObject *bonobo_object; - EvolutionShellComponentDndSourceFolder *folder; - DndSourceFolderPrivate *priv; - - bonobo_object = bonobo_object_from_servant (servant); - folder = EVOLUTION_SHELL_COMPONENT_DND_SOURCE_FOLDER (bonobo_object); - priv = folder->priv; - - priv->get_data (folder, source_context, action, dnd_type, data, ev, priv->user_data); -} - -static void -impl_GNOME_Evolution_ShellComponentDnd_SourceFolder_deleteData (PortableServer_Servant servant, - const GNOME_Evolution_ShellComponentDnd_SourceFolder_Context * source_context, - CORBA_Environment * ev) -{ - BonoboObject *bonobo_object; - EvolutionShellComponentDndSourceFolder *folder; - DndSourceFolderPrivate *priv; - - bonobo_object = bonobo_object_from_servant (servant); - folder = EVOLUTION_SHELL_COMPONENT_DND_SOURCE_FOLDER (bonobo_object); - priv = folder->priv; - - priv->delete_data (folder, source_context, priv->user_data); -} - -static void -impl_GNOME_Evolution_ShellComponentDnd_SourceFolder_endDrag (PortableServer_Servant servant, - const GNOME_Evolution_ShellComponentDnd_SourceFolder_Context * source_context, - CORBA_Environment * ev) -{ - BonoboObject *bonobo_object; - EvolutionShellComponentDndSourceFolder *folder; - DndSourceFolderPrivate *priv; - - bonobo_object = bonobo_object_from_servant (servant); - folder = EVOLUTION_SHELL_COMPONENT_DND_SOURCE_FOLDER (bonobo_object); - priv = folder->priv; - - priv->end_drag (folder, source_context, priv->user_data); -} - -static void -evolution_shell_component_dnd_source_folder_class_init (EvolutionShellComponentDndSourceFolderClass *klass) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - object_class->finalize = dnd_source_finalize; - - klass->epv.beginDrag = impl_GNOME_Evolution_ShellComponentDnd_SourceFolder_beginDrag; - klass->epv.getData = impl_GNOME_Evolution_ShellComponentDnd_SourceFolder_getData; - klass->epv.deleteData = impl_GNOME_Evolution_ShellComponentDnd_SourceFolder_deleteData; - klass->epv.endDrag = impl_GNOME_Evolution_ShellComponentDnd_SourceFolder_endDrag; - - parent_class = g_type_class_ref(PARENT_TYPE); -} - -static void -evolution_shell_component_dnd_source_folder_init (EvolutionShellComponentDndSourceFolder *folder) -{ - DndSourceFolderPrivate *priv; - - priv = g_new (DndSourceFolderPrivate, 1); - - folder->priv = priv; -} - -BONOBO_TYPE_FUNC_FULL (EvolutionShellComponentDndSourceFolder, - GNOME_Evolution_ShellComponentDnd_SourceFolder, - PARENT_TYPE, - evolution_shell_component_dnd_source_folder) - -EvolutionShellComponentDndSourceFolder* -evolution_shell_component_dnd_source_folder_new (DndSourceFolderBeginDragFn begin_drag, - DndSourceFolderGetDataFn get_data, - DndSourceFolderDeleteDataFn delete_data, - DndSourceFolderEndDragFn end_drag, - gpointer user_data) -{ - EvolutionShellComponentDndSourceFolder *dnd_source; - - g_return_val_if_fail (begin_drag != NULL, NULL); - g_return_val_if_fail (get_data != NULL, NULL); - g_return_val_if_fail (delete_data != NULL, NULL); - g_return_val_if_fail (end_drag != NULL, NULL); - - dnd_source = g_object_new (evolution_shell_component_dnd_source_folder_get_type (), NULL); - - dnd_source->priv->begin_drag = begin_drag; - dnd_source->priv->get_data = get_data; - dnd_source->priv->delete_data = delete_data; - dnd_source->priv->end_drag = end_drag; - dnd_source->priv->user_data = user_data; - - return dnd_source; -} - - - -/* Destination Folder stuff */ - -struct _DndDestinationFolderPrivate { - DndDestinationFolderHandleMotionFn handle_motion; - DndDestinationFolderHandleDropFn handle_drop; - gpointer user_data; -}; - -/* GtkObject methods */ -static void -dnd_destination_finalize (GObject *object) -{ - EvolutionShellComponentDndDestinationFolder *folder; - DndDestinationFolderPrivate *priv; - - folder = EVOLUTION_SHELL_COMPONENT_DND_DESTINATION_FOLDER (object); - priv = folder->priv; - - g_return_if_fail (priv != NULL); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - -/* CORBA interface */ -static CORBA_boolean -impl_GNOME_Evolution_ShellComponentDnd_DestinationFolder_handleMotion (PortableServer_Servant servant, - const CORBA_char* physical_uri, - const CORBA_char *folder_type, - const GNOME_Evolution_ShellComponentDnd_DestinationFolder_Context * destination_context, - GNOME_Evolution_ShellComponentDnd_Action * suggested_action, CORBA_Environment * ev) -{ - BonoboObject *bonobo_object; - EvolutionShellComponentDndDestinationFolder *folder; - DndDestinationFolderPrivate *priv; - - bonobo_object = bonobo_object_from_servant (servant); - folder = EVOLUTION_SHELL_COMPONENT_DND_DESTINATION_FOLDER (bonobo_object); - priv = folder->priv; - - return priv->handle_motion (folder, physical_uri, folder_type, destination_context, suggested_action, priv->user_data); -} - -static CORBA_boolean -impl_GNOME_Evolution_ShellComponentDnd_DestinationFolder_handleDrop (PortableServer_Servant servant, - const CORBA_char *physical_uri, - const CORBA_char *folder_type, - const GNOME_Evolution_ShellComponentDnd_DestinationFolder_Context * destination_context, - const GNOME_Evolution_ShellComponentDnd_Action action, - const GNOME_Evolution_ShellComponentDnd_Data * data, CORBA_Environment * ev) -{ - BonoboObject *bonobo_object; - EvolutionShellComponentDndDestinationFolder *folder; - DndDestinationFolderPrivate *priv; - - bonobo_object = bonobo_object_from_servant (servant); - folder = EVOLUTION_SHELL_COMPONENT_DND_DESTINATION_FOLDER (bonobo_object); - priv = folder->priv; - - return priv->handle_drop (folder, physical_uri, folder_type, destination_context, action, data, priv->user_data); -} - -static void -evolution_shell_component_dnd_destination_folder_class_init (EvolutionShellComponentDndDestinationFolderClass *klass) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - object_class->finalize = dnd_destination_finalize; - - klass->epv.handleMotion = impl_GNOME_Evolution_ShellComponentDnd_DestinationFolder_handleMotion; - klass->epv.handleDrop = impl_GNOME_Evolution_ShellComponentDnd_DestinationFolder_handleDrop; - - parent_class = g_type_class_ref(PARENT_TYPE); -} - -static void -evolution_shell_component_dnd_destination_folder_init (EvolutionShellComponentDndDestinationFolder *folder) -{ - DndDestinationFolderPrivate *priv; - - priv = g_new (DndDestinationFolderPrivate, 1); - - folder->priv = priv; -} - -BONOBO_TYPE_FUNC_FULL (EvolutionShellComponentDndDestinationFolder, - GNOME_Evolution_ShellComponentDnd_DestinationFolder, - PARENT_TYPE, - evolution_shell_component_dnd_destination_folder) - -EvolutionShellComponentDndDestinationFolder * -evolution_shell_component_dnd_destination_folder_new (DndDestinationFolderHandleMotionFn handle_motion, - DndDestinationFolderHandleDropFn handle_drop, - gpointer user_data) -{ - EvolutionShellComponentDndDestinationFolder *dnd_destination; - - g_return_val_if_fail (handle_motion != NULL, NULL); - g_return_val_if_fail (handle_drop != NULL, NULL); - - dnd_destination = g_object_new (evolution_shell_component_dnd_destination_folder_get_type (), NULL); - - dnd_destination->priv->handle_motion = handle_motion; - dnd_destination->priv->handle_drop = handle_drop; - dnd_destination->priv->user_data = user_data; - - return dnd_destination; -} - diff --git a/shell/evolution-shell-component-dnd.h b/shell/evolution-shell-component-dnd.h deleted file mode 100644 index 25922bca97..0000000000 --- a/shell/evolution-shell-component-dnd.h +++ /dev/null @@ -1,136 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-shell-component-dnd.h - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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: Chris Toshok - */ - -#ifndef EVOLUTION_SHELL_COMPONENT_DND_H -#define EVOLUTION_SHELL_COMPONENT_DND_H - -#include <bonobo/bonobo-object.h> -#include <gtk/gtktypeutils.h> - -#include "Evolution.h" - -#ifdef cplusplus -extern "C" { -#pragma } -#endif /* cplusplus */ - -/* Source Folder stuff */ -#define EVOLUTION_SHELL_COMPONENT_DND_SOURCE_FOLDER_TYPE (evolution_shell_component_dnd_source_folder_get_type ()) -#define EVOLUTION_SHELL_COMPONENT_DND_SOURCE_FOLDER(obj) (GTK_CHECK_CAST ((obj), EVOLUTION_SHELL_COMPONENT_DND_SOURCE_FOLDER_TYPE, EvolutionShellComponentDndSourceFolder)) -#define EVOLUTION_SHELL_COMPONENT_DND_SOURCE_FOLDER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), EVOLUTION_SHELL_COMPONENT_DND_SOURCE_FOLDER_TYPE, EvolutionShellComponentDndSourceFolderClass)) -#define IS_EVOLUTION_SHELL_COMPONENT_DND_SOURCE_FOLDER(obj) (GTK_CHECK_TYPE ((obj), EVOLUTION_SHELL_COMPONENT_DND_SOURCE_FOLDER_TYPE)) -#define IS_EVOLUTION_SHELL_COMPONENT_DND_SOURCE_FOLDER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), EVOLUTION_SHELL_COMPONENT_DND_SOURCE_FOLDER_TYPE)) - -typedef struct _DndSourceFolderPrivate DndSourceFolderPrivate; -typedef struct _EvolutionShellComponentDndSourceFolder EvolutionShellComponentDndSourceFolder; -typedef struct _EvolutionShellComponentDndSourceFolderClass EvolutionShellComponentDndSourceFolderClass; - -typedef void (*DndSourceFolderBeginDragFn)(EvolutionShellComponentDndSourceFolder *folder, - const char *physical_uri, - const char *folder_type, - GNOME_Evolution_ShellComponentDnd_ActionSet *possible_actions_return, - GNOME_Evolution_ShellComponentDnd_Action *suggested_action_return, - gpointer closure); -typedef void (*DndSourceFolderGetDataFn)(EvolutionShellComponentDndSourceFolder *folder, - const GNOME_Evolution_ShellComponentDnd_SourceFolder_Context * source_context, - const GNOME_Evolution_ShellComponentDnd_Action action, - const char * dnd_type, - GNOME_Evolution_ShellComponentDnd_Data ** data_return, - CORBA_Environment *ev, - gpointer closure); -typedef void (*DndSourceFolderDeleteDataFn)(EvolutionShellComponentDndSourceFolder *folder, - const GNOME_Evolution_ShellComponentDnd_SourceFolder_Context *source_context, - gpointer closure); -typedef void (*DndSourceFolderEndDragFn)(EvolutionShellComponentDndSourceFolder *folder, - const GNOME_Evolution_ShellComponentDnd_SourceFolder_Context *source_context, - gpointer closure); - -struct _EvolutionShellComponentDndSourceFolder { - BonoboObject object; - DndSourceFolderPrivate *priv; -}; - -struct _EvolutionShellComponentDndSourceFolderClass { - BonoboObjectClass parent_class; - - POA_GNOME_Evolution_ShellComponentDnd_SourceFolder__epv epv; -}; - -GtkType evolution_shell_component_dnd_source_folder_get_type (void); - -EvolutionShellComponentDndSourceFolder* -evolution_shell_component_dnd_source_folder_new (DndSourceFolderBeginDragFn begin_drag, - DndSourceFolderGetDataFn get_data, - DndSourceFolderDeleteDataFn delete_data, - DndSourceFolderEndDragFn end_drag, - gpointer user_data); - - - -/* Destination Folder stuff */ -#define EVOLUTION_SHELL_COMPONENT_DND_DESTINATION_FOLDER_TYPE (evolution_shell_component_dnd_destination_folder_get_type ()) -#define EVOLUTION_SHELL_COMPONENT_DND_DESTINATION_FOLDER(obj) (GTK_CHECK_CAST ((obj), EVOLUTION_SHELL_COMPONENT_DND_DESTINATION_FOLDER_TYPE, EvolutionShellComponentDndDestinationFolder)) -#define EVOLUTION_SHELL_COMPONENT_DND_DESTINATION_FOLDER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), EVOLUTION_SHELL_COMPONENT_DND_DESTINATION_FOLDER_TYPE, EvolutionShellComponentDndDestinationFolderClass)) -#define IS_EVOLUTION_SHELL_COMPONENT_DND_DESTINATION_FOLDER(obj) (GTK_CHECK_TYPE ((obj), EVOLUTION_SHELL_COMPONENT_DND_DESTINATION_FOLDER_TYPE)) -#define IS_EVOLUTION_SHELL_COMPONENT_DND_DESTINATION_FOLDER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), EVOLUTION_SHELL_COMPONENT_DND_DESTINATION_FOLDER_TYPE)) - -typedef struct _DndDestinationFolderPrivate DndDestinationFolderPrivate; -typedef struct _EvolutionShellComponentDndDestinationFolder EvolutionShellComponentDndDestinationFolder; -typedef struct _EvolutionShellComponentDndDestinationFolderClass EvolutionShellComponentDndDestinationFolderClass; - -typedef CORBA_boolean (*DndDestinationFolderHandleMotionFn)(EvolutionShellComponentDndDestinationFolder *folder, - const char *physical_uri, - const char *folder_type, - const GNOME_Evolution_ShellComponentDnd_DestinationFolder_Context * destination_context, - GNOME_Evolution_ShellComponentDnd_Action * suggested_action_return, - gpointer closure); -typedef CORBA_boolean (*DndDestinationFolderHandleDropFn)(EvolutionShellComponentDndDestinationFolder *folder, - const char *physical_uri, - const char *folder_type, - const GNOME_Evolution_ShellComponentDnd_DestinationFolder_Context * destination_context, - const GNOME_Evolution_ShellComponentDnd_Action action, - const GNOME_Evolution_ShellComponentDnd_Data * data, - gpointer closure); - -struct _EvolutionShellComponentDndDestinationFolder { - BonoboObject object; - DndDestinationFolderPrivate *priv; -}; - -struct _EvolutionShellComponentDndDestinationFolderClass { - BonoboObjectClass parent_class; - - POA_GNOME_Evolution_ShellComponentDnd_DestinationFolder__epv epv; -}; - -GtkType evolution_shell_component_dnd_destination_folder_get_type (void); - -EvolutionShellComponentDndDestinationFolder* -evolution_shell_component_dnd_destination_folder_new (DndDestinationFolderHandleMotionFn handle_motion, - DndDestinationFolderHandleDropFn handle_drop, - gpointer user_data); - -#ifdef cplusplus -} -#endif /* cplusplus */ - -#endif /* EVOLUTION_SHELL_COMPONENT_DND_H */ diff --git a/shell/evolution-shell-component-utils.c b/shell/evolution-shell-component-utils.c deleted file mode 100644 index 935b0f9973..0000000000 --- a/shell/evolution-shell-component-utils.c +++ /dev/null @@ -1,169 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-shell-component-utils.c - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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. - * - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "evolution-shell-component-utils.h" - -#include "e-util/e-dialog-utils.h" - -#include <string.h> -#include <libgnome/gnome-i18n.h> -#include <libgnome/gnome-util.h> -#include <bonobo/bonobo-ui-util.h> -#include <bonobo/bonobo-moniker-util.h> -#include <bonobo/bonobo-exception.h> -#include <bonobo-activation/bonobo-activation.h> - -static void free_pixmaps (void); -static GSList *inited_arrays = NULL; - -void e_pixmaps_update (BonoboUIComponent *uic, EPixmap *pixcache) -{ - static int done_init = 0; - int i; - - if (!done_init) { - g_atexit (free_pixmaps); - done_init = 1; - } - - if (g_slist_find (inited_arrays, pixcache) == NULL) - inited_arrays = g_slist_prepend (inited_arrays, pixcache); - - for (i = 0; pixcache [i].path; i++) { - if (!pixcache [i].pixbuf) { - char *path; - GdkPixbuf *pixbuf; - - path = g_build_filename (EVOLUTION_IMAGES, pixcache [i].fname, NULL); - - pixbuf = gdk_pixbuf_new_from_file (path, NULL); - if (pixbuf == NULL) { - g_warning ("Cannot load image -- %s", path); - } else { - pixcache [i].pixbuf = bonobo_ui_util_pixbuf_to_xml (pixbuf); - g_object_unref (pixbuf); - bonobo_ui_component_set_prop (uic, - pixcache [i].path, "pixname", - pixcache [i].pixbuf, NULL); - } - - g_free (path); - } else { - bonobo_ui_component_set_prop (uic, pixcache [i].path, - "pixname", - pixcache [i].pixbuf, - NULL); - } - } -} - -static void -free_pixmaps (void) -{ - int i; - GSList *li; - - for (li = inited_arrays; li != NULL; li = li->next) { - EPixmap *pixcache = li->data; - for (i = 0; pixcache [i].path; i++) - g_free (pixcache [i].pixbuf); - } - - g_slist_free (inited_arrays); -} - - -/** - * e_activation_failure_dialog: - * @parent: parent window of the dialog, or %NULL - * @msg: the context-specific part of the error message - * @oafiid: the OAFIID of the component that failed to start - * @repo_id: the repo_id of the component that failed to start - * - * This puts up an error dialog about a failed component activation - * containing as much information as we can manage to gather about - * why it failed. - **/ -void -e_activation_failure_dialog (GtkWindow *parent, const char *msg, - const char *oafiid, const char *repo_id) -{ - Bonobo_Unknown object; - CORBA_Environment ev; - char *errmsg; - - CORBA_exception_init (&ev); - object = bonobo_get_object (oafiid, repo_id, &ev); - if (ev._major == CORBA_NO_EXCEPTION) { - if (object) { - Bonobo_Unknown_unref (object, &ev); - CORBA_Object_release (object, &ev); - } - errmsg = g_strdup_printf (_("%s\n\nUnknown error."), msg); - } else if (strcmp (CORBA_exception_id (&ev), ex_Bonobo_GeneralError) != 0) { - char *bonobo_err = bonobo_exception_get_text (&ev); - errmsg = g_strdup_printf (_("%s\n\nThe error from the " - "component system is:\n%s"), - msg, bonobo_err); - g_free (bonobo_err); - } else { - Bonobo_GeneralError *errval = CORBA_exception_value (&ev); - - errmsg = g_strdup_printf (_("%s\n\nThe error from the " - "activation system is:\n%s"), - msg, errval->description); - } - CORBA_exception_free (&ev); - - e_notice (parent, GTK_MESSAGE_ERROR, errmsg); - g_free (errmsg); -} - - -/** - * e_get_activation_failure_msg: - * @ev: An exception returned by an oaf_activate call. - * - * Get a descriptive error message from @ev. - * - * Return value: A newly allocated string with the printable error message. - **/ -char * -e_get_activation_failure_msg (CORBA_Environment *ev) -{ - g_return_val_if_fail (ev != NULL, NULL); - - if (CORBA_exception_id (ev) == NULL) - return NULL; - - if (strcmp (CORBA_exception_id (ev), ex_Bonobo_GeneralError) != 0) { - return bonobo_exception_get_text (ev); - } else { - const Bonobo_GeneralError *oaf_general_error; - - oaf_general_error = CORBA_exception_value (ev); - return g_strdup (oaf_general_error->description); - } -} diff --git a/shell/evolution-shell-component-utils.h b/shell/evolution-shell-component-utils.h deleted file mode 100644 index 5aceab64c7..0000000000 --- a/shell/evolution-shell-component-utils.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-shell-component-utils.h - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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. - */ - -#ifndef __EVOLUTION_SHELL_COMPONENT_UTILS_H__ -#define __EVOLUTION_SHELL_COMPONENT_UTILS_H__ - -#include <bonobo/bonobo-ui-component.h> -#include <gtk/gtkwindow.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -typedef struct _EPixmap { - const char *path; - const char *fname; - char *pixbuf; -} EPixmap; - -#define E_PIXMAP(path,fname) { (path), (fname), NULL } -#define E_PIXMAP_END { NULL, NULL, NULL } - -/* Takes an array of pixmaps, terminated by E_PIXMAP_END, and loads into uic */ -void e_pixmaps_update (BonoboUIComponent *uic, EPixmap *pixcache); - -void e_activation_failure_dialog (GtkWindow *parent, - const char *msg, - const char *oafiid, - const char *repo_id); -char *e_get_activation_failure_msg (CORBA_Environment *ev); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __EVOLUTION_SHELL_COMPONENT_UTILS_H__ */ diff --git a/shell/evolution-shell-component.c b/shell/evolution-shell-component.c deleted file mode 100644 index b263b0f28d..0000000000 --- a/shell/evolution-shell-component.c +++ /dev/null @@ -1,1227 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-shell-component.c - * - * Copyright (C) 2000, 2001, 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 "evolution-shell-component.h" - -#include "e-shell-corba-icon-utils.h" -#include "e-shell-marshal.h" - -#include <fcntl.h> -#include <unistd.h> - -#include <glib.h> -#include <gtk/gtksignal.h> -#include <bonobo/bonobo-object.h> -#include <libgnome/gnome-i18n.h> - -#include <gal/util/e-util.h> - - -#define PING_DELAY 10000 - - -#define PARENT_TYPE BONOBO_OBJECT_TYPE - -static BonoboObjectClass *parent_class = NULL; - -struct _UserCreatableItemType { - char *id; - char *description; - char *menu_description; - char *tooltip; - char menu_shortcut; - GdkPixbuf *icon; - char *folder_type; -}; -typedef struct _UserCreatableItemType UserCreatableItemType; - -struct _EvolutionShellComponentPrivate { - GList *folder_types; /* EvolutionShellComponentFolderType */ - GList *external_uri_schemas; /* char * */ - - EvolutionShellComponentCreateViewFn create_view_fn; - EvolutionShellComponentCreateFolderFn create_folder_fn; - EvolutionShellComponentRemoveFolderFn remove_folder_fn; - EvolutionShellComponentXferFolderFn xfer_folder_fn; - EvolutionShellComponentPopulateFolderContextMenuFn populate_folder_context_menu_fn; - EvolutionShellComponentUnpopulateFolderContextMenuFn unpopulate_folder_context_menu_fn; - EvolutionShellComponentGetDndSelectionFn get_dnd_selection_fn; - EvolutionShellComponentRequestQuitFn request_quit_fn; - - EvolutionShellClient *owner_client; - - GSList *user_creatable_item_types; /* UserCreatableItemType */ - - /* This is used for - populateFolderContextMenu/unpopulateFolderContextMenu. */ - BonoboUIComponent *uic; - - gulong parent_view_xid; - - int ping_timeout_id; - - void *closure; -}; - -enum { - OWNER_SET, - OWNER_UNSET, - OWNER_DIED, - DEBUG, - INTERACTIVE, - HANDLE_EXTERNAL_URI, - USER_CREATE_NEW_ITEM, - SEND_RECEIVE, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - - -/* UserCreatableItemType handling. */ - -static UserCreatableItemType * -user_creatable_item_type_new (const char *id, - const char *description, - const char *menu_description, - const char *tooltip, - const char *folder_type, - char menu_shortcut, - GdkPixbuf *icon) -{ - UserCreatableItemType *type; - - type = g_new (UserCreatableItemType, 1); - type->id = g_strdup (id); - type->description = g_strdup (description); - type->menu_description = g_strdup (menu_description); - type->tooltip = g_strdup (tooltip); - type->menu_shortcut = menu_shortcut; - type->folder_type = g_strdup (folder_type); - - if (icon == NULL) - type->icon = NULL; - else - type->icon = g_object_ref (icon); - - return type; -} - -static void -user_creatable_item_type_free (UserCreatableItemType *type) -{ - g_free (type->id); - g_free (type->description); - g_free (type->menu_description); - g_free (type->folder_type); - - if (type->icon != NULL) - g_object_unref (type->icon); - - g_free (type); -} - - -/* Helper functions. */ - -/* Notice that, if passed a NULL pointer, this string will construct a - zero-element NULL-terminated string array instead of returning NULL itself - (i.e. it will return a pointer to a single g_malloc()ed NULL pointer). */ -static char ** -duplicate_null_terminated_string_array (char *array[]) -{ - char **new; - int count; - int i; - - if (array == NULL) { - count = 0; - } else { - for (count = 0; array[count] != NULL; count++) - ; - } - - new = g_new (char *, count + 1); - - for (i = 0; i < count; i++) - new[i] = g_strdup (array[i]); - new[count] = NULL; - - return new; -} - -/* The following will create a CORBA sequence of strings from the specified - * NULL-terminated array, without duplicating the strings. */ -static void -fill_corba_sequence_from_null_terminated_string_array (CORBA_sequence_CORBA_string *corba_sequence, - char **array) -{ - int count; - int i; - - g_assert (corba_sequence != NULL); - g_assert (array != NULL); - - CORBA_sequence_set_release (corba_sequence, TRUE); - - count = 0; - while (array[count] != NULL) - count++; - - corba_sequence->_maximum = count; - corba_sequence->_length = count; - corba_sequence->_buffer = CORBA_sequence_CORBA_string_allocbuf (count); - - for (i = 0; i < count; i++) - corba_sequence->_buffer[i] = CORBA_string_dup (array[i]); - - CORBA_sequence_set_release (corba_sequence, TRUE); -} - - -#if 0 -/* Owner pinging. */ - -static gboolean -owner_ping_callback (void *data) -{ - EvolutionShellComponent *shell_component; - EvolutionShellComponentPrivate *priv; - Bonobo_Unknown owner_objref; - CORBA_Environment ev; - gboolean alive; - - shell_component = EVOLUTION_SHELL_COMPONENT (data); - priv = shell_component->priv; - - owner_objref = evolution_shell_client_corba_objref (priv->owner_client); - - if (owner_objref == CORBA_OBJECT_NIL) - return FALSE; - - /* We are duplicating the object here, as we might get an ::unsetOwner - while we invoke the pinging, and this would make the objref invalid - and thus crash the stubs (cfr. #13802). */ - - CORBA_exception_init (&ev); - owner_objref = CORBA_Object_duplicate (owner_objref, &ev); - - alive = bonobo_unknown_ping (owner_objref, NULL); - - CORBA_Object_release (owner_objref, &ev); - CORBA_exception_free (&ev); - - if (alive) - return TRUE; - - /* This is tricky. During the pinging, we might have gotten an - ::unsetOwner invocation which has invalidated our owner_client. In - this case, no "owner_died" should be emitted. */ - - if (priv->owner_client != NULL) { - g_print ("\t*** The shell has disappeared\n"); - g_signal_emit (shell_component, signals[OWNER_DIED], 0); - } - - priv->ping_timeout_id = -1; - - return FALSE; -} - -static void -setup_owner_pinging (EvolutionShellComponent *shell_component) -{ - EvolutionShellComponentPrivate *priv; - GNOME_Evolution_Shell shell_corba_objref; - - priv = shell_component->priv; - - shell_corba_objref = evolution_shell_client_corba_objref (priv->owner_client); - - if (priv->ping_timeout_id != -1) - g_source_remove (priv->ping_timeout_id); - - priv->ping_timeout_id = g_timeout_add (PING_DELAY, owner_ping_callback, shell_component); -} -#endif - - -/* CORBA interface implementation. */ - -static GNOME_Evolution_FolderTypeList * -impl__get_supportedTypes (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionShellComponent *shell_component; - EvolutionShellComponentPrivate *priv; - GNOME_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 = GNOME_Evolution_FolderTypeList__alloc (); - CORBA_sequence_set_release (folder_type_list, TRUE); - folder_type_list->_length = g_list_length (priv->folder_types); - folder_type_list->_maximum = folder_type_list->_length; - folder_type_list->_buffer = CORBA_sequence_GNOME_Evolution_FolderType_allocbuf (folder_type_list->_maximum); - - for (p = priv->folder_types, i = 0; p != NULL; p = p->next, i++) { - GNOME_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->iconName = CORBA_string_dup (folder_type->icon_name); - corba_folder_type->displayName = CORBA_string_dup (folder_type->display_name); - corba_folder_type->description = CORBA_string_dup (folder_type->description); - corba_folder_type->userCreatable = folder_type->user_creatable; - - fill_corba_sequence_from_null_terminated_string_array (& corba_folder_type->acceptedDndTypes, - folder_type->accepted_dnd_types); - fill_corba_sequence_from_null_terminated_string_array (& corba_folder_type->exportedDndTypes, - folder_type->exported_dnd_types); - } - - CORBA_sequence_set_release (folder_type_list, TRUE); - - return folder_type_list; -} - -static GNOME_Evolution_URISchemaList * -impl__get_externalUriSchemas (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - EvolutionShellComponent *shell_component; - EvolutionShellComponentPrivate *priv; - GNOME_Evolution_URISchemaList *uri_schema_list; - GList *p; - int i; - - shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object_from_servant (servant)); - priv = shell_component->priv; - - uri_schema_list = GNOME_Evolution_URISchemaList__alloc (); - - /* FIXME: We could probably keep this to FALSE and avoid - CORBA_string_duplicating. */ - CORBA_sequence_set_release (uri_schema_list, TRUE); - - if (priv->external_uri_schemas == NULL) { - uri_schema_list->_length = 0; - uri_schema_list->_maximum = 0; - uri_schema_list->_buffer = NULL; - return uri_schema_list; - } - - uri_schema_list->_length = g_list_length (priv->external_uri_schemas); - uri_schema_list->_maximum = uri_schema_list->_length; - uri_schema_list->_buffer = CORBA_sequence_GNOME_Evolution_URISchema_allocbuf (uri_schema_list->_maximum); - - for (p = priv->external_uri_schemas, i = 0; p != NULL; p = p->next, i++) { - const char *schema; - - schema = (const char *) p->data; - uri_schema_list->_buffer[i] = CORBA_string_dup (schema); - } - - CORBA_sequence_set_release (uri_schema_list, TRUE); - - return uri_schema_list; -} - -static GNOME_Evolution_UserCreatableItemTypeList * -impl__get_userCreatableItemTypes (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - EvolutionShellComponent *shell_component; - EvolutionShellComponentPrivate *priv; - GNOME_Evolution_UserCreatableItemTypeList *list; - GSList *p; - int i; - - shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object_from_servant (servant)); - priv = shell_component->priv; - - list = GNOME_Evolution_UserCreatableItemTypeList__alloc (); - list->_maximum = g_slist_length (priv->user_creatable_item_types); - list->_length = list->_maximum; - list->_buffer = CORBA_sequence_GNOME_Evolution_UserCreatableItemType_allocbuf (list->_maximum); - - for (p = priv->user_creatable_item_types, i = 0; p != NULL; p = p->next, i ++) { - GNOME_Evolution_UserCreatableItemType *corba_type; - const UserCreatableItemType *type; - - corba_type = list->_buffer + i; - type = (const UserCreatableItemType *) p->data; - - corba_type->id = CORBA_string_dup (type->id); - corba_type->description = CORBA_string_dup (type->description); - corba_type->menuDescription = CORBA_string_dup (type->menu_description); - corba_type->tooltip = CORBA_string_dup (type->tooltip != NULL ? type->tooltip : ""); - corba_type->folderType = CORBA_string_dup (type->folder_type != NULL ? type->folder_type : ""); - corba_type->menuShortcut = type->menu_shortcut; - - e_store_corba_icon_from_pixbuf (type->icon, & corba_type->icon); - } - - CORBA_sequence_set_release (list, TRUE); - - return list; -} - -static void -impl_setOwner (PortableServer_Servant servant, - const GNOME_Evolution_Shell shell, - const CORBA_char *evolution_homedir, - CORBA_Environment *ev) -{ - EvolutionShellComponent *shell_component; - EvolutionShellComponentPrivate *priv; - - shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object_from_servant (servant)); - priv = shell_component->priv; - - if (priv->owner_client != NULL) { - int owner_is_dead; - - owner_is_dead = CORBA_Object_non_existent - (evolution_shell_client_corba_objref (priv->owner_client), ev); - if (ev->_major != CORBA_NO_EXCEPTION) - owner_is_dead = TRUE; - - if (! owner_is_dead) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_ShellComponent_AlreadyOwned, NULL); - } else { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_ShellComponent_OldOwnerHasDied, NULL); - - g_signal_emit (shell_component, signals[OWNER_DIED], 0); - } - - return; - } - - if (ev->_major == CORBA_NO_EXCEPTION) { -#if 0 - BonoboObject *local_object; -#endif - - priv->owner_client = evolution_shell_client_new (shell); - g_signal_emit (shell_component, signals[OWNER_SET], 0, priv->owner_client, evolution_homedir); - -#if 0 - /* Set up pinging of the shell (to realize if it's gone unexpectedly) when in the - non-local case. */ - local_object = bonobo_object (ORBit_small_get_servant (shell)); - if (local_object == NULL) - setup_owner_pinging (shell_component); -#endif - } -} - -static void -impl_unsetOwner (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_GNOME_Evolution_ShellComponent_NotOwned, NULL); - return; - } - - g_signal_emit (shell_component, signals[OWNER_UNSET], 0); -} - -static void -impl_debug (PortableServer_Servant servant, - const CORBA_char *log_path, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionShellComponent *shell_component; - int fd; - - bonobo_object = bonobo_object_from_servant (servant); - shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object); - - fd = open (log_path, O_WRONLY | O_APPEND); - if (!fd) - return; - - dup2 (fd, STDOUT_FILENO); - dup2 (fd, STDERR_FILENO); - close (fd); - - g_signal_emit (shell_component, signals[DEBUG], 0); -} - -static void -impl_interactive (PortableServer_Servant servant, - CORBA_boolean interactive, - CORBA_unsigned_long new_view_xid, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionShellComponent *shell_component; - - bonobo_object = bonobo_object_from_servant (servant); - shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object); - - if (interactive) - shell_component->priv->parent_view_xid = new_view_xid; - else - shell_component->priv->parent_view_xid = 0L; - - g_signal_emit (shell_component, signals[INTERACTIVE], 0, - interactive, new_view_xid); -} - -static Bonobo_Control -impl_createView (PortableServer_Servant servant, - const CORBA_char *physical_uri, - const CORBA_char *type, - const CORBA_char *view_info, - 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, - view_info, &control, priv->closure); - - if (result != EVOLUTION_SHELL_COMPONENT_OK) { - switch (result) { - case EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDTYPE: - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_ShellComponent_UnsupportedType, - NULL); - break; - case EVOLUTION_SHELL_COMPONENT_INTERNALERROR: - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_ShellComponent_InternalError, - NULL); - break; - default: - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_ShellComponent_NotFound, - NULL); - } - - return CORBA_OBJECT_NIL; - } - - return CORBA_Object_duplicate (bonobo_object_corba_objref (BONOBO_OBJECT (control)), ev); -} - -static void -impl_handleExternalURI (PortableServer_Servant servant, - const CORBA_char *uri, - CORBA_Environment *ev) -{ - EvolutionShellComponent *shell_component; - - shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object_from_servant (servant)); - - g_signal_emit (shell_component, signals[HANDLE_EXTERNAL_URI], 0, uri); -} - -static void -impl_createFolderAsync (PortableServer_Servant servant, - const GNOME_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) { - GNOME_Evolution_ShellComponentListener_notifyResult (listener, - GNOME_Evolution_ShellComponentListener_UNSUPPORTED_OPERATION, - ev); - return; - } - - (* priv->create_folder_fn) (shell_component, physical_uri, type, listener, priv->closure); -} - -static void -impl_removeFolderAsync (PortableServer_Servant servant, - const GNOME_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->remove_folder_fn == NULL) { - GNOME_Evolution_ShellComponentListener_notifyResult (listener, - GNOME_Evolution_ShellComponentListener_UNSUPPORTED_OPERATION, - ev); - return; - } - - (* priv->remove_folder_fn) (shell_component, physical_uri, type, listener, priv->closure); -} - -static void -impl_xferFolderAsync (PortableServer_Servant servant, - const GNOME_Evolution_ShellComponentListener listener, - const CORBA_char *source_physical_uri, - const CORBA_char *destination_physical_uri, - const CORBA_char *type, - const CORBA_boolean remove_source, - 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->xfer_folder_fn == NULL) { - GNOME_Evolution_ShellComponentListener_notifyResult (listener, - GNOME_Evolution_ShellComponentListener_UNSUPPORTED_OPERATION, - ev); - return; - } - - (* priv->xfer_folder_fn) (shell_component, - source_physical_uri, - destination_physical_uri, - type, - remove_source, - listener, - priv->closure); -} - -static void -impl_populateFolderContextMenu (PortableServer_Servant servant, - const Bonobo_UIContainer corba_uih, - 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->populate_folder_context_menu_fn == NULL) - return; - - if (priv->uic != NULL) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_ShellComponent_AlreadyPopulated, - NULL); - return; - } - - priv->uic = bonobo_ui_component_new_default (); - bonobo_ui_component_set_container (priv->uic, corba_uih, NULL); - - (* priv->populate_folder_context_menu_fn) (shell_component, priv->uic, physical_uri, type, priv->closure); -} - -static void -impl_unpopulateFolderContextMenu (PortableServer_Servant servant, - const Bonobo_UIContainer corba_uih, - 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->unpopulate_folder_context_menu_fn == NULL) - return; - - if (priv->uic == NULL) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_ShellComponent_NotPopulated, - NULL); - return; - } - - (* priv->unpopulate_folder_context_menu_fn) (shell_component, priv->uic, physical_uri, type, priv->closure); - - bonobo_object_unref (BONOBO_OBJECT (priv->uic)); - priv->uic = NULL; -} - -static void -impl_userCreateNewItem (PortableServer_Servant servant, - const CORBA_char *id, - const CORBA_char *parent_physical_uri, - const CORBA_char *parent_type, - CORBA_Environment *ev) -{ - EvolutionShellComponent *shell_component; - EvolutionShellComponentPrivate *priv; - - shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object_from_servant (servant)); - priv = shell_component->priv; - - /* FIXME: Check that the type is good. */ - - g_signal_emit (shell_component, signals[USER_CREATE_NEW_ITEM], 0, id, parent_physical_uri, parent_type); -} - -static void -impl_sendReceive (PortableServer_Servant servant, - const CORBA_boolean show_dialog, - CORBA_Environment *ev) -{ - EvolutionShellComponent *shell_component; - - shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object_from_servant (servant)); - g_signal_emit (shell_component, signals[SEND_RECEIVE], 0, show_dialog); -} - -static void -impl_requestQuit (PortableServer_Servant servant, - const GNOME_Evolution_ShellComponentListener listener, - CORBA_Environment *ev) -{ - EvolutionShellComponent *shell_component; - gboolean allow_quit; - - shell_component = EVOLUTION_SHELL_COMPONENT (bonobo_object_from_servant (servant)); - - if (shell_component->priv->request_quit_fn == NULL) - allow_quit = TRUE; - else - allow_quit = (* shell_component->priv->request_quit_fn) (shell_component, - shell_component->priv->closure); - - if (allow_quit) - GNOME_Evolution_ShellComponentListener_notifyResult (listener, - GNOME_Evolution_ShellComponentListener_OK, - ev); - else - GNOME_Evolution_ShellComponentListener_notifyResult (listener, - GNOME_Evolution_ShellComponentListener_CANCEL, - ev); -} - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - EvolutionShellComponent *shell_component; - EvolutionShellComponentPrivate *priv; - - shell_component = EVOLUTION_SHELL_COMPONENT (object); - - priv = shell_component->priv; - - if (priv->ping_timeout_id != -1) { - g_source_remove (priv->ping_timeout_id); - priv->ping_timeout_id = -1; - } - - if (priv->owner_client != NULL) { - g_object_unref (priv->owner_client); - priv->owner_client = NULL; - } - - if (priv->uic != NULL) { - bonobo_object_unref (BONOBO_OBJECT (priv->uic)); - priv->uic = NULL; - } - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EvolutionShellComponent *shell_component; - EvolutionShellComponentPrivate *priv; - GSList *sp; - GList *p; - - shell_component = EVOLUTION_SHELL_COMPONENT (object); - - priv = shell_component->priv; - - 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_strfreev (folder_type->exported_dnd_types); - g_strfreev (folder_type->accepted_dnd_types); - - g_free (folder_type); - } - g_list_free (priv->folder_types); - - e_free_string_list (priv->external_uri_schemas); - - for (sp = priv->user_creatable_item_types; sp != NULL; sp = sp->next) - user_creatable_item_type_free ((UserCreatableItemType *) sp->data); - g_slist_free (priv->user_creatable_item_types); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -/* EvolutionShellComponent methods. */ - -static void -impl_owner_unset (EvolutionShellComponent *shell_component) -{ - EvolutionShellComponentPrivate *priv; - - priv = shell_component->priv; - - if (priv->ping_timeout_id != -1) { - g_source_remove (priv->ping_timeout_id); - priv->ping_timeout_id = -1; - } - - g_object_unref (priv->owner_client); - priv->owner_client = NULL; -} - -static void -impl_owner_died (EvolutionShellComponent *shell_component) -{ - EvolutionShellComponentPrivate *priv; - - priv = shell_component->priv; - - g_object_unref (priv->owner_client); - priv->owner_client = NULL; - - /* The default implementation for ::owner_died emits ::owner_unset, so - that we make the behavior for old components kind of correct without - even if they don't handle the new ::owner_died signal correctly - yet. */ - - g_signal_emit (shell_component, signals[OWNER_UNSET], 0); -} - - -/* Initialization. */ - -static void -evolution_shell_component_class_init (EvolutionShellComponentClass *klass) -{ - EvolutionShellComponentClass *shell_component_class; - GObjectClass *object_class; - POA_GNOME_Evolution_ShellComponent__epv *epv = &klass->epv; - - object_class = G_OBJECT_CLASS (klass); - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - signals[OWNER_SET] - = g_signal_new ("owner_set", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionShellComponentClass, owner_set), - NULL, NULL, - e_shell_marshal_NONE__POINTER_POINTER, - G_TYPE_NONE, 2, - G_TYPE_POINTER, G_TYPE_POINTER); - - signals[OWNER_DIED] - = g_signal_new ("owner_died", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionShellComponentClass, owner_died), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - signals[OWNER_UNSET] - = g_signal_new ("owner_unset", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionShellComponentClass, owner_unset), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - signals[DEBUG] - = g_signal_new ("debug", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionShellComponentClass, debug), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - signals[INTERACTIVE] - = g_signal_new ("interactive", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionShellComponentClass, interactive), - NULL, NULL, - e_shell_marshal_NONE__BOOL_INT, - G_TYPE_NONE, 2, - G_TYPE_BOOLEAN, - G_TYPE_INT); - - signals[HANDLE_EXTERNAL_URI] - = g_signal_new ("handle_external_uri", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionShellComponentClass, handle_external_uri), - NULL, NULL, - e_shell_marshal_NONE__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); - - signals[USER_CREATE_NEW_ITEM] - = g_signal_new ("user_create_new_item", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionShellComponentClass, user_create_new_item), - NULL, NULL, - e_shell_marshal_VOID__STRING_STRING_STRING, - G_TYPE_NONE, 3, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_STRING); - - signals[SEND_RECEIVE] - = g_signal_new ("send_receive", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionShellComponentClass, send_receive), - NULL, NULL, - e_shell_marshal_NONE__BOOL, - G_TYPE_NONE, 1, - G_TYPE_BOOLEAN); - - parent_class = g_type_class_ref(PARENT_TYPE); - - epv->_get_supportedTypes = impl__get_supportedTypes; - epv->_get_externalUriSchemas = impl__get_externalUriSchemas; - epv->_get_userCreatableItemTypes = impl__get_userCreatableItemTypes; - epv->setOwner = impl_setOwner; - epv->unsetOwner = impl_unsetOwner; - epv->debug = impl_debug; - epv->interactive = impl_interactive; - epv->createView = impl_createView; - epv->handleExternalURI = impl_handleExternalURI; - epv->createFolderAsync = impl_createFolderAsync; - epv->removeFolderAsync = impl_removeFolderAsync; - epv->xferFolderAsync = impl_xferFolderAsync; - epv->populateFolderContextMenu = impl_populateFolderContextMenu; - epv->unpopulateFolderContextMenu = impl_unpopulateFolderContextMenu; - epv->userCreateNewItem = impl_userCreateNewItem; - epv->sendReceive = impl_sendReceive; - epv->requestQuit = impl_requestQuit; - - shell_component_class = EVOLUTION_SHELL_COMPONENT_CLASS (object_class); - shell_component_class->owner_died = impl_owner_died; - shell_component_class->owner_unset = impl_owner_unset; -} - -static void -evolution_shell_component_init (EvolutionShellComponent *shell_component) -{ - EvolutionShellComponentPrivate *priv; - - priv = g_new (EvolutionShellComponentPrivate, 1); - - priv->folder_types = NULL; - priv->external_uri_schemas = NULL; - - priv->create_view_fn = NULL; - priv->create_folder_fn = NULL; - priv->remove_folder_fn = NULL; - priv->xfer_folder_fn = NULL; - priv->populate_folder_context_menu_fn = NULL; - priv->unpopulate_folder_context_menu_fn = NULL; - - priv->owner_client = NULL; - priv->user_creatable_item_types = NULL; - priv->closure = NULL; - - priv->ping_timeout_id = -1; - - priv->uic = NULL; - - shell_component->priv = priv; -} - - -void -evolution_shell_component_construct (EvolutionShellComponent *shell_component, - const EvolutionShellComponentFolderType folder_types[], - const char *external_uri_schemas[], - EvolutionShellComponentCreateViewFn create_view_fn, - EvolutionShellComponentCreateFolderFn create_folder_fn, - EvolutionShellComponentRemoveFolderFn remove_folder_fn, - EvolutionShellComponentXferFolderFn xfer_folder_fn, - EvolutionShellComponentPopulateFolderContextMenuFn populate_folder_context_menu_fn, - EvolutionShellComponentUnpopulateFolderContextMenuFn unpopulate_folder_context_menu_fn, - EvolutionShellComponentGetDndSelectionFn get_dnd_selection_fn, - EvolutionShellComponentRequestQuitFn request_quit_fn, - void *closure) -{ - EvolutionShellComponentPrivate *priv; - int i; - - g_return_if_fail (shell_component != NULL); - g_return_if_fail (EVOLUTION_IS_SHELL_COMPONENT (shell_component)); - g_return_if_fail (folder_types != NULL); - - 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->xfer_folder_fn = xfer_folder_fn; - priv->populate_folder_context_menu_fn = populate_folder_context_menu_fn; - priv->unpopulate_folder_context_menu_fn = unpopulate_folder_context_menu_fn; - priv->get_dnd_selection_fn = get_dnd_selection_fn; - priv->request_quit_fn = request_quit_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); - - /* Notice that these get translated here. */ - new->display_name = g_strdup (_(folder_types[i].display_name)); - new->description = g_strdup (_(folder_types[i].description)); - - new->user_creatable = folder_types[i].user_creatable; - new->accepted_dnd_types = duplicate_null_terminated_string_array (folder_types[i].accepted_dnd_types); - new->exported_dnd_types = duplicate_null_terminated_string_array (folder_types[i].exported_dnd_types); - - 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); - - if (external_uri_schemas != NULL) { - for (i = 0; external_uri_schemas[i] != NULL; i++) - priv->external_uri_schemas = g_list_prepend (priv->external_uri_schemas, - g_strdup (external_uri_schemas[i])); - } -} - -EvolutionShellComponent * -evolution_shell_component_new (const EvolutionShellComponentFolderType folder_types[], - const char *external_uri_schemas[], - EvolutionShellComponentCreateViewFn create_view_fn, - EvolutionShellComponentCreateFolderFn create_folder_fn, - EvolutionShellComponentRemoveFolderFn remove_folder_fn, - EvolutionShellComponentXferFolderFn xfer_folder_fn, - EvolutionShellComponentPopulateFolderContextMenuFn populate_folder_context_menu_fn, - EvolutionShellComponentUnpopulateFolderContextMenuFn unpopulate_folder_context_menu_fn, - EvolutionShellComponentGetDndSelectionFn get_dnd_selection_fn, - EvolutionShellComponentRequestQuitFn request_quit_fn, - void *closure) -{ - EvolutionShellComponent *new; - - g_return_val_if_fail (folder_types != NULL, NULL); - - new = g_object_new (evolution_shell_component_get_type (), NULL); - - evolution_shell_component_construct (new, - folder_types, - external_uri_schemas, - create_view_fn, - create_folder_fn, - remove_folder_fn, - xfer_folder_fn, - populate_folder_context_menu_fn, - unpopulate_folder_context_menu_fn, - get_dnd_selection_fn, - request_quit_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; -} - -gulong evolution_shell_component_get_parent_view_xid(EvolutionShellComponent *shell_component) -{ - g_return_val_if_fail (shell_component != NULL, 0); - g_return_val_if_fail (EVOLUTION_IS_SHELL_COMPONENT (shell_component), 0); - - return shell_component->priv->parent_view_xid; -} - - -void -evolution_shell_component_add_user_creatable_item (EvolutionShellComponent *shell_component, - const char *id, - const char *description, - const char *menu_description, - const char *tooltip, - const char *folder_type, - char menu_shortcut, - GdkPixbuf *icon) -{ - EvolutionShellComponentPrivate *priv; - UserCreatableItemType *type; - - g_return_if_fail (shell_component != NULL); - g_return_if_fail (EVOLUTION_IS_SHELL_COMPONENT (shell_component)); - g_return_if_fail (id != NULL); - g_return_if_fail (description != NULL); - g_return_if_fail (menu_description != NULL); - - priv = shell_component->priv; - - type = user_creatable_item_type_new (id, description, menu_description, tooltip, folder_type, menu_shortcut, icon); - - priv->user_creatable_item_types = g_slist_prepend (priv->user_creatable_item_types, type); -} - - -/* Public utility functions. */ - -const char * -evolution_shell_component_result_to_string (EvolutionShellComponentResult result) -{ - switch (result) { - case EVOLUTION_SHELL_COMPONENT_OK: - return _("Success"); - case EVOLUTION_SHELL_COMPONENT_CANCEL: - return _("Cancel"); - case EVOLUTION_SHELL_COMPONENT_CORBAERROR: - return _("CORBA error"); - case EVOLUTION_SHELL_COMPONENT_INTERRUPTED: - return _("Interrupted"); - case EVOLUTION_SHELL_COMPONENT_INVALIDARG: - return _("Invalid argument"); - case EVOLUTION_SHELL_COMPONENT_ALREADYOWNED: - return _("Already has an owner"); - case EVOLUTION_SHELL_COMPONENT_NOTOWNED: - return _("No owner"); - case EVOLUTION_SHELL_COMPONENT_NOTFOUND: - return _("Not found"); - case EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDTYPE: - return _("Unsupported type"); - case EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDSCHEMA: - return _("Unsupported schema"); - case EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDOPERATION: - return _("Unsupported operation"); - case EVOLUTION_SHELL_COMPONENT_INTERNALERROR: - return _("Internal error"); - case EVOLUTION_SHELL_COMPONENT_BUSY: - return _("Busy"); - case EVOLUTION_SHELL_COMPONENT_EXISTS: - return _("Exists"); - case EVOLUTION_SHELL_COMPONENT_INVALIDURI: - return _("Invalid URI"); - case EVOLUTION_SHELL_COMPONENT_PERMISSIONDENIED: - return _("Permission denied"); - case EVOLUTION_SHELL_COMPONENT_HASSUBFOLDERS: - return _("Has subfolders"); - case EVOLUTION_SHELL_COMPONENT_NOSPACE: - return _("No space left"); - case EVOLUTION_SHELL_COMPONENT_OLDOWNERHASDIED: - return _("Old owner has died"); - case EVOLUTION_SHELL_COMPONENT_UNKNOWNERROR: - default: - return _("Unknown error"); - } -} - - -BONOBO_TYPE_FUNC_FULL (EvolutionShellComponent, - GNOME_Evolution_ShellComponent, - PARENT_TYPE, - evolution_shell_component) diff --git a/shell/evolution-shell-component.h b/shell/evolution-shell-component.h deleted file mode 100644 index 53d9a4aae9..0000000000 --- a/shell/evolution-shell-component.h +++ /dev/null @@ -1,217 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-shell-component.h - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 - -#include "Evolution.h" - -#include "evolution-shell-client.h" - -#include <gdk-pixbuf/gdk-pixbuf.h> - -#include <bonobo/bonobo-object.h> -#include <bonobo/bonobo-control.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)) - -#define EVOLUTION_SHELL_COMPONENT_POPUP_PLACEHOLDER "/popups/FolderPopup/ComponentPlaceholder/Items" - - -typedef struct _EvolutionShellComponent EvolutionShellComponent; -typedef struct _EvolutionShellComponentPrivate EvolutionShellComponentPrivate; -typedef struct _EvolutionShellComponentClass EvolutionShellComponentClass; - -enum _EvolutionShellComponentResult { - EVOLUTION_SHELL_COMPONENT_OK, - EVOLUTION_SHELL_COMPONENT_CANCEL, - 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_UNSUPPORTEDSCHEMA, - 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_OLDOWNERHASDIED, - EVOLUTION_SHELL_COMPONENT_UNKNOWNERROR -}; -typedef enum _EvolutionShellComponentResult EvolutionShellComponentResult; - -typedef EvolutionShellComponentResult (* EvolutionShellComponentCreateViewFn) - (EvolutionShellComponent *shell_component, - const char *physical_uri, - const char *type, - const char *view_info, - BonoboControl **control_return, - void *closure); -typedef void (* EvolutionShellComponentCreateFolderFn) (EvolutionShellComponent *shell_component, - const char *physical_uri, - const char *type, - const GNOME_Evolution_ShellComponentListener listener, - void *closure); -typedef void (* EvolutionShellComponentRemoveFolderFn) (EvolutionShellComponent *shell_component, - const char *physical_uri, - const char *type, - const GNOME_Evolution_ShellComponentListener listener, - void *closure); -typedef void (* EvolutionShellComponentXferFolderFn) (EvolutionShellComponent *shell_component, - const char *source_physical_uri, - const char *destination_physical_uri, - const char *type, - gboolean remove_source, - const GNOME_Evolution_ShellComponentListener listener, - void *closure); -typedef void (* EvolutionShellComponentPopulateFolderContextMenuFn) (EvolutionShellComponent *shell_component, - BonoboUIComponent *uic, - const char *physical_uri, - const char *type, - void *closure); -typedef void (* EvolutionShellComponentUnpopulateFolderContextMenuFn) (EvolutionShellComponent *shell_component, - BonoboUIComponent *uic, - const char *physical_uri, - const char *type, - void *closure); -typedef char * (* EvolutionShellComponentGetDndSelectionFn) (EvolutionShellComponent *shell_component, - const char *physical_uri, - int type, - int *format_return, - const char **selection_return, - int *selection_length_return, - void *closure); - -typedef gboolean (* EvolutionShellComponentRequestQuitFn) (EvolutionShellComponent *shell_component, - void *closure); - -struct _EvolutionShellComponentFolderType { - char *name; - char *icon_name; - char *display_name; - char *description; - - gboolean user_creatable; - - /* The following are NULL-terminated arrays. */ - char **accepted_dnd_types; - char **exported_dnd_types; -}; -typedef struct _EvolutionShellComponentFolderType EvolutionShellComponentFolderType; - -struct _EvolutionShellComponent { - BonoboObject parent; - - EvolutionShellComponentPrivate *priv; -}; - -struct _EvolutionShellComponentClass { - BonoboObjectClass parent_class; - - POA_GNOME_Evolution_ShellComponent__epv epv; - - /* Signals. */ - - void (* owner_set) (EvolutionShellComponent *shell_component, - EvolutionShellClient *shell_client, - const char *evolution_homedir); - void (* owner_unset) (EvolutionShellComponent *shell_component); - void (* owner_died) (EvolutionShellComponent *shell_component); - - void (* debug) (EvolutionShellComponent *shell_component); - - void (* interactive) (EvolutionShellComponent *shell_component, - gboolean is_interactive, - unsigned long new_view_xid); - - void (* handle_external_uri) (EvolutionShellComponent *shell_component, - const char *uri); - - void (* user_create_new_item) (EvolutionShellComponent *shell_component, - const char *id, - const char *parent_folder_physical_uri, - const char *parent_folder_type); - - void (* send_receive) (EvolutionShellComponent *shell_component, - gboolean show_dialog); -}; - - -GtkType evolution_shell_component_get_type (void); -void evolution_shell_component_construct (EvolutionShellComponent *shell_component, - const EvolutionShellComponentFolderType folder_types[], - const char *external_uri_schemas[], - EvolutionShellComponentCreateViewFn create_view_fn, - EvolutionShellComponentCreateFolderFn create_folder_fn, - EvolutionShellComponentRemoveFolderFn remove_folder_fn, - EvolutionShellComponentXferFolderFn xfer_folder_fn, - EvolutionShellComponentPopulateFolderContextMenuFn populate_folder_context_menu_fn, - EvolutionShellComponentUnpopulateFolderContextMenuFn unpopulate_folder_context_menu_fn, - EvolutionShellComponentGetDndSelectionFn get_dnd_selection_fn, - EvolutionShellComponentRequestQuitFn request_quit_fn, - void *closure); -EvolutionShellComponent *evolution_shell_component_new (const EvolutionShellComponentFolderType folder_types[], - const char *external_uri_schemas[], - EvolutionShellComponentCreateViewFn create_view_fn, - EvolutionShellComponentCreateFolderFn create_folder_fn, - EvolutionShellComponentRemoveFolderFn remove_folder_fn, - EvolutionShellComponentXferFolderFn xfer_folder_fn, - EvolutionShellComponentPopulateFolderContextMenuFn populate_folder_context_menu_fn, - EvolutionShellComponentUnpopulateFolderContextMenuFn unpopulate_folder_context_menu_fn, - EvolutionShellComponentGetDndSelectionFn get_dnd_selection_fn, - EvolutionShellComponentRequestQuitFn request_quit_fn, - void *closure); -EvolutionShellClient *evolution_shell_component_get_owner (EvolutionShellComponent *shell_component); - -gulong evolution_shell_component_get_parent_view_xid(EvolutionShellComponent *shell_component); - -void evolution_shell_component_add_user_creatable_item (EvolutionShellComponent *shell_component, - const char *id, - const char *description, - const char *menu_description, - const char *tooltip, - const char *folder_type, - char menu_shortcut, - GdkPixbuf *icon); - -const char *evolution_shell_component_result_to_string (EvolutionShellComponentResult result); - -#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 4858d18e24..0000000000 --- a/shell/evolution-shell-view.c +++ /dev/null @@ -1,258 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-shell-view.c - * - * Copyright (C) 2000, 2001, 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <gal/util/e-util.h> - -#include "evolution-shell-view.h" - -#include "e-shell-marshal.h" - - -#define PARENT_TYPE bonobo_object_get_type () -static BonoboObjectClass *parent_class = NULL; - -struct _EvolutionShellViewPrivate { - int dummy; -}; - -enum { - SET_MESSAGE, - UNSET_MESSAGE, - CHANGE_VIEW, - SET_TITLE, - SET_FOLDER_BAR_LABEL, - SHOW_SETTINGS, - LAST_SIGNAL -}; -static int signals[LAST_SIGNAL] = { 0 }; - - -/* CORBA interface implementation. */ - -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); - g_signal_emit (bonobo_object, signals[SET_MESSAGE], 0, message, busy); -} - -static void -impl_ShellView_unset_message (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - - bonobo_object = bonobo_object_from_servant (servant); - g_signal_emit (bonobo_object, signals[UNSET_MESSAGE], 0); -} - -static void -impl_ShellView_change_current_view (PortableServer_Servant servant, - const CORBA_char *uri, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - - bonobo_object = bonobo_object_from_servant (servant); - g_signal_emit (bonobo_object, signals[CHANGE_VIEW], 0, uri); -} - -static void -impl_ShellView_set_title (PortableServer_Servant servant, - const CORBA_char *title, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - - bonobo_object = bonobo_object_from_servant (servant); - g_signal_emit (bonobo_object, signals[SET_TITLE], 0, title); -} - -static void -impl_ShellView_set_folder_bar_label (PortableServer_Servant servant, - const CORBA_char *text, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - - bonobo_object = bonobo_object_from_servant (servant); - g_signal_emit (bonobo_object, signals[SET_FOLDER_BAR_LABEL], 0, text); -} - -static void -impl_ShellView_show_settings (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - - bonobo_object = bonobo_object_from_servant (servant); - g_signal_emit (bonobo_object, signals[SHOW_SETTINGS], 0); -} - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - /* Nothing to do here. */ - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EvolutionShellView *shell_view; - EvolutionShellViewPrivate *priv; - - shell_view = EVOLUTION_SHELL_VIEW (object); - priv = shell_view->priv; - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -evolution_shell_view_class_init (EvolutionShellViewClass *klass) -{ - POA_GNOME_Evolution_ShellView__epv *epv; - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - epv = &klass->epv; - epv->setMessage = impl_ShellView_set_message; - epv->unsetMessage = impl_ShellView_unset_message; - epv->changeCurrentView = impl_ShellView_change_current_view; - epv->setTitle = impl_ShellView_set_title; - epv->setFolderBarLabel = impl_ShellView_set_folder_bar_label; - epv->showSettings = impl_ShellView_show_settings; - - signals[SET_MESSAGE] - = g_signal_new ("set_message", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionShellViewClass, set_message), - NULL, NULL, - e_shell_marshal_NONE__STRING_BOOL, - G_TYPE_NONE, 2, - G_TYPE_STRING, - G_TYPE_BOOLEAN); - - signals[UNSET_MESSAGE] - = g_signal_new ("unset_message", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionShellViewClass, unset_message), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - signals[CHANGE_VIEW] - = g_signal_new ("change_current_view", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionShellViewClass, change_current_view), - NULL, NULL, - e_shell_marshal_NONE__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); - - signals[SET_TITLE] - = g_signal_new ("set_title", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionShellViewClass, set_title), - NULL, NULL, - e_shell_marshal_NONE__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); - - signals[SET_FOLDER_BAR_LABEL] - = g_signal_new ("set_folder_bar_label", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionShellViewClass, set_folder_bar_label), - NULL, NULL, - e_shell_marshal_NONE__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); - - signals[SHOW_SETTINGS] - = g_signal_new ("show_settings", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionShellViewClass, show_settings), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - parent_class = g_type_class_ref(bonobo_object_get_type ()); -} - -static void -evolution_shell_view_init (EvolutionShellView *shell_view) -{ - EvolutionShellViewPrivate *priv; - - priv = g_new (EvolutionShellViewPrivate, 1); - priv->dummy = 0; - - shell_view->priv = priv; -} - - - -/** - * evolution_shell_view_new: - * - * Create a new EvolutionShellView object. - * - * Return value: The new EvolutionShellView object. - **/ -EvolutionShellView * -evolution_shell_view_new (void) -{ - return g_object_new (evolution_shell_view_get_type (), NULL); -} - - -BONOBO_TYPE_FUNC_FULL (EvolutionShellView, - GNOME_Evolution_ShellView, - PARENT_TYPE, - evolution_shell_view) diff --git a/shell/evolution-shell-view.h b/shell/evolution-shell-view.h deleted file mode 100644 index 0646b42162..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 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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__ - -#include <glib.h> -#include <bonobo/bonobo-object.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); - void (* change_current_view) (EvolutionShellView *shell_view, const char *uri); - void (* set_title) (EvolutionShellView *shell_view, const char *message); - void (* set_folder_bar_label) (EvolutionShellView *shell_view, const char *text); - void (* show_settings) (EvolutionShellView *shell_view); - - POA_GNOME_Evolution_ShellView__epv epv; -}; - - -GtkType evolution_shell_view_get_type (void); -EvolutionShellView *evolution_shell_view_new (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __EVOLUTION_SHELL_VIEW_H__ */ diff --git a/shell/evolution-storage-listener.c b/shell/evolution-storage-listener.c deleted file mode 100644 index 3961014846..0000000000 --- a/shell/evolution-storage-listener.c +++ /dev/null @@ -1,386 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-storage-listener.c - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <bonobo/bonobo-main.h> -#include <gal/util/e-util.h> - -#include "evolution-storage-listener.h" - -#include "e-shell-marshal.h" - - -#define PARENT_TYPE gtk_object_get_type () -static GtkObjectClass *parent_class = NULL; - -struct _EvolutionStorageListenerPrivate { - GNOME_Evolution_StorageListener corba_objref; - EvolutionStorageListenerServant *servant; -}; - - -enum { - DESTROYED, - NEW_FOLDER, - UPDATE_FOLDER, - REMOVED_FOLDER, - HAS_SUBFOLDERS, - LAST_SIGNAL -}; -static guint signals[LAST_SIGNAL] = { 0 }; - - -/* Evolution::StorageListener implementation. */ - -static POA_GNOME_Evolution_StorageListener__vepv my_GNOME_Evolution_StorageListener_vepv; - -static EvolutionStorageListener * -gtk_object_from_servant (PortableServer_Servant servant) -{ - EvolutionStorageListenerServant *my_servant; - - my_servant = (EvolutionStorageListenerServant *) servant; - return my_servant->gtk_object; -} - -static void -impl_GNOME_Evolution_StorageListener_notifyDestroyed (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - EvolutionStorageListener *listener; - EvolutionStorageListenerPrivate *priv; - - listener = gtk_object_from_servant (servant); - priv = listener->priv; - - g_signal_emit (listener, signals[DESTROYED], 0); -} - -static void -impl_GNOME_Evolution_StorageListener_notifyFolderCreated (PortableServer_Servant servant, - const CORBA_char *path, - const GNOME_Evolution_Folder *folder, - CORBA_Environment *ev) -{ - EvolutionStorageListener *listener; - EvolutionStorageListenerPrivate *priv; - - listener = gtk_object_from_servant (servant); - priv = listener->priv; - - g_signal_emit (listener, signals[NEW_FOLDER], 0, path, folder); -} - -static void -impl_GNOME_Evolution_StorageListener_notifyFolderUpdated (PortableServer_Servant servant, - const CORBA_char *path, - CORBA_long unread_count, - CORBA_Environment *ev) -{ - EvolutionStorageListener *listener; - EvolutionStorageListenerPrivate *priv; - - listener = gtk_object_from_servant (servant); - priv = listener->priv; - - g_signal_emit (listener, signals[UPDATE_FOLDER], 0, path, unread_count); -} - -static void -impl_GNOME_Evolution_StorageListener_notifyFolderRemoved (PortableServer_Servant servant, - const CORBA_char *path, - CORBA_Environment *ev) -{ - EvolutionStorageListener *listener; - EvolutionStorageListenerPrivate *priv; - - listener = gtk_object_from_servant (servant); - priv = listener->priv; - - g_signal_emit (listener, signals[REMOVED_FOLDER], 0, path); -} - -static void -impl_GNOME_Evolution_StorageListener_notifyHasSubfolders (PortableServer_Servant servant, - const CORBA_char *path, - const CORBA_char *message, - CORBA_Environment *ev) -{ - EvolutionStorageListener *listener; - EvolutionStorageListenerPrivate *priv; - - listener = gtk_object_from_servant (servant); - priv = listener->priv; - - g_signal_emit (listener, signals[HAS_SUBFOLDERS], 0, path, message); -} - -static EvolutionStorageListenerServant * -create_servant (EvolutionStorageListener *listener) -{ - EvolutionStorageListenerServant *servant; - POA_GNOME_Evolution_StorageListener *corba_servant; - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - servant = g_new0 (EvolutionStorageListenerServant, 1); - corba_servant = (POA_GNOME_Evolution_StorageListener *) servant; - - corba_servant->vepv = &my_GNOME_Evolution_StorageListener_vepv; - POA_GNOME_Evolution_StorageListener__init ((PortableServer_Servant) corba_servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_free (servant); - CORBA_exception_free (&ev); - return NULL; - } - - servant->gtk_object = listener; - - CORBA_exception_free (&ev); - - return servant; -} - -static GNOME_Evolution_StorageListener -activate_servant (EvolutionStorageListener *listener, - POA_GNOME_Evolution_StorageListener *servant) -{ - GNOME_Evolution_StorageListener corba_object; - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - CORBA_free (PortableServer_POA_activate_object (bonobo_poa (), servant, &ev)); - - corba_object = PortableServer_POA_servant_to_reference (bonobo_poa(), servant, &ev); - - if (ev._major == CORBA_NO_EXCEPTION && ! CORBA_Object_is_nil (corba_object, &ev)) { - CORBA_exception_free (&ev); - return corba_object; - } - - CORBA_exception_free (&ev); - - return CORBA_OBJECT_NIL; -} - - -/* GObject methods. */ - -static void -impl_finalize (GObject *object) -{ - EvolutionStorageListener *storage_listener; - EvolutionStorageListenerPrivate *priv; - CORBA_Environment ev; - - storage_listener = EVOLUTION_STORAGE_LISTENER (object); - priv = storage_listener->priv; - - CORBA_exception_init (&ev); - - if (priv->corba_objref != CORBA_OBJECT_NIL) - CORBA_Object_release (priv->corba_objref, &ev); - - if (priv->servant != NULL) { - PortableServer_ObjectId *object_id; - - object_id = PortableServer_POA_servant_to_id (bonobo_poa(), priv->servant, &ev); - PortableServer_POA_deactivate_object (bonobo_poa (), object_id, &ev); - CORBA_free (object_id); - } - - CORBA_exception_free (&ev); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -corba_class_init (void) -{ - POA_GNOME_Evolution_StorageListener__vepv *vepv; - POA_GNOME_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_GNOME_Evolution_StorageListener__epv, 1); - epv->notifyDestroyed = impl_GNOME_Evolution_StorageListener_notifyDestroyed; - epv->notifyFolderCreated = impl_GNOME_Evolution_StorageListener_notifyFolderCreated; - epv->notifyFolderUpdated = impl_GNOME_Evolution_StorageListener_notifyFolderUpdated; - epv->notifyFolderRemoved = impl_GNOME_Evolution_StorageListener_notifyFolderRemoved; - epv->notifyHasSubfolders = impl_GNOME_Evolution_StorageListener_notifyHasSubfolders; - - vepv = & my_GNOME_Evolution_StorageListener_vepv; - vepv->_base_epv = base_epv; - vepv->GNOME_Evolution_StorageListener_epv = epv; -} - -static void -class_init (EvolutionStorageListenerClass *klass) -{ - GObjectClass *object_class; - - parent_class = g_type_class_ref(PARENT_TYPE); - - object_class = G_OBJECT_CLASS (klass); - object_class->finalize = impl_finalize; - - signals[DESTROYED] - = g_signal_new ("destroyed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionStorageListenerClass, destroyed), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - signals[NEW_FOLDER] - = g_signal_new ("new_folder", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionStorageListenerClass, new_folder), - NULL, NULL, - e_shell_marshal_NONE__STRING_POINTER, - G_TYPE_NONE, 2, - G_TYPE_STRING, - G_TYPE_POINTER); - - signals[UPDATE_FOLDER] - = g_signal_new ("update_folder", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionStorageListenerClass, update_folder), - NULL, NULL, - e_shell_marshal_NONE__STRING_INT, - G_TYPE_NONE, 2, - G_TYPE_STRING, - G_TYPE_INT); - - signals[REMOVED_FOLDER] - = g_signal_new ("removed_folder", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionStorageListenerClass, removed_folder), - NULL, NULL, - e_shell_marshal_NONE__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); - - signals[HAS_SUBFOLDERS] - = g_signal_new ("has_subfolders", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionStorageListenerClass, has_subfolders), - NULL, NULL, - e_shell_marshal_NONE__STRING_STRING, - G_TYPE_NONE, 2, - G_TYPE_STRING, - G_TYPE_STRING); - - corba_class_init (); -} - -static void -init (EvolutionStorageListener *storage_listener) -{ - EvolutionStorageListenerPrivate *priv; - - priv = g_new (EvolutionStorageListenerPrivate, 1); - priv->corba_objref = CORBA_OBJECT_NIL; - - storage_listener->priv = priv; -} - - -void -evolution_storage_listener_construct (EvolutionStorageListener *listener, - GNOME_Evolution_StorageListener corba_objref) -{ - EvolutionStorageListenerPrivate *priv; - - g_return_if_fail (listener != NULL); - g_return_if_fail (corba_objref != CORBA_OBJECT_NIL); - - priv = listener->priv; - - g_return_if_fail (priv->corba_objref == CORBA_OBJECT_NIL); - - priv->corba_objref = corba_objref; - - GTK_OBJECT_UNSET_FLAGS (GTK_OBJECT (listener), GTK_FLOATING); -} - -EvolutionStorageListener * -evolution_storage_listener_new (void) -{ - EvolutionStorageListener *new; - EvolutionStorageListenerPrivate *priv; - GNOME_Evolution_StorageListener corba_objref; - - new = g_object_new (evolution_storage_listener_get_type (), NULL); - priv = new->priv; - - priv->servant = create_servant (new); - corba_objref = activate_servant (new, (POA_GNOME_Evolution_StorageListener *) priv->servant); - - evolution_storage_listener_construct (new, corba_objref); - - return new; -} - - -/** - * evolution_storage_listener_corba_objref: - * @listener: A pointer to an EvolutionStorageListener - * - * Get the CORBA object reference for the interface embedded in this GTK+ - * object wrapper. - * - * Return value: A pointer to the CORBA object reference. - **/ -GNOME_Evolution_StorageListener -evolution_storage_listener_corba_objref (EvolutionStorageListener *listener) -{ - EvolutionStorageListenerPrivate *priv; - - g_return_val_if_fail (listener != NULL, CORBA_OBJECT_NIL); - g_return_val_if_fail (EVOLUTION_IS_STORAGE_LISTENER (listener), CORBA_OBJECT_NIL); - - priv = listener->priv; - return priv->corba_objref; -} - - -E_MAKE_TYPE (evolution_storage_listener, "EvolutionStorageListener", EvolutionStorageListener, - class_init, init, PARENT_TYPE) diff --git a/shell/evolution-storage-listener.h b/shell/evolution-storage-listener.h deleted file mode 100644 index e48a3243f8..0000000000 --- a/shell/evolution-storage-listener.h +++ /dev/null @@ -1,94 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-storage-listener.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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_LISTENER_H__ -#define __EVOLUTION_STORAGE_LISTENER_H__ - -#include <gtk/gtkobject.h> -#include "Evolution.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define EVOLUTION_TYPE_STORAGE_LISTENER (evolution_storage_listener_get_type ()) -#define EVOLUTION_STORAGE_LISTENER(obj) (GTK_CHECK_CAST ((obj), EVOLUTION_TYPE_STORAGE_LISTENER, EvolutionStorageListener)) -#define EVOLUTION_STORAGE_LISTENER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_STORAGE_LISTENER, EvolutionStorageListenerClass)) -#define EVOLUTION_IS_STORAGE_LISTENER(obj) (GTK_CHECK_TYPE ((obj), EVOLUTION_TYPE_STORAGE_LISTENER)) -#define EVOLUTION_IS_STORAGE_LISTENER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_STORAGE_LISTENER)) - - -typedef struct _EvolutionStorageListener EvolutionStorageListener; -typedef struct _EvolutionStorageListenerPrivate EvolutionStorageListenerPrivate; -typedef struct _EvolutionStorageListenerClass EvolutionStorageListenerClass; - -struct _EvolutionStorageListener { - GtkObject parent; - - EvolutionStorageListenerPrivate *priv; -}; - -struct _EvolutionStorageListenerClass { - GtkObjectClass parent_class; - - /* Signals. */ - void (* destroyed) (EvolutionStorageListener *storage_listener); - void (* new_folder) (EvolutionStorageListener *storage_listener, - const char *path, - const GNOME_Evolution_Folder *folder); - void (* update_folder) (EvolutionStorageListener *storage_listener, - const char *path, - int unread_count); - void (* removed_folder) (EvolutionStorageListener *storage_listener, - const char *path); - void (* has_subfolders) (EvolutionStorageListener *storage_listener, - const char *path, - const char *message); - - void (* shared_folder_discovery_result) (EvolutionStorageListener *storage_listener, - const char *user, - const char *folder_name, - const char *storage_path, - const char *physical_uri); -}; - - -struct _EvolutionStorageListenerServant { - POA_GNOME_Evolution_StorageListener servant_placeholder; - EvolutionStorageListener *gtk_object; -}; -typedef struct _EvolutionStorageListenerServant EvolutionStorageListenerServant; - - -GtkType evolution_storage_listener_get_type (void); -void evolution_storage_listener_construct (EvolutionStorageListener *listener, - GNOME_Evolution_StorageListener corba_objref); -EvolutionStorageListener *evolution_storage_listener_new (void); - -GNOME_Evolution_StorageListener evolution_storage_listener_corba_objref (EvolutionStorageListener *listener); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __EVOLUTION_STORAGE_LISTENER_H__ */ diff --git a/shell/evolution-storage-set-view-factory.c b/shell/evolution-storage-set-view-factory.c deleted file mode 100644 index 7782d4cb5e..0000000000 --- a/shell/evolution-storage-set-view-factory.c +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-storage-set-view-factory.c - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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-storage-set-view.h" -#include "e-shell.h" -#include "evolution-storage-set-view.h" - -#include "evolution-storage-set-view-factory.h" - -#include <gtk/gtkscrolledwindow.h> - - -BonoboControl * -evolution_storage_set_view_factory_new_view (EShell *shell) -{ - EStorageSet *storage_set; - GtkWidget *storage_set_view; - BonoboControl *control; - EvolutionStorageSetView *storage_set_view_interface; - GtkWidget *scrolled_window; - - g_return_val_if_fail (shell != NULL, NULL); - g_return_val_if_fail (E_IS_SHELL (shell), NULL); - - storage_set = e_shell_get_storage_set (shell); - storage_set_view = e_storage_set_create_new_view (storage_set, NULL /*XXX*/); - e_storage_set_view_set_allow_dnd (E_STORAGE_SET_VIEW (storage_set_view), FALSE); - - storage_set_view_interface = evolution_storage_set_view_new (E_STORAGE_SET_VIEW (storage_set_view)); - if (storage_set_view_interface == NULL) { - gtk_widget_destroy (storage_set_view); - return NULL; - } - - 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_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), - GTK_SHADOW_IN); - - gtk_container_add (GTK_CONTAINER (scrolled_window), storage_set_view); - - gtk_widget_show (scrolled_window); - gtk_widget_show (storage_set_view); - - control = bonobo_control_new (scrolled_window); - bonobo_object_add_interface (BONOBO_OBJECT (control), BONOBO_OBJECT (storage_set_view_interface)); - - return control; -} diff --git a/shell/evolution-storage-set-view-factory.h b/shell/evolution-storage-set-view-factory.h deleted file mode 100644 index 75d45cf1b8..0000000000 --- a/shell/evolution-storage-set-view-factory.h +++ /dev/null @@ -1,30 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-storage-set-view-factory.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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_SET_VIEW_FACTORY_H -#define _EVOLUTION_STORAGE_SET_VIEW_FACTORY_H - -#include "e-shell.h" - -BonoboControl *evolution_storage_set_view_factory_new_view (EShell *shell); - -#endif /* _EVOLUTION_STORAGE_SET_VIEW_FACTORY_H */ diff --git a/shell/evolution-storage-set-view-listener.c b/shell/evolution-storage-set-view-listener.c deleted file mode 100644 index 3e78b97caa..0000000000 --- a/shell/evolution-storage-set-view-listener.c +++ /dev/null @@ -1,287 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-storage-set-view-listener.c - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 <bonobo/bonobo-main.h> -#include <gal/util/e-util.h> - -#include "evolution-storage-set-view-listener.h" - -#include "e-shell-marshal.h" - - -#define PARENT_TYPE gtk_object_get_type () -static GtkObjectClass *parent_class = NULL; - -struct _EvolutionStorageSetViewListenerPrivate { - GNOME_Evolution_StorageSetViewListener corba_listener; - EvolutionStorageSetViewListenerServant *servant; -}; - -enum { - FOLDER_SELECTED, - FOLDER_TOGGLED, - LAST_SIGNAL -}; -static guint signals[LAST_SIGNAL] = { 0 }; - - -/* Evolution::StorageSetViewListener implementation. */ - -static POA_GNOME_Evolution_StorageSetViewListener__vepv my_GNOME_Evolution_StorageSetViewListener_vepv; - -static EvolutionStorageSetViewListener * -gtk_object_from_servant (PortableServer_Servant servant) -{ - EvolutionStorageSetViewListenerServant *my_servant; - - my_servant = (EvolutionStorageSetViewListenerServant *) servant; - return my_servant->gtk_object; -} - -static void -impl_GNOME_Evolution_StorageSetViewListener_notifyFolderSelected (PortableServer_Servant servant, - const CORBA_char *uri, - CORBA_Environment *ev) -{ - EvolutionStorageSetViewListener *listener; - - listener = gtk_object_from_servant (servant); - - g_signal_emit (listener, signals[FOLDER_SELECTED], 0, uri); -} - -static void -impl_GNOME_Evolution_StorageSetViewListener_notifyFolderToggled (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - EvolutionStorageSetViewListener *listener; - - listener = gtk_object_from_servant (servant); - - g_signal_emit (listener, signals[FOLDER_TOGGLED], 0); -} - -static EvolutionStorageSetViewListenerServant * -create_servant (EvolutionStorageSetViewListener *listener) -{ - EvolutionStorageSetViewListenerServant *servant; - POA_GNOME_Evolution_StorageSetViewListener *corba_servant; - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - servant = g_new0 (EvolutionStorageSetViewListenerServant, 1); - corba_servant = (POA_GNOME_Evolution_StorageSetViewListener *) servant; - - corba_servant->vepv = &my_GNOME_Evolution_StorageSetViewListener_vepv; - POA_GNOME_Evolution_StorageSetViewListener__init ((PortableServer_Servant) corba_servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_free (servant); - CORBA_exception_free (&ev); - return NULL; - } - - servant->gtk_object = listener; - - CORBA_exception_free (&ev); - - return servant; -} - -static GNOME_Evolution_StorageSetViewListener -activate_servant (EvolutionStorageSetViewListener *listener, - POA_GNOME_Evolution_StorageSetViewListener *servant) -{ - GNOME_Evolution_StorageSetViewListener corba_object; - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - CORBA_free (PortableServer_POA_activate_object (bonobo_poa (), servant, &ev)); - - corba_object = PortableServer_POA_servant_to_reference (bonobo_poa(), servant, &ev); - - if (ev._major == CORBA_NO_EXCEPTION && ! CORBA_Object_is_nil (corba_object, &ev)) { - CORBA_exception_free (&ev); - return corba_object; - } - - CORBA_exception_free (&ev); - - return CORBA_OBJECT_NIL; -} - - -/* GObject methods. */ - -static void -impl_finalize (GObject *object) -{ - EvolutionStorageSetViewListener *listener; - EvolutionStorageSetViewListenerPrivate *priv; - CORBA_Environment ev; - - listener = EVOLUTION_STORAGE_SET_VIEW_LISTENER (object); - priv = listener->priv; - - CORBA_exception_init (&ev); - - if (priv->corba_listener != CORBA_OBJECT_NIL) - CORBA_Object_release (priv->corba_listener, &ev); - - if (priv->servant != NULL) { - PortableServer_ObjectId *object_id; - - object_id = PortableServer_POA_servant_to_id (bonobo_poa(), priv->servant, &ev); - PortableServer_POA_deactivate_object (bonobo_poa (), object_id, &ev); - CORBA_free (object_id); - } - - CORBA_exception_free (&ev); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -corba_class_init (void) -{ - POA_GNOME_Evolution_StorageSetViewListener__vepv *vepv; - POA_GNOME_Evolution_StorageSetViewListener__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_GNOME_Evolution_StorageSetViewListener__epv, 1); - epv->notifyFolderSelected = impl_GNOME_Evolution_StorageSetViewListener_notifyFolderSelected; - epv->notifyFolderToggled = impl_GNOME_Evolution_StorageSetViewListener_notifyFolderToggled; - - vepv = & my_GNOME_Evolution_StorageSetViewListener_vepv; - vepv->_base_epv = base_epv; - vepv->GNOME_Evolution_StorageSetViewListener_epv = epv; -} - -static void -class_init (EvolutionStorageSetViewListenerClass *klass) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - object_class->finalize = impl_finalize; - - parent_class = g_type_class_ref(gtk_object_get_type ()); - - signals[FOLDER_SELECTED] - = g_signal_new ("folder_selected", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionStorageSetViewListenerClass, folder_selected), - NULL, NULL, - e_shell_marshal_NONE__STRING, - G_TYPE_NONE, 1, - G_TYPE_STRING); - signals[FOLDER_TOGGLED] - = g_signal_new ("folder_toggled", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionStorageSetViewListenerClass, folder_toggled), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - corba_class_init (); -} - -static void -init (EvolutionStorageSetViewListener *storage_set_view_listener) -{ - EvolutionStorageSetViewListenerPrivate *priv; - - priv = g_new (EvolutionStorageSetViewListenerPrivate, 1); - priv->corba_listener = CORBA_OBJECT_NIL; - - storage_set_view_listener->priv = priv; -} - - -void -evolution_storage_set_view_listener_construct (EvolutionStorageSetViewListener *listener, - GNOME_Evolution_StorageSetViewListener corba_listener) -{ - EvolutionStorageSetViewListenerPrivate *priv; - - g_return_if_fail (listener != NULL); - g_return_if_fail (EVOLUTION_IS_STORAGE_SET_VIEW_LISTENER (listener)); - g_return_if_fail (corba_listener != CORBA_OBJECT_NIL); - - priv = listener->priv; - - g_return_if_fail (priv->corba_listener == CORBA_OBJECT_NIL); - - priv->corba_listener = corba_listener; - - GTK_OBJECT_UNSET_FLAGS (GTK_OBJECT (listener), GTK_FLOATING); -} - -EvolutionStorageSetViewListener * -evolution_storage_set_view_listener_new (void) -{ - EvolutionStorageSetViewListener *new; - EvolutionStorageSetViewListenerPrivate *priv; - GNOME_Evolution_StorageSetViewListener corba_listener; - - new = g_object_new (evolution_storage_set_view_listener_get_type (), NULL); - priv = new->priv; - - priv->servant = create_servant (new); - corba_listener = activate_servant (new, (POA_GNOME_Evolution_StorageSetViewListener *) priv->servant); - - evolution_storage_set_view_listener_construct (new, corba_listener); - - return new; -} - -GNOME_Evolution_StorageSetViewListener -evolution_storage_set_view_listener_corba_objref (EvolutionStorageSetViewListener *listener) -{ - EvolutionStorageSetViewListenerPrivate *priv; - - g_return_val_if_fail (listener != NULL, CORBA_OBJECT_NIL); - g_return_val_if_fail (EVOLUTION_IS_STORAGE_SET_VIEW_LISTENER (listener), CORBA_OBJECT_NIL); - - priv = listener->priv; - return priv->corba_listener; -} - - -E_MAKE_TYPE (evolution_storage_set_view_listener, "EvolutionStorageSetViewListener", EvolutionStorageSetViewListener, - class_init, init, PARENT_TYPE) diff --git a/shell/evolution-storage-set-view-listener.h b/shell/evolution-storage-set-view-listener.h deleted file mode 100644 index b81ab1ed30..0000000000 --- a/shell/evolution-storage-set-view-listener.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-storage-set-view-listener.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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_SET_VIEW_LISTENER_H_ -#define _EVOLUTION_STORAGE_SET_VIEW_LISTENER_H_ - -#include <gtk/gtkobject.h> - -#include "Evolution.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define EVOLUTION_TYPE_STORAGE_SET_VIEW_LISTENER (evolution_storage_set_view_listener_get_type ()) -#define EVOLUTION_STORAGE_SET_VIEW_LISTENER(obj) (GTK_CHECK_CAST ((obj), EVOLUTION_TYPE_STORAGE_SET_VIEW_LISTENER, EvolutionStorageSetViewListener)) -#define EVOLUTION_STORAGE_SET_VIEW_LISTENER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_STORAGE_SET_VIEW_LISTENER, EvolutionStorageSetViewListenerClass)) -#define EVOLUTION_IS_STORAGE_SET_VIEW_LISTENER(obj) (GTK_CHECK_TYPE ((obj), EVOLUTION_TYPE_STORAGE_SET_VIEW_LISTENER)) -#define EVOLUTION_IS_STORAGE_SET_VIEW_LISTENER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_STORAGE_SET_VIEW_LISTENER)) - - -typedef struct _EvolutionStorageSetViewListener EvolutionStorageSetViewListener; -typedef struct _EvolutionStorageSetViewListenerPrivate EvolutionStorageSetViewListenerPrivate; -typedef struct _EvolutionStorageSetViewListenerClass EvolutionStorageSetViewListenerClass; - -struct _EvolutionStorageSetViewListener { - GtkObject parent; - - EvolutionStorageSetViewListenerPrivate *priv; -}; - -struct _EvolutionStorageSetViewListenerClass { - GtkObjectClass parent_class; - - void (* folder_selected) (EvolutionStorageSetViewListener *listener, - const char *uri); - void (* folder_toggled) (EvolutionStorageSetViewListener *listener, - const char *uri, - gboolean active); -}; - - -struct _EvolutionStorageSetViewListenerServant { - POA_GNOME_Evolution_StorageSetViewListener servant_placeholder; - EvolutionStorageSetViewListener *gtk_object; -}; -typedef struct _EvolutionStorageSetViewListenerServant EvolutionStorageSetViewListenerServant; - - -GtkType evolution_storage_set_view_listener_get_type (void); -void evolution_storage_set_view_listener_construct (EvolutionStorageSetViewListener *listener, - GNOME_Evolution_StorageSetViewListener corba_objref); -EvolutionStorageSetViewListener *evolution_storage_set_view_listener_new (void); - -GNOME_Evolution_StorageSetViewListener evolution_storage_set_view_listener_corba_objref (EvolutionStorageSetViewListener *listener); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _EVOLUTION_STORAGE_SET_VIEW_LISTENER_H_ */ diff --git a/shell/evolution-storage-set-view.c b/shell/evolution-storage-set-view.c deleted file mode 100644 index 4d495e0dc1..0000000000 --- a/shell/evolution-storage-set-view.c +++ /dev/null @@ -1,481 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-storage-set-view.c - * - * Copyright (C) 2000, 2001, 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 "evolution-storage-set-view.h" -#include "e-shell-constants.h" - -#include <gal/util/e-util.h> - -#include <gtk/gtksignal.h> - -#include <string.h> - - -#define PARENT_TYPE bonobo_object_get_type () -static BonoboObjectClass *parent_class = NULL; - -struct _EvolutionStorageSetViewPrivate { - GtkWidget *storage_set_view_widget; - GList *listeners; -}; - - -/* EStorageSet widget callbacks. */ - -static void -storage_set_view_widget_folder_selected_cb (EStorageSetView *storage_set_view_widget, - const char *uri, - void *data) -{ - EvolutionStorageSetView *storage_set_view; - EvolutionStorageSetViewPrivate *priv; - GList *p; - - storage_set_view = EVOLUTION_STORAGE_SET_VIEW (data); - priv = storage_set_view->priv; - - for (p = priv->listeners; p != NULL; p = p->next) { - CORBA_Environment ev; - GNOME_Evolution_StorageSetViewListener listener; - - CORBA_exception_init (&ev); - - listener = (GNOME_Evolution_StorageSetViewListener) p->data; - GNOME_Evolution_StorageSetViewListener_notifyFolderSelected (listener, uri, &ev); - - /* FIXME: What if we fail? */ - - CORBA_exception_free (&ev); - } -} - -static void -storage_set_view_widget_folder_toggled_cb (EStorageSetView *storage_set_view_widget, - void *data) -{ - EvolutionStorageSetView *storage_set_view; - EvolutionStorageSetViewPrivate *priv; - GList *p; - - storage_set_view = EVOLUTION_STORAGE_SET_VIEW (data); - priv = storage_set_view->priv; - - for (p = priv->listeners; p != NULL; p = p->next) { - CORBA_Environment ev; - GNOME_Evolution_StorageSetViewListener listener; - - CORBA_exception_init (&ev); - - listener = (GNOME_Evolution_StorageSetViewListener) p->data; - GNOME_Evolution_StorageSetViewListener_notifyFolderToggled (listener, &ev); - - /* FIXME: What if we fail? */ - - CORBA_exception_free (&ev); - } -} - - -/* Listener handling. */ - -static GList * -find_listener_in_list (GNOME_Evolution_StorageSetViewListener listener, - GList *list) -{ - CORBA_Environment ev; - GList *p; - - CORBA_exception_init (&ev); - - for (p = list; p != NULL; p = p->next) { - GNOME_Evolution_StorageSetViewListener listener_item; - - listener_item = (GNOME_Evolution_StorageSetViewListener) p->data; - if (CORBA_Object_is_equivalent (listener, listener_item, &ev)) - break; - } - - CORBA_exception_free (&ev); - - return p; -} - -static gboolean -add_listener (EvolutionStorageSetView *storage_set_view, - GNOME_Evolution_StorageSetViewListener listener) -{ - EvolutionStorageSetViewPrivate *priv; - CORBA_Environment ev; - const char *current_uri; - GNOME_Evolution_StorageSetViewListener copy_of_listener; - - priv = storage_set_view->priv; - - if (find_listener_in_list (listener, priv->listeners) != NULL) - return FALSE; - - CORBA_exception_init (&ev); - - copy_of_listener = CORBA_Object_duplicate (listener, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - CORBA_exception_free (&ev); - return FALSE; - } - - priv->listeners = g_list_prepend (priv->listeners, copy_of_listener); - - current_uri = e_storage_set_view_get_current_folder (E_STORAGE_SET_VIEW (priv->storage_set_view_widget)); - if (current_uri != NULL) - GNOME_Evolution_StorageSetViewListener_notifyFolderSelected (listener, current_uri, &ev); - - CORBA_exception_free (&ev); - - return TRUE; -} - -static gboolean -remove_listener (EvolutionStorageSetView *storage_set_view, - GNOME_Evolution_StorageSetViewListener listener) -{ - EvolutionStorageSetViewPrivate *priv; - GList *listener_node; - CORBA_Environment ev; - - priv = storage_set_view->priv; - - listener_node = find_listener_in_list (listener, priv->listeners); - if (listener_node == NULL) - return FALSE; - - CORBA_exception_init (&ev); - CORBA_Object_release ((CORBA_Object) listener_node->data, &ev); - CORBA_exception_free (&ev); - - priv->listeners = g_list_remove_link (priv->listeners, listener_node); - - return TRUE; -} - - -/* CORBA interface implementation. */ - -static void -impl_StorageSetView_add_listener (PortableServer_Servant servant, - const GNOME_Evolution_StorageSetViewListener listener, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionStorageSetView *storage_set_view; - - bonobo_object = bonobo_object_from_servant (servant); - storage_set_view = EVOLUTION_STORAGE_SET_VIEW (bonobo_object); - - if (! add_listener (storage_set_view, listener)) - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_StorageSetView_AlreadyListening, NULL); -} - -static void -impl_StorageSetView_remove_listener (PortableServer_Servant servant, - const GNOME_Evolution_StorageSetViewListener listener, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionStorageSetView *storage_set_view; - - bonobo_object = bonobo_object_from_servant (servant); - storage_set_view = EVOLUTION_STORAGE_SET_VIEW (bonobo_object); - - if (! remove_listener (storage_set_view, listener)) - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_StorageSetView_NotFound, NULL); -} - -static CORBA_boolean -impl_StorageSetView__get_showFolders (PortableServer_Servant servant, - CORBA_Environment * ev) -{ - BonoboObject *bonobo_object; - EvolutionStorageSetView *storage_set_view; - EvolutionStorageSetViewPrivate *priv; - - bonobo_object = bonobo_object_from_servant (servant); - storage_set_view = EVOLUTION_STORAGE_SET_VIEW (bonobo_object); - priv = storage_set_view->priv; - - return e_storage_set_view_get_show_folders (E_STORAGE_SET_VIEW (priv->storage_set_view_widget)); -} - -static void -impl_StorageSetView__set_showFolders (PortableServer_Servant servant, - const CORBA_boolean value, - CORBA_Environment * ev) -{ - BonoboObject *bonobo_object; - EvolutionStorageSetView *storage_set_view; - EvolutionStorageSetViewPrivate *priv; - - bonobo_object = bonobo_object_from_servant (servant); - storage_set_view = EVOLUTION_STORAGE_SET_VIEW (bonobo_object); - priv = storage_set_view->priv; - - e_storage_set_view_set_show_folders (E_STORAGE_SET_VIEW (priv->storage_set_view_widget), value); -} - -static void -impl_StorageSetView__set_showCheckboxes (PortableServer_Servant servant, - const CORBA_boolean value, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionStorageSetView *storage_set_view; - EvolutionStorageSetViewPrivate *priv; - - bonobo_object = bonobo_object_from_servant (servant); - storage_set_view = EVOLUTION_STORAGE_SET_VIEW (bonobo_object); - priv = storage_set_view->priv; - - e_storage_set_view_set_show_checkboxes (E_STORAGE_SET_VIEW (priv->storage_set_view_widget), - value, NULL, NULL); -} - -static CORBA_boolean -impl_StorageSetView__get_showCheckboxes (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionStorageSetView *storage_set_view; - EvolutionStorageSetViewPrivate *priv; - - bonobo_object = bonobo_object_from_servant (servant); - storage_set_view = EVOLUTION_STORAGE_SET_VIEW (bonobo_object); - priv = storage_set_view->priv; - - return e_storage_set_view_get_show_checkboxes (E_STORAGE_SET_VIEW (priv->storage_set_view_widget)); -} - -static void -impl_StorageSetView__set_checkedFolders (PortableServer_Servant servant, - const GNOME_Evolution_FolderList *list, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionStorageSetView *storage_set_view; - EvolutionStorageSetViewPrivate *priv; - GSList *path_list = NULL; - int i; - - bonobo_object = bonobo_object_from_servant (servant); - storage_set_view = EVOLUTION_STORAGE_SET_VIEW (bonobo_object); - priv = storage_set_view->priv; - - for (i = 0; i < list->_length; i++) { - if (strncmp (list->_buffer[i].evolutionUri, "evolution:", 10) != 0) - continue; - - path_list = g_slist_append (path_list, g_strdup (list->_buffer[i].evolutionUri + 10)); - } - - e_storage_set_view_set_checkboxes_list (E_STORAGE_SET_VIEW (priv->storage_set_view_widget), - path_list); - - g_slist_foreach (path_list, (GFunc) g_free, NULL); - g_slist_free (path_list); -} - -static GNOME_Evolution_FolderList * -impl_StorageSetView__get_checkedFolders (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionStorageSetView *storage_set_view; - EvolutionStorageSetViewPrivate *priv; - EStorageSet *storage_set; - GNOME_Evolution_FolderList *return_list; - GSList *path_list; - GSList *p; - int num_folders; - int i; - - bonobo_object = bonobo_object_from_servant (servant); - storage_set_view = EVOLUTION_STORAGE_SET_VIEW (bonobo_object); - priv = storage_set_view->priv; - - path_list = e_storage_set_view_get_checkboxes_list (E_STORAGE_SET_VIEW (priv->storage_set_view_widget)); - num_folders = g_slist_length (path_list); - - return_list = GNOME_Evolution_FolderList__alloc (); - return_list->_maximum = num_folders; - return_list->_length = num_folders; - return_list->_buffer = CORBA_sequence_GNOME_Evolution_Folder_allocbuf (return_list->_maximum); - - storage_set = e_storage_set_view_get_storage_set (E_STORAGE_SET_VIEW (priv->storage_set_view_widget)); - - for (p = path_list, i = 0; p != NULL; p = p->next, i ++) { - EFolder *folder; - const char *path; - char *evolution_uri; - - path = (const char *) p->data; - - folder = e_storage_set_get_folder (storage_set, path); - if (folder == NULL) { - g_warning ("Cannot find folder -- %s", path); - - /* Subtract here so that we don't start putting - ininitialised blanks into the CORBA list */ - return_list->_length--; - i--; - continue; - } - - evolution_uri = g_strconcat (E_SHELL_URI_PREFIX, path, NULL); - e_folder_to_corba (folder, evolution_uri, return_list->_buffer + i); - g_free (evolution_uri); - } - - g_slist_foreach (path_list, (GFunc) g_free, NULL); - g_slist_free (path_list); - - CORBA_sequence_set_release (return_list, TRUE); - return return_list; -} - - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - /* (Nothing to do here.) */ - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EvolutionStorageSetView *storage_set_view; - EvolutionStorageSetViewPrivate *priv; - CORBA_Environment ev; - GList *p; - - storage_set_view = EVOLUTION_STORAGE_SET_VIEW (object); - priv = storage_set_view->priv; - - CORBA_exception_init (&ev); - - for (p = priv->listeners; p != NULL; p = p->next) { - GNOME_Evolution_StorageSetViewListener listener; - - listener = (GNOME_Evolution_StorageSetViewListener) p->data; - CORBA_Object_release (listener, &ev); - } - - CORBA_exception_free (&ev); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -evolution_storage_set_view_class_init (EvolutionStorageSetViewClass *klass) -{ - POA_GNOME_Evolution_StorageSetView__epv *epv; - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - epv = & (klass->epv); - epv->addListener = impl_StorageSetView_add_listener; - epv->removeListener = impl_StorageSetView_remove_listener; - epv->_set_showFolders = impl_StorageSetView__set_showFolders; - epv->_get_showFolders = impl_StorageSetView__get_showFolders; - epv->_set_showCheckboxes = impl_StorageSetView__set_showCheckboxes; - epv->_get_showCheckboxes = impl_StorageSetView__get_showCheckboxes; - epv->_set_checkedFolders = impl_StorageSetView__set_checkedFolders; - epv->_get_checkedFolders = impl_StorageSetView__get_checkedFolders; - - parent_class = g_type_class_ref(PARENT_TYPE); -} - -static void -evolution_storage_set_view_init (EvolutionStorageSetView *storage_set_view) -{ - EvolutionStorageSetViewPrivate *priv; - - priv = g_new (EvolutionStorageSetViewPrivate, 1); - priv->storage_set_view_widget = NULL; - priv->listeners = NULL; - - storage_set_view->priv = priv; -} - - -void -evolution_storage_set_view_construct (EvolutionStorageSetView *storage_set_view, - EStorageSetView *storage_set_view_widget) -{ - EvolutionStorageSetViewPrivate *priv; - - g_return_if_fail (EVOLUTION_IS_STORAGE_SET_VIEW (storage_set_view)); - g_return_if_fail (E_IS_STORAGE_SET_VIEW (storage_set_view_widget)); - - priv = storage_set_view->priv; - - g_assert (priv->storage_set_view_widget == NULL); - priv->storage_set_view_widget = GTK_WIDGET (storage_set_view_widget); - - g_signal_connect (priv->storage_set_view_widget, "folder_selected", - G_CALLBACK (storage_set_view_widget_folder_selected_cb), storage_set_view); - g_signal_connect (priv->storage_set_view_widget, "checkboxes_changed", - G_CALLBACK (storage_set_view_widget_folder_toggled_cb), storage_set_view); -} - -EvolutionStorageSetView * -evolution_storage_set_view_new (EStorageSetView *storage_set_view_widget) -{ - EvolutionStorageSetView *new; - - g_return_val_if_fail (storage_set_view_widget != NULL, NULL); - g_return_val_if_fail (E_IS_STORAGE_SET_VIEW (storage_set_view_widget), NULL); - - new = g_object_new (evolution_storage_set_view_get_type (), NULL); - - evolution_storage_set_view_construct (new, storage_set_view_widget); - - return new; -} - - -BONOBO_TYPE_FUNC_FULL (EvolutionStorageSetView, - GNOME_Evolution_StorageSetView, - PARENT_TYPE, - evolution_storage_set_view) diff --git a/shell/evolution-storage-set-view.h b/shell/evolution-storage-set-view.h deleted file mode 100644 index fcfbafc9a9..0000000000 --- a/shell/evolution-storage-set-view.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-storage-set-view.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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_SET_VIEW_H_ -#define _EVOLUTION_STORAGE_SET_VIEW_H_ - -#include <bonobo/bonobo-object.h> - -#include "e-storage-set-view.h" - -#include "Evolution.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define EVOLUTION_TYPE_STORAGE_SET_VIEW (evolution_storage_set_view_get_type ()) -#define EVOLUTION_STORAGE_SET_VIEW(obj) (GTK_CHECK_CAST ((obj), EVOLUTION_TYPE_STORAGE_SET_VIEW, EvolutionStorageSetView)) -#define EVOLUTION_STORAGE_SET_VIEW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_STORAGE_SET_VIEW, EvolutionStorageSetViewClass)) -#define EVOLUTION_IS_STORAGE_SET_VIEW(obj) (GTK_CHECK_TYPE ((obj), EVOLUTION_TYPE_STORAGE_SET_VIEW)) -#define EVOLUTION_IS_STORAGE_SET_VIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_STORAGE_SET_VIEW)) - - -typedef struct _EvolutionStorageSetView EvolutionStorageSetView; -typedef struct _EvolutionStorageSetViewPrivate EvolutionStorageSetViewPrivate; -typedef struct _EvolutionStorageSetViewClass EvolutionStorageSetViewClass; - -struct _EvolutionStorageSetView { - BonoboObject parent; - - EvolutionStorageSetViewPrivate *priv; -}; - -struct _EvolutionStorageSetViewClass { - BonoboObjectClass parent_class; - - POA_GNOME_Evolution_StorageSetView__epv epv; -}; - - -GtkType evolution_storage_set_view_get_type (void); -void evolution_storage_set_view_construct (EvolutionStorageSetView *storage_set_view, - EStorageSetView *storage_set_view_widget); -EvolutionStorageSetView *evolution_storage_set_view_new (EStorageSetView *storage_set_view_widget); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _EVOLUTION_STORAGE_SET_VIEW_H_ */ diff --git a/shell/evolution-storage.c b/shell/evolution-storage.c deleted file mode 100644 index b083e5d794..0000000000 --- a/shell/evolution-storage.c +++ /dev/null @@ -1,1349 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-storage.c - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 "evolution-storage.h" - -#include "Evolution.h" - -#include "e-folder.h" -#include "e-folder-tree.h" -#include "e-shell-constants.h" -#include "e-shell-corba-icon-utils.h" - -#include "e-shell-marshal.h" - -#include <string.h> -#include <gal/util/e-util.h> -#include <gtk/gtksignal.h> -#include <bonobo/bonobo-object.h> -#include <bonobo/bonobo-exception.h> -#include <gdk-pixbuf/gdk-pixbuf.h> -#include <glib.h> - - -#define PARENT_TYPE BONOBO_OBJECT_TYPE -static BonoboObjectClass *parent_class = NULL; - -struct _FolderPropertyItem { - char *label; - char *tooltip; - GdkPixbuf *icon; -}; -typedef struct _FolderPropertyItem FolderPropertyItem; - -struct _EvolutionStoragePrivate { - /* Name of the storage. */ - char *name; - - /* Whether there are shared folders in this storage. */ - gboolean has_shared_folders; - - /* What we will display as the name of the storage. */ - char *display_name; - - /* The set of folders we have in this storage. */ - EFolderTree *folder_tree; - - /* Mappings from URIs to folder tree paths. */ - GHashTable *uri_to_path; - - /* The listener registered on this storage. */ - GList *corba_storage_listeners; - - /* The property items. */ - GSList *folder_property_items; -}; - - -enum { - CREATE_FOLDER, - REMOVE_FOLDER, - XFER_FOLDER, - UPDATE_FOLDER, - OPEN_FOLDER, - DISCOVER_SHARED_FOLDER, - CANCEL_DISCOVER_SHARED_FOLDER, - REMOVE_SHARED_FOLDER, - SHOW_FOLDER_PROPERTIES, - - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - - -/* Utility functions. */ - -static void -list_through_listener_foreach (EFolderTree *tree, - const char *path, - void *data, - void *closure) -{ - const GNOME_Evolution_Folder *corba_folder; - GNOME_Evolution_StorageListener corba_listener; - CORBA_Environment ev; - - corba_folder = (GNOME_Evolution_Folder *) data; - corba_listener = (GNOME_Evolution_StorageListener) closure; - - /* The root folder has no data. */ - if (corba_folder == NULL) - return; - - CORBA_exception_init (&ev); - GNOME_Evolution_StorageListener_notifyFolderCreated (corba_listener, path, corba_folder, &ev); - CORBA_exception_free (&ev); -} - -static void -list_through_listener (EvolutionStorage *storage, - GNOME_Evolution_StorageListener listener, - CORBA_Environment *ev) -{ - EvolutionStoragePrivate *priv; - - priv = storage->priv; - - e_folder_tree_foreach (priv->folder_tree, - list_through_listener_foreach, - listener); -} - -static GList * -find_listener_in_list (const GNOME_Evolution_StorageListener listener, - GList *list) -{ - CORBA_Environment ev; - GList *p; - - CORBA_exception_init (&ev); - - for (p = list; p != NULL; p = p->next) { - GNOME_Evolution_StorageListener listener_item; - - listener_item = (GNOME_Evolution_StorageListener) p->data; - - if (CORBA_Object_is_equivalent (listener_item, listener, &ev) && ev._major == CORBA_NO_EXCEPTION) - return p; - } - - CORBA_exception_free (&ev); - - return NULL; -} - -static gboolean -add_listener (EvolutionStorage *storage, - const GNOME_Evolution_StorageListener listener) -{ - EvolutionStoragePrivate *priv; - GNOME_Evolution_StorageListener listener_copy; - CORBA_Environment ev; - - priv = storage->priv; - - if (find_listener_in_list (listener, priv->corba_storage_listeners) != NULL) - return FALSE; - - CORBA_exception_init (&ev); - - listener_copy = CORBA_Object_duplicate (listener, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - /* Panic. */ - g_warning ("EvolutionStorage -- Cannot duplicate listener."); - CORBA_exception_free (&ev); - - /* FIXME this will cause the ::add_listener implementation to - incorrectly raise `AlreadyListening' */ - return FALSE; - } - - priv->corba_storage_listeners = g_list_prepend (priv->corba_storage_listeners, - listener_copy); - - list_through_listener (storage, listener_copy, &ev); - - CORBA_exception_free (&ev); - - return TRUE; -} - -static gboolean -remove_listener (EvolutionStorage *storage, - const GNOME_Evolution_StorageListener listener) -{ - EvolutionStoragePrivate *priv; - CORBA_Environment ev; - GList *p; - - priv = storage->priv; - - p = find_listener_in_list (listener, priv->corba_storage_listeners); - if (p == NULL) - return FALSE; - - CORBA_exception_init (&ev); - CORBA_Object_release ((CORBA_Object) p->data, &ev); - CORBA_exception_free (&ev); - - priv->corba_storage_listeners = g_list_remove_link (priv->corba_storage_listeners, p); - - return TRUE; -} - - -/* Functions for the EFolderTree in the storage. */ - -static void -folder_destroy_notify (EFolderTree *tree, - const char *path, - void *data, - void *closure) -{ - GNOME_Evolution_Folder *corba_folder; - - corba_folder = (GNOME_Evolution_Folder *) data; - CORBA_free (data); -} - - -/* CORBA interface implementation. */ - -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); -} - -static CORBA_boolean -impl_Storage__get_hasSharedFolders (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 priv->has_shared_folders; -} - -static GNOME_Evolution_Folder * -impl_Storage_getFolderAtPath (PortableServer_Servant servant, - const CORBA_char *path, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionStorage *storage; - EvolutionStoragePrivate *priv; - GNOME_Evolution_Folder *corba_folder; - GNOME_Evolution_Folder *return_value; - - bonobo_object = bonobo_object_from_servant (servant); - storage = EVOLUTION_STORAGE (bonobo_object); - priv = storage->priv; - - corba_folder = e_folder_tree_get_folder (priv->folder_tree, path); - if (corba_folder == NULL) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Storage_NotFound, NULL); - return NULL; - } - - /* duplicate CORBA structure */ - return_value = GNOME_Evolution_Folder__alloc (); - return_value->type = CORBA_string_dup (corba_folder->type); - return_value->description = CORBA_string_dup (corba_folder->description); - return_value->displayName = CORBA_string_dup (corba_folder->displayName); - return_value->physicalUri = CORBA_string_dup (corba_folder->physicalUri); - return_value->evolutionUri = CORBA_string_dup (corba_folder->evolutionUri); - return_value->customIconName = CORBA_string_dup (corba_folder->customIconName); - return_value->unreadCount = corba_folder->unreadCount; - return_value->canSyncOffline = corba_folder->canSyncOffline; - return_value->sortingPriority = corba_folder->sortingPriority; - - return return_value; -} - -static void -get_folder_list_foreach (EFolderTree *tree, - const char *path, - void *data, - void *closure) -{ - const GNOME_Evolution_Folder *corba_folder; - GNOME_Evolution_Folder *new_corba_folder; - GNOME_Evolution_FolderList *folder_list; - - corba_folder = (GNOME_Evolution_Folder *) data; - folder_list = (GNOME_Evolution_FolderList *) closure; - - if (corba_folder == NULL) - return; - - new_corba_folder = folder_list->_buffer + folder_list->_length; - new_corba_folder->displayName = CORBA_string_dup (corba_folder->displayName); - new_corba_folder->description = CORBA_string_dup (corba_folder->description); - new_corba_folder->type = CORBA_string_dup (corba_folder->type); - new_corba_folder->physicalUri = CORBA_string_dup (corba_folder->physicalUri); - new_corba_folder->evolutionUri = CORBA_string_dup (corba_folder->evolutionUri); - new_corba_folder->unreadCount = corba_folder->unreadCount; - new_corba_folder->sortingPriority = corba_folder->sortingPriority; - new_corba_folder->customIconName = CORBA_string_dup (corba_folder->customIconName); - - folder_list->_length++; -} - -static GNOME_Evolution_FolderList * -impl_Storage__get_folderList (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionStorage *storage; - EvolutionStoragePrivate *priv; - GNOME_Evolution_FolderList *folder_list; - - bonobo_object = bonobo_object_from_servant (servant); - storage = EVOLUTION_STORAGE (bonobo_object); - priv = storage->priv; - - folder_list = GNOME_Evolution_FolderList__alloc (); - folder_list->_maximum = e_folder_tree_get_count (priv->folder_tree); - folder_list->_length = 0; - folder_list->_buffer = CORBA_sequence_GNOME_Evolution_Folder_allocbuf (folder_list->_maximum); - - e_folder_tree_foreach (priv->folder_tree, get_folder_list_foreach, folder_list); - - CORBA_sequence_set_release (folder_list, TRUE); - return folder_list; -} - -static void -impl_Storage_asyncCreateFolder (PortableServer_Servant servant, - const CORBA_char *path, - const CORBA_char *type, - const CORBA_char *description, - const CORBA_char *parent_physical_uri, - const Bonobo_Listener listener, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - CORBA_Object obj_dup; - EvolutionStorage *storage; - - bonobo_object = bonobo_object_from_servant (servant); - storage = EVOLUTION_STORAGE (bonobo_object); - - obj_dup = CORBA_Object_duplicate (listener, ev); - g_signal_emit (storage, signals[CREATE_FOLDER], 0, - obj_dup, path, type, description, parent_physical_uri); -} - - -static void -impl_Storage_asyncRemoveFolder (PortableServer_Servant servant, - const CORBA_char *path, - const CORBA_char *physical_uri, - const Bonobo_Listener listener, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionStorage *storage; - CORBA_Object obj_dup; - - bonobo_object = bonobo_object_from_servant (servant); - storage = EVOLUTION_STORAGE (bonobo_object); - - obj_dup = CORBA_Object_duplicate (listener, ev); - g_signal_emit (storage, signals[REMOVE_FOLDER], 0, - obj_dup, path, physical_uri); -} - -static void -impl_Storage_asyncXferFolder (PortableServer_Servant servant, - const CORBA_char *source_path, - const CORBA_char *destination_path, - const CORBA_boolean remove_source, - const Bonobo_Listener listener, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionStorage *storage; - CORBA_Object obj_dup; - - bonobo_object = bonobo_object_from_servant (servant); - storage = EVOLUTION_STORAGE (bonobo_object); - - obj_dup = CORBA_Object_duplicate (listener, ev); - g_signal_emit (storage, signals[XFER_FOLDER], 0, - obj_dup, source_path, destination_path, remove_source); -} - -static void -impl_Storage_updateFolder (PortableServer_Servant servant, - const CORBA_char *path, - CORBA_long unread_count, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionStoragePrivate *priv; - EvolutionStorage *storage; - GList *p; - - bonobo_object = bonobo_object_from_servant (servant); - storage = EVOLUTION_STORAGE (bonobo_object); - - g_signal_emit (storage, signals[UPDATE_FOLDER], 0, - path, unread_count); - - priv = storage->priv; - - if (priv->corba_storage_listeners == NULL) - return; - - for (p = priv->corba_storage_listeners; p != NULL; p = p->next) { - GNOME_Evolution_StorageListener listener; - CORBA_Environment my_ev; - - CORBA_exception_init (&my_ev); - - listener = p->data; - GNOME_Evolution_StorageListener_notifyFolderUpdated (listener, path, - unread_count, &my_ev); - - CORBA_exception_free (&my_ev); - } -} - -static void -impl_Storage_asyncOpenFolder (PortableServer_Servant servant, - const CORBA_char *path, - Bonobo_Listener listener, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionStorage *storage; - CORBA_Object obj_dup; - - bonobo_object = bonobo_object_from_servant (servant); - storage = EVOLUTION_STORAGE (bonobo_object); - - obj_dup = CORBA_Object_duplicate (listener, ev); - g_signal_emit (storage, signals[OPEN_FOLDER], 0, - obj_dup, path); -} - -static void -impl_Storage_asyncDiscoverSharedFolder (PortableServer_Servant servant, - const CORBA_char *user, - const CORBA_char *folder_name, - Bonobo_Listener listener, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionStorage *storage; - CORBA_Object obj_dup; - - bonobo_object = bonobo_object_from_servant (servant); - storage = EVOLUTION_STORAGE (bonobo_object); - - obj_dup = CORBA_Object_duplicate (listener, ev); - g_signal_emit (storage, signals[DISCOVER_SHARED_FOLDER], 0, - obj_dup, user, folder_name); -} - -static void -impl_Storage_cancelDiscoverSharedFolder (PortableServer_Servant servant, - const CORBA_char *user, - const CORBA_char *folder_name, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionStorage *storage; - - bonobo_object = bonobo_object_from_servant (servant); - storage = EVOLUTION_STORAGE (bonobo_object); - - g_signal_emit (storage, signals[CANCEL_DISCOVER_SHARED_FOLDER], 0, - user, folder_name); -} - -static void -impl_Storage_asyncRemoveSharedFolder (PortableServer_Servant servant, - const CORBA_char *path, - const Bonobo_Listener listener, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionStorage *storage; - CORBA_Object obj_dup; - - bonobo_object = bonobo_object_from_servant (servant); - storage = EVOLUTION_STORAGE (bonobo_object); - - obj_dup = CORBA_Object_duplicate (listener, ev); - g_signal_emit (storage, signals[REMOVE_SHARED_FOLDER], 0, - obj_dup, path); -} - -static void -impl_Storage_addListener (PortableServer_Servant servant, - const GNOME_Evolution_StorageListener listener, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionStorage *storage; - - bonobo_object = bonobo_object_from_servant (servant); - storage = EVOLUTION_STORAGE (bonobo_object); - - if (! add_listener (storage, listener)) - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Storage_AlreadyListening, NULL); -} - -static void -impl_Storage_removeListener (PortableServer_Servant servant, - const GNOME_Evolution_StorageListener listener, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionStorage *storage; - - bonobo_object = bonobo_object_from_servant (servant); - storage = EVOLUTION_STORAGE (bonobo_object); - - if (! remove_listener (storage, listener)) - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Storage_NotFound, NULL); -} - -static void -impl_Storage_showFolderProperties (PortableServer_Servant servant, - const CORBA_char *path, - const CORBA_short item_number, - const CORBA_long parent_window_id, - CORBA_Environment *ev) -{ - EvolutionStorage *storage; - - storage = EVOLUTION_STORAGE (bonobo_object_from_servant (servant)); - g_signal_emit (storage, signals[SHOW_FOLDER_PROPERTIES], 0, - path, item_number, parent_window_id); -} - -static GNOME_Evolution_Storage_FolderPropertyItemList * -impl_Storage__get_folderPropertyItems (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - EvolutionStorage *storage; - EvolutionStoragePrivate *priv; - GNOME_Evolution_Storage_FolderPropertyItemList *list; - GSList *p; - int count; - int i; - - storage = EVOLUTION_STORAGE (bonobo_object_from_servant (servant)); - priv = storage->priv; - - count = g_slist_length (priv->folder_property_items); - - list = GNOME_Evolution_Storage_FolderPropertyItemList__alloc (); - list->_length = list->_maximum = count; - list->_buffer = CORBA_sequence_GNOME_Evolution_Storage_FolderPropertyItem_allocbuf (list->_maximum); - - for (i = 0, p = priv->folder_property_items; p != NULL; i ++, p = p->next) { - const FolderPropertyItem *item; - - item = (const FolderPropertyItem *) p->data; - - list->_buffer[i].label = CORBA_string_dup (item->label); - list->_buffer[i].tooltip = CORBA_string_dup (item->tooltip); - e_store_corba_icon_from_pixbuf (item->icon, & list->_buffer[i].icon); - } - - CORBA_sequence_set_release (list, TRUE); - - return list; -} - - -/* GObject methods. */ - -static void -free_mapping (gpointer key, gpointer value, gpointer user_data) -{ - g_free (key); - g_free (value); -} - -static void -impl_dispose (GObject *object) -{ - EvolutionStorage *storage; - EvolutionStoragePrivate *priv; - CORBA_Environment ev; - GList *p; - - storage = EVOLUTION_STORAGE (object); - priv = storage->priv; - - CORBA_exception_init (&ev); - - for (p = priv->corba_storage_listeners; p != NULL; p = p->next) { - GNOME_Evolution_StorageListener listener; - - listener = p->data; - - GNOME_Evolution_StorageListener_notifyDestroyed (listener, &ev); - - /* (This is not a Bonobo object, so no unref.) */ - CORBA_Object_release (listener, &ev); - } - - g_list_free (priv->corba_storage_listeners); - priv->corba_storage_listeners = NULL; - - CORBA_exception_free (&ev); - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - EvolutionStorage *storage; - EvolutionStoragePrivate *priv; - GSList *sp; - - storage = EVOLUTION_STORAGE (object); - priv = storage->priv; - - g_free (priv->name); - if (priv->folder_tree != NULL) - e_folder_tree_destroy (priv->folder_tree); - if (priv->uri_to_path != NULL) { - g_hash_table_foreach (priv->uri_to_path, free_mapping, NULL); - g_hash_table_destroy (priv->uri_to_path); - } - - for (sp = priv->folder_property_items; sp != NULL; sp = sp->next) { - FolderPropertyItem *item; - - item = (FolderPropertyItem *) sp->data; - - g_free (item->label); - g_free (item->tooltip); - if (item->icon != NULL) - g_object_unref (item->icon); - g_free (item); - } - g_slist_free (priv->folder_property_items); - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -evolution_storage_class_init (EvolutionStorageClass *klass) -{ - POA_GNOME_Evolution_Storage__epv *epv; - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - epv = & klass->epv; - epv->_get_name = impl_Storage__get_name; - epv->_get_hasSharedFolders = impl_Storage__get_hasSharedFolders; - epv->getFolderAtPath = impl_Storage_getFolderAtPath; - epv->_get_folderList = impl_Storage__get_folderList; - epv->asyncCreateFolder = impl_Storage_asyncCreateFolder; - epv->asyncRemoveFolder = impl_Storage_asyncRemoveFolder; - epv->asyncXferFolder = impl_Storage_asyncXferFolder; - epv->asyncOpenFolder = impl_Storage_asyncOpenFolder; - epv->updateFolder = impl_Storage_updateFolder; - epv->asyncDiscoverSharedFolder = impl_Storage_asyncDiscoverSharedFolder; - epv->cancelDiscoverSharedFolder = impl_Storage_cancelDiscoverSharedFolder; - epv->asyncRemoveSharedFolder = impl_Storage_asyncRemoveSharedFolder; - epv->addListener = impl_Storage_addListener; - epv->removeListener = impl_Storage_removeListener; - epv->showFolderProperties = impl_Storage_showFolderProperties; - epv->_get_folderPropertyItems = impl_Storage__get_folderPropertyItems; - - parent_class = g_type_class_ref(PARENT_TYPE); - - signals[CREATE_FOLDER] - = g_signal_new ("create_folder", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EvolutionStorageClass, create_folder), - NULL, NULL, - e_shell_marshal_NONE__POINTER_STRING_STRING_STRING_STRING, - G_TYPE_NONE, 5, - G_TYPE_POINTER, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_STRING); - - signals[REMOVE_FOLDER] - = g_signal_new ("remove_folder", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EvolutionStorageClass, remove_folder), - NULL, NULL, - e_shell_marshal_NONE__POINTER_STRING_STRING, - G_TYPE_NONE, 3, - G_TYPE_POINTER, - G_TYPE_STRING, - G_TYPE_STRING); - - signals[XFER_FOLDER] - = g_signal_new ("xfer_folder", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EvolutionStorageClass, xfer_folder), - NULL, NULL, - e_shell_marshal_NONE__POINTER_STRING_STRING_BOOL, - G_TYPE_NONE, 4, - G_TYPE_POINTER, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_BOOLEAN); - - signals[UPDATE_FOLDER] - = g_signal_new ("update_folder", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionStorageClass, update_folder), - NULL, NULL, - e_shell_marshal_NONE__STRING_INT, - G_TYPE_NONE, 2, - G_TYPE_STRING, - G_TYPE_INT); - - signals[OPEN_FOLDER] - = g_signal_new ("open_folder", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EvolutionStorageClass, open_folder), - NULL, NULL, - e_shell_marshal_NONE__POINTER_STRING, - G_TYPE_NONE, 2, - G_TYPE_POINTER, - G_TYPE_STRING); - - signals[DISCOVER_SHARED_FOLDER] - = g_signal_new ("discover_shared_folder", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EvolutionStorageClass, discover_shared_folder), - NULL, NULL, - e_shell_marshal_NONE__POINTER_STRING_STRING, - G_TYPE_NONE, 3, - G_TYPE_POINTER, - G_TYPE_STRING, - G_TYPE_STRING); - - signals[CANCEL_DISCOVER_SHARED_FOLDER] - = g_signal_new ("cancel_discover_shared_folder", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EvolutionStorageClass, cancel_discover_shared_folder), - NULL, NULL, - e_shell_marshal_NONE__STRING_STRING, - G_TYPE_NONE, 2, - G_TYPE_STRING, - G_TYPE_STRING); - - signals[REMOVE_SHARED_FOLDER] - = g_signal_new ("remove_shared_folder", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EvolutionStorageClass, remove_shared_folder), - NULL, NULL, - e_shell_marshal_NONE__POINTER_STRING, - G_TYPE_NONE, 2, - G_TYPE_POINTER, - G_TYPE_STRING); - - signals[SHOW_FOLDER_PROPERTIES] - = g_signal_new ("show_folder_properties", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EvolutionStorageClass, show_folder_properties), - NULL, NULL, - e_shell_marshal_NONE__STRING_INT_INT, - G_TYPE_NONE, 3, - G_TYPE_STRING, - G_TYPE_INT, - G_TYPE_INT); -} - -static void -evolution_storage_init (EvolutionStorage *storage) -{ - EvolutionStoragePrivate *priv; - - priv = g_new (EvolutionStoragePrivate, 1); - priv->name = NULL; - priv->has_shared_folders = FALSE; - priv->folder_tree = e_folder_tree_new (folder_destroy_notify, storage); - priv->uri_to_path = g_hash_table_new (g_str_hash, g_str_equal); - priv->corba_storage_listeners = NULL; - priv->folder_property_items = NULL; - - storage->priv = priv; -} - - -void -evolution_storage_construct (EvolutionStorage *storage, - const char *name, - gboolean has_shared_folders) -{ - EvolutionStoragePrivate *priv; - - g_return_if_fail (EVOLUTION_IS_STORAGE (storage)); - g_return_if_fail (name != NULL); - g_return_if_fail (name[0] != '\0'); - - priv = storage->priv; - priv->name = g_strdup (name); - priv->has_shared_folders = !! has_shared_folders; -} - -EvolutionStorage * -evolution_storage_new (const char *name, - gboolean has_shared_folders) -{ - EvolutionStorage *new; - - g_return_val_if_fail (name != NULL, NULL); - g_return_val_if_fail (name[0] != '\0', NULL); - - new = g_object_new (evolution_storage_get_type (), 0); - - evolution_storage_construct (new, name, has_shared_folders); - - return new; -} - -void -evolution_storage_rename (EvolutionStorage *evolution_storage, - const char *new_name) -{ - /* FIXME: Implement me */ -} - -EvolutionStorageResult -evolution_storage_register (EvolutionStorage *evolution_storage, - GNOME_Evolution_StorageRegistry corba_storage_registry) -{ - EvolutionStorageResult result; - GNOME_Evolution_StorageListener corba_storage_listener; - GNOME_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_listeners != NULL) - return EVOLUTION_STORAGE_ERROR_ALREADYREGISTERED; - - CORBA_exception_init (&ev); - - corba_storage = bonobo_object_corba_objref (BONOBO_OBJECT (evolution_storage)); - corba_storage_listener = GNOME_Evolution_StorageRegistry_addStorage (corba_storage_registry, - corba_storage, - priv->name, - &ev); - - if (ev._major == CORBA_NO_EXCEPTION) { - add_listener (evolution_storage, 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_GNOME_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, - GNOME_Evolution_Shell corba_shell) -{ - GNOME_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_queryInterface (corba_shell, - "IDL:GNOME/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_deregister_on_shell (EvolutionStorage *evolution_storage, - GNOME_Evolution_Shell corba_shell) -{ - GNOME_Evolution_StorageRegistry corba_storage_registry; - 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 (corba_shell != CORBA_OBJECT_NIL, - EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER); - - priv = evolution_storage->priv; - - CORBA_exception_init (&ev); - - corba_storage_registry = Bonobo_Unknown_queryInterface (corba_shell, - "IDL:GNOME/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; - } - - GNOME_Evolution_StorageRegistry_removeStorageByName (corba_storage_registry, - priv->name, - &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_GNOME_Evolution_StorageRegistry_NotFound) == 0) - result = EVOLUTION_STORAGE_ERROR_EXISTS; - else - result = EVOLUTION_STORAGE_ERROR_GENERIC; - } - - /* Now unref the EvolutionStorage */ - bonobo_object_unref (BONOBO_OBJECT (evolution_storage)); - - Bonobo_Unknown_unref (corba_storage_registry, &ev); - CORBA_Object_release (corba_storage_registry, &ev); - - CORBA_exception_free (&ev); - - return result; -} - -static char * -make_full_uri (EvolutionStorage *storage, - const char *path) -{ - const char *storage_name; - char *full_path; - - storage_name = storage->priv->name; - - if (strcmp (path, E_PATH_SEPARATOR_S) == 0) - full_path = g_strconcat (E_SHELL_URI_PREFIX, - E_PATH_SEPARATOR_S, storage_name, - NULL); - else if (! g_path_is_absolute (path)) - full_path = g_strconcat (E_SHELL_URI_PREFIX, - E_PATH_SEPARATOR_S, storage_name, - E_PATH_SEPARATOR_S, path, NULL); - else - full_path = g_strconcat (E_SHELL_URI_PREFIX, - E_PATH_SEPARATOR_S, storage_name, - path, NULL); - - return full_path; -} - -EvolutionStorageResult -evolution_storage_new_folder (EvolutionStorage *evolution_storage, - const char *path, - const char *display_name, - const char *type, - const char *physical_uri, - const char *description, - const char *custom_icon_name, - int unread_count, - gboolean can_sync_offline, - int sorting_priority) -{ - EvolutionStorageResult result; - EvolutionStoragePrivate *priv; - GNOME_Evolution_Folder *corba_folder; - CORBA_Environment ev; - GList *p; - char *evolutionUri; - - 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 (display_name != 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); - - if (description == NULL) - description = ""; - - priv = evolution_storage->priv; - - CORBA_exception_init (&ev); - - corba_folder = GNOME_Evolution_Folder__alloc (); - corba_folder->displayName = CORBA_string_dup (display_name); - corba_folder->description = CORBA_string_dup (description); - corba_folder->type = CORBA_string_dup (type); - corba_folder->physicalUri = CORBA_string_dup (physical_uri); - corba_folder->canSyncOffline = (CORBA_boolean) can_sync_offline; - corba_folder->sortingPriority = sorting_priority; - - if (custom_icon_name != NULL) - corba_folder->customIconName = CORBA_string_dup (custom_icon_name); - else - corba_folder->customIconName = CORBA_string_dup (""); - - evolutionUri = make_full_uri (evolution_storage, path); - corba_folder->evolutionUri = CORBA_string_dup (evolutionUri); - g_free (evolutionUri); - - corba_folder->unreadCount = unread_count; - - if (! e_folder_tree_add (priv->folder_tree, path, corba_folder)) { - CORBA_free (corba_folder); - return EVOLUTION_STORAGE_ERROR_EXISTS; - } - g_hash_table_insert (priv->uri_to_path, g_strdup (physical_uri), g_strdup (path)); - - result = EVOLUTION_STORAGE_OK; - - for (p = priv->corba_storage_listeners; p != NULL; p = p->next) { - GNOME_Evolution_StorageListener listener; - - listener = p->data; - GNOME_Evolution_StorageListener_notifyFolderCreated (listener, path, corba_folder, &ev); - - if (ev._major == CORBA_NO_EXCEPTION) - continue; - - if (ev._major != CORBA_USER_EXCEPTION) - result = EVOLUTION_STORAGE_ERROR_CORBA; - else if (strcmp (CORBA_exception_id (&ev), ex_GNOME_Evolution_StorageListener_Exists) == 0) - result = EVOLUTION_STORAGE_ERROR_EXISTS; - else - result = EVOLUTION_STORAGE_ERROR_GENERIC; - - break; - } - - CORBA_exception_free (&ev); - - return result; -} - -EvolutionStorageResult -evolution_storage_update_folder (EvolutionStorage *evolution_storage, - const char *path, - int unread_count) -{ - EvolutionStorageResult result; - EvolutionStoragePrivate *priv; - GNOME_Evolution_Folder *corba_folder; - GList *p; - - 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; - - g_signal_emit (evolution_storage, signals[UPDATE_FOLDER], 0, - path, unread_count); - - if (priv->corba_storage_listeners == NULL) - return EVOLUTION_STORAGE_ERROR_NOTREGISTERED; - - result = EVOLUTION_STORAGE_OK; - - for (p = priv->corba_storage_listeners; p != NULL; p = p->next) { - GNOME_Evolution_StorageListener listener; - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - listener = p->data; - GNOME_Evolution_StorageListener_notifyFolderUpdated (listener, path, unread_count, &ev); - - CORBA_exception_free (&ev); - } - - if (result == EVOLUTION_STORAGE_OK) { - corba_folder = e_folder_tree_get_folder (priv->folder_tree, path); - if (corba_folder != NULL) - corba_folder->unreadCount = unread_count; - else - result = EVOLUTION_STORAGE_ERROR_NOTFOUND; - } - - return result; -} - -EvolutionStorageResult -evolution_storage_update_folder_by_uri (EvolutionStorage *evolution_storage, - const char *physical_uri, - int unread_count) -{ - EvolutionStoragePrivate *priv; - char *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 (physical_uri != NULL, EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER); - - priv = evolution_storage->priv; - - path = g_hash_table_lookup (priv->uri_to_path, physical_uri); - return evolution_storage_update_folder (evolution_storage, path, unread_count); -} - -EvolutionStorageResult -evolution_storage_removed_folder (EvolutionStorage *evolution_storage, - const char *path) -{ - EvolutionStorageResult result; - EvolutionStoragePrivate *priv; - CORBA_Environment ev; - GNOME_Evolution_Folder *corba_folder; - gpointer key, value; - GList *p; - - 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_listeners == NULL) - return EVOLUTION_STORAGE_ERROR_NOTREGISTERED; - - corba_folder = e_folder_tree_get_folder (priv->folder_tree, path); - if (corba_folder == NULL) - return EVOLUTION_STORAGE_ERROR_NOTFOUND; - if (g_hash_table_lookup_extended (priv->uri_to_path, corba_folder->physicalUri, &key, &value)) { - g_hash_table_remove (priv->uri_to_path, key); - g_free (key); - g_free (value); - } - e_folder_tree_remove (priv->folder_tree, path); - - CORBA_exception_init (&ev); - - result = EVOLUTION_STORAGE_OK; - - for (p = priv->corba_storage_listeners; p != NULL; p = p->next) { - GNOME_Evolution_StorageListener listener; - - listener = p->data; - GNOME_Evolution_StorageListener_notifyFolderRemoved (listener, path, &ev); - - if (ev._major == CORBA_NO_EXCEPTION) - continue; - - if (ev._major != CORBA_USER_EXCEPTION) - result = EVOLUTION_STORAGE_ERROR_CORBA; - else if (strcmp (CORBA_exception_id (&ev), ex_GNOME_Evolution_StorageListener_NotFound) == 0) - result = EVOLUTION_STORAGE_ERROR_NOTFOUND; - else - result = EVOLUTION_STORAGE_ERROR_GENERIC; - - break; - } - - CORBA_exception_free (&ev); - - return result; -} - -gboolean -evolution_storage_folder_exists (EvolutionStorage *evolution_storage, - const char *path) -{ - EvolutionStoragePrivate *priv; - - 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; - - return e_folder_tree_get_folder (priv->folder_tree, path) != NULL; -} - -EvolutionStorageResult -evolution_storage_has_subfolders (EvolutionStorage *evolution_storage, - const char *path, - const char *message) -{ - EvolutionStorageResult result; - EvolutionStoragePrivate *priv; - CORBA_Environment ev; - GList *p; - - 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 (message != NULL, EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER); - - priv = evolution_storage->priv; - - if (priv->corba_storage_listeners == NULL) - return EVOLUTION_STORAGE_ERROR_NOTREGISTERED; - - CORBA_exception_init (&ev); - - result = EVOLUTION_STORAGE_OK; - - for (p = priv->corba_storage_listeners; p != NULL; p = p->next) { - GNOME_Evolution_StorageListener listener; - - listener = p->data; - GNOME_Evolution_StorageListener_notifyHasSubfolders (listener, path, message, &ev); - - if (ev._major == CORBA_NO_EXCEPTION) - continue; - if (ev._major != CORBA_USER_EXCEPTION) - result = EVOLUTION_STORAGE_ERROR_CORBA; - else if (strcmp (CORBA_exception_id (&ev), ex_GNOME_Evolution_StorageListener_NotFound) == 0) - result = EVOLUTION_STORAGE_ERROR_NOTFOUND; - else - result = EVOLUTION_STORAGE_ERROR_GENERIC; - - break; - } - - CORBA_exception_free (&ev); - - return result; -} - - -/* Setting up property items. */ - -void -evolution_storage_add_property_item (EvolutionStorage *evolution_storage, - const char *label, - const char *tooltip, - GdkPixbuf *icon) -{ - FolderPropertyItem *item; - - g_return_if_fail (EVOLUTION_IS_STORAGE (evolution_storage)); - g_return_if_fail (label != NULL); - - item = g_new (FolderPropertyItem, 1); - item->label = g_strdup (label); - item->tooltip = g_strdup (tooltip); - item->icon = icon; - if (icon != NULL) - g_object_ref (icon); - - evolution_storage->priv->folder_property_items = g_slist_append (evolution_storage->priv->folder_property_items, - item); -} - - -BONOBO_TYPE_FUNC_FULL (EvolutionStorage, - GNOME_Evolution_Storage, - PARENT_TYPE, - evolution_storage) diff --git a/shell/evolution-storage.h b/shell/evolution-storage.h deleted file mode 100644 index 209f43a339..0000000000 --- a/shell/evolution-storage.h +++ /dev/null @@ -1,185 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-storage.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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__ - -#include "Evolution.h" - -#include <glib.h> -#include <glib-object.h> - -#include <gdk-pixbuf/gdk-pixbuf.h> - -#include <bonobo/bonobo-object.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define EVOLUTION_TYPE_STORAGE (evolution_storage_get_type ()) -#define EVOLUTION_STORAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EVOLUTION_TYPE_STORAGE, EvolutionStorage)) -#define EVOLUTION_STORAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_STORAGE, EvolutionStorageClass)) -#define EVOLUTION_IS_STORAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EVOLUTION_TYPE_STORAGE)) -#define EVOLUTION_IS_STORAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_STORAGE)) - - -typedef struct _EvolutionStorage EvolutionStorage; -typedef struct _EvolutionStoragePrivate EvolutionStoragePrivate; -typedef struct _EvolutionStorageClass EvolutionStorageClass; - -enum _EvolutionStorageResult { - EVOLUTION_STORAGE_OK, - - /* Generic errors */ - EVOLUTION_STORAGE_ERROR_GENERIC, - EVOLUTION_STORAGE_ERROR_CORBA, - EVOLUTION_STORAGE_ERROR_INVALIDPARAMETER, - - /* Registration errors */ - EVOLUTION_STORAGE_ERROR_ALREADYREGISTERED, - EVOLUTION_STORAGE_ERROR_NOTREGISTERED, - EVOLUTION_STORAGE_ERROR_NOREGISTRY, - EVOLUTION_STORAGE_ERROR_EXISTS, - EVOLUTION_STORAGE_ERROR_NOTFOUND, - - /* Folder creation/deletion errors */ - EVOLUTION_STORAGE_ERROR_UNSUPPORTED_OPERATION, - EVOLUTION_STORAGE_ERROR_UNSUPPORTED_TYPE, - EVOLUTION_STORAGE_ERROR_INVALID_URI, - EVOLUTION_STORAGE_ERROR_ALREADY_EXISTS, - EVOLUTION_STORAGE_ERROR_DOES_NOT_EXIST, - EVOLUTION_STORAGE_ERROR_PERMISSION_DENIED, - EVOLUTION_STORAGE_ERROR_NO_SPACE, - EVOLUTION_STORAGE_ERROR_NOT_EMPTY -}; -typedef enum _EvolutionStorageResult EvolutionStorageResult; - -struct _EvolutionStorage { - BonoboObject parent; - - EvolutionStoragePrivate *priv; -}; - -struct _EvolutionStorageClass { - BonoboObjectClass parent_class; - - /* signals */ - void (*create_folder) (EvolutionStorage *storage, - const Bonobo_Listener listener, - const char *path, - const char *type, - const char *description, - const char *parent_physical_uri); - - void (*remove_folder) (EvolutionStorage *storage, - const Bonobo_Listener listener, - const char *path, - const char *physical_uri); - - void (*xfer_folder) (EvolutionStorage *storage, - const Bonobo_Listener listener, - const char *source_path, - const char *destination_path, - gboolean remove_source); - - void (*open_folder) (EvolutionStorage *storage, - const Bonobo_Listener listener, - const char *path); - - void (*update_folder) (EvolutionStorage *storage, - const char *path, - int unread_count); - - void (*discover_shared_folder) (EvolutionStorage *storage, - Bonobo_Listener listener, - const char *user, - const char *folder_name); - - void (*cancel_discover_shared_folder) (EvolutionStorage *storage, - const char *user, - const char *folder_name); - - void (*remove_shared_folder) (EvolutionStorage *storage, - Bonobo_Listener listener, - const char *path); - - void (*show_folder_properties) (EvolutionStorage *storage, - const char *path, - unsigned int itemNumber, - unsigned long parentWindowId); - - POA_GNOME_Evolution_Storage__epv epv; -}; - - -GType evolution_storage_get_type (void); -void evolution_storage_construct (EvolutionStorage *storage, - const char *name, - gboolean has_shared_folders); -EvolutionStorage *evolution_storage_new (const char *name, - gboolean has_shared_folders); - -void evolution_storage_rename (EvolutionStorage *storage, - const char *new_name); - -EvolutionStorageResult evolution_storage_register (EvolutionStorage *storage, - GNOME_Evolution_StorageRegistry corba_registry); -EvolutionStorageResult evolution_storage_register_on_shell (EvolutionStorage *evolution_storage, - GNOME_Evolution_Shell corba_shell); -EvolutionStorageResult evolution_storage_deregister_on_shell (EvolutionStorage *storage, - GNOME_Evolution_Shell corba_shell); -EvolutionStorageResult evolution_storage_new_folder (EvolutionStorage *evolution_storage, - const char *path, - const char *display_name, - const char *type, - const char *physical_uri, - const char *description, - const char *custom_icon_name, - int unread_count, - gboolean can_sync_offline, - int sorting_priority); -EvolutionStorageResult evolution_storage_update_folder (EvolutionStorage *evolution_storage, - const char *path, - int unread_count); -EvolutionStorageResult evolution_storage_update_folder_by_uri (EvolutionStorage *evolution_storage, - const char *physical_uri, - int unread_count); -EvolutionStorageResult evolution_storage_removed_folder (EvolutionStorage *evolution_storage, - const char *path); -gboolean evolution_storage_folder_exists (EvolutionStorage *evolution_storage, - const char *path); -EvolutionStorageResult evolution_storage_has_subfolders (EvolutionStorage *evolution_storage, - const char *path, - const char *message); - -void evolution_storage_add_property_item (EvolutionStorage *evolution_storage, - const char *label, - const char *tooltip, - GdkPixbuf *icon); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __EVOLUTION_STORAGE_H__ */ diff --git a/shell/evolution-test-component.c b/shell/evolution-test-component.c deleted file mode 100644 index faeae39991..0000000000 --- a/shell/evolution-test-component.c +++ /dev/null @@ -1,715 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-test-component.c - * - * Copyright (C) 2001, 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 - */ - -/* Simple test component for the Evolution shell. */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "evolution-shell-component.h" - -#include "evolution-activity-client.h" -#include "evolution-config-control.h" -#include "evolution-storage.h" - -#include <bonobo-activation/bonobo-activation.h> - -#include <bonobo/bonobo-exception.h> -#include <bonobo/bonobo-generic-factory.h> -#include <bonobo/bonobo-main.h> -#include <bonobo/bonobo-widget.h> - -#include <libgnomeui/gnome-ui-init.h> - -#include <gtk/gtkdialog.h> -#include <gtk/gtkeventbox.h> -#include <gtk/gtklabel.h> -#include <gtk/gtkmain.h> -#include <gtk/gtkstock.h> -#include <gtk/gtkvbox.h> - -#include <gdk-pixbuf/gdk-pixbuf.h> - -#include <stdlib.h> -#include <string.h> - - -#define COMPONENT_ID "OAFIID:GNOME_Evolution_TestComponent_ShellComponent" - -#define CONFIGURATION_CONTROL_FACTORY_ID "OAFIID:GNOME_Evolution_TestComponent_ConfigurationControlFactory" -#define CONFIGURATION_CONTROL_ID "OAFIID:GNOME_Evolution_TestComponent_ConfigurationControl" - -static const EvolutionShellComponentFolderType folder_types[] = { - { "test", "/usr/share/pixmaps/gnome-money.png", N_("Test"), N_("Test type"), FALSE, NULL, NULL }, - { NULL } -}; - - -static BonoboGenericFactory *configuration_control_factory = NULL; - -static EvolutionShellClient *parent_shell = NULL; - -static int timeout_id = 0; - - -/* TEST #1: Configuration Control. */ - -static BonoboObject * -create_configuration_page (void) -{ - GtkWidget *label; - - label = gtk_label_new ("This is the configuration page for the test component."); - gtk_widget_show (label); - - return BONOBO_OBJECT (evolution_config_control_new (label)); -} - -static BonoboObject * -configuration_control_factory_fn (BonoboGenericFactory *factory, - const char *id, - void *closure) -{ - if (strcmp (id, CONFIGURATION_CONTROL_ID) == 0) { - return create_configuration_page (); - } else { - g_warning ("Unknown ID in configuration control factory -- %s", id); - return NULL; - } -} - -static void -register_configuration_control_factory (void) -{ - configuration_control_factory = bonobo_generic_factory_new (CONFIGURATION_CONTROL_FACTORY_ID, - configuration_control_factory_fn, - NULL); - - if (configuration_control_factory == NULL) - g_warning ("Cannot register configuration control factory!"); -} - - -/* TEST #2: The ::Shortcut interface. */ - -static void -spit_out_shortcuts (EvolutionShellClient *shell_client) -{ - GNOME_Evolution_Shortcuts shortcuts_interface; - GNOME_Evolution_Shortcuts_GroupList *groups; - CORBA_Environment ev; - int i, j; - - CORBA_exception_init (&ev); - - shortcuts_interface = evolution_shell_client_get_shortcuts_interface (shell_client); - if (CORBA_Object_is_nil (shortcuts_interface, &ev)) { - g_warning ("No ::Shortcut interface on the shell"); - CORBA_exception_free (&ev); - return; - } - - groups = GNOME_Evolution_Shortcuts__get_groups (shortcuts_interface, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("Exception getting the groups: %s", BONOBO_EX_REPOID (&ev)); - CORBA_exception_free (&ev); - return; - } - - for (i = 0; i < groups->_length; i ++) { - GNOME_Evolution_Shortcuts_Group *group; - GNOME_Evolution_Shortcuts_ShortcutList *shortcuts; - - group = groups->_buffer + i; - shortcuts = &group->shortcuts; - - g_print ("\tGROUP: %s\n", group->name); - - for (j = 0; j < shortcuts->_length; j ++) { - GNOME_Evolution_Shortcuts_Shortcut *shortcut; - - shortcut = shortcuts->_buffer + j; - - g_print ("\t\tName: %s\n", shortcut->name); - g_print ("\t\t\tType: %s\n", shortcut->type); - g_print ("\t\t\tURI: %s\n", shortcut->uri); - } - } - - g_print ("** Done\n\n"); - - CORBA_exception_free (&ev); -} - - -/* TEST #4: The multiple folder selector. */ - -static void -dialog_clicked_callback (GtkDialog *dialog, - int button_num, - void *data) -{ - GNOME_Evolution_StorageSetView storage_set_view_iface; - CORBA_Environment ev; - GNOME_Evolution_FolderList *folder_list; - - if (button_num == 1) { - /* Close. */ - gtk_widget_destroy (GTK_WIDGET (dialog)); - return; - } - - CORBA_exception_init (&ev); - - storage_set_view_iface = (GNOME_Evolution_StorageSetView) data; - - folder_list = GNOME_Evolution_StorageSetView__get_checkedFolders (storage_set_view_iface, &ev); - if (BONOBO_EX (&ev)) { - g_warning ("Cannot get checkedFolders -- %s", BONOBO_EX_REPOID (&ev)); - } else { - int i; - - for (i = 0; i < folder_list->_length; i ++) { -#define PRINT(s) g_print ("\t" #s ": %s\n", folder_list->_buffer[i].s); - g_print ("Folder #%d:\n", i + 1); - PRINT (type); - PRINT (description); - PRINT (displayName); - PRINT (physicalUri); - PRINT (evolutionUri); -#undef PRINT - - g_print ("\tunreadCount: %d\n", folder_list->_buffer[i].unreadCount); - } - } - - CORBA_exception_free (&ev); -} - -static void -dialog_weak_notify (void *data, - GObject *where_the_object_was) -{ - GNOME_Evolution_StorageSetView storage_set_view_iface; - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - storage_set_view_iface = (GNOME_Evolution_StorageSetView) data; - Bonobo_Unknown_unref (storage_set_view_iface, &ev); - - CORBA_exception_free (&ev); -} - -static void -create_new_folder_selector (EvolutionShellComponent *shell_component) -{ - EvolutionShellClient *shell_client; - GNOME_Evolution_Shell corba_shell; - GNOME_Evolution_StorageSetView storage_set_view_iface; - GtkWidget *dialog; - GtkWidget *control_widget; - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - shell_client = evolution_shell_component_get_owner (shell_component); - g_assert (shell_client != NULL); - corba_shell = evolution_shell_client_corba_objref (shell_client); - - control_widget = evolution_shell_client_create_storage_set_view (shell_client, - CORBA_OBJECT_NIL, - NULL, - &storage_set_view_iface, - &ev); - if (control_widget == NULL) { - g_warning ("Can't create the StorageSetView control -- %s", BONOBO_EX_REPOID (&ev)); - CORBA_exception_free (&ev); - return; - } - - dialog = gtk_dialog_new_with_buttons ("Test the Selector here.", NULL, - GTK_DIALOG_MODAL, - GTK_STOCK_APPLY, GTK_RESPONSE_ACCEPT, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, - NULL); - gtk_window_set_default_size (GTK_WINDOW (dialog), 200, 400); - - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), control_widget); - - GNOME_Evolution_StorageSetView__set_showCheckboxes (storage_set_view_iface, TRUE, &ev); - if (BONOBO_EX (&ev)) - g_warning ("Cannot show checkboxes -- %s", BONOBO_EX_REPOID (&ev)); - - g_signal_connect (dialog, "clicked", - G_CALLBACK (dialog_clicked_callback), storage_set_view_iface); - - /* This is necessary to unref the StorageSetView iface once we are done - with it. */ - g_object_weak_ref (G_OBJECT (dialog), dialog_weak_notify, storage_set_view_iface); - - gtk_widget_show (control_widget); - gtk_widget_show (dialog); - - CORBA_exception_free (&ev); -} - - -/* TEST #5: Test custom storage. */ - -static int -shared_folder_discovery_timeout_callback (void *data) -{ - GNOME_Evolution_Storage_FolderResult result; - CORBA_Environment ev; - Bonobo_Listener listener; - CORBA_any any; - EvolutionStorage *storage; - - storage = EVOLUTION_STORAGE (data); - - listener = (Bonobo_Listener) g_object_get_data (G_OBJECT (storage), "listener"); - - result.result = GNOME_Evolution_Storage_OK; - result.path = "/Shared Folders/The Public Folder"; - - any._type = TC_GNOME_Evolution_Storage_FolderResult; - any._value = &result; - - CORBA_exception_init (&ev); - - Bonobo_Listener_event (listener, "result", &any, &ev); - if (BONOBO_EX (&ev)) - g_warning ("Cannot report result for shared folder discovery -- %s", - BONOBO_EX_REPOID (&ev)); - - Bonobo_Unknown_unref (listener, &ev); - CORBA_Object_release (listener, &ev); - - CORBA_exception_free (&ev); - - g_object_set_data (G_OBJECT (storage), "listener", NULL); - g_object_set_data (G_OBJECT (storage), "timeout_id", NULL); - - return FALSE; -} - -static void -storage_discover_shared_folder_callback (EvolutionStorage *storage, - Bonobo_Listener listener, - const char *user, - const char *folder_name, - void *data) -{ - CORBA_Environment ev; - Bonobo_Listener listener_copy; - - CORBA_exception_init (&ev); - listener_copy = CORBA_Object_duplicate (listener, &ev); - Bonobo_Unknown_ref (listener, &ev); - CORBA_exception_free (&ev); - - g_print ("Listener copy %p\n", listener_copy); - - timeout_id = g_timeout_add (1000, shared_folder_discovery_timeout_callback, storage); - - g_object_set_data (G_OBJECT (storage), "listener", listener_copy); - g_object_set_data (G_OBJECT (storage), "timeout_id", GINT_TO_POINTER (timeout_id)); -} - -static void -storage_cancel_discover_shared_folder_callback (EvolutionStorage *storage, - const char *user, - const char *folder_name, - void *data) -{ - Bonobo_Listener listener; - CORBA_Environment ev; - int timeout_id; - - timeout_id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (storage), "timeout_id")); - if (timeout_id == 0) - return; - - g_source_remove (timeout_id); - g_object_set_data (G_OBJECT (storage), "timeout_id", NULL); - - listener = (Bonobo_Listener) g_object_get_data (G_OBJECT (storage), "listener"); - - CORBA_exception_init (&ev); - Bonobo_Unknown_unref (listener, &ev); - CORBA_Object_release (listener, &ev); - CORBA_exception_free (&ev); - - g_object_set_data (G_OBJECT (storage), "listener", NULL); -} - -static void -storage_show_folder_properties_callback (EvolutionStorage *storage, - const char *path, - unsigned int itemNumber, - unsigned long parentWindowId, - void *data) -{ - g_print ("Show properties #%d -- %s\n", itemNumber, path); -} - -static void -setup_custom_storage (EvolutionShellClient *shell_client) -{ - EvolutionStorage *the_storage; - EvolutionStorageResult result; - - the_storage = evolution_storage_new ("TestStorage", TRUE); - - g_signal_connect (the_storage, "discover_shared_folder", - G_CALLBACK (storage_discover_shared_folder_callback), shell_client); - g_signal_connect (the_storage, "cancel_discover_shared_folder", - G_CALLBACK (storage_cancel_discover_shared_folder_callback), shell_client); - - /* Add some custom "Properties" items. */ - evolution_storage_add_property_item (the_storage, "Sharing...", - "Change sharing properties for this folder", NULL); - evolution_storage_add_property_item (the_storage, "Permissions...", - "Change permissions for this folder", NULL); - - g_signal_connect (the_storage, "show_folder_properties", - G_CALLBACK (storage_show_folder_properties_callback), NULL); - - result = evolution_storage_register_on_shell (the_storage, evolution_shell_client_corba_objref (shell_client)); - if (result != EVOLUTION_STORAGE_OK) { - g_warning ("Cannot register storage on the shell."); - bonobo_object_unref (BONOBO_OBJECT (the_storage)); - return; - } - - /* Test the sorting_priority arg here: if it was just sorting in - alphabetical order, FirstFolder would come before SecondFolder, but - we are specifying -1 sorting priority for SecondFolder and zero for - FirstFolder so the order is reversed. */ - - evolution_storage_new_folder (the_storage, "/FirstFolder", "FirstFolder", - "test", "file:///tmp/blah", "", "inbox", 0, TRUE, 0); - evolution_storage_new_folder (the_storage, "/SecondFolder", "SecondFolder", - "calendar", "file:///tmp/bleh", "", NULL, 0, FALSE, -1); -} - - -/* Callbacks. */ - -static void -activity_client_cancel_callback (EvolutionActivityClient *client, - void *data) -{ - g_print ("User requested that the operation be cancelled.\n"); -} - -static void -activity_client_show_details_callback (EvolutionActivityClient *client, - void *data) -{ - g_print ("User wants to see details.\n"); -} - - -/* Timeout #3: We are done. */ -static int -timeout_callback_3 (void *data) -{ - EvolutionActivityClient *activity_client; - - activity_client = EVOLUTION_ACTIVITY_CLIENT (data); - - g_object_unref (activity_client); - - g_print ("--> Done.\n"); - - return FALSE; -} - -/* Timeout #2: Update the progress until it reaches 100%. */ -static int -timeout_callback_2 (void *data) -{ - EvolutionActivityClient *activity_client; - int progress; - - activity_client = EVOLUTION_ACTIVITY_CLIENT (data); - progress = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (activity_client), "my_progress")); - - if (progress < 0) - progress = 0; - - g_print ("--> Updating %d\n", progress); - - if (! evolution_activity_client_update (activity_client, "Operation Foo in progress", - (float) progress / 100.0)) { - g_warning ("Error when updating operation"); - return FALSE; - } - - progress ++; - g_object_set_data (G_OBJECT (activity_client), "my_progress", GINT_TO_POINTER (progress)); - - if (progress > 100) { - g_timeout_add (200, timeout_callback_3, activity_client); - return FALSE; - } - - return TRUE; -} - -/* Timeout #1: Set busy. */ -static int -timeout_callback_1 (void *data) -{ - EvolutionActivityClient *activity_client; - gboolean suggest_display; - GdkPixbuf *animated_icon[2]; - static int count = 0; - -#define NUM_ACTIVITIES 10 - - animated_icon[0] = gdk_pixbuf_new_from_file (EVOLUTION_IMAGES "outbox-mini.png", NULL); - animated_icon[1] = NULL; - - g_assert (animated_icon[0] != NULL); - - activity_client = evolution_activity_client_new (parent_shell, COMPONENT_ID, - animated_icon, - "Operation Foo started!", - TRUE, - &suggest_display); - if (activity_client == CORBA_OBJECT_NIL) { - g_warning ("Cannot create EvolutionActivityClient object"); - return FALSE; - } - - g_object_set_data (G_OBJECT (activity_client), "my_progress", GINT_TO_POINTER (-1)); - - g_signal_connect (activity_client, "cancel", - G_CALLBACK (activity_client_cancel_callback), NULL); - g_signal_connect (activity_client, "show_details", - G_CALLBACK (activity_client_show_details_callback), NULL); - - g_print ("Component becoming busy -- %s\n", COMPONENT_ID); - if (suggest_display) - g_print (" --> Could display dialog box.\n"); - - g_timeout_add (100, timeout_callback_2, activity_client); - - if (count < NUM_ACTIVITIES) { - count ++; - g_timeout_add ((rand () % 5 + 1) * 500, timeout_callback_1, NULL); - } - - return FALSE; -} - - -static EvolutionShellComponentResult -create_view_fn (EvolutionShellComponent *shell_component, - const char *physical_uri, - const char *folder_type, - const char *view_data, - BonoboControl **control_return, - void *closure) -{ - GtkWidget *vbox; - GtkWidget *label_1, *label_2, *label_3, *label_4; - GtkWidget *event_box_1, *event_box_2; - - label_1 = gtk_label_new ("This is just a test component, displaying the following URI:"); - label_2 = gtk_label_new (physical_uri); - - if (*view_data) { - label_3 = gtk_label_new ("And the following view_data:"); - label_4 = gtk_label_new (view_data); - } else - label_3 = label_4 = NULL; - - event_box_1 = gtk_event_box_new (); - event_box_2 = gtk_event_box_new (); - - vbox = gtk_vbox_new (FALSE, 5); - - gtk_box_pack_start (GTK_BOX (vbox), event_box_1, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox), label_1, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox), label_2, FALSE, TRUE, 0); - if (label_3) { - gtk_box_pack_start (GTK_BOX (vbox), label_3, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox), label_4, FALSE, TRUE, 0); - } - gtk_box_pack_start (GTK_BOX (vbox), event_box_2, TRUE, TRUE, 0); - - gtk_widget_show_all (vbox); - - *control_return = bonobo_control_new (vbox); - - g_assert (timeout_id == 0); - timeout_id = g_timeout_add (2000, timeout_callback_1, NULL); - - return EVOLUTION_SHELL_COMPONENT_OK; -} - -static gboolean -request_quit_fn (EvolutionShellComponent *shell_component, - void *closure) -{ - GtkWidget *confirm_dialog; - GtkWidget *label; - int response; - - confirm_dialog = gtk_dialog_new_with_buttons ("Quit?", NULL, GTK_DIALOG_MODAL, - GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, - GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, - NULL); - label = gtk_label_new ("Please confirm that you want to quit now."); - gtk_container_add (GTK_CONTAINER (GTK_DIALOG (confirm_dialog)->vbox), label); - gtk_widget_show_all (confirm_dialog); - - response = gtk_dialog_run (GTK_DIALOG (confirm_dialog)); - gtk_widget_destroy (confirm_dialog); - - if (response == GTK_RESPONSE_ACCEPT) - return TRUE; /* OK */ - else - return FALSE; /* Cancel */ -} - - -/* Callbacks. */ - -static void -owner_set_callback (EvolutionShellComponent *shell_component, - EvolutionShellClient *shell_client, - const char *evolution_homedir) -{ - g_assert (parent_shell == NULL); - - g_print ("We have an owner -- home directory is `%s'\n", evolution_homedir); - - parent_shell = shell_client; - - if (evolution_shell_client_get_activity_interface (parent_shell) == CORBA_OBJECT_NIL) - g_warning ("Shell doesn't have a ::Activity interface -- weird!"); - - spit_out_shortcuts (shell_client); - - setup_custom_storage (shell_client); -} - -static int -owner_unset_idle_callback (void *data) -{ - gtk_main_quit (); - return FALSE; -} - -static void -owner_unset_callback (EvolutionShellComponent *shell_component, - void *data) -{ - g_idle_add_full (G_PRIORITY_LOW, owner_unset_idle_callback, NULL, NULL); -} - -static void -user_create_new_item_callback (EvolutionShellComponent *shell_component, - const char *id, - const char *parent_folder_physical_uri, - const char *parent_folder_type) -{ - g_print ("\n*** Should create -- %s\n", id); - g_print ("\n\tType %s, URI %s\n", parent_folder_type, parent_folder_physical_uri); - - if (strcmp (id, "FolderSelector") == 0) - create_new_folder_selector (shell_component); -} - - -static void -register_component (void) -{ - EvolutionShellComponent *shell_component; - int result; - - shell_component = evolution_shell_component_new (folder_types, - NULL, - create_view_fn, - NULL, NULL, NULL, NULL, NULL, NULL, - request_quit_fn, - NULL); - - g_signal_connect (shell_component, "owner_set", - G_CALLBACK (owner_set_callback), NULL); - g_signal_connect (shell_component, "owner_unset", - G_CALLBACK (owner_unset_callback), NULL); - - evolution_shell_component_add_user_creatable_item (shell_component, "Stuff", - "New Stuff", "New _Stuff", - "Create some new stuff", - NULL, - '\0', NULL); - evolution_shell_component_add_user_creatable_item (shell_component, "MoreStuff", - "New More Stuff", "New _More Stuff", - "Create more stuff", - NULL, - 'n', NULL); - evolution_shell_component_add_user_creatable_item (shell_component, "FolderSelector", - "Folder Selector", "New Folder _Selector", - "Show a folder selector", - NULL, - 's', NULL); - - g_signal_connect (shell_component, "user_create_new_item", - G_CALLBACK (user_create_new_item_callback), NULL); - - result = bonobo_activation_active_server_register (COMPONENT_ID, - bonobo_object_corba_objref (BONOBO_OBJECT (shell_component))); - - if (result != Bonobo_ACTIVATION_REG_SUCCESS) - g_error ("Cannot register active server into OAF"); -} - - -int -main (int argc, char **argv) -{ - bindtextdomain (GETTEXT_PACKAGE, EVOLUTION_LOCALEDIR); - textdomain (GETTEXT_PACKAGE); - - gnome_program_init (PACKAGE, VERSION, LIBGNOMEUI_MODULE, argc, argv, - GNOME_PROGRAM_STANDARD_PROPERTIES, - GNOME_PARAM_HUMAN_READABLE_NAME, _("Evolution Test Component"), - NULL); - - register_configuration_control_factory (); - - register_component (); - - g_print ("Test Component up and running.\n"); - - bonobo_main (); - - return 0; -} diff --git a/shell/evolution-wizard.c b/shell/evolution-wizard.c deleted file mode 100644 index 83b3a57778..0000000000 --- a/shell/evolution-wizard.c +++ /dev/null @@ -1,409 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* - * evolution-wizard.c - * - * Copyright (C) 2000-2003 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdio.h> -#include <gtk/gtksignal.h> -#include <gtk/gtkmarshal.h> -#include <gtk/gtktypeutils.h> -#include <bonobo/bonobo-exception.h> -#include <bonobo/bonobo-main.h> -#include <bonobo/bonobo-event-source.h> - -#include "evolution-wizard.h" -#include "Evolution.h" - -#include "e-shell-marshal.h" -#include "e-shell-corba-icon-utils.h" - -struct _EvolutionWizardPrivate { - BonoboEventSource *event_source; - - GPtrArray *pages; -}; - -typedef struct { - char *title; - GdkPixbuf *icon; - BonoboControl *control; -} EvolutionWizardPage; - -enum { - NEXT, - PREPARE, - BACK, - FINISH, - CANCEL, - HELP, - LAST_SIGNAL -}; - -#define PARENT_TYPE BONOBO_OBJECT_TYPE - -static GtkObjectClass *parent_class; -static guint32 signals[LAST_SIGNAL] = { 0 }; - -static GNOME_Evolution_Wizard_PageList * -impl_GNOME_Evolution_Wizard__get_pages (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionWizard *wizard; - EvolutionWizardPage *page; - GNOME_Evolution_Wizard_PageList *pages; - int i; - - bonobo_object = bonobo_object_from_servant (servant); - wizard = EVOLUTION_WIZARD (bonobo_object); - - pages = GNOME_Evolution_Wizard_PageList__alloc (); - pages->_maximum = pages->_length = wizard->priv->pages->len; - pages->_buffer = GNOME_Evolution_Wizard_PageList_allocbuf (pages->_maximum); - for (i = 0; i < wizard->priv->pages->len; i++) { - page = wizard->priv->pages->pdata[i]; - - pages->_buffer[i].title = CORBA_string_dup (page->title); - e_store_corba_icon_from_pixbuf (page->icon, &pages->_buffer[i].icon); - pages->_buffer[i].control = BONOBO_OBJREF (page->control); - } - - return pages; -} - -static void -impl_GNOME_Evolution_Wizard_notifyAction (PortableServer_Servant servant, - CORBA_long pagenumber, - GNOME_Evolution_Wizard_Action action, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - EvolutionWizard *wizard; - EvolutionWizardPrivate *priv; - - bonobo_object = bonobo_object_from_servant (servant); - wizard = EVOLUTION_WIZARD (bonobo_object); - priv = wizard->priv; - - if (pagenumber < 0 - || pagenumber > priv->pages->len - || (action != GNOME_Evolution_Wizard_BACK && pagenumber == priv->pages->len)) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_Wizard_NoPage, NULL); - return; - } - - switch (action) { - case GNOME_Evolution_Wizard_NEXT: - g_signal_emit (bonobo_object, signals[NEXT], 0, pagenumber); - break; - - case GNOME_Evolution_Wizard_PREPARE: - g_signal_emit (bonobo_object, signals[PREPARE], 0, pagenumber); - break; - - case GNOME_Evolution_Wizard_BACK: - g_signal_emit (bonobo_object, signals[BACK], 0, pagenumber); - break; - - case GNOME_Evolution_Wizard_FINISH: - g_signal_emit (bonobo_object, signals[FINISH], 0); - break; - - case GNOME_Evolution_Wizard_CANCEL: - g_signal_emit (bonobo_object, signals[CANCEL], 0); - break; - - case GNOME_Evolution_Wizard_HELP: - g_signal_emit (bonobo_object, signals[HELP], 0, pagenumber); - break; - - default: - break; - } -} - - - -static void -free_page (EvolutionWizardPage *page) -{ - g_free (page->title); - g_object_unref (page->icon); - bonobo_object_unref (page->control); - - g_free (page); -} - -static void -dispose (GObject *object) -{ - EvolutionWizard *wizard = EVOLUTION_WIZARD (object); - int i; - - if (wizard->priv->event_source) { - bonobo_object_unref (wizard->priv->event_source); - wizard->priv->event_source = NULL; - } - - if (wizard->priv->pages) { - for (i = 0; i < wizard->priv->pages->len; i++) - free_page (wizard->priv->pages->pdata[i]); - g_ptr_array_free (wizard->priv->pages, TRUE); - wizard->priv->pages = NULL; - } - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -finalize (GObject *object) -{ - EvolutionWizard *wizard = EVOLUTION_WIZARD (object); - - g_free (wizard->priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -static void -evolution_wizard_class_init (EvolutionWizardClass *klass) -{ - GObjectClass *object_class; - POA_GNOME_Evolution_Wizard__epv *epv = &klass->epv; - - object_class = G_OBJECT_CLASS (klass); - object_class->dispose = dispose; - object_class->finalize = finalize; - - signals[NEXT] - = g_signal_new ("next", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionWizardClass, next), - NULL, NULL, - e_shell_marshal_NONE__INT, - G_TYPE_NONE, 1, - G_TYPE_INT); - signals[PREPARE] - = g_signal_new ("prepare", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionWizardClass, prepare), - NULL, NULL, - e_shell_marshal_NONE__INT, - G_TYPE_NONE, 1, - G_TYPE_INT); - signals[BACK] - = g_signal_new ("back", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionWizardClass, back), - NULL, NULL, - e_shell_marshal_NONE__INT, - G_TYPE_NONE, 1, - G_TYPE_INT); - signals[FINISH] - = g_signal_new ("finish", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionWizardClass, finish), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); - signals[CANCEL] - = g_signal_new ("cancel", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionWizardClass, cancel), - NULL, NULL, - e_shell_marshal_NONE__NONE, - G_TYPE_NONE, 0); - signals[HELP] - = g_signal_new ("help", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EvolutionWizardClass, help), - NULL, NULL, - e_shell_marshal_NONE__INT, - G_TYPE_NONE, 1, - G_TYPE_INT); - - parent_class = g_type_class_ref(PARENT_TYPE); - - epv->_get_pages = impl_GNOME_Evolution_Wizard__get_pages; - epv->notifyAction = impl_GNOME_Evolution_Wizard_notifyAction; -} - -static void -evolution_wizard_init (EvolutionWizard *wizard) -{ - wizard->priv = g_new0 (EvolutionWizardPrivate, 1); - - wizard->priv->event_source = bonobo_event_source_new (); - bonobo_object_add_interface (BONOBO_OBJECT (wizard), - BONOBO_OBJECT (wizard->priv->event_source)); - - wizard->priv->pages = g_ptr_array_new (); -} - -BONOBO_TYPE_FUNC_FULL (EvolutionWizard, GNOME_Evolution_Wizard, - PARENT_TYPE, evolution_wizard); - -EvolutionWizard * -evolution_wizard_new (void) -{ - return g_object_new (EVOLUTION_TYPE_WIZARD, NULL); -} - -void -evolution_wizard_add_page (EvolutionWizard *wizard, - const char *title, - GdkPixbuf *icon, - GtkWidget *page) -{ - EvolutionWizardPage *new; - - new = g_new (EvolutionWizardPage, 1); - new->title = g_strdup (title); - new->icon = icon; - g_object_ref (icon); - new->control = bonobo_control_new (page); - - g_ptr_array_add (wizard->priv->pages, new); -} - - -void -evolution_wizard_set_buttons_sensitive (EvolutionWizard *wizard, - gboolean back_sensitive, - gboolean next_sensitive, - gboolean cancel_sensitive, - CORBA_Environment *opt_ev) -{ - EvolutionWizardPrivate *priv; - CORBA_Environment ev; - CORBA_any any; - CORBA_short s; - - g_return_if_fail (EVOLUTION_IS_WIZARD (wizard)); - - priv = wizard->priv; - - if (opt_ev == NULL) { - CORBA_exception_init (&ev); - } else { - ev = *opt_ev; - } - - s = back_sensitive << 2 | next_sensitive << 1 | cancel_sensitive; - any._type = (CORBA_TypeCode) TC_CORBA_short; - any._value = &s; - - bonobo_event_source_notify_listeners (priv->event_source, - EVOLUTION_WIZARD_SET_BUTTONS_SENSITIVE, - &any, &ev); - if (opt_ev == NULL && BONOBO_EX (&ev)) { - g_warning ("ERROR(evolution_wizard_set_buttons_sensitive): %s", CORBA_exception_id (&ev)); - } - - if (opt_ev == NULL) { - CORBA_exception_free (&ev); - } -} - -void -evolution_wizard_set_show_finish (EvolutionWizard *wizard, - gboolean show_finish, - CORBA_Environment *opt_ev) -{ - EvolutionWizardPrivate *priv; - CORBA_Environment ev; - CORBA_any any; - CORBA_boolean b; - - g_return_if_fail (EVOLUTION_IS_WIZARD (wizard)); - - priv = wizard->priv; - if (opt_ev == NULL) { - CORBA_exception_init (&ev); - } else { - ev = *opt_ev; - } - - b = show_finish; - any._type = (CORBA_TypeCode) TC_CORBA_boolean; - any._value = &b; - - bonobo_event_source_notify_listeners (priv->event_source, - EVOLUTION_WIZARD_SET_SHOW_FINISH, - &any, &ev); - if (opt_ev == NULL && BONOBO_EX (&ev)) { - g_warning ("ERROR(evolution_wizard_set_show_finish): %s", CORBA_exception_id (&ev)); - } - - if (opt_ev == NULL) { - CORBA_exception_free (&ev); - } -} - -void -evolution_wizard_set_page (EvolutionWizard *wizard, - int page_number, - CORBA_Environment *opt_ev) -{ - EvolutionWizardPrivate *priv; - CORBA_Environment ev; - CORBA_any any; - CORBA_short s; - - g_return_if_fail (EVOLUTION_IS_WIZARD (wizard)); - - priv = wizard->priv; - - g_return_if_fail (page_number >= 0 && page_number < priv->pages->len); - - if (opt_ev == NULL) { - CORBA_exception_init (&ev); - } else { - ev = *opt_ev; - } - - s = page_number; - any._type = (CORBA_TypeCode) TC_CORBA_short; - any._value = &s; - - bonobo_event_source_notify_listeners (priv->event_source, - EVOLUTION_WIZARD_SET_PAGE, - &any, &ev); - - if (opt_ev == NULL && BONOBO_EX (&ev)) { - g_warning ("ERROR(evolution_wizard_set_page): %s", CORBA_exception_id (&ev)); - } - - if (opt_ev == NULL) { - CORBA_exception_free (&ev); - } -} - diff --git a/shell/evolution-wizard.h b/shell/evolution-wizard.h deleted file mode 100644 index 46e4f0819a..0000000000 --- a/shell/evolution-wizard.h +++ /dev/null @@ -1,83 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* - * evolution-wizard.h - * - * Copyright (C) 2000-2003 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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. - */ - -#ifndef __EVOLUTION_WIZARD_H__ -#define __EVOLUTION_WIZARD_H__ - -#include <bonobo/bonobo-object.h> -#include <bonobo/bonobo-control.h> - -#include "Evolution.h" - -typedef struct _EvolutionWizard EvolutionWizard; -typedef struct _EvolutionWizardPrivate EvolutionWizardPrivate; - -#define EVOLUTION_WIZARD_SET_PAGE "GNOME::Evolution::Wizard_setPage" -#define EVOLUTION_WIZARD_SET_SHOW_FINISH "GNOME::Evolution::Wizard_setShowFinish" -#define EVOLUTION_WIZARD_SET_BUTTONS_SENSITIVE "GNOME::Evolution::Wizard_setButtonsSensitive" - -#define EVOLUTION_TYPE_WIZARD (evolution_wizard_get_type ()) -#define EVOLUTION_WIZARD(o) (GTK_CHECK_CAST ((o), EVOLUTION_TYPE_WIZARD, EvolutionWizard)) -#define EVOLUTION_WIZARD_CLASS(k) (GTK_CHECK_CLASS_CAST((k), EVOLUTION_TYPE_WIZARD, EvolutionWizardClass)) -#define EVOLUTION_IS_WIZARD(o) (GTK_CHECK_TYPE ((o), EVOLUTION_TYPE_WIZARD)) -#define EVOLUTION_IS_WIZARD_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), EVOLUTION_TYPE_WIZARD)) - -struct _EvolutionWizard { - BonoboObject object; - - EvolutionWizardPrivate *priv; -}; - -typedef struct { - BonoboObjectClass parent_class; - - POA_GNOME_Evolution_Wizard__epv epv; - - void (* next) (EvolutionWizard *wizard, int page_number); - void (* prepare) (EvolutionWizard *wizard, int page_number); - void (* back) (EvolutionWizard *wizard, int page_number); - void (* finish) (EvolutionWizard *wizard); - void (* cancel) (EvolutionWizard *wizard); - void (* help) (EvolutionWizard *wizard, int page_number); -} EvolutionWizardClass; - -GtkType evolution_wizard_get_type (void); - -EvolutionWizard *evolution_wizard_new (void); - -void evolution_wizard_add_page (EvolutionWizard *wizard, - const char *title, - GdkPixbuf *icon, - GtkWidget *page); - -void evolution_wizard_set_buttons_sensitive (EvolutionWizard *wizard, - gboolean back_sensitive, - gboolean next_sensitive, - gboolean cancel_sensitive, - CORBA_Environment *opt_ev); -void evolution_wizard_set_show_finish (EvolutionWizard *wizard, - gboolean show_finish, - CORBA_Environment *opt_ev); -void evolution_wizard_set_page (EvolutionWizard *wizard, - int page_number, - CORBA_Environment *opt_ev); - -#endif /* __EVOLUTION_WIZARD_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 7e90c140e2..0000000000 --- a/shell/glade/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -glade_DATA = \ - e-active-connection-dialog.glade \ - e-shell-config-default-folders.glade \ - e-shell-folder-creation-dialog.glade \ - e-shell-shared-folder-picker-dialog.glade \ - evolution-startup-wizard.glade \ - e-folder-list.glade - -EXTRA_DIST = $(glade_DATA) diff --git a/shell/glade/e-active-connection-dialog.glade b/shell/glade/e-active-connection-dialog.glade deleted file mode 100644 index 8e904da0b3..0000000000 --- a/shell/glade/e-active-connection-dialog.glade +++ /dev/null @@ -1,144 +0,0 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> - -<glade-interface> - -<widget class="GtkDialog" id="active_connection_dialog"> - <property name="border_width">6</property> - <property name="visible">True</property> - <property name="title" translatable="yes">Active Connections</property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="window_position">GTK_WIN_POS_NONE</property> - <property name="modal">False</property> - <property name="resizable">True</property> - <property name="destroy_with_parent">False</property> - <property name="has_separator">True</property> - - <child internal-child="vbox"> - <widget class="GtkVBox" id="dialog-vbox2"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">6</property> - - <child internal-child="action_area"> - <widget class="GtkHButtonBox" id="dialog-action_area2"> - <property name="visible">True</property> - <property name="layout_style">GTK_BUTTONBOX_END</property> - - <child> - <widget class="GtkButton" id="cancelbutton1"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-cancel</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">-6</property> - </widget> - </child> - - <child> - <widget class="GtkButton" id="okbutton1"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-ok</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">-5</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">GTK_PACK_END</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="vbox1"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">6</property> - - <child> - <widget class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="label" translatable="yes">The following connections are currently active:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">10</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkScrolledWindow" id="scrolledwindow1"> - <property name="visible">True</property> - <property name="hscrollbar_policy">GTK_POLICY_NEVER</property> - <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> - <property name="shadow_type">GTK_SHADOW_IN</property> - <property name="window_placement">GTK_CORNER_TOP_LEFT</property> - - <child> - <widget class="GtkTreeView" id="active_connection_treeview"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="headers_visible">True</property> - <property name="rules_hint">False</property> - <property name="reorderable">False</property> - <property name="enable_search">True</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="instruction_label"> - <property name="visible">True</property> - <property name="label" translatable="yes">Click OK to close these connections and go offline</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">10</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - </child> -</widget> - -</glade-interface> diff --git a/shell/glade/e-folder-list.glade b/shell/glade/e-folder-list.glade deleted file mode 100644 index d644f34a35..0000000000 --- a/shell/glade/e-folder-list.glade +++ /dev/null @@ -1,110 +0,0 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> - -<glade-interface> - -<widget class="GtkWindow" id="window-contents-reparented"> - <property name="title" translatable="yes">window1</property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="window_position">GTK_WIN_POS_NONE</property> - <property name="modal">False</property> - <property name="resizable">True</property> - <property name="destroy_with_parent">False</property> - - <child> - <widget class="GtkFrame" id="frame-toplevel"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="label_yalign">0.5</property> - <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property> - - <child> - <widget class="GtkVBox" id="vbox1"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">0</property> - - <child> - <widget class="Custom" id="custom-optionmenu"> - <property name="visible">True</property> - <property name="creation_function">create_custom_optionmenu</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Fri, 22 Mar 2002 15:09:48 GMT</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkHBox" id="hbox1"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">0</property> - - <child> - <widget class="Custom" id="custom-folder-list"> - <property name="visible">True</property> - <property name="creation_function">create_custom_folder_list</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Tue, 19 Mar 2002 18:07:28 GMT</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkVButtonBox" id="vbuttonbox1"> - <property name="visible">True</property> - <property name="layout_style">GTK_BUTTONBOX_START</property> - <property name="spacing">6</property> - - <child> - <widget class="GtkButton" id="button-add"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-add</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - </widget> - </child> - - <child> - <widget class="GtkButton" id="button-remove"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-remove</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - </child> - </widget> - </child> -</widget> - -</glade-interface> diff --git a/shell/glade/e-shell-config-default-folders.glade b/shell/glade/e-shell-config-default-folders.glade deleted file mode 100644 index 2cf2734304..0000000000 --- a/shell/glade/e-shell-config-default-folders.glade +++ /dev/null @@ -1,194 +0,0 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> - -<glade-interface> - -<widget class="GtkWindow" id="default folders"> - <property name="title" translatable="yes">window1</property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="window_position">GTK_WIN_POS_NONE</property> - <property name="modal">False</property> - <property name="resizable">True</property> - <property name="destroy_with_parent">False</property> - - <child> - <widget class="GtkTable" id="default_folders_table"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="n_rows">4</property> - <property name="n_columns">2</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Mail:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label4"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Tasks:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label3"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Contacts:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label2"> - <property name="visible">True</property> - <property name="label" translatable="yes">C_alendar:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="Custom" id="default_mail_button"> - <property name="visible">True</property> - <property name="creation_function">e_shell_config_default_folder_selector_button_new</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Wed, 10 Apr 2002 17:54:56 GMT</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="Custom" id="default_contacts_button"> - <property name="visible">True</property> - <property name="creation_function">e_shell_config_default_folder_selector_button_new</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Wed, 10 Apr 2002 17:55:01 GMT</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="Custom" id="default_calendar_button"> - <property name="visible">True</property> - <property name="creation_function">e_shell_config_default_folder_selector_button_new</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Wed, 10 Apr 2002 17:55:06 GMT</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="Custom" id="default_tasks_button"> - <property name="visible">True</property> - <property name="creation_function">e_shell_config_default_folder_selector_button_new</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Wed, 10 Apr 2002 17:55:12 GMT</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - </widget> - </child> -</widget> - -</glade-interface> 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 9fc32dc5ee..0000000000 --- a/shell/glade/e-shell-folder-creation-dialog.glade +++ /dev/null @@ -1,180 +0,0 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> - -<glade-interface> - -<widget class="GtkDialog" id="create_folder_dialog"> - <property name="border_width">6</property> - <property name="visible">True</property> - <property name="title" translatable="yes"></property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="window_position">GTK_WIN_POS_NONE</property> - <property name="modal">False</property> - <property name="default_width">350</property> - <property name="default_height">410</property> - <property name="resizable">True</property> - <property name="destroy_with_parent">False</property> - <property name="has_separator">True</property> - - <child internal-child="vbox"> - <widget class="GtkVBox" id="dialog-vbox1"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">12</property> - - <child internal-child="action_area"> - <widget class="GtkHButtonBox" id="dialog-action_area1"> - <property name="visible">True</property> - <property name="layout_style">GTK_BUTTONBOX_END</property> - - <child> - <widget class="GtkButton" id="cancel_button"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-cancel</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">-6</property> - </widget> - </child> - - <child> - <widget class="GtkButton" id="ok_button"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-ok</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">-5</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">GTK_PACK_END</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="main_vbox"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">6</property> - - <child> - <widget class="GtkLabel" id="folder_name_label"> - <property name="visible">True</property> - <property name="label" translatable="yes">Folder _name:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">7.45058e-09</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="folder_name_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="has_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="folder_type_label"> - <property name="visible">True</property> - <property name="label" translatable="yes">Folder _type:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">7.45058e-09</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="folder_type_option_menu"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">-1</property> - - <child internal-child="menu"> - <widget class="GtkMenu" id="convertwidget1"> - <property name="visible">True</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="creation_position_label"> - <property name="visible">True</property> - <property name="label" translatable="yes">Specify where to create the folder:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">7.45058e-09</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - </child> -</widget> - -</glade-interface> diff --git a/shell/glade/e-shell-shared-folder-picker-dialog.glade b/shell/glade/e-shell-shared-folder-picker-dialog.glade deleted file mode 100644 index 181e454fb5..0000000000 --- a/shell/glade/e-shell-shared-folder-picker-dialog.glade +++ /dev/null @@ -1,252 +0,0 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd" > - -<glade-interface> - <widget class="GtkDialog" id="dialog"> - <property name="title" translatable="yes">Open Other User's Folder</property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="modal">no</property> - <property name="allow_shrink">no</property> - <property name="allow_grow">no</property> - <property name="width-request">350</property> - <property name="visible">yes</property> - <property name="window-position">GTK_WIN_POS_NONE</property> - - <child internal-child="vbox"> - <widget class="GtkVBox" id="dialog-vbox1"> - <property name="homogeneous">no</property> - <property name="spacing">8</property> - <property name="visible">yes</property> - - <child internal-child="action_area"> - <widget class="GtkHButtonBox" id="dialog-action_area1"> - <property name="layout_style">GTK_BUTTONBOX_END</property> - <property name="spacing">8</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkButton" id="button3"> - <property name="can_default">yes</property> - <property name="can_focus">yes</property> - <property name="visible">yes</property> - <property name="label">gtk-cancel</property> - <property name="use_stock">yes</property> - <property name="use_underline">yes</property> - <property name="response_id">-6</property> - </widget> - </child> - - <child> - <widget class="GtkButton" id="button1"> - <property name="can_default">yes</property> - <property name="has_default">yes</property> - <property name="can_focus">yes</property> - <property name="visible">yes</property> - <property name="label">gtk-ok</property> - <property name="use_stock">yes</property> - <property name="use_underline">yes</property> - <property name="response_id">-5</property> - </widget> - </child> - - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">yes</property> - <property name="pack_type">GTK_PACK_END</property> - </packing> - </child> - - <child> - <widget class="GtkTable" id="table1"> - <property name="homogeneous">no</property> - <property name="row_spacing">3</property> - <property name="column_spacing">3</property> - <property name="n-rows">3</property> - <property name="n-columns">2</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkLabel" id="label1"> - <property name="label" translatable="yes">_Account:</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">server-option-menu</property> - <property name="visible">yes</property> - <property name="use_underline">yes</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label3"> - <property name="label" translatable="yes">_Folder Name:</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">folder-name-entry</property> - <property name="visible">yes</property> - <property name="use_underline">yes</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="server-option-menu"> - <property name="can_focus">yes</property> - <property name="history">0</property> - <property name="visible">yes</property> - - <child internal-child="menu"> - <widget class="GtkMenu" id="convertwidget1"> - <property name="visible">yes</property> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkCombo" id="folder-name-combo"> - <property name="value_in_list">no</property> - <property name="case_sensitive">no</property> - <property name="enable_arrow_keys">yes</property> - <property name="enable_arrows_always">no</property> - <property name="allow_empty">yes</property> - <property name="visible">yes</property> - - <child internal-child="entry"> - <widget class="GtkEntry" id="folder-name-entry"> - <property name="can_focus">yes</property> - <property name="editable">yes</property> - <property name="text" translatable="yes"></property> - <property name="max-length">0</property> - <property name="visibility">yes</property> - <property name="visible">yes</property> - </widget> - </child> - - <child internal-child="list"> - <widget class="GtkList" id="convertwidget2"> - <property name="visible">yes</property> - - <child> - <widget class="GtkListItem" id="convertwidget3"> - <property name="visible">yes</property> - - <child> - <widget class="GtkLabel" id="convertwidget4"> - <property name="label" translatable="yes"></property> - <property name="xalign">0.0</property> - <property name="visible">yes</property> - </widget> - </child> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">expand|fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkHBox" id="user-picker-placeholder"> - <property name="homogeneous">no</property> - <property name="spacing">0</property> - <property name="visible">yes</property> - - <child> - <placeholder /> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkButton" id="button-user"> - <property name="can_focus">yes</property> - <property name="label" translatable="yes">_User:</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="visible">yes</property> - <property name="use_underline">yes</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - <packing> - <property name="padding">2</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">4</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> -</glade-interface> diff --git a/shell/glade/evolution-startup-wizard.glade b/shell/glade/evolution-startup-wizard.glade deleted file mode 100644 index 7314c5ce33..0000000000 --- a/shell/glade/evolution-startup-wizard.glade +++ /dev/null @@ -1,92 +0,0 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> - -<glade-interface> -<requires lib="gnome"/> - -<widget class="GtkWindow" id="startup-wizard"> - <property name="border_width">6</property> - <property name="title" translatable="yes">Evolution Setup Assistant</property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="window_position">GTK_WIN_POS_NONE</property> - <property name="modal">False</property> - <property name="resizable">True</property> - <property name="destroy_with_parent">False</property> - - <child> - <widget class="GnomeDruid" id="startup-druid"> - <property name="border_width">6</property> - <property name="visible">True</property> - <property name="show_help">False</property> - - <child> - <widget class="GnomeDruidPageEdge" id="start-page"> - <property name="visible">True</property> - <property name="position">GNOME_EDGE_START</property> - <property name="title" translatable="yes">Welcome</property> - <property name="text" translatable="yes">Welcome to Evolution. The next few screens will allow -Evolution to connect to your email accounts, and to import -files from other applications. - -Please click the "Forward" button to continue. </property> - </widget> - </child> - - <child> - <widget class="GnomeDruidPageStandard" id="timezone-page"> - <property name="visible">True</property> - <property name="title" translatable="yes">Timezone </property> - <property name="logo">timezone-48.png</property> - - <child internal-child="vbox"> - <widget class="GtkVBox" id="druid-vbox6"> - <property name="border_width">16</property> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">0</property> - - <child> - <placeholder/> - </child> - </widget> - </child> - </widget> - </child> - - <child> - <widget class="GnomeDruidPageStandard" id="import-page"> - <property name="visible">True</property> - <property name="title" translatable="yes">Importing Files</property> - <property name="logo">import.png</property> - - <child internal-child="vbox"> - <widget class="GtkVBox" id="druid-vbox7"> - <property name="border_width">16</property> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">0</property> - - <child> - <placeholder/> - </child> - </widget> - </child> - </widget> - </child> - - <child> - <widget class="GnomeDruidPageEdge" id="done-page"> - <property name="visible">True</property> - <property name="position">GNOME_EDGE_FINISH</property> - <property name="title" translatable="yes">Done</property> - <property name="text" translatable="yes">You have successfully entered all of the information -needed to set up Evolution. - -Click the "Apply" button to save your settings. </property> - </widget> - </child> - </widget> - </child> -</widget> - -</glade-interface> diff --git a/shell/importer/.cvsignore b/shell/importer/.cvsignore deleted file mode 100644 index a1e30a4161..0000000000 --- a/shell/importer/.cvsignore +++ /dev/null @@ -1,10 +0,0 @@ -.deps -.libs -Makefile.in -Makefile -GNOME_Evolution_Importer-stubs.c -GNOME_Evolution_Importer-skels.c -GNOME_Evolution_Importer-common.c -GNOME_Evolution_Importer.h -*.lo -*.la diff --git a/shell/importer/GNOME_Evolution_Importer.idl b/shell/importer/GNOME_Evolution_Importer.idl deleted file mode 100644 index 775ba47377..0000000000 --- a/shell/importer/GNOME_Evolution_Importer.idl +++ /dev/null @@ -1,97 +0,0 @@ -/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Interfaces for the importer framework. - * - * Authors: - * Iain Holmes <iain@ximian.com> - * - * Copyright (C) 2000 Ximian, Inc. - */ - -#include <Bonobo.idl> - -module GNOME { -module Evolution { - interface ImporterListener : Bonobo::Unknown { - enum ImporterResult { - OK, - UNSUPPORTED_OPERATION, - NOT_READY, - BUSY, - UNKNOWN_DATA, - BAD_DATA, - BAD_FILE - }; - - /** - * notifyResult: - * @result: The result of the import. - * @more_items: Are there any more items to be processed? - * - * Notifies the listener of the result and whether there are - * any more items to be imported. - */ - oneway void notifyResult (in ImporterResult result, - in boolean more_items); - }; - - interface Importer : Bonobo::Unknown { - - /** - * processItem: - * @listener: The ImporterListener that will be notified of the - * progress. - * - * Processes the next item. - * - */ - oneway void processItem (in ImporterListener listener); - - /** - * getError: - * - * Retrieve a detailed explaination of the error. - * - * Returns: A string. - */ - string getError (); - - /** - * supportFormat: - * @filename: The filename of the file. - * - * Checks if the importer created by this factory can - * import the file specified. - * - * Returns: A boolean, TRUE if it can import the file, - * FALSE otherwise. - */ - boolean supportFormat (in string filename); - - /** - * loadFile: - * @filename: The filename of the file. - * @folderpath: The full pathname to the folder. - * @foldertpe: The type of the folder to import to. - * - * Loads the file and prepares an Importer object that can - * process files of this type. - * - * Returns: An Importer object. - */ - boolean loadFile (in string filename, - in string folderpath, - in string foldertype); - }; - - interface IntelligentImporter : Bonobo::Unknown { - - readonly attribute string importername; - readonly attribute string message; - - boolean canImport (); - - void importData (); - }; -}; -}; diff --git a/shell/importer/Makefile.am b/shell/importer/Makefile.am deleted file mode 100644 index 094df408d1..0000000000 --- a/shell/importer/Makefile.am +++ /dev/null @@ -1,66 +0,0 @@ -INCLUDES = \ - -I$(top_srcdir) \ - -I$(top_srcdir)/shell \ - -I$(top_builddir)/shell \ - -DG_LOG_DOMAIN=\"Evolution-Importer\" \ - -DEVOLUTION_GLADEDIR="\"$(gladedir)\"" \ - $(SHELL_CFLAGS) - -privlib_LTLIBRARIES = libevolution-importer.la - - -# IDL stuff - -IDLS = GNOME_Evolution_Importer.idl - -IDL_GENERATED_H = \ - GNOME_Evolution_Importer.h - -IDL_GENERATED_C = \ - GNOME_Evolution_Importer-common.c \ - GNOME_Evolution_Importer-skels.c \ - GNOME_Evolution_Importer-stubs.c - -IDL_GENERATED = $(IDL_GENERATED_H) $(IDL_GENERATED_C) - -$(IDL_GENERATED_H): $(IDLS) - $(ORBIT_IDL) -I $(srcdir) $(IDL_INCLUDES) $(srcdir)/GNOME_Evolution_Importer.idl - -$(IDL_GENERATED_C): $(IDL_GENERATED_H) - -idl_DATA = $(IDLS) - - -# Component - -libevolution_importerincludedir = $(privincludedir)/importer -libevolution_importer_la_SOURCES = \ - $(IDL_GENERATED) \ - evolution-intelligent-importer.c \ - evolution-importer-client.c \ - evolution-importer-listener.c \ - evolution-importer.c \ - intelligent.c \ - intelligent.h - -libevolution_importerinclude_HEADERS = \ - GNOME_Evolution_Importer.h \ - evolution-intelligent-importer.h \ - evolution-importer-client.h \ - evolution-importer-listener.h \ - evolution-importer.h - -libevolution_importer_la_LIBADD = \ - $(top_builddir)/e-util/libeutil.la \ - $(SHELL_LIBS) - -glade_DATA = import.glade - -EXTRA_DIST = $(glade_DATA) $(IDLS) - -BUILT_SOURCES= $(IDL_GENERATED) -CLEANFILES = $(BUILT_SOURCES) - -dist-hook: - cd $(distdir); rm -f $(BUILT_SOURCES) - diff --git a/shell/importer/evolution-importer-client.c b/shell/importer/evolution-importer-client.c deleted file mode 100644 index 1f6807b3c8..0000000000 --- a/shell/importer/evolution-importer-client.c +++ /dev/null @@ -1,251 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-importer-client.c - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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: Iain Holmes <iain@ximian.com> - * Based on evolution-shell-component-client.c by Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "evolution-importer-client.h" - -#include <glib.h> -#include <bonobo/bonobo-object.h> -#include <bonobo/bonobo-main.h> -#include <gal/util/e-util.h> - -#include "GNOME_Evolution_Importer.h" - -#define PARENT_TYPE G_TYPE_OBJECT -static GObjectClass *parent_class = NULL; - - -static void -finalise (GObject *object) -{ - /* FIXME: should this unref the client->objref?? */ - - parent_class->finalize(object); -} - -static void -class_init (EvolutionImporterClientClass *klass) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - parent_class = g_type_class_ref(PARENT_TYPE); - - object_class->finalize = finalise; -} - -static void -init (EvolutionImporterClient *client) -{ -} - -/** - * evolution_importer_client_new: - * @objref: The CORBA_Object to make a client for. - * - * Makes a client for @objref. @objref should be an Evolution_Importer. - * - * Returns: A newly created EvolutionImporterClient. - */ -EvolutionImporterClient * -evolution_importer_client_new (const CORBA_Object objref) -{ - EvolutionImporterClient *client; - - g_return_val_if_fail (objref != CORBA_OBJECT_NIL, NULL); - - client = g_object_new (evolution_importer_client_get_type (), NULL); - client->objref = objref; - - return client; -} - -/** - * evolution_importer_client_new_from_id: - * @id: The oafiid of the component to make a client for. - * - * Makes a client for the object returned by activating @id. - * - * Returns: A newly created EvolutionImporterClient. - */ -EvolutionImporterClient * -evolution_importer_client_new_from_id (const char *id) -{ - CORBA_Environment ev; - CORBA_Object objref; - - g_return_val_if_fail (id != NULL, NULL); - - CORBA_exception_init (&ev); - objref = bonobo_activation_activate_from_id ((char *) id, 0, NULL, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - CORBA_exception_free (&ev); - g_warning ("Could not start %s.", id); - return NULL; - } - - CORBA_exception_free (&ev); - if (objref == CORBA_OBJECT_NIL) { - g_warning ("Could not activate component %s", id); - return NULL; - } - - return evolution_importer_client_new (objref); -} - -/* API */ -/** - * evolution_importer_client_support_format: - * @client: The EvolutionImporterClient. - * @filename: Name of the file to check. - * - * Checks whether @client is able to import @filename. - * - * Returns: TRUE if @client can import @filename, FALSE otherwise. - */ -gboolean -evolution_importer_client_support_format (EvolutionImporterClient *client, - const char *filename) -{ - GNOME_Evolution_Importer corba_importer; - gboolean result; - CORBA_Environment ev; - - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (EVOLUTION_IS_IMPORTER_CLIENT (client), FALSE); - g_return_val_if_fail (filename != NULL, FALSE); - - CORBA_exception_init (&ev); - corba_importer = client->objref; - result = GNOME_Evolution_Importer_supportFormat (corba_importer, - filename, &ev); - CORBA_exception_free (&ev); - - return result; -} - -/** - * evolution_importer_client_load_file: - * @client: The EvolutionImporterClient. - * @filename: The file to load. - * @physical_uri: The physical URI of the folder to import data into. - * @folder_type: The type of the folder represented by @physical_uri. - * - * Loads and initialises the importer. - * - * Returns: TRUE on sucess, FALSE on failure. - */ -gboolean -evolution_importer_client_load_file (EvolutionImporterClient *client, - const char *filename, - const char *physical_uri, - const char *folder_type) -{ - GNOME_Evolution_Importer corba_importer; - gboolean result; - CORBA_Environment ev; - - g_return_val_if_fail (client != NULL, FALSE); - g_return_val_if_fail (EVOLUTION_IS_IMPORTER_CLIENT (client), FALSE); - g_return_val_if_fail (filename != NULL, FALSE); - - CORBA_exception_init (&ev); - corba_importer = client->objref; - result = GNOME_Evolution_Importer_loadFile (corba_importer, - filename, - physical_uri ? physical_uri : "", - folder_type ? folder_type : "", - &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("Oh there *WAS* an exception.\nIt was %s", - CORBA_exception_id (&ev)); - CORBA_exception_free (&ev); - return FALSE; - } - CORBA_exception_free (&ev); - - return result; -} - -/** - * evolution_importer_client_process_item: - * @client: The EvolutionImporterClient. - * @listener: The EvolutionImporterListener. - * - * Starts importing the next item in the file. @listener will be notified - * when the item has finished. - */ -void -evolution_importer_client_process_item (EvolutionImporterClient *client, - EvolutionImporterListener *listener) -{ - GNOME_Evolution_Importer corba_importer; - GNOME_Evolution_ImporterListener corba_listener; - CORBA_Environment ev; - - g_return_if_fail (client != NULL); - g_return_if_fail (EVOLUTION_IS_IMPORTER_CLIENT (client)); - g_return_if_fail (listener != NULL); - g_return_if_fail (EVOLUTION_IS_IMPORTER_LISTENER (listener)); - - CORBA_exception_init (&ev); - - corba_importer = client->objref; - corba_listener = bonobo_object_corba_objref (BONOBO_OBJECT (listener)); - GNOME_Evolution_Importer_processItem (corba_importer, - corba_listener, &ev); - CORBA_exception_free (&ev); -} - -/** - * evolution_importer_client_get_error: - * @client: The EvolutionImporterClient. - * - * Gets the error as a string. - * - * Returns: The error as a string. If there is no error NULL is returned. - * Importers need not support this method and if so, NULL is also returned. - */ -const char * -evolution_importer_client_get_error (EvolutionImporterClient *client) -{ - GNOME_Evolution_Importer corba_importer; - CORBA_char *str; - CORBA_Environment ev; - - g_return_val_if_fail (client != NULL, NULL); - g_return_val_if_fail (EVOLUTION_IS_IMPORTER_CLIENT (client), NULL); - - corba_importer = client->objref; - - CORBA_exception_init (&ev); - str = GNOME_Evolution_Importer_getError (corba_importer, &ev); - - return str; -} - -E_MAKE_TYPE (evolution_importer_client, "EvolutionImporterClient", - EvolutionImporterClient, class_init, init, PARENT_TYPE) diff --git a/shell/importer/evolution-importer-client.h b/shell/importer/evolution-importer-client.h deleted file mode 100644 index 46b38e851a..0000000000 --- a/shell/importer/evolution-importer-client.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-importer-client.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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: Iain Holmes <iain@ximian.com> - */ - -#ifndef EVOLUTION_IMPORTER_CLIENT_H -#define EVOLUTION_IMPORTER_CLIENT_H - -#include <glib.h> -#include <importer/evolution-importer.h> -#include <importer/evolution-importer-listener.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif - -#define EVOLUTION_TYPE_IMPORTER_CLIENT (evolution_importer_client_get_type ()) -#define EVOLUTION_IMPORTER_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EVOLUTION_TYPE_IMPORTER_CLIENT, EvolutionImporterClient)) -#define EVOLUTION_IMPORTER_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_IMPORTER_CLIENT, EvolutionImporterClientClass)) -#define EVOLUTION_IS_IMPORTER_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EVOLUTION_TYPE_IMPORTER_CLIENT)) -#define EVOLUTION_IS_IMPORTER_CLIENT_CLASS(klass) (G_TYPE_CHECK_INSTANCE_TYPE ((klass), EVOLUTION_TYPE_IMPORTER_CLIENT)) - - -typedef struct _EvolutionImporterClient EvolutionImporterClient; -typedef struct _EvolutionImporterClientClass EvolutionImporterClientClass; - -struct _EvolutionImporterClient { - GObject parent_type; - - GNOME_Evolution_Importer objref; -}; - -struct _EvolutionImporterClientClass { - GObjectClass parent_class; -}; - -GType evolution_importer_client_get_type (void); - -EvolutionImporterClient *evolution_importer_client_new (const CORBA_Object objref); -EvolutionImporterClient *evolution_importer_client_new_from_id (const char *id); - -gboolean evolution_importer_client_support_format (EvolutionImporterClient *client, - const char *filename); -gboolean evolution_importer_client_load_file (EvolutionImporterClient *client, - const char *filename, - const char *physical_uri, - const char *folder_type); -void evolution_importer_client_process_item (EvolutionImporterClient *client, - EvolutionImporterListener *listener); -const char *evolution_importer_client_get_error (EvolutionImporterClient *client); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/shell/importer/evolution-importer-listener.c b/shell/importer/evolution-importer-listener.c deleted file mode 100644 index 5f99384dce..0000000000 --- a/shell/importer/evolution-importer-listener.c +++ /dev/null @@ -1,224 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-importer-client.c - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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: Iain Holmes <iain@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "evolution-importer-listener.h" - -#include <bonobo/bonobo-object.h> -#include <gal/util/e-util.h> - -#include "GNOME_Evolution_Importer.h" -#define PARENT_TYPE BONOBO_OBJECT_TYPE - -static BonoboObjectClass *parent_class = NULL; - -struct _EvolutionImporterListenerPrivate { - EvolutionImporterListenerCallback callback; - - void *closure; -}; - -#if 0 -static POA_GNOME_Evolution_ImporterListener__vepv Listener_vepv; - -static POA_GNOME_Evolution_ImporterListener * -create_servant (void) -{ - POA_GNOME_Evolution_ImporterListener *servant; - CORBA_Environment ev; - - servant = (POA_GNOME_Evolution_ImporterListener *) g_new0 (BonoboObjectServant, 1); - servant->vepv = &Listener_vepv; - - CORBA_exception_init (&ev); - POA_GNOME_Evolution_ImporterListener__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; -} -#endif - -static EvolutionImporterResult -corba_result_to_evolution (GNOME_Evolution_ImporterListener_ImporterResult corba_result) -{ - switch (corba_result) { - case GNOME_Evolution_ImporterListener_OK: - return EVOLUTION_IMPORTER_OK; - case GNOME_Evolution_ImporterListener_UNSUPPORTED_OPERATION: - return EVOLUTION_IMPORTER_UNSUPPORTED_OPERATION; - case GNOME_Evolution_ImporterListener_UNKNOWN_DATA: - return EVOLUTION_IMPORTER_UNKNOWN_DATA; - case GNOME_Evolution_ImporterListener_BAD_DATA: - return EVOLUTION_IMPORTER_BAD_DATA; - case GNOME_Evolution_ImporterListener_BAD_FILE: - return EVOLUTION_IMPORTER_BAD_FILE; - case GNOME_Evolution_ImporterListener_NOT_READY: - return EVOLUTION_IMPORTER_NOT_READY; - case GNOME_Evolution_ImporterListener_BUSY: - return EVOLUTION_IMPORTER_BUSY; - default: - return EVOLUTION_IMPORTER_UNKNOWN_ERROR; - } -} - -static inline EvolutionImporterListener * -evolution_importer_listener_from_servant (PortableServer_Servant servant) -{ - return EVOLUTION_IMPORTER_LISTENER (bonobo_object_from_servant (servant)); -} - -static void -impl_GNOME_Evolution_ImporterListener_notifyResult (PortableServer_Servant servant, - GNOME_Evolution_ImporterListener_ImporterResult result, - CORBA_boolean more_items, - CORBA_Environment *ev) -{ - EvolutionImporterListener *listener; - EvolutionImporterListenerPrivate *priv; - EvolutionImporterResult out_result; - - listener = evolution_importer_listener_from_servant (servant); - priv = listener->priv; - - out_result = corba_result_to_evolution (result); - if (priv->callback) { - (priv->callback) (listener, out_result, more_items, - priv->closure); - } - - return; -} - - -/* GObject methods */ -static void -finalise (GObject *object) -{ - EvolutionImporterListener *listener; - EvolutionImporterListenerPrivate *priv; - - listener = EVOLUTION_IMPORTER_LISTENER (object); - priv = listener->priv; - - if (priv == NULL) - return; - - g_free (priv); - listener->priv = NULL; - - G_OBJECT_CLASS (parent_class)->finalize(object); -} - -#if 0 -static void -corba_class_init (void) -{ - POA_GNOME_Evolution_ImporterListener__vepv *vepv; - POA_GNOME_Evolution_ImporterListener__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_GNOME_Evolution_ImporterListener__epv, 1); - epv->notifyResult = impl_GNOME_Evolution_ImporterListener_notifyResult; - - vepv = &Listener_vepv; - vepv->_base_epv = base_epv; - vepv->Bonobo_Unknown_epv = bonobo_object_get_epv (); - vepv->GNOME_Evolution_ImporterListener_epv = epv; -} -#endif - -static void -evolution_importer_listener_class_init (EvolutionImporterListenerClass *klass) -{ - GObjectClass *object_class; - POA_GNOME_Evolution_ImporterListener__epv *epv = &klass->epv; - - object_class = G_OBJECT_CLASS (klass); - object_class->finalize = finalise; - - parent_class = g_type_class_ref(PARENT_TYPE); - epv->notifyResult = impl_GNOME_Evolution_ImporterListener_notifyResult; -} - -static void -evolution_importer_listener_init (EvolutionImporterListener *listener) -{ - EvolutionImporterListenerPrivate *priv; - - priv = g_new0 (EvolutionImporterListenerPrivate, 1); - listener->priv = priv; -} - -static void -evolution_importer_listener_construct (EvolutionImporterListener *listener, - EvolutionImporterListenerCallback callback, - void *closure) -{ - EvolutionImporterListenerPrivate *priv; - - g_return_if_fail (listener != NULL); - g_return_if_fail (EVOLUTION_IS_IMPORTER_LISTENER (listener)); - g_return_if_fail (callback != NULL); - - priv = listener->priv; - priv->callback = callback; - priv->closure = closure; -} - -/** - * evolution_importer_listener_new - * @callback: The #EvolutionImporterListenerCallback callback. - * @closure: The data that will be passed to that callback. - * - * Creates a new #EvolutionImporterListener object which calls @callback when - * something happens. - * Returns: A newly allocated #EvolutionImporterListener. - */ -EvolutionImporterListener * -evolution_importer_listener_new (EvolutionImporterListenerCallback callback, - void *closure) -{ - EvolutionImporterListener *listener; - - listener = g_object_new (evolution_importer_listener_get_type (), NULL); - - evolution_importer_listener_construct (listener, callback, closure); - return listener; -} - -BONOBO_TYPE_FUNC_FULL (EvolutionImporterListener, - GNOME_Evolution_ImporterListener, - PARENT_TYPE, evolution_importer_listener); diff --git a/shell/importer/evolution-importer-listener.h b/shell/importer/evolution-importer-listener.h deleted file mode 100644 index 7254346fc2..0000000000 --- a/shell/importer/evolution-importer-listener.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-importer-listener.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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: Iain Holmes <iain@ximian.com> - */ - -#ifndef EVOLUTION_IMPORTER_LISTENER_H -#define EVOLUTION_IMPORTER_LISTENER_H - -#include <glib.h> -#include <bonobo/bonobo-object.h> -#include <importer/GNOME_Evolution_Importer.h> -#include "evolution-importer.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* cplusplus */ - -#define EVOLUTION_TYPE_IMPORTER_LISTENER (evolution_importer_listener_get_type ()) -#define EVOLUTION_IMPORTER_LISTENER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EVOLUTION_TYPE_IMPORTER_LISTENER, EvolutionImporterListener)) -#define EVOLUTION_IMPORTER_LISTENER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_IMPORTER_LISTENER, EvolutionImporterListenerClass)) -#define EVOLUTION_IS_IMPORTER_LISTENER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EVOLUTION_TYPE_IMPORTER_LISTENER)) -#define EVOLUTION_IS_IMPORTER_LISTENER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_IMPORTER_LISTENER)) - -typedef struct _EvolutionImporterListener EvolutionImporterListener; -typedef struct _EvolutionImporterListenerPrivate EvolutionImporterListenerPrivate; -typedef struct _EvolutionImporterListenerClass EvolutionImporterListenerClass; - -typedef void (* EvolutionImporterListenerCallback) (EvolutionImporterListener *listener, - EvolutionImporterResult result, - gboolean more_items, - void *closure); -struct _EvolutionImporterListener { - BonoboObject parent; - - EvolutionImporterListenerPrivate *priv; -}; - -struct _EvolutionImporterListenerClass { - BonoboObjectClass parent_class; - - POA_GNOME_Evolution_ImporterListener__epv epv; -}; - -GType evolution_importer_listener_get_type (void); - -EvolutionImporterListener *evolution_importer_listener_new (EvolutionImporterListenerCallback callback, - void *closure); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/shell/importer/evolution-importer.c b/shell/importer/evolution-importer.c deleted file mode 100644 index cd419b4ca9..0000000000 --- a/shell/importer/evolution-importer.c +++ /dev/null @@ -1,229 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-importer.c - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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: Iain Holmes <iain@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "evolution-importer.h" - -#include <bonobo/bonobo-object.h> -#include <gal/util/e-util.h> - -#include "GNOME_Evolution_Importer.h" - -#define PARENT_TYPE BONOBO_OBJECT_TYPE -static BonoboObjectClass *parent_class = NULL; - -struct _EvolutionImporterPrivate { - EvolutionImporterLoadFileFn load_file_fn; - EvolutionImporterSupportFormatFn support_format_fn; - EvolutionImporterProcessItemFn process_item_fn; - EvolutionImporterGetErrorFn get_error_fn; - - void *closure; -}; - - -static inline EvolutionImporter * -evolution_importer_from_servant (PortableServer_Servant servant) -{ - return EVOLUTION_IMPORTER (bonobo_object_from_servant (servant)); -} - -static CORBA_boolean -impl_GNOME_Evolution_Importer_supportFormat (PortableServer_Servant servant, - const CORBA_char *filename, - CORBA_Environment *ev) -{ - EvolutionImporter *importer; - EvolutionImporterPrivate *priv; - - importer = evolution_importer_from_servant (servant); - priv = importer->priv; - - if (priv->support_format_fn != NULL) - return (priv->support_format_fn) (importer, filename, - priv->closure); - else - return FALSE; -} - -static CORBA_boolean -impl_GNOME_Evolution_Importer_loadFile (PortableServer_Servant servant, - const CORBA_char *filename, - const CORBA_char *physical_uri, - const CORBA_char *folder_type, - CORBA_Environment *ev) -{ - EvolutionImporter *importer; - EvolutionImporterPrivate *priv; - - importer = evolution_importer_from_servant (servant); - priv = importer->priv; - - if (priv->load_file_fn != NULL) - return (priv->load_file_fn) (importer, filename, physical_uri, folder_type, priv->closure); - else - return FALSE; -} - -static void -impl_GNOME_Evolution_Importer_processItem (PortableServer_Servant servant, - GNOME_Evolution_ImporterListener listener, - CORBA_Environment *ev) -{ - EvolutionImporter *importer; - EvolutionImporterPrivate *priv; - - importer = evolution_importer_from_servant (servant); - priv = importer->priv; - - if (priv->process_item_fn != NULL) - (priv->process_item_fn) (importer, listener, priv->closure, ev); - else - GNOME_Evolution_ImporterListener_notifyResult (listener, - GNOME_Evolution_ImporterListener_UNSUPPORTED_OPERATION, FALSE, ev); -} - -static CORBA_char * -impl_GNOME_Evolution_Importer_getError (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - EvolutionImporter *importer; - EvolutionImporterPrivate *priv; - CORBA_char *out_str; - - importer = evolution_importer_from_servant (servant); - priv = importer->priv; - - if (priv->get_error_fn != NULL) { - out_str = (priv->get_error_fn) (importer, priv->closure); - return CORBA_string_dup (out_str ? out_str : ""); - } else - return CORBA_string_dup (""); -} - - -static void -finalise (GObject *object) -{ - EvolutionImporter *importer; - EvolutionImporterPrivate *priv; - - importer = EVOLUTION_IMPORTER (object); - priv = importer->priv; - - if (priv == NULL) - return; - - g_free (priv); - importer->priv = NULL; - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -static void -evolution_importer_class_init (EvolutionImporterClass *klass) -{ - GObjectClass *object_class; - POA_GNOME_Evolution_Importer__epv *epv = &klass->epv; - - object_class = G_OBJECT_CLASS (klass); - object_class->finalize = finalise; - - parent_class = g_type_class_ref(PARENT_TYPE); - epv->supportFormat = impl_GNOME_Evolution_Importer_supportFormat; - epv->loadFile = impl_GNOME_Evolution_Importer_loadFile; - epv->processItem = impl_GNOME_Evolution_Importer_processItem; - epv->getError = impl_GNOME_Evolution_Importer_getError; -} - -static void -evolution_importer_init (EvolutionImporter *importer) -{ - EvolutionImporterPrivate *priv; - - priv = g_new0 (EvolutionImporterPrivate, 1); - - importer->priv = priv; -} - - - -static void -evolution_importer_construct (EvolutionImporter *importer, - EvolutionImporterSupportFormatFn support_format_fn, - EvolutionImporterLoadFileFn load_file_fn, - EvolutionImporterProcessItemFn process_item_fn, - EvolutionImporterGetErrorFn get_error_fn, - void *closure) -{ - EvolutionImporterPrivate *priv; - - g_return_if_fail (importer != NULL); - g_return_if_fail (EVOLUTION_IS_IMPORTER (importer)); - g_return_if_fail (support_format_fn != NULL); - g_return_if_fail (load_file_fn != NULL); - g_return_if_fail (process_item_fn != NULL); - - priv = importer->priv; - priv->support_format_fn = support_format_fn; - priv->load_file_fn = load_file_fn; - priv->process_item_fn = process_item_fn; - priv->get_error_fn = get_error_fn; - - priv->closure = closure; -} - -/** - * evolution_importer_new: - * @support_format_fn: The function to be called by the supportFormat method. - * @load_file_fn: The function to be called by the loadFile method. - * @process_item_fn: The function to be called by the processItem method. - * @get_error_fn: The function to be called by the getError method. - * @closure: The data to be passed to all of the above functions. - * - * Creates a new EvolutionImporter object. Of the parameters only - * @get_error_function and @closure may be #NULL. - * - * Returns: A newly created EvolutionImporter object. - */ -EvolutionImporter * -evolution_importer_new (EvolutionImporterSupportFormatFn support_format_fn, - EvolutionImporterLoadFileFn load_file_fn, - EvolutionImporterProcessItemFn process_item_fn, - EvolutionImporterGetErrorFn get_error_fn, - void *closure) -{ - EvolutionImporter *importer; - - importer = g_object_new(evolution_importer_get_type (), NULL); - evolution_importer_construct (importer, support_format_fn, load_file_fn, - process_item_fn, get_error_fn, closure); - return importer; -} - -BONOBO_TYPE_FUNC_FULL (EvolutionImporter, - GNOME_Evolution_Importer, - PARENT_TYPE, - evolution_importer); diff --git a/shell/importer/evolution-importer.h b/shell/importer/evolution-importer.h deleted file mode 100644 index d2fd94be0f..0000000000 --- a/shell/importer/evolution-importer.h +++ /dev/null @@ -1,96 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-importer.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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: Iain Holmes <iain@ximian.com> - */ - -#ifndef EVOLUTION_IMPORTER_H -#define EVOLUTION_IMPORTER_H - -#include <glib.h> -#include <bonobo/bonobo-object.h> -#include <importer/GNOME_Evolution_Importer.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* cplusplus */ - -#define EVOLUTION_TYPE_IMPORTER (evolution_importer_get_type ()) -#define EVOLUTION_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EVOLUTION_TYPE_IMPORTER, EvolutionImporter)) -#define EVOLUTION_IMPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_IMPORTER, EvolutionImporterClass)) -#define EVOLUTION_IS_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EVOLUTION_TYPE_IMPORTER)) -#define EVOLUTION_IS_IMPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_IMPORTER)) - -typedef struct _EvolutionImporter EvolutionImporter; -typedef struct _EvolutionImporterPrivate EvolutionImporterPrivate; -typedef struct _EvolutionImporterClass EvolutionImporterClass; - -typedef gboolean (* EvolutionImporterSupportFormatFn) (EvolutionImporter *importer, - const char *filename, - void *closure); -typedef gboolean (* EvolutionImporterLoadFileFn) (EvolutionImporter *importer, - const char *filename, - const char *physical_uri, - const char *folder_type, - void *closure); -typedef void (* EvolutionImporterProcessItemFn) (EvolutionImporter *importer, - CORBA_Object listener, - void *closure, - CORBA_Environment *ev); -typedef char *(* EvolutionImporterGetErrorFn) (EvolutionImporter *importer, - void *closure); - -typedef enum { - EVOLUTION_IMPORTER_OK, - EVOLUTION_IMPORTER_UNSUPPORTED_OPERATION, - EVOLUTION_IMPORTER_INTERRUPTED, - EVOLUTION_IMPORTER_BUSY, - EVOLUTION_IMPORTER_NOT_READY, - EVOLUTION_IMPORTER_UNKNOWN_DATA, - EVOLUTION_IMPORTER_BAD_DATA, - EVOLUTION_IMPORTER_BAD_FILE, - EVOLUTION_IMPORTER_UNKNOWN_ERROR -} EvolutionImporterResult; - -struct _EvolutionImporter { - BonoboObject parent; - - EvolutionImporterPrivate *priv; -}; - -struct _EvolutionImporterClass { - BonoboObjectClass parent_class; - - POA_GNOME_Evolution_Importer__epv epv; -}; - -GType evolution_importer_get_type (void); - -EvolutionImporter *evolution_importer_new (EvolutionImporterSupportFormatFn support_format_fn, - EvolutionImporterLoadFileFn load_file_fn, - EvolutionImporterProcessItemFn process_item_fn, - EvolutionImporterGetErrorFn get_error_fn, - void *closure); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/shell/importer/evolution-intelligent-importer.c b/shell/importer/evolution-intelligent-importer.c deleted file mode 100644 index e9d40d0f6d..0000000000 --- a/shell/importer/evolution-intelligent-importer.c +++ /dev/null @@ -1,197 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-intelligent-importer.c - * - * Copyright (C) 2000, 2001 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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: Iain Holmes <iain@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "evolution-intelligent-importer.h" - -#include <bonobo/bonobo-object.h> - -#include "GNOME_Evolution_Importer.h" - -#define PARENT_TYPE BONOBO_OBJECT_TYPE -static BonoboObjectClass *parent_class = NULL; - -struct _EvolutionIntelligentImporterPrivate { - EvolutionIntelligentImporterCanImportFn can_import_fn; - EvolutionIntelligentImporterImportDataFn import_data_fn; - - char *importername; - char *message; - void *closure; -}; - - -static inline EvolutionIntelligentImporter * -evolution_intelligent_importer_from_servant (PortableServer_Servant servant) -{ - return EVOLUTION_INTELLIGENT_IMPORTER (bonobo_object_from_servant (servant)); -} - -static CORBA_char * -impl_GNOME_Evolution_IntelligentImporter__get_importername (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - EvolutionIntelligentImporter *ii; - - ii = evolution_intelligent_importer_from_servant (servant); - - return CORBA_string_dup (ii->priv->importername ? - ii->priv->importername : ""); -} - -static CORBA_char * -impl_GNOME_Evolution_IntelligentImporter__get_message (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - EvolutionIntelligentImporter *ii; - - ii = evolution_intelligent_importer_from_servant (servant); - - return CORBA_string_dup (ii->priv->message ? - ii->priv->message : ""); -} - -static CORBA_boolean -impl_GNOME_Evolution_IntelligentImporter_canImport (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - EvolutionIntelligentImporter *ii; - EvolutionIntelligentImporterPrivate *priv; - - ii = evolution_intelligent_importer_from_servant (servant); - priv = ii->priv; - - if (priv->can_import_fn != NULL) - return (priv->can_import_fn) (ii, priv->closure); - else - return FALSE; -} - -static void -impl_GNOME_Evolution_IntelligentImporter_importData (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - EvolutionIntelligentImporter *ii; - EvolutionIntelligentImporterPrivate *priv; - - ii = evolution_intelligent_importer_from_servant (servant); - priv = ii->priv; - - if (priv->import_data_fn) - (priv->import_data_fn) (ii, priv->closure); -} - - -static void -finalise (GObject *object) -{ - EvolutionIntelligentImporter *ii; - - ii = EVOLUTION_INTELLIGENT_IMPORTER (object); - - if (ii->priv == NULL) - return; - - g_free (ii->priv->importername); - g_free (ii->priv); - ii->priv = NULL; - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -static void -evolution_intelligent_importer_class_init (EvolutionIntelligentImporterClass *klass) -{ - GObjectClass *object_class; - POA_GNOME_Evolution_IntelligentImporter__epv *epv = &klass->epv; - - object_class = G_OBJECT_CLASS (klass); - object_class->finalize = finalise; - - parent_class = g_type_class_ref(PARENT_TYPE); - epv->_get_importername = impl_GNOME_Evolution_IntelligentImporter__get_importername; - epv->_get_message = impl_GNOME_Evolution_IntelligentImporter__get_message; - epv->canImport = impl_GNOME_Evolution_IntelligentImporter_canImport; - epv->importData = impl_GNOME_Evolution_IntelligentImporter_importData; -} - -static void -evolution_intelligent_importer_init (EvolutionIntelligentImporter *ii) -{ - ii->priv = g_new0 (EvolutionIntelligentImporterPrivate, 1); -} - - -static void -evolution_intelligent_importer_construct (EvolutionIntelligentImporter *ii, - EvolutionIntelligentImporterCanImportFn can_import_fn, - EvolutionIntelligentImporterImportDataFn import_data_fn, - const char *importername, - const char *message, - void *closure) -{ - g_return_if_fail (ii != NULL); - ii->priv->importername = g_strdup (importername); - ii->priv->message = g_strdup (message); - - ii->priv->can_import_fn = can_import_fn; - ii->priv->import_data_fn = import_data_fn; - ii->priv->closure = closure; -} - -/** - * evolution_intelligent_importer_new: - * can_import_fn: The function that will be called to see if this importer can do - * anything. - * import_data_fn: The function that will be called when the importer should - * import the data. - * importername: The name of this importer. - * message: The message that will be displayed when the importer can import. - * closure: The data to be passed to @can_import_fn and @import_data_fn. - * - * Creates a new IntelligentImporter. - * - * Returns: A newly allocated EvolutionIntelligentImporter. - */ -EvolutionIntelligentImporter * -evolution_intelligent_importer_new (EvolutionIntelligentImporterCanImportFn can_import_fn, - EvolutionIntelligentImporterImportDataFn import_data_fn, - const char *importername, - const char *message, - void *closure) -{ - EvolutionIntelligentImporter *ii; - - ii = g_object_new (evolution_intelligent_importer_get_type (), NULL); - evolution_intelligent_importer_construct (ii, can_import_fn, - import_data_fn, importername, - message, closure); - return ii; -} - -BONOBO_TYPE_FUNC_FULL (EvolutionIntelligentImporter, - GNOME_Evolution_IntelligentImporter, - PARENT_TYPE, - evolution_intelligent_importer); diff --git a/shell/importer/evolution-intelligent-importer.h b/shell/importer/evolution-intelligent-importer.h deleted file mode 100644 index d51177f817..0000000000 --- a/shell/importer/evolution-intelligent-importer.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-intelligent-importer.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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: Iain Holmes <iain@ximian.com> - */ - -#ifndef EVOLUTION_INTELLIGENT_IMPORTER_H -#define EVOLUTION_INTELLIGENT_IMPORTER_H - -#include <glib.h> -#include <bonobo/bonobo-object.h> -#include <importer/GNOME_Evolution_Importer.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define EVOLUTION_TYPE_INTELLIGENT_IMPORTER (evolution_intelligent_importer_get_type ()) -#define EVOLUTION_INTELLIGENT_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EVOLUTION_TYPE_INTELLIGENT_IMPORTER, EvolutionIntelligentImporter)) -#define EVOLUTION_INTELLIGENT_IMPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EVOLUTION_TYPE_INTELLIGENT_IMPORTER, EvolutionIntelligentImporterClass)) -#define EVOLUTION_IS_INTELLIGENT_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EVOLUTION_TYPE_INTELLIGENT_IMPORTER)) -#define EVOLUTION_IS_INTELLIGENT_IMPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EVOLUTION_TYPE_INTELLIGENT_IMPORTER)) - -typedef struct _EvolutionIntelligentImporter EvolutionIntelligentImporter; -typedef struct _EvolutionIntelligentImporterPrivate EvolutionIntelligentImporterPrivate; -typedef struct _EvolutionIntelligentImporterClass EvolutionIntelligentImporterClass; - -typedef gboolean (* EvolutionIntelligentImporterCanImportFn) (EvolutionIntelligentImporter *ii, - void *closure); -typedef void (* EvolutionIntelligentImporterImportDataFn) (EvolutionIntelligentImporter *ii, - void *closure); - -struct _EvolutionIntelligentImporter { - BonoboObject parent; - - EvolutionIntelligentImporterPrivate *priv; -}; - -struct _EvolutionIntelligentImporterClass { - BonoboObjectClass parent_class; - - POA_GNOME_Evolution_IntelligentImporter__epv epv; -}; - -GType evolution_intelligent_importer_get_type (void); - -EvolutionIntelligentImporter *evolution_intelligent_importer_new (EvolutionIntelligentImporterCanImportFn can_import_fn, - EvolutionIntelligentImporterImportDataFn import_data_fn, - const char *importername, - const char *message, - void *closure); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/shell/importer/import.glade b/shell/importer/import.glade deleted file mode 100644 index 27bcd2decb..0000000000 --- a/shell/importer/import.glade +++ /dev/null @@ -1,119 +0,0 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd" > - -<glade-interface> - <requires lib="gnome" /> - - <widget class="GtkWindow" id="importwizard"> - <property name="visible">no</property> - <property name="title" translatable="yes">Evolution Import Assistant</property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="modal">no</property> - <property name="allow_shrink">no</property> - <property name="allow_grow">yes</property> - <property name="window-position">GTK_WIN_POS_NONE</property> - - <child> - <widget class="GnomeDruid" id="druid1"> - <property name="visible">yes</property> - - <child> - <widget class="GnomeDruidPageEdge" id="page0"> - <property name="title" translatable="yes">Evolution Import Assistant</property> - <property name="text" translatable="yes">Welcome to the Evolution Import Assistant. -With this assistant you will be guided through the process of -importing external files into Evolution.</property> - <property name="logo_image">import.png</property> - <property name="position">GNOME_EDGE_START</property> - <property name="visible">yes</property> - </widget> - </child> - - <child> - <widget class="GnomeDruidPageStandard" id="page1"> - <property name="title" translatable="yes">Importer Type (step 1 of 3)</property> - <property name="logo">import.png</property> - <property name="visible">yes</property> - - <child internal-child="vbox"> - <widget class="GtkVBox" id="druid-vbox2"> - <property name="homogeneous">no</property> - <property name="spacing">0</property> - <property name="visible">yes</property> - - <child> - <placeholder /> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - </child> - - <child> - <widget class="GnomeDruidPageStandard" id="page2-file"> - <property name="title" translatable="yes">Select a File (step 2 of 3)</property> - <property name="logo">import.png</property> - <property name="visible">yes</property> - - <child internal-child="vbox"> - <widget class="GtkVBox" id="druid-vbox1"> - <property name="homogeneous">no</property> - <property name="spacing">0</property> - <property name="visible">yes</property> - - <child> - <placeholder /> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - </child> - - <child> - <widget class="GnomeDruidPageStandard" id="page2-intelligent"> - <property name="title" translatable="yes">Select Importers (step 2 of 3)</property> - <property name="logo">import.png</property> - <property name="visible">yes</property> - - <child internal-child="vbox"> - <widget class="GtkVBox" id="druid-vbox3"> - <property name="homogeneous">no</property> - <property name="spacing">0</property> - <property name="visible">yes</property> - - <child> - <placeholder /> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - </child> - - <child> - <widget class="GnomeDruidPageEdge" id="page3"> - <property name="title" translatable="yes">Import File (step 3 of 3)</property> - <property name="text" translatable="yes">Click "Import" to begin importing the file into Evolution. </property> - <property name="logo_image">import.png</property> - <property name="position">GNOME_EDGE_FINISH</property> - <property name="visible">yes</property> - </widget> - </child> - </widget> - </child> - </widget> -</glade-interface> diff --git a/shell/importer/intelligent.c b/shell/importer/intelligent.c deleted file mode 100644 index 1eee3c238e..0000000000 --- a/shell/importer/intelligent.c +++ /dev/null @@ -1,484 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* intelligent.c - * - * Authors: - * Iain Holmes <iain@ximian.com> - * - * Copyright 2001 Ximian, Inc. (www.ximian.com) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "intelligent.h" - -#include <glib.h> - -#include <gtk/gtkdrawingarea.h> -#include <gtk/gtkbox.h> -#include <gtk/gtkhbox.h> -#include <gtk/gtkvbox.h> -#include <gtk/gtkcheckbutton.h> -#include <gtk/gtklabel.h> -#include <gtk/gtkmain.h> -#include <gtk/gtkobject.h> -#include <gtk/gtktogglebutton.h> -#include <gtk/gtkwidget.h> -#include <gtk/gtkwindow.h> -#include <gtk/gtkframe.h> -#include <gtk/gtkclist.h> -#include <gtk/gtknotebook.h> -#include <gtk/gtkscrolledwindow.h> -#include <gtk/gtkdialog.h> -#include <gtk/gtkstock.h> - -#include <libgnome/gnome-config.h> -/*#include <libgnome/gnome-util.h>*/ -#include <libgnome/gnome-i18n.h> - -#include <bonobo/bonobo-object.h> -#include <bonobo/bonobo-widget.h> - -#include "intelligent.h" -#include "GNOME_Evolution_Importer.h" - -/* Prototypes */ - -void intelligent_importer_init (void); - -/* End prototypes */ - -typedef struct { - CORBA_Object object; - Bonobo_Control control; - GtkWidget *widget; - - char *name; - char *blurb; - char *iid; -} IntelligentImporterData; - -typedef struct { - GtkWidget *dialog; - GtkWidget *placeholder; - GtkWidget *clist; - BonoboWidget *current; - - GList *importers; - - int running; -} IntelligentImporterDialog; - -typedef struct { - CORBA_Object importer; - char *iid; -} SelectedImporterData; - -static void -free_importer_dialog (IntelligentImporterDialog *d) -{ - GList *l; - - for (l = d->importers; l; l = l->next) { - CORBA_Environment ev; - IntelligentImporterData *data; - - data = l->data; - - CORBA_exception_init (&ev); - if (data->object != CORBA_OBJECT_NIL) - bonobo_object_release_unref (data->object, &ev); - - g_free (data->iid); - g_free (data->name); - g_free (data->blurb); - g_free (data); - } - - g_list_free (d->importers); - gtk_widget_destroy (d->dialog); - g_free (d); -} - -static void -start_importers (GList *selected) -{ - CORBA_Environment ev; - - CORBA_exception_init (&ev); - for (; selected; selected = selected->next) { - SelectedImporterData *selection = selected->data; - - GNOME_Evolution_IntelligentImporter_importData (selection->importer, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("Error importing %s\n%s", selection->iid, - CORBA_exception_id (&ev)); - } - } - CORBA_exception_free (&ev); -} - -static GList * -get_intelligent_importers (void) -{ - Bonobo_ServerInfoList *info_list; - GList *iids_ret = NULL; - CORBA_Environment ev; - int i; - - CORBA_exception_init (&ev); - info_list = bonobo_activation_query ("repo_ids.has ('IDL:GNOME/Evolution/IntelligentImporter:1.0')", NULL, &ev); - CORBA_exception_free (&ev); - - for (i = 0; i < info_list->_length; i++) { - const Bonobo_ServerInfo *info; - - info = info_list->_buffer + i; - iids_ret = g_list_prepend (iids_ret, g_strdup (info->iid)); - } - - return iids_ret; -} - -static void -select_row_cb (GtkCList *clist, - int row, - int column, - GdkEvent *ev, - IntelligentImporterDialog *d) -{ - gtk_notebook_set_page (GTK_NOTEBOOK (d->placeholder), row); -} - -static void -unselect_row_cb (GtkCList *clist, - int row, - int column, - GdkEvent *ev, - IntelligentImporterDialog *d) -{ - gtk_notebook_set_page (GTK_NOTEBOOK (d->placeholder), d->running); -} - -static IntelligentImporterDialog * -create_gui (GList *importers) -{ - GtkWidget *dialog, *clist, *sw, *label; - GtkWidget *hbox, *vbox, *dummy; - IntelligentImporterDialog *d; - GList *l; - int running = 0; - - d = g_new (IntelligentImporterDialog, 1); - d->dialog = dialog = gtk_dialog_new(); - gtk_window_set_title((GtkWindow *)dialog, _("Importers")); - dummy = gtk_button_new_from_stock(GTK_STOCK_CONVERT); - gtk_button_set_label((GtkButton *)dummy, _("Import")); - gtk_dialog_add_action_widget((GtkDialog *)dialog, dummy, GTK_RESPONSE_ACCEPT); - - dummy = gtk_button_new_from_stock(GTK_STOCK_NO); - gtk_button_set_label((GtkButton *)dummy, _("Don't import")); - gtk_dialog_add_action_widget((GtkDialog *)dialog, dummy, GTK_RESPONSE_REJECT); - - dummy = gtk_button_new_from_stock(GTK_STOCK_CANCEL); - gtk_button_set_label((GtkButton *)dummy, _("Don't ask me again")); - gtk_dialog_add_action_widget((GtkDialog *)dialog, dummy, GTK_RESPONSE_CANCEL); - d->importers = NULL; - d->current = NULL; - - d->clist = clist = gtk_clist_new (1); - gtk_clist_set_selection_mode (GTK_CLIST (d->clist), GTK_SELECTION_MULTIPLE); - - label = gtk_label_new (_("Evolution can import data from the following files:")); - gtk_misc_set_alignment(GTK_MISC(label), 0, .5); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), label, - TRUE, TRUE, 0); - - hbox = gtk_hbox_new (FALSE, 2); - gtk_container_set_border_width (GTK_CONTAINER (hbox), 2); - - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, - TRUE, TRUE, 0); - - sw = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(sw), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_widget_set_size_request (sw, 300, 150); - gtk_container_add (GTK_CONTAINER (sw), clist); - gtk_box_pack_start (GTK_BOX (hbox), sw, TRUE, TRUE, 0); - - vbox = gtk_vbox_new (FALSE, 0); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 2); - gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0); - - d->placeholder = gtk_notebook_new (); - gtk_notebook_set_show_tabs (GTK_NOTEBOOK (d->placeholder), FALSE); - gtk_box_pack_start (GTK_BOX (vbox), d->placeholder, TRUE, TRUE, 0); - - for (l = importers; l; l = l->next) { - IntelligentImporterData *data; - CORBA_Environment ev; - gboolean dontaskagain, can_run; - char *text[1], *prefix; - - /* Check if we want to show this one again */ - prefix = g_strdup_printf ("=%s/evolution/config/Shell=/intelligent-importers/", g_get_home_dir ()); - gnome_config_push_prefix (prefix); - g_free (prefix); - - dontaskagain = gnome_config_get_bool (l->data); - gnome_config_pop_prefix (); - - if (dontaskagain) - continue; - - data = g_new0 (IntelligentImporterData, 1); - data->iid = g_strdup (l->data); - - CORBA_exception_init (&ev); - data->object = bonobo_activation_activate_from_id ((char *) data->iid, 0, - NULL, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("Could not start %s: %s", data->iid, - CORBA_exception_id (&ev)); - CORBA_exception_free (&ev); - - /* Clean up the IntelligentImporterData */ - g_free (data->iid); - g_free (data); - continue; - } - - CORBA_exception_free (&ev); - if (data->object == CORBA_OBJECT_NIL) { - g_warning ("Could not activate_component %s", data->iid); - g_free (data->iid); - g_free (data); - continue; - } - - CORBA_exception_init (&ev); - can_run = GNOME_Evolution_IntelligentImporter_canImport (data->object, - &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("Could not get canImport(%s): %s", - data->iid, CORBA_exception_id (&ev)); - bonobo_object_release_unref (data->object, &ev); - CORBA_exception_free (&ev); - g_free (data->iid); - g_free (data); - continue; - } - CORBA_exception_free (&ev); - - if (can_run == FALSE) { - CORBA_exception_init (&ev); - bonobo_object_release_unref (data->object, &ev); - CORBA_exception_free (&ev); - g_free (data->iid); - g_free (data); - continue; - } - - running++; - - data->name = g_strdup (GNOME_Evolution_IntelligentImporter__get_importername (data->object, &ev)); - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("Could not get name(%s): %s", - data->iid, CORBA_exception_id (&ev)); - bonobo_object_release_unref (data->object, &ev); - CORBA_exception_free (&ev); - g_free (data->iid); - g_free (data); - continue; - } - - data->blurb = g_strdup (GNOME_Evolution_IntelligentImporter__get_message (data->object, &ev)); - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("Could not get message(%s): %s", - data->iid, CORBA_exception_id (&ev)); - bonobo_object_release_unref (data->object, &ev); - CORBA_exception_free (&ev); - g_free (data->iid); - g_free (data->name); - g_free (data); - continue; - } - - data->control = Bonobo_Unknown_queryInterface (data->object, - "IDL:Bonobo/Control:1.0", &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("Could not QI for Bonobo/Control:1.0 %s:%s", - data->iid, CORBA_exception_id (&ev)); - bonobo_object_release_unref (data->object, &ev); - CORBA_exception_free (&ev); - g_free (data->iid); - g_free (data->name); - g_free (data->blurb); - continue; - } - if (data->control != CORBA_OBJECT_NIL) { - data->widget = bonobo_widget_new_control_from_objref (data->control, CORBA_OBJECT_NIL); - /* Ref this widget so even if we remove it from the - containers it will always have an extra ref. */ - gtk_widget_show (data->widget); - gtk_widget_ref (data->widget); - } else { - data->widget = gtk_label_new (""); - } - - CORBA_exception_free (&ev); - - d->importers = g_list_prepend (d->importers, data); - gtk_notebook_prepend_page (GTK_NOTEBOOK (d->placeholder), - data->widget, NULL); - text[0] = data->name; - gtk_clist_prepend (GTK_CLIST (clist), text); - } - - d->running = running; - dummy = gtk_drawing_area_new (); - gtk_widget_show (dummy); - gtk_notebook_append_page (GTK_NOTEBOOK (d->placeholder), - dummy, NULL); - /* Set the start to the blank page */ - gtk_notebook_set_page (GTK_NOTEBOOK (d->placeholder), running); - - g_signal_connect((clist), "select-row", - G_CALLBACK (select_row_cb), d); - g_signal_connect((clist), "unselect-row", - G_CALLBACK (unselect_row_cb), d); - - gtk_widget_show_all (GTK_DIALOG (dialog)->vbox); - return d; -} - -void -intelligent_importer_init (void) -{ - GList *importers, *l, *selected = NULL; - IntelligentImporterDialog *d; - char *prefix; - gboolean dontaskagain; - int resp; - - prefix = g_strdup_printf ("=%s/evolution/config/Shell=/intelligent-importers/", g_get_home_dir()); - gnome_config_push_prefix (prefix); - g_free (prefix); - - dontaskagain = gnome_config_get_bool ("Dontaskagain=False"); - gnome_config_pop_prefix (); - - if (dontaskagain) { - return; - } - - importers = get_intelligent_importers (); - if (importers == NULL) - return; /* No intelligent importers. Easy :) */ - - d = create_gui (importers); - if (d->running == 0) { - free_importer_dialog (d); - return; /* No runnable intelligent importers. */ - } - - resp = gtk_dialog_run((GtkDialog *)d->dialog); - gtk_widget_destroy(d->dialog); - switch (resp) { - case GTK_RESPONSE_ACCEPT: - /* Make a list of the importers */ - - /* FIXME: Sort this list and don't do it a slow way */ - for (l = GTK_CLIST (d->clist)->selection; l; l = l->next) { - IntelligentImporterData *data; - SelectedImporterData *new_data; - CORBA_Environment ev; - char *iid; - - data = g_list_nth_data (d->importers, GPOINTER_TO_INT (l->data)); - iid = g_strdup (data->iid); - - new_data = g_new (SelectedImporterData, 1); - new_data->iid = iid; - - /* Reference the remote object, and duplicate the - local one. */ - CORBA_exception_init (&ev); - new_data->importer = bonobo_object_dup_ref (data->object, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("Error duplicating %s\n%s", iid, - CORBA_exception_id (&ev)); - g_free (iid); - CORBA_exception_free (&ev); - g_free (new_data); - continue; - } - CORBA_exception_free (&ev); - - selected = g_list_prepend (selected, new_data); - } - - /* Now destroy all the importers, as we've kept references to - the ones we need */ - free_importer_dialog (d); - - if (selected != NULL) { - /* Restart the selected ones */ - start_importers (selected); - - /* Free the selected list */ - for (l = selected; l; l = l->next) { - CORBA_Environment ev; - SelectedImporterData *selection = l->data; - - CORBA_exception_init (&ev); - bonobo_object_release_unref (selection->importer, &ev); - CORBA_exception_free (&ev); - - g_free (selection->iid); - g_free (selection); - } - g_list_free (selected); - } - - break; - - case GTK_RESPONSE_CANCEL: /* Dont ask again */ - prefix = g_strdup_printf ("=%s/evolution/config/Shell=/intelligent-importers/", g_get_home_dir()); - gnome_config_push_prefix (prefix); - g_free (prefix); - - gnome_config_set_bool ("Dontaskagain", TRUE); - gnome_config_pop_prefix (); - - gnome_config_sync (); - gnome_config_drop_all (); - g_print ("Not asking again"); - free_importer_dialog (d); - break; - - default: - case GTK_RESPONSE_REJECT: /* No button */ - free_importer_dialog (d); - break; - } - - g_list_free (importers); -} diff --git a/shell/importer/intelligent.h b/shell/importer/intelligent.h deleted file mode 100644 index 1e6f3e0b1b..0000000000 --- a/shell/importer/intelligent.h +++ /dev/null @@ -1,28 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* importer.c - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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: Kjartan Maraas <kmaraas@gnome.org> - */ - -#ifndef __INTELLIGENT_H__ -#define __INTELLIGENT_H__ - -void intelligent_importer_init (void); - -#endif diff --git a/shell/main.c b/shell/main.c deleted file mode 100644 index e41058377f..0000000000 --- a/shell/main.c +++ /dev/null @@ -1,630 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* main.c - * - * Copyright (C) 2000, 2001, 2002, 2003 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * 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 "e-util/e-dialog-utils.h" -#include "e-util/e-gtk-utils.h" - -#include "e-icon-factory.h" -#include "e-shell-constants.h" -#include "e-shell-config.h" -#include "e-setup.h" - -#include "e-shell.h" - -#include <gconf/gconf-client.h> - -#include <gtk/gtkalignment.h> -#include <gtk/gtkframe.h> -#include <gtk/gtklabel.h> -#include <gtk/gtkmain.h> -#include <gtk/gtksignal.h> -#include <gtk/gtkwindow.h> -#include <gtk/gtkdialog.h> -#include <gtk/gtkstock.h> - -#include <gdk/gdkx.h> -#include <X11/Xlib.h> - -#include <libgnome/gnome-i18n.h> -#include <libgnome/gnome-util.h> -#include <libgnomeui/gnome-ui-init.h> -#include <libgnomeui/gnome-window-icon.h> - -#include <bonobo/bonobo-main.h> -#include <bonobo/bonobo-moniker-util.h> -#include <bonobo/bonobo-exception.h> - -#include <bonobo-activation/bonobo-activation.h> - -#include <glade/glade.h> - -#include "e-config-upgrade.h" -#include "Evolution-Wombat.h" - -#ifdef GTKHTML_HAVE_GCONF -#include <gconf/gconf.h> -#endif - -#include <gal/widgets/e-cursors.h> - -#include <fcntl.h> -#include <signal.h> -#include <string.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> - -#include <pthread.h> - - -static EShell *shell = NULL; -static char *evolution_directory = NULL; - -/* Command-line options. */ -static gboolean no_splash = FALSE; -static gboolean start_online = FALSE; -static gboolean start_offline = FALSE; -static gboolean force_upgrade = FALSE; -static gboolean setup_only = FALSE; -static gboolean killev = FALSE; - -extern char *evolution_debug_log; - - -static GtkWidget * -quit_box_new (void) -{ - GtkWidget *window; - GtkWidget *label; - GtkWidget *frame; - - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_resizable (GTK_WINDOW (window), FALSE); - gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER); - - /* (Just to prevent smart-ass window managers like Sawfish from setting - the make the dialog as big as the standard Evolution window). */ - gtk_window_set_wmclass (GTK_WINDOW (window), "evolution-quit", "Evolution:quit"); - - e_make_widget_backing_stored (window); - - gtk_window_set_title (GTK_WINDOW (window), _("Evolution")); - - frame = gtk_frame_new (NULL); - gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT); - gtk_container_add (GTK_CONTAINER (window), frame); - - label = gtk_label_new (_("Evolution is now exiting ...")); - gtk_misc_set_padding (GTK_MISC (label), 30, 25); - - gtk_container_add (GTK_CONTAINER (frame), label); - - gtk_widget_show_now (frame); - gtk_widget_show_now (label); - gtk_widget_show_now (window); - - /* For some reason, the window fails to update without this - sometimes. */ - gtk_widget_queue_draw (window); - gtk_widget_queue_draw (label); - gtk_widget_queue_draw (frame); - - gdk_flush (); - - while (gtk_events_pending ()) - gtk_main_iteration (); - - gdk_flush (); - - return window; -} - -static void -no_views_left_cb (EShell *shell, gpointer data) -{ - GtkWidget *quit_box; - - quit_box = quit_box_new (); - g_object_add_weak_pointer (G_OBJECT (quit_box), (void **) &quit_box); - - /* FIXME: This is wrong. We should exit only when the shell is - destroyed. But refcounting is broken at present, so this is a - reasonable workaround for now. */ - - e_shell_unregister_all (shell); - - bonobo_object_unref (BONOBO_OBJECT (shell)); - - if (quit_box != NULL) - gtk_widget_destroy (quit_box); - - bonobo_main_quit (); -} - -static void -shell_weak_notify (void *data, - GObject *where_the_object_was) -{ - bonobo_main_quit (); -} - - -static void -kill_wombat (void) -{ - g_print ("(Killing old version of Wombat...)\n"); - - system (KILL_PROCESS_CMD " -9 lt-evolution-wombat 2> /dev/null"); - system (KILL_PROCESS_CMD " -9 evolution-wombat 2> /dev/null"); -} - -static void -kill_old_wombat (void) -{ - GNOME_Evolution_WombatInterfaceCheck iface; - CORBA_Environment ev; - CORBA_char *version; - - CORBA_exception_init (&ev); - - iface = bonobo_activation_activate_from_id ("OAFIID:GNOME_Evolution_Wombat_InterfaceCheck", 0, NULL, &ev); - if (BONOBO_EX (&ev) || iface == CORBA_OBJECT_NIL) { - kill_wombat (); - CORBA_exception_free (&ev); - return; - } - - version = GNOME_Evolution_WombatInterfaceCheck__get_interfaceVersion (iface, &ev); - if (BONOBO_EX (&ev)) { - kill_wombat (); - CORBA_Object_release (iface, &ev); - CORBA_exception_free (&ev); - return; - } - - if (strcmp (version, VERSION) != 0) { - CORBA_free (version); - kill_wombat (); - CORBA_Object_release (iface, &ev); - CORBA_exception_free (&ev); - return; - } - - CORBA_free (version); - CORBA_Object_release (iface, &ev); - CORBA_exception_free (&ev); -} - - -/* Warning dialog to scare people off a little bit. */ - -static void -warning_dialog_response_callback (GtkDialog *dialog, - int button_number, - void *data) -{ - GtkCheckButton *dont_bother_me_again_checkbox; - GConfClient *client; - - dont_bother_me_again_checkbox = GTK_CHECK_BUTTON (data); - - client = gconf_client_get_default (); - gconf_client_set_bool (client, "/apps/evolution/shell/skip_warning_dialog", - gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dont_bother_me_again_checkbox)), - NULL); - g_object_unref (client); - - gtk_widget_destroy (GTK_WIDGET (dialog)); -} - -static void -show_development_warning (GtkWindow *parent) -{ - GtkWidget *label; - GtkWidget *warning_dialog; - GtkWidget *dont_bother_me_again_checkbox; - GtkWidget *alignment; - GConfClient *client; - char *text; - - client = gconf_client_get_default (); - - if (gconf_client_get_bool (client, "/apps/evolution/shell/skip_warning_dialog", NULL)) { - g_object_unref (client); - return; - } - - g_object_unref (client); - - warning_dialog = gtk_dialog_new_with_buttons("Ximian Evolution " VERSION, parent, - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); - text = g_strdup_printf( - /* xgettext:no-c-format */ - /* Preview/Alpha/Beta version warning message */ - _("Hi. Thanks for taking the time to download this preview release\n" - "of the Ximian Evolution groupware suite.\n" - "\n" - "This version of Ximian Evolution is not yet complete. It is getting close,\n" - "but some features are either unfinished or do not work properly.\n" - "\n" - "If you want a stable version of Evolution, we urge you to uninstall\n" - "this version, and install version %s instead.\n" - "\n" - "If you find bugs, please report them to us at bugzilla.ximian.com.\n" - "This product comes with no warranty and is not intended for\n" - "individuals prone to violent fits of anger.\n" - "\n" - "We hope that you enjoy the results of our hard work, and we\n" - "eagerly await your contributions!\n"), - "1.2.x (1.2.2)"); - label = gtk_label_new (text); - g_free(text); - - gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT); - - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (warning_dialog)->vbox), - label, TRUE, TRUE, 4); - - label = gtk_label_new (_("Thanks\n" - "The Ximian Evolution Team\n")); - gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_RIGHT); - gtk_misc_set_alignment(GTK_MISC(label), 1, .5); - - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (warning_dialog)->vbox), - label, TRUE, TRUE, 0); - - dont_bother_me_again_checkbox = gtk_check_button_new_with_label (_("Don't tell me again")); - - /* GTK sucks. (Just so you know.) */ - alignment = gtk_alignment_new (0.0, 0.0, 0.0, 0.0); - - gtk_container_add (GTK_CONTAINER (alignment), dont_bother_me_again_checkbox); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (warning_dialog)->vbox), - alignment, FALSE, FALSE, 0); - - gtk_widget_show_all (warning_dialog); - - g_signal_connect (warning_dialog, "response", - G_CALLBACK (warning_dialog_response_callback), - dont_bother_me_again_checkbox); -} - -/* The following signal handlers are used to display the development warning as - soon as the first view is created. */ - -static void -view_map_callback (GtkWidget *widget, - void *data) -{ - g_signal_handlers_disconnect_by_func (widget, G_CALLBACK (view_map_callback), data); - - show_development_warning (GTK_WINDOW (widget)); -} - -static void -new_view_created_callback (EShell *shell, - EShellView *view, - void *data) -{ - g_signal_handlers_disconnect_by_func (shell, G_CALLBACK (new_view_created_callback), data); - - g_signal_connect (view, "map", G_CALLBACK (view_map_callback), NULL); -} - - -/* This is for doing stuff that requires the GTK+ loop to be running already. */ - -static gint -idle_cb (void *data) -{ - GSList *uri_list; - GNOME_Evolution_Shell corba_shell; - CORBA_Environment ev; - EShellConstructResult result; - EShellStartupLineMode startup_line_mode; - GSList *p; - gboolean have_evolution_uri; - gboolean display_default; - gboolean displayed_any; - - kill_old_wombat (); - - CORBA_exception_init (&ev); - - uri_list = (GSList *) data; - - if (! start_online && ! start_offline) - startup_line_mode = E_SHELL_STARTUP_LINE_MODE_CONFIG; - else if (start_online) - startup_line_mode = E_SHELL_STARTUP_LINE_MODE_ONLINE; - else - startup_line_mode = E_SHELL_STARTUP_LINE_MODE_OFFLINE; - - shell = e_shell_new (evolution_directory, ! no_splash, startup_line_mode, &result); - g_free (evolution_directory); - - switch (result) { - case E_SHELL_CONSTRUCT_RESULT_OK: - e_shell_config_factory_register (shell); - - g_signal_connect (shell, "no_views_left", G_CALLBACK (no_views_left_cb), NULL); - g_object_weak_ref (G_OBJECT (shell), shell_weak_notify, NULL); - - if (!getenv ("EVOLVE_ME_HARDER")) - g_signal_connect (shell, "new_view_created", - G_CALLBACK (new_view_created_callback), NULL); - - corba_shell = bonobo_object_corba_objref (BONOBO_OBJECT (shell)); - corba_shell = CORBA_Object_duplicate (corba_shell, &ev); - break; - - case E_SHELL_CONSTRUCT_RESULT_CANNOTREGISTER: - corba_shell = bonobo_activation_activate_from_id (E_SHELL_OAFIID, 0, NULL, &ev); - if (ev._major != CORBA_NO_EXCEPTION || corba_shell == CORBA_OBJECT_NIL) { - e_notice (NULL, GTK_MESSAGE_ERROR, - _("Cannot access the Ximian Evolution shell.")); - CORBA_exception_free (&ev); - bonobo_main_quit (); - return FALSE; - } - break; - - default: - e_notice (NULL, GTK_MESSAGE_ERROR, - _("Cannot initialize the Ximian Evolution shell: %s"), - e_shell_construct_result_to_string (result)); - CORBA_exception_free (&ev); - bonobo_main_quit (); - return FALSE; - - } - - have_evolution_uri = FALSE; - displayed_any = FALSE; - - for (p = uri_list; p != NULL; p = p->next) { - const char *uri; - - uri = (const char *) p->data; - if (strncmp (uri, E_SHELL_URI_PREFIX, E_SHELL_URI_PREFIX_LEN) == 0 || - strncmp (uri, E_SHELL_DEFAULTURI_PREFIX, E_SHELL_DEFAULTURI_PREFIX_LEN) == 0) - have_evolution_uri = TRUE; - } - - if (shell == NULL) { - /* We're talking to a remote shell. If the user didn't ask us to open any particular - URI, then open another view of the default URI. */ - if (uri_list == NULL) - display_default = TRUE; - else - display_default = FALSE; - } else { - /* We're starting a new shell. If the user didn't specify any evolution: URIs to - view, AND we can't load the user's previous settings, then show the default - URI. */ - if (! have_evolution_uri) { - e_shell_create_view (shell, NULL, NULL); - display_default = TRUE; - displayed_any = TRUE; - } else { - display_default = FALSE; - } - } - - for (p = uri_list; p != NULL; p = p->next) { - const char *uri; - - uri = (const char *) p->data; - GNOME_Evolution_Shell_handleURI (corba_shell, uri, &ev); - if (ev._major == CORBA_NO_EXCEPTION) - displayed_any = TRUE; - else { - g_warning ("CORBA exception %s when requesting URI -- %s", - BONOBO_EX_REPOID (&ev), uri); - CORBA_exception_free (&ev); - } - } - - g_slist_free (uri_list); - - if (display_default && ! displayed_any) { - const char *uri; - - uri = E_SHELL_VIEW_DEFAULT_URI; - GNOME_Evolution_Shell_handleURI (corba_shell, uri, &ev); - if (ev._major != CORBA_NO_EXCEPTION) - g_warning ("CORBA exception %s when requesting URI -- %s", BONOBO_EX_REPOID (&ev), uri); - } - - CORBA_Object_release (corba_shell, &ev); - - CORBA_exception_free (&ev); - - if (shell == NULL) - bonobo_main_quit (); - - return FALSE; -} - - -/* SIGSEGV handling. - - The GNOME SEGV handler will lose if it's not run from the main Gtk - thread. So if we have to redirect the signal if the crash happens in another - thread. */ - -static void (*gnome_segv_handler) (int); -static GStaticMutex segv_mutex = G_STATIC_MUTEX_INIT; -static pthread_t main_thread; - -static void -segv_redirect (int sig) -{ - if (pthread_self () == main_thread) - gnome_segv_handler (sig); - else { - pthread_kill (main_thread, sig); - - /* We can't return from the signal handler or the thread may - SEGV again. But we can't pthread_exit, because then the - thread may get cleaned up before bug-buddy can get a stack - trace. So we block by trying to lock a mutex we know is - already locked. */ - g_static_mutex_lock (&segv_mutex); - } -} - -static void -setup_segv_redirect (void) -{ - struct sigaction sa, osa; - - sigaction (SIGSEGV, NULL, &osa); - if (osa.sa_handler == SIG_DFL) - return; - - main_thread = pthread_self (); - - sa.sa_flags = 0; - sigemptyset (&sa.sa_mask); - sa.sa_handler = segv_redirect; - sigaction (SIGSEGV, &sa, NULL); - sigaction (SIGBUS, &sa, NULL); - sigaction (SIGFPE, &sa, NULL); - - sa.sa_handler = SIG_IGN; - sigaction (SIGXFSZ, &sa, NULL); - gnome_segv_handler = osa.sa_handler; - g_static_mutex_lock (&segv_mutex); -} - -int -main (int argc, char **argv) -{ - struct poptOption options[] = { - { "no-splash", '\0', POPT_ARG_NONE, &no_splash, 0, - N_("Disable splash screen"), NULL }, - { "offline", '\0', POPT_ARG_NONE, &start_offline, 0, - N_("Start in offline mode"), NULL }, - { "online", '\0', POPT_ARG_NONE, &start_online, 0, - N_("Start in online mode"), NULL }, -#ifdef KILL_PROCESS_CMD - { "force-shutdown", '\0', POPT_ARG_NONE, &killev, 0, - N_("Forcibly shut down all evolution components"), NULL }, -#endif - { "debug", '\0', POPT_ARG_STRING, &evolution_debug_log, 0, - N_("Send the debugging output of all components to a file."), NULL }, -#if 0 - { "force-upgrade", '\0', POPT_ARG_NONE, &force_upgrade, 0, - N_("Force upgrading of configuration files from Evolution 1.0.x"), NULL }, -#endif - { "setup-only", '\0', POPT_ARG_NONE | POPT_ARGFLAG_DOC_HIDDEN, - &setup_only, 0, NULL, NULL }, - POPT_AUTOHELP - { NULL, '\0', 0, NULL, 0, NULL, NULL } - }; - GSList *uri_list; - GValue popt_context_value = { 0, }; - GnomeProgram *program; - poptContext popt_context; - const char **args; - - /* Make ElectricFence work. */ - free (malloc (10)); - - bindtextdomain (GETTEXT_PACKAGE, EVOLUTION_LOCALEDIR); - bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - textdomain (GETTEXT_PACKAGE); - - program = gnome_program_init (PACKAGE, VERSION, LIBGNOMEUI_MODULE, argc, argv, - GNOME_PROGRAM_STANDARD_PROPERTIES, - GNOME_PARAM_POPT_TABLE, options, - GNOME_PARAM_HUMAN_READABLE_NAME, _("Evolution"), - NULL); - - if (start_online && start_offline) { - fprintf (stderr, _("%s: --online and --offline cannot be used together.\n Use %s --help for more information.\n"), - argv[0], argv[0]); - exit (1); - } - - if (killev) { - execl (EVOLUTION_TOOLSDIR "/killev", "killev", NULL); - /* Not reached */ - exit (0); - } - - setup_segv_redirect (); - - if (evolution_debug_log) { - int fd; - - fd = open (evolution_debug_log, O_WRONLY | O_CREAT | O_TRUNC, 0600); - if (fd) { - dup2 (fd, STDOUT_FILENO); - dup2 (fd, STDERR_FILENO); - close (fd); - } else - g_warning ("Could not set up debugging output file."); - } - - glade_init (); - e_cursors_init (); - e_icon_factory_init (); - e_proxy_init (); - - gnome_window_icon_set_default_from_file (EVOLUTION_IMAGES "/evolution-inbox.png"); - - /* FIXME */ - evolution_directory = g_build_filename (g_get_home_dir (), "evolution", NULL); - - if (! e_setup (evolution_directory)) - exit (1); - if (setup_only) - exit (0); - - uri_list = NULL; - - g_value_init (&popt_context_value, G_TYPE_POINTER); - g_object_get_property (G_OBJECT (program), GNOME_PARAM_POPT_CONTEXT, &popt_context_value); - popt_context = g_value_get_pointer (&popt_context_value); - args = poptGetArgs (popt_context); - if (args != NULL) { - const char **p; - - for (p = args; *p != NULL; p++) - uri_list = g_slist_prepend (uri_list, (char *) *p); - } - uri_list = g_slist_reverse (uri_list); - g_value_unset (&popt_context_value); - - e_config_upgrade(evolution_directory); - - gtk_idle_add (idle_cb, uri_list); - - bonobo_main (); - - return 0; -} |