Re: Embedding components in under 100 lines (Was Re: Embedding gnumeric...)
- From: sak tribctas gba gov ar
- To: gnome-components-list gnome org, tigermilk btinternet com,wiggs novum-millennium org
- Subject: Re: Embedding components in under 100 lines (Was Re: Embedding gnumeric...)
- Date: Fri, 1 Sep 2000 12:12:41 -0300
sorry, can't resist...
this example remind me of the Master Programmer in
http://www.ariel.com.au/jokes/The_Evolution_of_a_Programmer.html
"Iain" <tigermilk@btinternet.com> el día Fri, 1 Sep 2000 14:36:33 +0100,
escribió:
>> The document I mentioned above, in the section on CORBA and compound
>> documents, states:
>>
>> "Gnumeric is also available to other applications as a Bonobo
component.
>> (Bonobo is the compound document architecture of GNOME). This enables
>> your application to embed Gnumeric into your application for editing, or
>> displaying information. *One line of code would achieve all the magic
you
>> need.*" [Emphasis mine]
>>
>> Can somebody clue me in on what this "One line of code" might be?
>> Because I certainly haven't been able to figure it out from reading the
>> mailing list archives, or the bonobo/samples codes (which imply that one
>> *thousand* lines of code is probably closer to the truth),
>
>Well, 1 line is only true if you have your app bonoboised already.
>10 lines is probably more of a reality if you don't.
>
>Here's a short (80ish lines long) program that sticks any bonobo embeddable
>into a GtkWindow.
>
>/* Adding a bonobo component in two functions by Iain Holmes - Mostly
copied
>from
> bonobo/samples/compound-document/container/ */
>/* Compile with (all one line):
>gcc -o test-bonobo test.c -g `gnome-config --cflags bonobo gnomeui bonobox`
>`gnome-config --libs bonobo gnomeui bonobox` */
>
>#include <gtk/gtk.h>
>#include <gnome.h>
>#include <bonobo.h>
>
>void
>add_embeddable (GtkWidget *window,
> char *obj_id)
>{
> BonoboObjectClient *server;
> BonoboClientSite *site;
> BonoboContainer *container;
> Bonobo_ClientSite corba_client_site;
>
> BonoboViewFrame *view_frame;
> GtkWidget *view_widget;
>
> /* Activate component */
> server = bonobo_object_activate (obj_id, 0);
> if (!server) {
> g_warning ("Error launching %s", obj_id);
> return;
> }
>
> /* New bonobo container to hold the embeddable */
> container = bonobo_container_new ();
>
> /* New client site for the container */
> site = bonobo_client_site_new (container);
> corba_client_site = bonobo_client_site_corba_object_create (BONOBO_OBJECT
>(site));
>
> /* Not sure why we do this twice - Anyone? */
> site = bonobo_client_site_construct (site, corba_client_site, container);
>
> if (site) {
> bonobo_client_site_bind_embeddable (site, server);
> bonobo_object_unref (BONOBO_OBJECT (server));
> bonobo_container_add (container, BONOBO_OBJECT (site));
>
> /* Create a new view of the embeddable */
> view_frame = bonobo_client_site_new_view (site, NULL);
>
> /* Get the widget */
> view_widget = bonobo_view_frame_get_wrapper (view_frame);
>
> /* Bung it in the window */
> gtk_container_add (GTK_CONTAINER (window), view_widget);
> gtk_widget_show (view_widget);
> }
>}
>
>int main (int argc,
> char **argv)
>{
> GtkWidget *window;
> CORBA_ORB orb;
> CORBA_Environment ev;
> char *required_interfaces [2] = {"IDL:Bonobo/Embeddable:1.0", NULL };
> char *obj_id;
>
> gnome_init ("Bonobo Example", "1.0", argc, argv);
> orb = oaf_init (argc, argv);
>
> if (bonobo_init (orb, NULL, NULL) == FALSE)
> g_error ("Could not initialize Bonobo!\n");
>
> window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
> gtk_window_set_title (GTK_WINDOW (window), "Bonobo Example");
>
> /* Select the component */
> obj_id = bonobo_selector_select_id ("Select an embeddable component",
> (const char **) required_interfaces);
>
> add_embeddable (window, obj_id);
>
> gtk_widget_show (window);
> bonobo_main ();
>}
>
>Okay, so it lacks a few things (activation, UIHandlers) but these things
are
>fairly
>simple to add.
>
>iain
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]