Hi Diego,

On Sat, 2007-03-31 at 21:28 +0200, Diego González wrote:
> hi,
> 
> yesterday i gave a stab at spliting evolution into 3 components, attach
> is a preliminary patch. 
> 
> The patch does the following things:
> 1) it creates three shells for Mail, Calendar and Addressbook
> 2) each shell does not have the switching buttons (but the menu is still
> present although it does not do anything)
> 3) the settings components are only shown where they belong
> 4) modifies the "New" menu so that it only shows the meaningful
> components inside each application.
> 
> Now, this is a "Bonobo-based" split (in that it uses bonobo as the basis
> of the split (ie. there is only a new shell for each component, but the
> components are still there), and there are several problems: 

This is same as what I have demoed in last GUADEC (Vilanova 2006). I
have attached that pre-alpha patch that I have used in my demo. But I
felt that it shouldn't be the way to go. I can list the problems with
this approach.

1. Account setup lies with Mailer (Exchange/GW will have issues around
this)
2. Plugins aren't associated to any components. The EPlugin framework
has to load the plugins depending on the component loaded.
3. Though the shell gets invoked multiple times, the window pops out but
the process dies after that as it creates a new view out of it.

Ideally for the split we should do the following things before that

1. Move the account setup out of Mailer
2. Move away from libbonoboui to Gtk based menus
3. Have the shell interface for a all-component view (like what is there
today)
4. Have evolution-mail, evolution-calendar, evolution-contact, etc as
separate binaries. They should have a main function, that creates a
GtkWindow and creates the menus, toolbars, preferences dialog and partly
the required plugins. Some of this can be achieved via the shell
library, need to explore more on this.


> 
> a) not all the plugins can be used
> b) the system that lets you add an address from the mailer does not work
> as it requires functionality that belongs to the Address book component.
> c) It is a Bonobo split, meaning that all the components and mostly
> useless bonoboUI code is still there
> d) I don't really know what to do with the memos and notes components
> that belong to the calendar.

They too can be separate apps. Althought the calendar provides a unified
view.

> 
> All in all this can be the begining of a crusade to remove BonoboUI (the
> rest of the bonobo that is used in evolution is for communication with
> EDS, but i believe there is plan and even a patch to port it to DBUS)
> from Evolution and split it into 3 components, it only took me 3 hours
> without knowing anything at all about evolution.
> 
DBUS port is to replace BONOBO in eds for IPC etc. It has no other stuff
here in Evolution.

-Srini

PS: The patch use to apply on pre-2.8. Im not sure of the trunk. 

> Other thing that might also be needed is to put the addressbook UI to
> edit contacts into EDS this way there would be no inter-component
> dependencies.
> 
> Last but not least i don't know how the exchange plugins work and thus i
> don't know if this split breaks it and in which ways it does. 
> 
> Nevertheless i hope it shows a path for future work, i believe that if
> evolution gets rid of the BonoboUI code contributors will find an easier
> way into the code. I also say "it shows a path" because i don't think i
> will have enough time to remove BonoboUI code.
> 
> I hope this inspires some hackers.
> 
> Best regards,
> Diego
> 
> PD: i think the patch and files is everything i modified to make the
> thing work, in case there is something left, just drop me a line.
> _______________________________________________
> Evolution-hackers mailing list
> Evolution-hackers@gnome.org
> http://mail.gnome.org/mailman/listinfo/evolution-hackers
Index: e-component-registry.c
===================================================================
RCS file: /cvs/gnome/evolution/shell/e-component-registry.c,v
retrieving revision 1.58
diff -u -p -r1.58 e-component-registry.c
--- e-component-registry.c	2 Jun 2006 17:32:19 -0000	1.58
+++ e-component-registry.c	13 Jul 2006 18:06:12 -0000
@@ -143,7 +143,7 @@ set_schemas (EComponentInfo *component_i
 }
 
 static void
