/**
 * bonobo-selector.c: A control containing a BonoboSelector.
 *
 * Author:
 *     Michael Meeks (michael@helixcode.com)
 *
 * Copyright (C) 2000, Helix Code, Inc.
 */

/*
 * FIXME, vital features:
 *
 * ItemContainer - OAFIID:SelectorFactory!IDL:Bonobo/Control:1.0
 * Attach lots of lovely properties, perhaps an event source for double clicks
 */

#include <config.h>

#include <bonobo.h>

enum {
	PROP_INTERFACE,
	PROP_ID,
	PROP_NAME,
	PROP_DESCRIPTION
};

static void
set_prop (BonoboPropertyBag *bag,
	  const BonoboArg   *arg,
	  guint              arg_id,
	  CORBA_Environment *ev,
	  gpointer           user_data)
{
	g_return_if_fail (BONOBO_IS_SELECTOR_WIDGET (user_data));

	switch (arg_id) {
	case PROP_INTERFACE: {
		const gchar *query [2];

		query [0] = BONOBO_ARG_GET_STRING (arg);
		query [1] = NULL;

		bonobo_selector_widget_set_interfaces (
			user_data, query);
		break;
	}

	default:
		bonobo_exception_set (ev, ex_Bonobo_PropertyBag_NotFound);
		break;
	}
}

static void
get_prop (BonoboPropertyBag *bag,
	  BonoboArg         *arg,
	  guint              arg_id,
	  CORBA_Environment *ev,
	  gpointer           user_data)
{
	g_return_if_fail (BONOBO_IS_SELECTOR_WIDGET (user_data));

	switch (arg_id) {
	case PROP_INTERFACE:
		g_warning ("Cannot read interface");
		BONOBO_ARG_SET_STRING (arg, "");
		break;
	case PROP_ID:
		BONOBO_ARG_SET_STRING (
			arg, bonobo_selector_widget_get_id (user_data));
		break;
	case PROP_NAME:
		BONOBO_ARG_SET_STRING (
			arg, bonobo_selector_widget_get_name (user_data));
		break;
	case PROP_DESCRIPTION:
		BONOBO_ARG_SET_STRING (
			arg, bonobo_selector_widget_get_description (user_data));
		break;
	default:
		bonobo_exception_set (ev, ex_Bonobo_PropertyBag_NotFound);
		break;
	}
}

static BonoboObject *
generic_factory (BonoboGenericFactory *this, void *data)
{
	GtkWidget         *widget;
	const gchar       *query[] = { "IDL:Bonobo/Control:1.0", NULL };
	BonoboControl     *bonobo_object;
	BonoboPropertyBag *pb;

	widget = bonobo_selector_widget_new ();
	bonobo_selector_widget_set_interfaces (
		BONOBO_SELECTOR_WIDGET (widget), query);

	bonobo_object = bonobo_control_new (widget);

	pb = bonobo_property_bag_new (get_prop, set_prop, widget);
	bonobo_control_set_properties (BONOBO_CONTROL (bonobo_object), pb);
	bonobo_object_unref (BONOBO_OBJECT (pb));

	bonobo_property_bag_add (pb, "interface", PROP_INTERFACE,
				 BONOBO_ARG_STRING, NULL,
				 "Interface that must be supported",
				 BONOBO_PROPERTY_WRITEABLE);

	bonobo_property_bag_add (pb, "id", PROP_ID,
				 BONOBO_ARG_STRING, NULL,
				 "Selected OAFIID",
				 BONOBO_PROPERTY_READABLE);

	bonobo_property_bag_add (pb, "name", PROP_NAME,
				 BONOBO_ARG_STRING, NULL,
				 "name of selected component",
				 BONOBO_PROPERTY_READABLE);

	bonobo_property_bag_add (pb, "description", PROP_DESCRIPTION,
				 BONOBO_ARG_STRING, NULL,
				 "descroption of selected component",
				 BONOBO_PROPERTY_READABLE);

	return BONOBO_OBJECT (bonobo_object);
}

BONOBO_OAF_FACTORY ("OAFIID:Bonobo_Selector_ControlFactory",
		    "bonobo-selector", VERSION,
		    generic_factory,
		    NULL)


syntax highlighted by Code2HTML, v. 0.9.1