2 * embeddable-grid.c: An Embeddable Grid part of Gnumeric
5 * 1. EmbeddableGrid Gtk object implementation.
6 * 2. CORBA server routines for GNOME::Gnumeric::Grid
7 * 3. GridView Gtk object implementation
10 * Miguel de Icaza (miguel@gnu.org)
14 #include <bonobo/bonobo-embeddable.h>
15 #include <bonobo/bonobo-embeddable-factory.h>
16 #include "idl/Gnumeric.h"
19 #include "embeddable-grid.h"
20 #include "sheet-private.h"
23 * Our vectors for providing methods
25 POA_GNOME_Gnumeric_Grid__epv embeddable_grid_epv
;
26 POA_GNOME_Gnumeric_Grid__vepv embeddable_grid_vepv
;
28 static BonoboEmbeddableFactory
*bonobo_embeddable_grid_factory
;
30 static inline EmbeddableGrid
*
31 embeddable_grid_from_servant (PortableServer_Servant servant
)
33 return EMBEDDABLE_GRID (bonobo_object_from_servant (servant
));
36 static GNOME_Gnumeric_Sheet
37 Grid_get_sheet (PortableServer_Servant servant
, CORBA_Environment
*ev
)
39 EmbeddableGrid
*eg
= embeddable_grid_from_servant (servant
);
41 return CORBA_Object_duplicate (eg
->sheet
->private->corba_server
, ev
);
45 embeddable_grid_set_header_visibility (EmbeddableGrid
*eg
,
46 gboolean col_headers_visible
,
47 gboolean row_headers_visible
)
51 g_return_if_fail (eg
!= NULL
);
52 g_return_if_fail (IS_EMBEDDABLE_GRID (eg
));
54 for (l
= eg
->views
; l
; l
= l
->next
){
55 GridView
*grid_view
= GRID_VIEW (l
->data
);
57 sheet_view_set_header_visibility (
58 grid_view
->sheet_view
,
65 Grid_set_header_visibility (PortableServer_Servant servant
,
66 const CORBA_boolean col_headers_visible
,
67 const CORBA_boolean row_headers_visible
,
68 CORBA_Environment
*ev
)
70 EmbeddableGrid
*eg
= embeddable_grid_from_servant (servant
);
72 embeddable_grid_set_header_visibility (
73 eg
, col_headers_visible
, row_headers_visible
);
77 Grid_get_header_visibility (PortableServer_Servant servant
,
78 CORBA_boolean
*col_headers_visible
,
79 CORBA_boolean
*row_headers_visible
,
80 CORBA_Environment
*ev
)
82 EmbeddableGrid
*eg
= embeddable_grid_from_servant (servant
);
84 *col_headers_visible
= eg
->show_col_title
;
85 *row_headers_visible
= eg
->show_row_title
;
89 embeddable_grid_view_factory (BonoboEmbeddable
*embeddable
,
90 const Bonobo_ViewFrame view_frame
,
94 EmbeddableGrid
*eg
= EMBEDDABLE_GRID (embeddable
);
96 view
= grid_view_new (eg
);
98 return BONOBO_VIEW (view
);
102 init_embeddable_grid_corba_class (void)
107 embeddable_grid_vepv
.Bonobo_Unknown_epv
= bonobo_object_get_epv ();
108 embeddable_grid_vepv
.Bonobo_Embeddable_epv
= bonobo_embeddable_get_epv ();
109 embeddable_grid_vepv
.GNOME_Gnumeric_Grid_epv
= &embeddable_grid_epv
;
114 embeddable_grid_epv
.get_sheet
= Grid_get_sheet
;
115 embeddable_grid_epv
.set_header_visibility
= Grid_set_header_visibility
;
116 embeddable_grid_epv
.get_header_visibility
= Grid_get_header_visibility
;
120 embeddable_grid_class_init (GtkObjectClass
*Class
)
122 init_embeddable_grid_corba_class ();
126 embeddable_grid_init (GtkObject
*object
)
131 create_embeddable_grid (BonoboObject
*object
)
133 POA_GNOME_Gnumeric_Grid
*servant
;
134 CORBA_Environment ev
;
136 servant
= (POA_GNOME_Gnumeric_Grid
*) g_new0 (BonoboObjectServant
, 1);
137 servant
->vepv
= &embeddable_grid_vepv
;
139 CORBA_exception_init (&ev
);
140 POA_GNOME_Gnumeric_Grid__init ((PortableServer_Servant
) servant
, &ev
);
141 if (ev
._major
!= CORBA_NO_EXCEPTION
){
143 CORBA_exception_free (&ev
);
144 return CORBA_OBJECT_NIL
;
146 CORBA_exception_free (&ev
);
148 return bonobo_object_activate_servant (object
, servant
);
152 embeddable_grid_init_anon (EmbeddableGrid
*eg
)
154 eg
->workbook
= gtk_type_new (WORKBOOK_TYPE
);
155 eg
->sheet
= sheet_new (eg
->workbook
, _("Embedded Sheet"));
156 workbook_attach_sheet (eg
->workbook
, eg
->sheet
);
159 * Workaround code. Sheets are born with a sheet_view,
160 * but we do not need it at all. So manually get rid of it.
162 * When sheet_new semantics change (see TODO), the code below
163 * will warn about this condition to remove this piece of code
165 if (eg
->sheet
->sheet_views
!= NULL
){
166 sheet_destroy_sheet_view (eg
->sheet
, SHEET_VIEW (eg
->sheet
->sheet_views
->data
));
168 g_error ("Remove workaround code here");
172 embeddable_grid_new_anon (void)
174 EmbeddableGrid
*embeddable_grid
;
175 GNOME_Gnumeric_Grid corba_embeddable_grid
;
177 embeddable_grid
= gtk_type_new (EMBEDDABLE_GRID_TYPE
);
178 embeddable_grid_init_anon (embeddable_grid
);
179 corba_embeddable_grid
= create_embeddable_grid (BONOBO_OBJECT (embeddable_grid
));
181 if (corba_embeddable_grid
== CORBA_OBJECT_NIL
){
182 gtk_object_destroy (GTK_OBJECT (embeddable_grid
));
186 bonobo_embeddable_construct (
187 BONOBO_EMBEDDABLE (embeddable_grid
), corba_embeddable_grid
,
188 embeddable_grid_view_factory
, NULL
);
190 return embeddable_grid
;
194 embeddable_grid_new (Workbook
*wb
, Sheet
*sheet
)
196 EmbeddableGrid
*embeddable_grid
;
197 GNOME_Gnumeric_Grid corba_embeddable_grid
;
199 embeddable_grid
= gtk_type_new (EMBEDDABLE_GRID_TYPE
);
200 corba_embeddable_grid
= create_embeddable_grid (BONOBO_OBJECT (embeddable_grid
));
202 if (corba_embeddable_grid
== CORBA_OBJECT_NIL
){
203 gtk_object_destroy (GTK_OBJECT (embeddable_grid
));
207 embeddable_grid
->workbook
= wb
;
208 embeddable_grid
->sheet
= sheet
;
211 * We keep a handle to the Workbook
213 bonobo_object_ref (BONOBO_OBJECT (embeddable_grid
->workbook
));
215 bonobo_embeddable_construct (
216 BONOBO_EMBEDDABLE (embeddable_grid
), corba_embeddable_grid
,
217 embeddable_grid_view_factory
, NULL
);
219 return embeddable_grid
;
222 static BonoboObject
*
223 embeddable_grid_factory (BonoboEmbeddableFactory
*This
, void *data
)
225 EmbeddableGrid
*embeddable_grid
;
227 embeddable_grid
= embeddable_grid_new_anon ();
229 if (embeddable_grid
== NULL
)
233 * Populate verb list here.
236 return BONOBO_OBJECT (embeddable_grid
);
240 embeddable_grid_get_type (void)
242 static GtkType type
= 0;
246 "IDL:GNOME/Gnumeric/EmbeddableGrid:1.0",
247 sizeof (EmbeddableGrid
),
248 sizeof (EmbeddableGridClass
),
249 (GtkClassInitFunc
) embeddable_grid_class_init
,
250 (GtkObjectInitFunc
) embeddable_grid_init
,
251 NULL
, /* reserved 1 */
252 NULL
, /* reserved 2 */
253 (GtkClassInitFunc
) NULL
255 type
= gtk_type_unique (bonobo_embeddable_get_type (), &info
);
262 EmbeddableGridFactory_init (void)
264 bonobo_embeddable_grid_factory
= bonobo_embeddable_factory_new (
265 "GNOME:Gnumeric:GridFactory:1.0",
266 embeddable_grid_factory
, NULL
);
273 grid_view_get_type (void)
275 static GtkType type
= 0;
279 "EmbeddableGridView",
281 sizeof (GridViewClass
),
282 NULL
, NULL
, NULL
, NULL
, NULL
284 type
= gtk_type_unique (bonobo_view_get_type (), &info
);
291 * Invoked by the "destroy" method. We use this to keep the
292 * EmbeddableGrid list of views up to date.
295 grid_view_destroy (GridView
*grid_view
)
297 EmbeddableGrid
*eg
= grid_view
->embeddable
;
299 eg
->views
= g_list_remove (eg
->views
, grid_view
);
303 * Invoked by the "view_activate" method.
306 grid_view_activate (GridView
*grid_view
)
308 /* FIXME: Do we need to do any more work here? */
309 g_warning ("FIXME: plug is now private, can't set_focus");
310 /* gtk_signal_emit_by_name (GTK_OBJECT (grid_view->view.plug), "set_focus",
311 grid_view->sheet_view->sheet_view);*/
313 bonobo_view_activate_notify (BONOBO_VIEW (grid_view
), TRUE
);
317 grid_view_new (EmbeddableGrid
*eg
)
319 GridView
*grid_view
= NULL
;
320 Bonobo_View corba_grid_view
;
322 grid_view
= gtk_type_new (GRID_VIEW_TYPE
);
324 corba_grid_view
= bonobo_view_corba_object_create (BONOBO_OBJECT (grid_view
));
325 if (corba_grid_view
== CORBA_OBJECT_NIL
){
326 gtk_object_destroy (GTK_OBJECT (corba_grid_view
));
330 grid_view
->embeddable
= eg
;
331 grid_view
->sheet_view
= sheet_new_sheet_view (eg
->sheet
);
332 gtk_widget_show (GTK_WIDGET (grid_view
->sheet_view
));
333 g_warning ("FIXME: view_construct API changed");
334 /* bonobo_view_construct (
335 BONOBO_VIEW (grid_view), corba_grid_view,
336 GTK_WIDGET (grid_view->sheet_view));*/
338 eg
->views
= g_list_prepend (eg
->views
, grid_view
);
340 gtk_signal_connect (GTK_OBJECT (grid_view
), "destroy",
341 GTK_SIGNAL_FUNC (grid_view_destroy
), NULL
);
342 gtk_signal_connect (GTK_OBJECT (grid_view
), "activate",
343 GTK_SIGNAL_FUNC (grid_view_activate
), NULL
);
345 return BONOBO_VIEW (grid_view
);
349 embeddable_grid_set_range (EmbeddableGrid
*eg
,
350 int start_col
, int start_row
,
351 int end_col
, int end_row
)
353 g_return_if_fail (eg
!= NULL
);
354 g_return_if_fail (IS_EMBEDDABLE_GRID (eg
));
355 g_return_if_fail (start_col
<= end_col
);
356 g_return_if_fail (start_row
<= end_row
);