/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
/* addressbook-component.c
*
* Copyright (C) 2003 Ettore Perazzoli
*
* 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>
*/
/* EPFIXME: Add autocompletion setting. */
#include <config.h>
#include "addressbook-component.h"
#include "addressbook.h"
#include "widgets/misc/e-source-selector.h"
#include <gtk/gtkscrolledwindow.h>
#include <gconf/gconf-client.h>
#define PARENT_TYPE bonobo_object_get_type ()
static BonoboObjectClass *parent_class = NULL;
struct _AddressbookComponentPrivate {
GConfClient *gconf_client;
ESourceList *source_list;
};
/* Utility functions. */
static void
load_uri_for_selection (ESourceSelector *selector,
BonoboControl *view_control)
{
ESource *selected_source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (selector));
if (selected_source != NULL) {
char *uri = e_source_get_uri (selected_source);
bonobo_control_set_property (view_control, NULL, "folder_uri", TC_CORBA_string, uri, NULL);
g_free (uri);
}
}
/* Callbacks. */
static void
primary_source_selection_changed_callback (ESourceSelector *selector,
BonoboControl *view_control)
{
load_uri_for_selection (selector, view_control);
}
/* Evolution::Component CORBA methods. */
static void
impl_createControls (PortableServer_Servant servant,
Bonobo_Control *corba_sidebar_control,
Bonobo_Control *corba_view_control,
CORBA_Environment *ev)
{
AddressbookComponent *addressbook_component = ADDRESSBOOK_COMPONENT (bonobo_object_from_servant (servant));
GtkWidget *selector;
GtkWidget *selector_scrolled_window;
BonoboControl *sidebar_control;
BonoboControl *view_control;
selector = e_source_selector_new (addressbook_component->priv->source_list);
e_source_selector_show_selection (E_SOURCE_SELECTOR (selector), FALSE);
gtk_widget_show (selector);
selector_scrolled_window = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (selector_scrolled_window), GTK_SHADOW_IN);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (selector_scrolled_window),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_container_add (GTK_CONTAINER (selector_scrolled_window), selector);
gtk_widget_show (selector_scrolled_window);
sidebar_control = bonobo_control_new (selector_scrolled_window);
view_control = addressbook_new_control ();
g_signal_connect_object (selector, "primary_selection_changed",
G_CALLBACK (primary_source_selection_changed_callback),
G_OBJECT (view_control), 0);
load_uri_for_selection (E_SOURCE_SELECTOR (selector), view_control);
*corba_sidebar_control = CORBA_Object_duplicate (BONOBO_OBJREF (sidebar_control), ev);
*corba_view_control = CORBA_Object_duplicate (BONOBO_OBJREF (view_control), ev);
}
/* GObject methods. */
static void
impl_dispose (GObject *object)
{
AddressbookComponentPrivate *priv = ADDRESSBOOK_COMPONENT (object)->priv;
if (priv->source_list != NULL) {
g_object_unref (priv->source_list);
priv->source_list = NULL;
}
if (priv->gconf_client != NULL) {
g_object_unref (priv->gconf_client);
priv->gconf_client = NULL;
}
(* G_OBJECT_CLASS (parent_class)->dispose) (object);
}
static void
impl_finalize (GObject *object)
{
AddressbookComponentPrivate *priv = ADDRESSBOOK_COMPONENT (object)->priv;
g_free (priv);
(* G_OBJECT_CLASS (parent_class)->finalize) (object);
}
/* Initialization. */
static void
addressbook_component_class_init (AddressbookComponentClass *class)
{
POA_GNOME_Evolution_Component__epv *epv = &class->epv;
GObjectClass *object_class = G_OBJECT_CLASS (class);
epv->createControls = impl_createControls;
object_class->dispose = impl_dispose;
object_class->finalize = impl_finalize;
parent_class = g_type_class_peek_parent (class);
}
static void
addressbook_component_init (AddressbookComponent *component)
{
AddressbookComponentPrivate *priv;
priv = g_new0 (AddressbookComponentPrivate, 1);
/* EPFIXME: Should use a custom one instead? Also we should add
addressbook_component_peek_gconf_client(). */
priv->gconf_client = gconf_client_get_default ();
priv->source_list = e_source_list_new_for_gconf (priv->gconf_client,
"/apps/evolution/addressbook/sources");
component->priv = priv;
}
/* Public API. */
AddressbookComponent *
addressbook_component_peek (void)
{
static AddressbookComponent *component = NULL;
if (component == NULL)
component = g_object_new (addressbook_component_get_type (), NULL);
return component;
}
BONOBO_TYPE_FUNC_FULL (AddressbookComponent, GNOME_Evolution_Component, PARENT_TYPE, addressbook_component)