-query_components (EComponentRegistry *registry)
+query_components (EComponentRegistry *registry, const char *component_id)
 {
 	Bonobo_ServerInfoList *info_list;
 	CORBA_Environment ev;
@@ -151,8 +151,12 @@ query_components (EComponentRegistry *re
 	const GList *l;
 	char *query;
 	int i;
+	gboolean loaded=FALSE;
 
-	if (registry->priv->init)
+	if (registry->priv->init && !component_id)
+		return;
+	
+	if (component_id && (e_component_registry_peek_info_offline(registry, ECR_FIELD_ALIAS, component_id) != CORBA_OBJECT_NIL))
 		return;
 
 	registry->priv->init = TRUE;
@@ -174,7 +178,7 @@ query_components (EComponentRegistry *re
 	for (language_list=NULL;l;l=l->next)
 		language_list = g_slist_append(language_list, l->data);
 
-	for (i = 0; i < info_list->_length; i++) {
+	for (i = 0; i < info_list->_length && !loaded; i++) {
 		const char *id;
 		const char *label;
 		const char *menu_label;
@@ -189,6 +193,15 @@ query_components (EComponentRegistry *re
 		GNOME_Evolution_Component iface;
 
 		id = info_list->_buffer[i].iid;
+		alias = bonobo_server_info_prop_lookup (& info_list->_buffer[i], "evolution:component_alias", NULL);
+
+		if (component_id) {
+			if (!strcmp (component_id, alias))
+				loaded = TRUE;
+			else
+				continue;
+		}
+		
 		iface = bonobo_activation_activate_from_id ((char *)id, 0, NULL, &ev);
 		if (BONOBO_EX (&ev) || iface == CORBA_OBJECT_NIL) {
 			char *ex_text = bonobo_exception_get_text (&ev);
@@ -208,8 +221,6 @@ query_components (EComponentRegistry *re
 
 		menu_accelerator = bonobo_server_info_prop_lookup (& info_list->_buffer[i], "evolution:menu_accelerator", language_list);
 
-		alias = bonobo_server_info_prop_lookup (& info_list->_buffer[i], "evolution:component_alias", NULL);
-
 		icon_name = bonobo_server_info_prop_lookup (& info_list->_buffer[i], "evolution:button_icon", NULL);
 		if (icon_name) {
 			icon = e_icon_factory_get_icon (icon_name, E_ICON_SIZE_LARGE_TOOLBAR);
@@ -288,11 +299,11 @@ e_component_registry_new (void)
 
 
 GSList *
-e_component_registry_peek_list (EComponentRegistry *registry)
+e_component_registry_peek_list (EComponentRegistry *registry, const char *component_id)
 {
 	g_return_val_if_fail (E_IS_COMPONENT_REGISTRY (registry), NULL);
 
-	query_components(registry);
+	query_components(registry, component_id);
 
 	return registry->priv->infos;
 }
@@ -307,7 +318,39 @@ e_component_registry_peek_info (ECompone
 
 	g_return_val_if_fail (E_IS_COMPONENT_REGISTRY (registry), NULL);
 
-	query_components(registry);
+	query_components(registry, NULL);
+
+	for (p = registry->priv->infos; p != NULL; p = p->next) {
+		EComponentInfo *info = p->data;
+
+		switch (field) {
+		case ECR_FIELD_ID:
+			if (info->id && (strcmp (info->id, key) == 0))
+				return info;
+			break;
+		case ECR_FIELD_ALIAS:
+			if (info->alias && (strcmp (info->alias, key) == 0))
+				return info;
+			break;
+		case ECR_FIELD_SCHEMA:
+			for (q = info->uri_schemas; q != NULL; q = q->next)
+				if (strcmp((char *)q->data, key) == 0)
+					return info;
+			break;
+		}
+	}
+
+	return NULL;
+}
+
+EComponentInfo *
+e_component_registry_peek_info_offline (EComponentRegistry *registry,
+					enum _EComponentRegistryField field,
+					const char *key)
+{
+	GSList *p, *q;
+
+	g_return_val_if_fail (E_IS_COMPONENT_REGISTRY (registry), NULL);
 
 	for (p = registry->priv->infos; p != NULL; p = p->next) {
 		EComponentInfo *info = p->data;
Index: e-component-registry.h
===================================================================
RCS file: /cvs/gnome/evolution/shell/e-component-registry.h,v
retrieving revision 1.17
diff -u -p -r1.17 e-component-registry.h
--- e-component-registry.h	16 May 2005 04:46:40 -0000	1.17
+++ e-component-registry.h	13 Jul 2006 18:06:12 -0000
@@ -89,11 +89,13 @@ typedef struct _EComponentInfo EComponen
 GType               e_component_registry_get_type  (void);
 EComponentRegistry *e_component_registry_new       (void);
 
-GSList         *e_component_registry_peek_list  (EComponentRegistry *registry);
+GSList         *e_component_registry_peek_list  (EComponentRegistry *registry, const char *component_id);
 EComponentInfo *e_component_registry_peek_info  (EComponentRegistry *registry,
 						 enum _EComponentRegistryField type,
 						 const char *key);
-
+EComponentInfo *e_component_registry_peek_info_offline  (EComponentRegistry *registry,
+							 enum _EComponentRegistryField type,
+							 const char *key);
 GNOME_Evolution_Component  e_component_registry_activate  (EComponentRegistry *registry,
 							   const char         *id,
 							   CORBA_Environment  *ev);
Index: e-shell-settings-dialog.c
===================================================================
RCS file: /cvs/gnome/evolution/shell/e-shell-settings-dialog.c,v
retrieving revision 1.38
diff -u -p -r1.38 e-shell-settings-dialog.c
--- e-shell-settings-dialog.c	21 Jan 2006 11:48:51 -0000	1.38
+++ e-shell-settings-dialog.c	13 Jul 2006 18:06:13 -0000
@@ -46,7 +46,6 @@ G_DEFINE_TYPE (EShellSettingsDialog, e_s
 
 /* FIXME ugly hack to work around that sizing of invisible widgets is broken
    with Bonobo.  */
-
 static void
 set_dialog_size (EShellSettingsDialog *dialog)
 {
@@ -154,7 +153,7 @@ load_pages (EShellSettingsDialog *dialog
 	GList *page_list;
 	GList *p;
 	int i, j;
-
+	
 	priv = dialog->priv;
 	
 	CORBA_exception_init (&ev);
@@ -181,14 +180,27 @@ load_pages (EShellSettingsDialog *dialog
 		const char *description;
 		const char *icon_path;
 		const char *priority_string;
-		Bonobo_ActivationProperty *type;
+		const char *alias=NULL;		
+		Bonobo_ActivationProperty *type, *comp;
 		int priority;
 		GdkPixbuf *icon;
-
+		gboolean loaded = FALSE;
+		
 		CORBA_exception_init (&ev);
 
 		info = & control_list->_buffer[i];
-
+		comp = bonobo_server_info_prop_find   (info, "evolution2:config_item:component");
+		if (dialog->component && !dialog->universal) {
+			Bonobo_StringList list = comp->v._u.value_stringv;
+			
+			for (j = 0; j < list._length && !loaded; j++) {
+				if (!strcmp (dialog->component, list._buffer[j]))
+					loaded = TRUE;
+			}
+			if (!loaded)
+				continue;
+		}
+		
 		title       	= bonobo_server_info_prop_lookup (info, "evolution2:config_item:title", language_list);
 		description 	= bonobo_server_info_prop_lookup (info, "evolution2:config_item:description", language_list);
 		icon_path   	= bonobo_server_info_prop_lookup (info, "evolution2:config_item:icon_name", NULL);
@@ -297,9 +309,11 @@ static void
 e_shell_settings_dialog_class_init (EShellSettingsDialogClass *klass)
 {
 	GObjectClass *object_class;
-
+	GParamSpec *spec;
+	
 	object_class = G_OBJECT_CLASS (klass);
 	object_class->finalize = impl_finalize;
+	
 }
 
 static void
@@ -311,22 +325,23 @@ e_shell_settings_dialog_init (EShellSett
 	priv->types = g_hash_table_new (g_str_hash, g_str_equal);
 
 	dialog->priv = priv;
-
-	load_pages (dialog);
-	set_dialog_size (dialog);
-	
-	gtk_window_set_title (GTK_WINDOW (dialog), _("Evolution Preferences"));
-	gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
 }
 
 
 GtkWidget *
-e_shell_settings_dialog_new ()
+e_shell_settings_dialog_new (const char *component, gboolean universal)
 {
 	EShellSettingsDialog *new;
 
 	new = g_object_new (e_shell_settings_dialog_get_type (), NULL);
-
+	new->component = component;
+	new->universal = universal;
+	
+	load_pages (new);
+	set_dialog_size (new);
+	
+	gtk_window_set_title (GTK_WINDOW (new), _("Evolution Preferences"));
+	gtk_dialog_set_has_separator (GTK_DIALOG (new), FALSE);	
 	return GTK_WIDGET (new);
 }
 
Index: e-shell-settings-dialog.h
===================================================================
RCS file: /cvs/gnome/evolution/shell/e-shell-settings-dialog.h,v
retrieving revision 1.3
diff -u -p -r1.3 e-shell-settings-dialog.h
--- e-shell-settings-dialog.h	19 Jun 2002 19:18:19 -0000	1.3
+++ e-shell-settings-dialog.h	13 Jul 2006 18:06:13 -0000
@@ -45,6 +45,8 @@ typedef struct _EShellSettingsDialogClas
 struct _EShellSettingsDialog {
 	EMultiConfigDialog parent;
 
+	const char *component;
+	gboolean universal;
 	EShellSettingsDialogPrivate *priv;
 };
 
@@ -54,7 +56,7 @@ struct _EShellSettingsDialogClass {
 
 
 GtkType    e_shell_settings_dialog_get_type  (void);
-GtkWidget *e_shell_settings_dialog_new       (void);
+GtkWidget *e_shell_settings_dialog_new       (const char *component, gboolean universal);
 void       e_shell_settings_dialog_show_type (EShellSettingsDialog *dialog,
 					      const char           *type);
 
Index: e-shell-window.c
===================================================================
RCS file: /cvs/gnome/evolution/shell/e-shell-window.c,v
retrieving revision 1.51
diff -u -p -r1.51 e-shell-window.c
--- e-shell-window.c	7 Jul 2006 03:19:43 -0000	1.51
+++ e-shell-window.c	13 Jul 2006 18:06:16 -0000
@@ -84,7 +84,8 @@ struct _EShellWindowPrivate {
 	EShell *shell;
 
 	EShellView *shell_view;	/* CORBA wrapper for this, just a placeholder */
-
+	const char *component;
+	
 	/* plugin menu manager */
 	ESMenu *menu;
 
@@ -639,7 +640,7 @@ static GConfEnumStringPair button_styles
 };
 
 static void
-setup_widgets (EShellWindow *window)
+setup_widgets (EShellWindow *window, char *component_id)
 {
 	EShellWindowPrivate *priv = window->priv;
 	EComponentRegistry *registry = e_shell_peek_component_registry (priv->shell);
@@ -686,8 +687,14 @@ setup_widgets (EShellWindow *window)
 				      visible ? "0" : "1",
 				      NULL);
 
-	e_sidebar_set_show_buttons (E_SIDEBAR (priv->sidebar), visible);
-
+	e_sidebar_set_show_buttons (E_SIDEBAR (priv->sidebar), visible && !component_id);
+	if (component_id) {
+		bonobo_ui_component_set_prop (e_shell_window_peek_bonobo_ui_component (window),
+					      "/menu/View/Window",
+					      "visib",
+					      "0",
+					      NULL);		
+	}
 	style = gconf_client_get_string (gconf_client,
 					 "/apps/evolution/shell/view_defaults/buttons_style",
 					 NULL);
@@ -758,7 +765,18 @@ setup_widgets (EShellWindow *window)
 
 	button_id = 0;
 	xml = g_string_new("");
-	for (p = e_component_registry_peek_list (registry); p != NULL; p = p->next) {
+
+	if (component_id) {
+		/* Hide these, if it is a split model */
+		bonobo_ui_component_rm (e_shell_window_peek_bonobo_ui_component (window),
+						   "/menu/View/Window",
+						   NULL);
+		bonobo_ui_component_rm (e_shell_window_peek_bonobo_ui_component (window),
+						   "/menu/View/Buttons",
+						   NULL);		
+	}
+	
+	for (p = e_component_registry_peek_list (registry, component_id); p != NULL; p = p->next) {
 		char *tmp, *tmp2;
 		EComponentInfo *info = p->data;
 		ComponentView *view = component_view_new (info->id, info->alias, button_id);
@@ -769,40 +787,42 @@ setup_widgets (EShellWindow *window)
 			continue;
 		e_sidebar_add_button (E_SIDEBAR (priv->sidebar), info->button_label, info->button_tooltips, info->button_icon, button_id);
 
-		g_string_printf(xml, "SwitchComponent-%s", info->alias);
-		bonobo_ui_component_add_verb (e_shell_window_peek_bonobo_ui_component (window),
-					      xml->str,
-					      (BonoboUIVerbFn)menu_component_selected,
-					      window);
-
-		g_string_printf(xml, "<submenu name=\"View\">"
-				"<submenu name=\"Window\">"
-				"<placeholder name=\"WindowComponent\">"
-				"<menuitem name=\"SwitchComponent-%s\" "
-				"verb=\"\" label=\"%s\" accel=\"%s\" tip=\"",
-				info->alias,
-				info->menu_label,
-				info->menu_accelerator);
-		tmp = g_strdup_printf (_("Switch to %s"), info->button_label);
-		tmp2 = g_markup_escape_text (tmp, -1);
-		g_string_append (xml, tmp2);
-		g_free (tmp2);
-		g_free (tmp);
-
-		tmp = bonobo_ui_util_pixbuf_to_xml (info->menu_icon),
-		g_string_append_printf(xml, "\" pixtype=\"pixbuf\" pixname=\"%s\"/>"
-				       "</placeholder></submenu></submenu>\n",
-				       tmp);
-		g_free(tmp);
-		bonobo_ui_component_set_translate (e_shell_window_peek_bonobo_ui_component (window),
-						   "/menu",
-						   xml->str,
-						   NULL);
-		g_string_printf(xml, "<cmd name=\"SwitchComponent-%s\"/>\n", info->alias);
-		bonobo_ui_component_set_translate (e_shell_window_peek_bonobo_ui_component (window),
-						   "/commands",
-						   xml->str,
-						   NULL);
+		if (!component_id) {
+			g_string_printf(xml, "SwitchComponent-%s", info->alias);
+			bonobo_ui_component_add_verb (e_shell_window_peek_bonobo_ui_component (window),
+						      xml->str,
+						      (BonoboUIVerbFn)menu_component_selected,
+						      window);
+
+			g_string_printf(xml, "<submenu name=\"View\">"
+					"<submenu name=\"Window\" >"
+					"<placeholder name=\"WindowComponent\">"
+					"<menuitem name=\"SwitchComponent-%s\" "
+					"verb=\"\" label=\"%s\" accel=\"%s\" tip=\"",
+					info->alias,
+					info->menu_label,
+					info->menu_accelerator);
+			tmp = g_strdup_printf (_("Switch to %s"), info->button_label);
+			tmp2 = g_markup_escape_text (tmp, -1);
+			g_string_append (xml, tmp2);
+			g_free (tmp2);
+			g_free (tmp);
+
+			tmp = bonobo_ui_util_pixbuf_to_xml (info->menu_icon),
+				g_string_append_printf(xml, "\" pixtype=\"pixbuf\" pixname=\"%s\"/>"
+						       "</placeholder></submenu></submenu>\n",
+						       tmp);
+			g_free(tmp);
+			bonobo_ui_component_set_translate (e_shell_window_peek_bonobo_ui_component (window),
+							   "/menu",
+							   xml->str,
+							   NULL);
+			g_string_printf(xml, "<cmd name=\"SwitchComponent-%s\"/>\n", info->alias);
+			bonobo_ui_component_set_translate (e_shell_window_peek_bonobo_ui_component (window),
+							   "/commands",
+							   xml->str,
+							   NULL);
+		}
 		button_id ++;
 	}
 	g_string_free(xml, TRUE);
@@ -828,7 +848,8 @@ static void
 impl_dispose (GObject *object)
 {
 	EShellWindowPrivate *priv = E_SHELL_WINDOW (object)->priv;
-
+	EShellWindow *window = E_SHELL_WINDOW (object);
+	
 	if (priv->shell != NULL) {
 		g_object_remove_weak_pointer (G_OBJECT (priv->shell), (void **) &priv->shell);
 		priv->shell = NULL;
@@ -844,6 +865,11 @@ impl_dispose (GObject *object)
 		priv->tooltips = NULL;
 	}
 
+	if (window->settings_dialog != NULL) {
+		gtk_widget_destroy (window->settings_dialog);
+		window->settings_dialog = NULL;
+	}
+	
 	(* G_OBJECT_CLASS (e_shell_window_parent_class)->dispose) (object);
 }
 
@@ -960,7 +986,7 @@ e_shell_window_init (EShellWindow *shell
 	priv->shell_view = e_shell_view_new(shell_window);
 
 	shell_window->priv = priv;
-
+	shell_window->settings_dialog = NULL;
 	/** @HookPoint: Shell Main Menu
 	 * @Id: org.gnome.evolution.shell
 	 * @Type: ESMenu
@@ -988,6 +1014,8 @@ e_shell_window_new (EShell *shell,
 	char *default_component_id = NULL;
 	char *xmlfile;
 
+	window->priv->component = component_id;
+	e_user_creatable_items_set_split (component_id ? TRUE: FALSE);	
 	if (bonobo_window_construct (BONOBO_WINDOW (window),
 				     bonobo_ui_container_new (),
 				     "evolution", "Evolution") == NULL) {
@@ -1019,7 +1047,7 @@ e_shell_window_new (EShell *shell,
 	e_shell_window_commands_setup (window);
 	e_menu_activate((EMenu *)priv->menu, priv->ui_component, TRUE);
 
-	setup_widgets (window);
+	setup_widgets (window, component_id);
 
 	if(gconf_client_get_bool (gconf_client,"/apps/evolution/shell/view_defaults/sidebar_visible",NULL))
 		gtk_widget_show (priv->sidebar);
@@ -1198,8 +1226,14 @@ void
 e_shell_window_show_settings (EShellWindow *window)
 {
 	g_return_if_fail (E_IS_SHELL_WINDOW (window));
+	const char *component;
+
+/* 	if (window->priv->component) */
+/* 		component = window->priv->component; */
+/* 	else */
+	component = window->priv->current_view ? window->priv->current_view->component_alias : NULL;
 
-	e_shell_show_settings (window->priv->shell, window->priv->current_view ? window->priv->current_view->component_alias : NULL, window);
+	e_shell_show_settings (window->priv->shell, component, window, window->priv->component ? FALSE : TRUE);
 }
 
 void
Index: e-shell-window.h
===================================================================
RCS file: /cvs/gnome/evolution/shell/e-shell-window.h,v
retrieving revision 1.11
diff -u -p -r1.11 e-shell-window.h
--- e-shell-window.h	21 Dec 2005 07:18:49 -0000	1.11
+++ e-shell-window.h	13 Jul 2006 18:06:16 -0000
@@ -41,6 +41,7 @@ typedef struct _EShellWindowClass   EShe
 struct _EShellWindow {
 	BonoboWindow parent;
 
+	GtkWidget *settings_dialog;
 	EShellWindowPrivate *priv;
 };
 
Index: e-shell.c
===================================================================
RCS file: /cvs/gnome/evolution/shell/e-shell.c,v
retrieving revision 1.273
diff -u -p -r1.273 e-shell.c
--- e-shell.c	19 Jun 2006 15:21:55 -0000	1.273
+++ e-shell.c	13 Jul 2006 18:06:18 -0000
@@ -85,6 +85,7 @@ struct _EShellPrivate {
 
 	/* EUriSchemaRegistry *uri_schema_registry; FIXME */
 	EComponentRegistry *component_registry;
+	const char *default_component_id;
 
 	/* Names for the types of the folders that have maybe crashed.  */
 	/* FIXME TODO */
@@ -97,7 +98,7 @@ struct _EShellPrivate {
 	EvolutionListener *line_status_listener;
 
 	/* Settings Dialog */
-	GtkWidget *settings_dialog;
+/* 	GtkWidget *settings_dialog; */
 
 	/* If we're quitting and things are still busy, a timeout handler */
 	guint quit_timeout;
@@ -174,7 +175,7 @@ set_interactive (EShell *shell,
 	first_element = g_list_first (shell->priv->windows);
 	view = GTK_WIDGET (first_element->data);
 
-	component_list = e_component_registry_peek_list (shell->priv->component_registry);
+	component_list = e_component_registry_peek_list (shell->priv->component_registry, shell->priv->default_component_id);
 
 	for (p = component_list; p != NULL; p = p->next) {
 		EComponentInfo *info = p->data;
@@ -450,10 +451,10 @@ impl_dispose (GObject *object)
 	/* No unreffing for these as they are aggregate.  */
 	/* bonobo_object_unref (BONOBO_OBJECT (priv->corba_storage_registry)); */
 
-	if (priv->settings_dialog != NULL) {
-		gtk_widget_destroy (priv->settings_dialog);
-		priv->settings_dialog = NULL;
-	}
+/* 	if (priv->settings_dialog != NULL) { */
+/* 		gtk_widget_destroy (priv->settings_dialog); */
+/* 		priv->settings_dialog = NULL; */
+/* 	} */
 
 	if (priv->line_status_listener) {
 		priv->line_status_listener->complete = NULL;
@@ -603,7 +604,7 @@ attempt_upgrade (EShell *shell, int majo
 
 	success = TRUE;
 
-	component_infos = e_component_registry_peek_list (shell->priv->component_registry);
+	component_infos = e_component_registry_peek_list (shell->priv->component_registry, shell->priv->default_component_id);
 	for (p = component_infos; success && p != NULL; p = p->next) {
 		const EComponentInfo *info = p->data;
 		CORBA_Environment ev;
@@ -685,7 +686,7 @@ e_shell_construct (EShell *shell,
 	
 	/* activate all the components (peek list does this implictly) */
 	/* Do we really need to assign the result of this to the list? */
-	component = e_component_registry_peek_list (shell->priv->component_registry);
+	component = e_component_registry_peek_list (shell->priv->component_registry, shell->priv->default_component_id);
 	
 	e_shell_attempt_upgrade(shell);
 
@@ -726,13 +727,15 @@ e_shell_construct (EShell *shell,
  **/
 EShell *
 e_shell_new (EShellStartupLineMode startup_line_mode,
+	     const char *component_id,
 	     EShellConstructResult *construct_result_return)
 {
 	EShell *new;
 	EShellConstructResult construct_result;
 
 	new = g_object_new (e_shell_get_type (), NULL);
-
+	new->priv->default_component_id = component_id;
+	
 	construct_result = e_shell_construct (new, E_SHELL_OAFIID, startup_line_mode);
 
 	if (construct_result != E_SHELL_CONSTRUCT_RESULT_OK) {
@@ -938,7 +941,7 @@ e_shell_create_window (EShell *shell,
 
 	g_signal_emit (shell, signals[NEW_WINDOW_CREATED], 0, window);
 
-	gtk_widget_show (GTK_WIDGET (window));
+	gtk_window_present (GTK_WIDGET (window));
 
 	e_error_default_parent((GtkWindow *)window);
 
@@ -1143,7 +1146,7 @@ set_line_status(EShell *shell, GNOME_Evo
 	   `need to not complete till we're really complete */
 	priv->line_status_pending += 2;
 
-	component_infos = e_component_registry_peek_list (priv->component_registry);
+	component_infos = e_component_registry_peek_list (priv->component_registry, shell->priv->default_component_id);
 	for (p = component_infos; p != NULL; p = p->next) {
 		EComponentInfo *info = p->data;
 
@@ -1206,7 +1209,7 @@ e_shell_send_receive (EShell *shell)
 
 	g_return_if_fail (E_IS_SHELL (shell));
 
-	component_list = e_component_registry_peek_list (shell->priv->component_registry);
+	component_list = e_component_registry_peek_list (shell->priv->component_registry, shell->priv->default_component_id);
 
 	for (p = component_list; p != NULL; p = p->next) {
 		EComponentInfo *info = p->data;
@@ -1227,7 +1230,8 @@ e_shell_send_receive (EShell *shell)
 void
 e_shell_show_settings (EShell *shell,
 		       const char *type,
-		       EShellWindow *shell_window)
+		       EShellWindow *shell_window,
+	               gboolean universal)
 {
 	EShellPrivate *priv;
 	
@@ -1236,21 +1240,21 @@ e_shell_show_settings (EShell *shell,
 
 	priv = shell->priv;
 	
-	if (priv->settings_dialog != NULL) {
-		gdk_window_show (priv->settings_dialog->window);
-		gtk_widget_grab_focus (priv->settings_dialog);
+	if (shell_window->settings_dialog != NULL) {
+		gdk_window_show (shell_window->settings_dialog->window);
+		gtk_widget_grab_focus (shell_window->settings_dialog);
 		return;
 	}
 	
-	priv->settings_dialog = e_shell_settings_dialog_new ();
+	shell_window->settings_dialog = e_shell_settings_dialog_new (type, universal);
 
 	if (type != NULL)
-		e_shell_settings_dialog_show_type (E_SHELL_SETTINGS_DIALOG (priv->settings_dialog), type);
+		e_shell_settings_dialog_show_type (E_SHELL_SETTINGS_DIALOG (shell_window->settings_dialog), type);
 
-	g_object_add_weak_pointer (G_OBJECT (priv->settings_dialog), (void **) & priv->settings_dialog);
+	g_object_add_weak_pointer (G_OBJECT (shell_window->settings_dialog), (void **) & shell_window->settings_dialog);
 
-	gtk_window_set_transient_for (GTK_WINDOW (priv->settings_dialog), GTK_WINDOW (shell_window));
-	gtk_widget_show (priv->settings_dialog);
+	gtk_window_set_transient_for (GTK_WINDOW (shell_window->settings_dialog), GTK_WINDOW (shell_window));
+	gtk_widget_show (shell_window->settings_dialog);
 }
 
 
@@ -1287,7 +1291,7 @@ es_run_quit(EShell *shell)
 	priv = shell->priv;
 	priv->preparing_to_quit = TRUE;
 
-	component_infos = e_component_registry_peek_list (priv->component_registry);
+	component_infos = e_component_registry_peek_list (priv->component_registry, shell->priv->default_component_id);
 	done_quit = TRUE;
 	for (sp = component_infos; sp != NULL; sp = sp->next) {
 		EComponentInfo *info = sp->data;
@@ -1335,7 +1339,7 @@ e_shell_quit(EShell *shell)
 	if (priv->preparing_to_quit)
 		return FALSE;
 
-	component_infos = e_component_registry_peek_list (priv->component_registry);
+	component_infos = e_component_registry_peek_list (priv->component_registry, shell->priv->default_component_id);
 	can_quit = TRUE;
 	for (sp = component_infos; sp != NULL; sp = sp->next) {
 		EComponentInfo *info = sp->data;
Index: e-shell.h
===================================================================
RCS file: /cvs/gnome/evolution/shell/e-shell.h,v
retrieving revision 1.70
diff -u -p -r1.70 e-shell.h
--- e-shell.h	22 Dec 2005 02:12:34 -0000	1.70
+++ e-shell.h	13 Jul 2006 18:06:18 -0000
@@ -97,6 +97,7 @@ EShellConstructResult  e_shell_construct
 					   const char            *iid,
 					   EShellStartupLineMode  startup_line_mode);
 EShell                *e_shell_new        (EShellStartupLineMode  startup_line_mode,
+					   const char            *component_id,
 					   EShellConstructResult *construct_result_return);
 
 gboolean  e_shell_attempt_upgrade  (EShell     *shell);
@@ -127,7 +128,8 @@ void  e_shell_send_receive  (EShell *she
 
 void  e_shell_show_settings  (EShell       *shell,
 			      const char   *type,
-			      EShellWindow *shell_window);
+			      EShellWindow *shell_window,
+	                      gboolean universal);
 
 gboolean e_shell_quit (EShell *shell);
 
Index: e-user-creatable-items-handler.c
===================================================================
RCS file: /cvs/gnome/evolution/shell/e-user-creatable-items-handler.c,v
retrieving revision 1.17
diff -u -p -r1.17 e-user-creatable-items-handler.c
--- e-user-creatable-items-handler.c	12 Jul 2006 06:49:13 -0000	1.17
+++ e-user-creatable-items-handler.c	13 Jul 2006 18:06:19 -0000
@@ -60,6 +60,8 @@ struct _Component {
 };
 typedef struct _Component Component;
 
+static split = FALSE;
+
 /* Representation of a single menu item.  */
 struct _MenuItem {
 	const char *label;
@@ -98,6 +100,7 @@ struct _EUserCreatableItemsHandlerPrivat
 	BonoboControl *new_control;
 	GtkTooltips *tooltips;
 	GtkAccelGroup *accel_group;
+	gboolean split;
 };
 
 enum {
@@ -247,6 +250,8 @@ ensure_menu_items (EUserCreatableItemsHa
 		int i;
 
 		component = (const Component *) p->data;
+		if (handler->priv->split && strcmp (handler->priv->this_component, component->alias))
+			continue;
 		if (component->type_list != NULL) {
 			for (i = 0; i < component->type_list->_length; i ++) {
 				const GNOME_Evolution_CreatableItemType *corba_item;
@@ -422,6 +427,9 @@ add_verbs (EUserCreatableItemsHandler *h
 		int i;
 
 		component = (const Component *) p->data;
+		
+		if (handler->priv->split && strcmp (handler->priv->this_component, component->alias))
+			continue;
 
 		if (component->type_list != NULL) {
 			for (i = 0; i < component->type_list->_length; i ++) {
@@ -520,36 +528,39 @@ construct_menu (EUserCreatableItemsHandl
 	}
 
 	/* Then a separator */
-	separator_func (handler, menu, 1);
-
-	/* Then the objects from other components. */
-	items = NULL;
-	for (p = priv->objects; p != NULL; p = p->next) {
-		item = p->data;
-		if (! item_is_default (item, priv->this_component))
-			items = g_slist_prepend (items, item);
-	}
+	if (!handler->priv->split) {
+		separator_func (handler, menu, 1);
 
-	items = g_slist_sort (items, item_types_sort_func);
-	for (p = items; p != NULL; p = p->next)
-		menu_item_func (handler, menu, p->data, FALSE);
-	g_slist_free (items);
-
-	/* Another separator */
-	separator_func (handler, menu, 2);
+		/* Then the objects from other components. */
+		items = NULL;
+		for (p = priv->objects; p != NULL; p = p->next) {
+			item = p->data;
+			if (! item_is_default (item, priv->this_component))
+				items = g_slist_prepend (items, item);
+		}
 
-	/* And finally the folders from other components */
-	items = NULL;
-	for (p = priv->folders; p != NULL; p = p->next) {
-		item = p->data;
-		if (! item_is_default (item, priv->this_component))
-			items = g_slist_prepend (items, item);
+		items = g_slist_sort (items, item_types_sort_func);
+		for (p = items; p != NULL; p = p->next)
+			menu_item_func (handler, menu, p->data, FALSE);
+		g_slist_free (items);
+
+		/* Another separator */
+		separator_func (handler, menu, 2);
+
+		/* And finally the folders from other components */
+		items = NULL;
+		for (p = priv->folders; p != NULL; p = p->next) {
+			item = p->data;
+			if (! item_is_default (item, priv->this_component))
+				items = g_slist_prepend (items, item);
+		}
+		items = g_slist_sort (items, item_types_sort_func);
+		for (p = items; p != NULL; p = p->next)
+			menu_item_func (handler, menu, p->data, FALSE);
+		g_slist_free (items);		
 	}
-
-	items = g_slist_sort (items, item_types_sort_func);
-	for (p = items; p != NULL; p = p->next)
-		menu_item_func (handler, menu, p->data, FALSE);
-	g_slist_free (items);
+	
+	
 }
 
 /* The XML description for "File -> New".  */
@@ -877,6 +887,7 @@ e_user_creatable_items_handler_new (cons
 				NULL);
 	handler->priv->create_local = create_local;
 	handler->priv->create_data = data;
+	handler->priv->split = split;
 
 	return handler;
 }
@@ -914,3 +925,11 @@ e_user_creatable_items_handler_activate 
 					BONOBO_OBJREF (priv->new_control),
 					NULL);
 }
+
+
+void e_user_creatable_items_set_split (gboolean status)
+{
+	split = status;
+}
+
+		
Index: e-user-creatable-items-handler.h
===================================================================
RCS file: /cvs/gnome/evolution/shell/e-user-creatable-items-handler.h,v
retrieving revision 1.3
diff -u -p -r1.3 e-user-creatable-items-handler.h
--- e-user-creatable-items-handler.h	21 Apr 2004 04:08:55 -0000	1.3
+++ e-user-creatable-items-handler.h	13 Jul 2006 18:06:19 -0000
@@ -62,7 +62,7 @@ EUserCreatableItemsHandler *e_user_creat
 
 void                        e_user_creatable_items_handler_activate   (EUserCreatableItemsHandler *handler,
 								       BonoboUIComponent          *ui_component);
-
+void e_user_creatable_items_set_split (gboolean status);
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
Index: main.c
===================================================================
RCS file: /cvs/gnome/evolution/shell/main.c,v
retrieving revision 1.184
diff -u -p -r1.184 main.c
--- main.c	17 Jun 2006 15:18:38 -0000	1.184
+++ main.c	13 Jul 2006 18:06:19 -0000
@@ -86,6 +86,7 @@
 #include <pthread.h>
 
 #include "e-util/e-plugin.h"
+#include "e-shell-view.h"
 
 static EShell *shell = NULL;
 
@@ -103,7 +104,6 @@ static gint idle_cb (void *data);
 
 static char *default_component_id = NULL;
 static char *evolution_debug_log = NULL;
-static gchar **remaining_args;
 
 static void
 no_windows_left_cb (EShell *shell, gpointer data)
@@ -347,8 +347,9 @@ idle_cb (void *data)
 	else
 		startup_line_mode = E_SHELL_STARTUP_LINE_MODE_OFFLINE;
 
-	shell = e_shell_new (startup_line_mode, &result);
-
+	shell = e_shell_new (startup_line_mode, default_component_id, &result);
+	e_user_creatable_items_set_split (default_component_id ? TRUE: FALSE);
+	printf("it is %s\n", default_component_id);
 	switch (result) {
 	case E_SHELL_CONSTRUCT_RESULT_OK:
 		g_signal_connect (shell, "no_windows_left", G_CALLBACK (no_windows_left_cb), NULL);
@@ -381,16 +382,20 @@ idle_cb (void *data)
 		open_uris (corba_shell, uri_list);
 	} else {
 		CORBA_Environment ev;
-
+		EShellView *view;
+		
 		CORBA_exception_init (&ev);
+
 		if (uri_list != NULL)
 			open_uris (corba_shell, uri_list);
-		else
+		else {
 			if (default_component_id == NULL)
-				GNOME_Evolution_Shell_createNewWindow (corba_shell, "", &ev);
+				view = GNOME_Evolution_Shell_createNewWindow (corba_shell, "", &ev);
 			else
-				GNOME_Evolution_Shell_createNewWindow (corba_shell, default_component_id, &ev);
+				view = GNOME_Evolution_Shell_createNewWindow (corba_shell, default_component_id, &ev);
 
+			gtk_window_present (view);
+		}
 		CORBA_exception_free (&ev);
 	}
 
@@ -399,7 +404,7 @@ idle_cb (void *data)
 	CORBA_Object_release (corba_shell, &ev);
 
 	CORBA_exception_free (&ev);
-	
+	printf("shell %d\n", shell);
 	if (shell == NULL)
 		bonobo_main_quit ();
 
_______________________________________________
Evolution-hackers mailing list
Evolution-hackers@gnome.org
http://mail.gnome.org/mailman/listinfo/evolution-hackers

Reply via email to