workbook-control-gui.c 118 KB
Newer Older
1
2
/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */

3
4
5
/*
 * workbook-control-gui.c: GUI specific routines for a workbook-control.
 *
Jody Goldberg's avatar
Jody Goldberg committed
6
 * Copyright (C) 2000 Jody Goldberg (jody@gnome.org)
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * 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
 */
23
24
#include <gnumeric-config.h>
#include "gnumeric.h"
25
#include "workbook-control-gui-priv.h"
26

27
28
29
30
31
32
33
#include "application.h"
#include "workbook-object-toolbar.h"
#include "workbook-format-toolbar.h"
#include "workbook-view.h"
#include "workbook-edit.h"
#include "workbook.h"
#include "sheet.h"
34
#include "sheet-merge.h"
35
#include "sheet-private.h"
36
#include "sheet-control-gui-priv.h"
37
#include "gnumeric-canvas.h"
Jody Goldberg's avatar
Jody Goldberg committed
38
#include "sheet-object.h"
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "dialogs.h"
#include "commands.h"
#include "cmd-edit.h"
#include "workbook-cmd-format.h"
#include "selection.h"
#include "clipboard.h"
#include "print.h"
#include "gui-clipboard.h"
#include "workbook-edit.h"
#include "main.h"
#include "eval.h"
#include "position.h"
#include "parse-util.h"
#include "ranges.h"
Morten Welinder's avatar
Morten Welinder committed
53
#include "value.h"
Jody Goldberg's avatar
Jody Goldberg committed
54
55
#include "history.h"
#include "str.h"
Jody Goldberg's avatar
Jody Goldberg committed
56
#include "cell.h"
57
#include "gui-file.h"
58
#include "search.h"
59
#include "error-info.h"
Jody Goldberg's avatar
fix.    
Jody Goldberg committed
60
#include "pixmaps/equal-sign.xpm"
61
#include "gui-util.h"
Jody Goldberg's avatar
fix.    
Jody Goldberg committed
62
#include "widgets/widget-editable-label.h"
63
#include "widgets/gnumeric-combo-text.h"
64

Jody Goldberg's avatar
update    
Jody Goldberg committed
65
66
#ifdef ENABLE_BONOBO
#include "sheet-object-container.h"
67
#ifdef ENABLE_EVOLUTION
Jody Goldberg's avatar
Jody Goldberg committed
68
#include <idl/Evolution-Composer.h>
69
70
#include <bonobo/bonobo-stream-memory.h>
#endif
Jody Goldberg's avatar
update    
Jody Goldberg committed
71
#endif
72

73
#include <gal/util/e-util.h>
Jody Goldberg's avatar
fix.    
Jody Goldberg committed
74
#include <gal/widgets/widget-color-combo.h>
75
#include <gal/widgets/gtk-combo-stack.h>
Jody Goldberg's avatar
fix.    
Jody Goldberg committed
76
77
78
79

#include <libgnome/gnome-i18n.h>
#include <libgnome/gnome-config.h>

80
#include <ctype.h>
81
#include <stdarg.h>
82
#include <stdio.h>
83
#include <errno.h>
84

85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
gboolean
wbcg_ui_update_begin (WorkbookControlGUI *wbcg)
{
	g_return_val_if_fail (IS_WORKBOOK_CONTROL_GUI (wbcg), FALSE);
	g_return_val_if_fail (!wbcg->updating_ui, FALSE);

	return (wbcg->updating_ui = TRUE);
}

void
wbcg_ui_update_end (WorkbookControlGUI *wbcg)
{
	g_return_if_fail (IS_WORKBOOK_CONTROL_GUI (wbcg));
	g_return_if_fail (wbcg->updating_ui);

	wbcg->updating_ui = FALSE;
}

103
104
105
106
107
108
109
110
111
112
113
static int
sheet_to_page_index (WorkbookControlGUI *wbcg, Sheet *sheet, SheetControlGUI **res)
{
	int i = 0;
	GtkWidget *w;

	if (res)
		*res = NULL;
	g_return_val_if_fail (IS_SHEET (sheet), -1);

	for ( ; NULL != (w = gtk_notebook_get_nth_page (wbcg->notebook, i)) ; i++) {
114
115
116
		GtkObject *obj = gtk_object_get_data (GTK_OBJECT (w),
						      SHEET_CONTROL_KEY);
		SheetControlGUI *scg = SHEET_CONTROL_GUI (obj);
117
		SheetControl *sc = (SheetControl *) scg;
Morten Welinder's avatar
Morten Welinder committed
118

119
		if (scg != NULL && sc->sheet == sheet) {
120
			if (res)
121
				*res = scg;
122
123
124
125
126
127
			return i;
		}
	}
	return -1;
}

Jody Goldberg's avatar
Jody Goldberg committed
128
129
130
GtkWindow *
wb_control_gui_toplevel (WorkbookControlGUI *wbcg)
{
131
132
	g_return_val_if_fail (IS_WORKBOOK_CONTROL_GUI (wbcg), NULL);

Jody Goldberg's avatar
be safe    
Jody Goldberg committed
133
	return wbcg->toplevel;
Jody Goldberg's avatar
Jody Goldberg committed
134
135
}

136
137
138
139
140
141
142
143
144
145
/**
 * wb_control_gui_focus_cur_sheet :
 * @wbcg : The workbook control to operate on.
 *
 * A utility routine to safely ensure that the keyboard focus
 * is attached to the item-grid.  This is required when a user
 * edits a combo-box or and entry-line which grab focus.
 *
 * It is called for zoom, font name/size, and accept/cancel for the editline.
 */
Jody Goldberg's avatar
Jody Goldberg committed
146
147
148
Sheet *
wb_control_gui_focus_cur_sheet (WorkbookControlGUI *wbcg)
{
Jody Goldberg's avatar
Jody Goldberg committed
149
	GtkWidget *table;
150
	GtkObject *obj;
151
	SheetControlGUI *scg;
Jody Goldberg's avatar
Jody Goldberg committed
152

153
	g_return_val_if_fail (IS_WORKBOOK_CONTROL_GUI (wbcg), NULL);
Jody Goldberg's avatar
Jody Goldberg committed
154

Jody Goldberg's avatar
Jody Goldberg committed
155
156
157
	table = gtk_notebook_get_nth_page (wbcg->notebook,
		gtk_notebook_get_current_page (wbcg->notebook));
	obj = gtk_object_get_data (GTK_OBJECT (table), SHEET_CONTROL_KEY);
158
	scg = SHEET_CONTROL_GUI (obj);
159
160
161

	g_return_val_if_fail (scg != NULL, NULL);

162
	scg_take_focus (scg);
163

164
	return ((SheetControl *) scg)->sheet;
165
}
Jody Goldberg's avatar
Jody Goldberg committed
166

167
168
169
170
SheetControlGUI *
wb_control_gui_cur_sheet (WorkbookControlGUI *wbcg)
{
	SheetControlGUI *scg;
Jody Goldberg's avatar
Jody Goldberg committed
171

172
173
	sheet_to_page_index (wbcg,
		wb_control_cur_sheet (WORKBOOK_CONTROL (wbcg)), &scg);
Jody Goldberg's avatar
Jody Goldberg committed
174

175
	return scg;
Jody Goldberg's avatar
Jody Goldberg committed
176
177
}

178
179
180
181
182
183
184
185
/****************************************************************************/
/* Autosave */
static gboolean
cb_autosave (gpointer *data)
{
	WorkbookView *wb_view;
        WorkbookControlGUI *wbcg = (WorkbookControlGUI *)data;

186
	g_return_val_if_fail (IS_WORKBOOK_CONTROL_GUI (wbcg), FALSE);
187
188
189
190
191
192
193
194
195

	wb_view = wb_control_view (WORKBOOK_CONTROL (wbcg));

	if (wb_view == NULL)
		return FALSE;

	if (wbcg->autosave && workbook_is_dirty (wb_view_workbook (wb_view))) {
	        if (wbcg->autosave_prompt && !dialog_autosave_prompt (wbcg))
			return TRUE;
196
		gui_file_save (wbcg, wb_view);
197
198
199
200
	}
	return TRUE;
}

201
202
203
204
205
206
207
208
209
210
211
212
213
/**
 * wbcg_rangesel_possible
 * @wbcg : the workbook control gui
 *
 * Returns true if the cursor keys should be used to select
 * a cell range (if the cursor is in a spot in the expression
 * where it makes sense to have a cell reference), false if not.
 */
gboolean
wbcg_rangesel_possible (WorkbookControlGUI const *wbcg)
{
	g_return_val_if_fail (IS_WORKBOOK_CONTROL_GUI (wbcg), FALSE);

214
215
	/* Already range selecting */
	if (wbcg->rangesel != NULL)
216
217
		return TRUE;

218
	/* Rangesel requires that we be editing somthing */
219
	if (!wbcg_is_editing (wbcg) && !wbcg_edit_entry_redirect_p (wbcg))
220
221
		return FALSE;

222
	return gnumeric_expr_entry_rangesel_meaningful (wbcg_get_entry_logical (wbcg));
223
224
}

Jody Goldberg's avatar
Jody Goldberg committed
225
gboolean
226
wbcg_is_editing (WorkbookControlGUI const *wbcg)
Jody Goldberg's avatar
Jody Goldberg committed
227
228
229
230
231
{
	g_return_val_if_fail (IS_WORKBOOK_CONTROL_GUI (wbcg), FALSE);
	return wbcg->editing;
}

232
void
233
wbcg_autosave_cancel (WorkbookControlGUI *wbcg)
234
{
Jody Goldberg's avatar
Jody Goldberg committed
235
236
	g_return_if_fail (IS_WORKBOOK_CONTROL_GUI (wbcg));

237
238
239
240
241
242
243
	if (wbcg->autosave_timer != 0) {
		gtk_timeout_remove (wbcg->autosave_timer);
		wbcg->autosave_timer = 0;
	}
}

void
244
wbcg_autosave_set (WorkbookControlGUI *wbcg, int minutes, gboolean prompt)
245
{
Jody Goldberg's avatar
Jody Goldberg committed
246
247
	g_return_if_fail (IS_WORKBOOK_CONTROL_GUI (wbcg));

248
	wbcg_autosave_cancel (wbcg);
249
250
251
252
253
254
255
256
257
258
259

	wbcg->autosave = (minutes != 0);
	wbcg->autosave_minutes = minutes;
	wbcg->autosave_prompt = prompt;

	if (wbcg->autosave)
		wbcg->autosave_timer = gtk_timeout_add (minutes * 60000,
			(GtkFunction) cb_autosave, wbcg);
}
/****************************************************************************/

Jody Goldberg's avatar
Jody Goldberg committed
260
261
262
263
264
265
static WorkbookControl *
wbcg_control_new (WorkbookControl *wbc, WorkbookView *wbv, Workbook *wb)
{
	return workbook_control_gui_new (wbv, wb);
}

Jody Goldberg's avatar
Jody Goldberg committed
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
static void
wbcg_init_state (WorkbookControl *wbc)
{
	WorkbookView	   *wbv = wb_control_view (wbc);
	WorkbookControlGUI *wbcg = WORKBOOK_CONTROL_GUI (wbc);
	ColorCombo *combo;

	/* Associate the combos with the view */
	combo = COLOR_COMBO (wbcg->back_color);
	color_palette_set_group (combo->palette,
		color_group_fetch ("back_color_group", wbv));
	combo = COLOR_COMBO (wbcg->fore_color);
	color_palette_set_group (combo->palette,
		color_group_fetch ("fore_color_group", wbv));
}

282
283
284
285
286
287
288
289
290
291
292
static void
wbcg_title_set (WorkbookControl *wbc, char const *title)
{
	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
	char *full_title;

	g_return_if_fail (wbcg != NULL);
	g_return_if_fail (title != NULL);

	full_title = g_strconcat (title, _(" : Gnumeric"), NULL);

Jody Goldberg's avatar
Jody Goldberg committed
293
 	gtk_window_set_title (wb_control_gui_toplevel (wbcg), full_title);
294
295
296
297
298
299
300
	g_free (full_title);
}

static void
cb_prefs_update (gpointer key, gpointer value, gpointer user_data)
{
	Sheet *sheet = value;
301
	sheet_adjust_preferences (sheet, FALSE, FALSE);
302
303
304
305
306
307
308
}

static void
wbcg_prefs_update (WorkbookControl *wbc)
{
	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
	Workbook	*wb  = wb_control_workbook (wbc);
Jody Goldberg's avatar
Jody Goldberg committed
309
	WorkbookView	*wbv = wb_control_view (wbc);
310
311

	g_hash_table_foreach (wb->sheet_hash_private, cb_prefs_update, NULL);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
312
	gtk_notebook_set_show_tabs (wbcg->notebook,
313
314
315
316
				    wbv->show_notebook_tabs);
}

static void
Jody Goldberg's avatar
Jody Goldberg committed
317
wbcg_format_feedback (WorkbookControl *wbc)
318
{
Jody Goldberg's avatar
Jody Goldberg committed
319
	workbook_feedback_set ((WorkbookControlGUI *)wbc);
320
321
322
}

static void
Jody Goldberg's avatar
Jody Goldberg committed
323
zoom_changed (WorkbookControlGUI *wbcg, Sheet* sheet)
324
325
326
{
	gchar buffer [25];

Jody Goldberg's avatar
delete.    
Jody Goldberg committed
327
	g_return_if_fail (IS_SHEET (sheet));
328
329
330
	g_return_if_fail (wbcg->zoom_entry != NULL);

	snprintf (buffer, sizeof (buffer), "%d%%",
331
		  (int) (sheet->last_zoom_factor_used * 100 + .5));
Jody Goldberg's avatar
delete.    
Jody Goldberg committed
332

333
	if (wbcg_ui_update_begin (wbcg)) {
334
335
		gnm_combo_text_set_text (GNM_COMBO_TEXT (wbcg->zoom_entry),
			buffer, GNM_COMBO_TEXT_CURRENT);
336
337
		wbcg_ui_update_end (wbcg);
	}
Jody Goldberg's avatar
delete.    
Jody Goldberg committed
338
339

	scg_object_update_bbox (wb_control_gui_cur_sheet (wbcg),
340
				NULL, NULL);
341
342
343
344
345
346
347
}

static void
wbcg_zoom_feedback (WorkbookControl *wbc)
{
	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
	Sheet *sheet = wb_control_cur_sheet (wbc);
Jody Goldberg's avatar
Jody Goldberg committed
348
	zoom_changed (wbcg, sheet);
349
350
351
352
353
}

static void
wbcg_edit_line_set (WorkbookControl *wbc, char const *text)
{
354
355
	GtkEntry *entry;

356
	entry = GTK_ENTRY (wbcg_get_entry ((WorkbookControlGUI*)wbc));
357
358
359
	gtk_entry_set_text (entry, text);
}

Jody Goldberg's avatar
Jody Goldberg committed
360
361
362
363
364
365
366
static void
wbcg_edit_selection_descr_set (WorkbookControl *wbc, char const *text)
{
	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
	gtk_entry_set_text (GTK_ENTRY (wbcg->selection_descriptor), text);
}

Jody Goldberg's avatar
be safe    
Jody Goldberg committed
367
368
369
370
371
372
373
374
375
376
377
378
379
/*
 * Signal handler for EditableLabel's text_changed signal.
 */
static gboolean
cb_sheet_label_changed (EditableLabel *el,
			const char *new_name, WorkbookControlGUI *wbcg)
{
	gboolean ans = !cmd_rename_sheet (WORKBOOK_CONTROL (wbcg),
					  el->text, new_name);
	wb_control_gui_focus_cur_sheet (wbcg);
	return ans;
}

Jody Goldberg's avatar
Jody Goldberg committed
380
381
382
383
384
385
static void
cb_sheet_label_edit_stopped (EditableLabel *el, WorkbookControlGUI *wbcg)
{
	wb_control_gui_focus_cur_sheet (wbcg);
}

Jody Goldberg's avatar
be safe    
Jody Goldberg committed
386
static void
387
sheet_action_add_sheet (GtkWidget *widget, SheetControlGUI *scg)
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
388
{
389
390
391
	SheetControl *sc = (SheetControl *) scg;

	workbook_sheet_add (wb_control_workbook (sc->wbc), sc->sheet, TRUE);
392
	wb_control_gui_focus_cur_sheet (scg->wbcg);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
393
}
Jody Goldberg's avatar
Jody Goldberg committed
394

Jody Goldberg's avatar
be safe    
Jody Goldberg committed
395
static void
396
delete_sheet_if_possible (GtkWidget *ignored, SheetControlGUI *scg)
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
397
{
398
399
	SheetControl *sc = (SheetControl *) scg;
	Workbook *wb = wb_control_workbook (sc->wbc);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
400
401
402
403
404
405
406
407
408
409
	GtkWidget *d, *button_no;
	char *message;
	int r;

	/*
	 * If this is the last sheet left, ignore the request
	 */
	if (workbook_sheet_count (wb) == 1)
		return;

410
411
412
413
414
	if (sc->sheet->pristine) {
		workbook_sheet_delete (sc->sheet);
		return;
	}

Jody Goldberg's avatar
be safe    
Jody Goldberg committed
415
416
	message = g_strdup_printf (
		_("Are you sure you want to remove the sheet called `%s'?"),
417
		sc->sheet->name_unquoted);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
418
419
420
421
422
423
424
425
426
427

	d = gnome_message_box_new (
		message, GNOME_MESSAGE_BOX_QUESTION,
		GNOME_STOCK_BUTTON_YES,
		GNOME_STOCK_BUTTON_NO,
		NULL);
	g_free (message);
	button_no = g_list_last (GNOME_DIALOG (d)->buttons)->data;
	gtk_widget_grab_focus (button_no);

428
	r = gnumeric_dialog_run (scg->wbcg, GNOME_DIALOG (d));
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
429
430
431
432

	if (r != 0)
		return;

433
	workbook_sheet_delete (sc->sheet);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
434
435
436
	workbook_recalc_all (wb);
}

Jody Goldberg's avatar
update    
Jody Goldberg committed
437
static void
438
sheet_action_rename_sheet (GtkWidget *widget, SheetControlGUI *scg)
Jody Goldberg's avatar
update    
Jody Goldberg committed
439
{
440
441
	SheetControl *sc = (SheetControl *) scg;
	Sheet *sheet = sc->sheet;
442
	char *new_name = dialog_get_sheet_name (scg->wbcg, sheet->name_unquoted);
Jody Goldberg's avatar
update    
Jody Goldberg committed
443
444
445
446
	if (!new_name)
		return;

	/* We do not care if it fails */
447
	cmd_rename_sheet (sc->wbc, sheet->name_unquoted, new_name);
Jody Goldberg's avatar
update    
Jody Goldberg committed
448
449
450
451
	g_free (new_name);
}

static void
452
sheet_action_clone_sheet (GtkWidget *widget, SheetControlGUI *scg)
Jody Goldberg's avatar
update    
Jody Goldberg committed
453
{
454
455
	SheetControl *sc = (SheetControl *) scg;
     	Sheet *new_sheet = sheet_duplicate (sc->sheet);
Morten Welinder's avatar
Morten Welinder committed
456

457
	workbook_sheet_attach (sc->sheet->workbook, new_sheet, sc->sheet);
Jody Goldberg's avatar
update    
Jody Goldberg committed
458
	sheet_set_dirty (new_sheet, TRUE);
459
	wb_control_gui_focus_cur_sheet (scg->wbcg);
Jody Goldberg's avatar
update    
Jody Goldberg committed
460
461
462
}

static void
463
sheet_action_reorder_sheet (GtkWidget *widget, SheetControlGUI *scg)
Jody Goldberg's avatar
update    
Jody Goldberg committed
464
{
465
	dialog_sheet_order (scg->wbcg);
Jody Goldberg's avatar
update    
Jody Goldberg committed
466
467
}

Jody Goldberg's avatar
be safe    
Jody Goldberg committed
468
469
470
471
/**
 * sheet_menu_label_run:
 */
static void
472
sheet_menu_label_run (SheetControlGUI *scg, GdkEventButton *event)
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
473
474
{
#define SHEET_CONTEXT_TEST_SIZE 1
475
	SheetControl *sc = (SheetControl *) scg;
Morten Welinder's avatar
Morten Welinder committed
476

Jody Goldberg's avatar
be safe    
Jody Goldberg committed
477
478
	struct {
		const char *text;
479
		void (*function) (GtkWidget *widget, SheetControlGUI *scg);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
		int  flags;
	} const sheet_label_context_actions [] = {
		{ N_("Add another sheet"), &sheet_action_add_sheet, 0 },
		{ N_("Remove this sheet"), &delete_sheet_if_possible, SHEET_CONTEXT_TEST_SIZE },
		{ N_("Rename this sheet"), &sheet_action_rename_sheet, 0 },
		{ N_("Duplicate this sheet"), &sheet_action_clone_sheet, 0 },
		{ N_("Re-order sheets"), &sheet_action_reorder_sheet, SHEET_CONTEXT_TEST_SIZE },
		{ NULL, NULL }
	};

	GtkWidget *menu;
	GtkWidget *item;
	int i;

	menu = gtk_menu_new ();

	for (i = 0; sheet_label_context_actions [i].text != NULL; i++){
		int flags = sheet_label_context_actions [i].flags;

Jody Goldberg's avatar
update    
Jody Goldberg committed
499
		if (flags & SHEET_CONTEXT_TEST_SIZE &&
500
		    workbook_sheet_count (sc->sheet->workbook) < 2)
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
501
				continue;
Jody Goldberg's avatar
update    
Jody Goldberg committed
502

Jody Goldberg's avatar
be safe    
Jody Goldberg committed
503
504
505
506
507
508
509
510
		item = gtk_menu_item_new_with_label (
			_(sheet_label_context_actions [i].text));
		gtk_menu_append (GTK_MENU (menu), item);
		gtk_widget_show (item);

		gtk_signal_connect (
			GTK_OBJECT (item), "activate",
			GTK_SIGNAL_FUNC (sheet_label_context_actions [i].function),
511
			scg);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
512
513
514
515
516
517
518
519
520
521
522
	}

	gnumeric_popup_menu (GTK_MENU (menu), event);
}

/**
 * cb_sheet_label_button_press:
 *
 * Invoked when the user has clicked on the EditableLabel widget.
 * This takes care of switching to the notebook that contains the label
 */
Jody Goldberg's avatar
Jody Goldberg committed
523
static gboolean
Jody Goldberg's avatar
update    
Jody Goldberg committed
524
525
cb_sheet_label_button_press (GtkWidget *widget, GdkEventButton *event,
			     GtkWidget *child)
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
526
527
528
{
	GtkWidget *notebook;
	gint page_number;
529
530
531
532
533
	GtkObject *obj = gtk_object_get_data (GTK_OBJECT (child),
					      SHEET_CONTROL_KEY);
	SheetControlGUI *scg = SHEET_CONTROL_GUI (obj);

	g_return_val_if_fail (scg != NULL, FALSE);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
534
535
536
537
538
539
540

	if (event->type != GDK_BUTTON_PRESS)
		return FALSE;

	notebook = child->parent;
	page_number = gtk_notebook_page_num (GTK_NOTEBOOK (notebook), child);

541
	if (event->button == 1 || NULL != scg->wbcg->rangesel) {
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
542
543
544
545
546
		gtk_notebook_set_page (GTK_NOTEBOOK (notebook), page_number);
		return TRUE;
	}

	if (event->button == 3) {
547
548
549

		sheet_menu_label_run (SHEET_CONTROL_GUI (obj), event);
		scg_take_focus (SHEET_CONTROL_GUI (obj));
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
550
551
552
553
554
555
		return TRUE;
	}

	return FALSE;
}

Jody Goldberg's avatar
update    
Jody Goldberg committed
556
static void workbook_setup_sheets (WorkbookControlGUI *wbcg);
557
static void wbcg_menu_state_sheet_count (WorkbookControl *wbc);
Jody Goldberg's avatar
update    
Jody Goldberg committed
558

Jody Goldberg's avatar
be safe    
Jody Goldberg committed
559
560
561
562
/**
 * wbcg_sheet_add:
 * @sheet: a sheet
 *
563
 * Creates a new SheetControlGUI for the sheet and adds it to the workbook-control-gui.
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
564
565
566
567
568
 */
static void
wbcg_sheet_add (WorkbookControl *wbc, Sheet *sheet)
{
	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
569
	SheetControlGUI *scg;
570
	SheetControl *sc;
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
571
	GtkWidget *sheet_label;
Jody Goldberg's avatar
Jody Goldberg committed
572
	GList     *ptr;
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
573
574

	g_return_if_fail (wbcg != NULL);
Jody Goldberg's avatar
update    
Jody Goldberg committed
575
576
577

	if (wbcg->notebook == NULL)
		workbook_setup_sheets (wbcg);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
578

579
	scg = sheet_control_gui_new (sheet);
580
581
	sc = (SheetControl *) scg;
	sc->wbc = wbc;
582
	scg->wbcg = wbcg;
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
583
584
585
586
587
588
589
590
591
592
593
594
595
596

	/*
	 * NB. this is so we can use editable_label_set_text since
	 * gtk_notebook_set_tab_label kills our widget & replaces with a label.
	 */
	sheet_label = editable_label_new (sheet->name_unquoted);
	gtk_signal_connect_after (
		GTK_OBJECT (sheet_label), "text_changed",
		GTK_SIGNAL_FUNC (cb_sheet_label_changed), wbcg);
	gtk_signal_connect (
		GTK_OBJECT (sheet_label), "editing_stopped",
		GTK_SIGNAL_FUNC (cb_sheet_label_edit_stopped), wbcg);
	gtk_signal_connect (
		GTK_OBJECT (sheet_label), "button_press_event",
597
		GTK_SIGNAL_FUNC (cb_sheet_label_button_press), scg->table);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
598
599

	gtk_widget_show (sheet_label);
600
	gtk_widget_show_all (GTK_WIDGET (scg->table));
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
601

602
603
	if (wbcg_ui_update_begin (wbcg)) {
		gtk_notebook_insert_page (wbcg->notebook,
604
			GTK_WIDGET (scg->table), sheet_label,
605
606
607
			workbook_sheet_index_get (wb_control_workbook (wbc), sheet));
		wbcg_ui_update_end (wbcg);
	}
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
608

609
	wbcg_menu_state_sheet_count (wbc);
Jody Goldberg's avatar
Jody Goldberg committed
610
611
612

	/* create views for the sheet objects */
	for (ptr = sheet->sheet_objects; ptr != NULL ; ptr = ptr->next)
613
		sheet_object_new_view (ptr->data, scg);
614
615
	scg_adjust_preferences (sc);
	scg_set_zoom_factor (sc);
616
	scg_take_focus (scg);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
617
618
619
620
621
622
}

static void
wbcg_sheet_remove (WorkbookControl *wbc, Sheet *sheet)
{
	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
623
	SheetControlGUI *scg;
Jody Goldberg's avatar
update    
Jody Goldberg committed
624
625
626
627
628
629
	int i;

	/* During destruction we may have already removed the notebook */
	if (wbcg->notebook == NULL)
		return;

630
	i = sheet_to_page_index (wbcg, sheet, &scg);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
631

Jody Goldberg's avatar
Jody Goldberg committed
632
	g_return_if_fail (i >= 0);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
633

Jody Goldberg's avatar
Jody Goldberg committed
634
	gtk_notebook_remove_page (wbcg->notebook, i);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
635

636
	wbcg_menu_state_sheet_count (wbc);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
637
638
}

Jody Goldberg's avatar
Jody Goldberg committed
639
640
641
642
643
static void
wbcg_sheet_rename (WorkbookControl *wbc, Sheet *sheet)
{
	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
	GtkWidget *label;
644
645
	SheetControlGUI *scg;
	int i = sheet_to_page_index (wbcg, sheet, &scg);
Jody Goldberg's avatar
Jody Goldberg committed
646
647
648

	g_return_if_fail (i >= 0);

649
	label = gtk_notebook_get_tab_label (wbcg->notebook, GTK_WIDGET (scg->table));
Jody Goldberg's avatar
Jody Goldberg committed
650
651
	editable_label_set_text (EDITABLE_LABEL (label), sheet->name_unquoted);
}
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
652

Jody Goldberg's avatar
Jody Goldberg committed
653
static void
Jody Goldberg's avatar
Jody Goldberg committed
654
wbcg_sheet_focus (WorkbookControl *wbc, Sheet *sheet)
Jody Goldberg's avatar
Jody Goldberg committed
655
656
{
	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
657
658
	SheetControlGUI *scg;
	int i = sheet_to_page_index (wbcg, sheet, &scg);
Jody Goldberg's avatar
Jody Goldberg committed
659
660
661
662
663
664
665
666
667

	/* A sheet added in another view may not yet have a view */
	if (i >= 0) {
		gtk_notebook_set_page (wbcg->notebook, i);
		zoom_changed (wbcg, sheet);
	}
}

static void
Jody Goldberg's avatar
Jody Goldberg committed
668
wbcg_sheet_move (WorkbookControl *wbc, Sheet *sheet, int new_pos)
Jody Goldberg's avatar
Jody Goldberg committed
669
{
Jody Goldberg's avatar
Jody Goldberg committed
670
	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
671
	SheetControlGUI *scg;
Jody Goldberg's avatar
Jody Goldberg committed
672
673
674
675

	g_return_if_fail (IS_SHEET (sheet));

	/* No need for sanity checking, the workbook did that */
676
        if (sheet_to_page_index (wbcg, sheet, &scg) >= 0)
Jody Goldberg's avatar
Jody Goldberg committed
677
		gtk_notebook_reorder_child (wbcg->notebook,
678
			GTK_WIDGET (scg->table), new_pos);
Jody Goldberg's avatar
Jody Goldberg committed
679
680
}

Jody Goldberg's avatar
update    
Jody Goldberg committed
681
682
683
684
685
686
static void
wbcg_sheet_remove_all (WorkbookControl *wbc)
{
	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;

	if (wbcg->notebook != NULL) {
687
688
		GtkWidget *tmp = GTK_WIDGET (wbcg->notebook);

689
		/* Be sure we are no longer editing */
690
		wbcg_edit_finish (wbcg, FALSE);
691

692
693
694
		/* Clear notebook to disable updates as focus changes for pages
		 * during destruction
		 */
Jody Goldberg's avatar
update    
Jody Goldberg committed
695
		wbcg->notebook = NULL;
696
		gtk_container_remove (GTK_CONTAINER (wbcg->table), tmp);
Jody Goldberg's avatar
update    
Jody Goldberg committed
697
698
699
	}
}

Jody Goldberg's avatar
Jody Goldberg committed
700
701
702
703
704
705
706
707
static void
wbcg_history_setup (WorkbookControlGUI *wbcg)
{
	GList *hl = application_history_get_list ();
	if (hl)
		history_menu_setup (wbcg, hl);
}

708
709
static gboolean
cb_change_zoom (GtkWidget *caller, char *new_zoom, WorkbookControlGUI *wbcg)
Jody Goldberg's avatar
Jody Goldberg committed
710
711
712
{
	Sheet *sheet = wb_control_cur_sheet (WORKBOOK_CONTROL (wbcg));
	int factor;
713
	char *end;
Jody Goldberg's avatar
Jody Goldberg committed
714

Jody Goldberg's avatar
delete.    
Jody Goldberg committed
715
	if (sheet == NULL || wbcg->updating_ui)
716
		return TRUE;
Jody Goldberg's avatar
Jody Goldberg committed
717

718
719
720
721
722
723
724
725
726
727
728
	errno = 0; /* strtod sets errno, but does not clear it.  */
	factor = strtol (new_zoom, &end, 10);
	if (new_zoom != end && errno != ERANGE && factor == (gnum_float)factor)
		/* The GSList of sheet passed to cmd_zoom will be freed by cmd_zoom,
		 * and the sheet will fore an updat eof the zoom combo to keep the
		 * display consistent
		 */
		cmd_zoom (WORKBOOK_CONTROL (wbcg), g_slist_append (NULL, sheet),
			  (double) factor / 100);
	else
		zoom_changed (wbcg, sheet);
Jody Goldberg's avatar
Jody Goldberg committed
729
730

	wb_control_gui_focus_cur_sheet (wbcg);
731

732
733
	/* because we are updating it there is no need to apply it now */
	return FALSE;
Jody Goldberg's avatar
Jody Goldberg committed
734
735
736
}

static void
Jody Goldberg's avatar
Jody Goldberg committed
737
wbcg_auto_expr_value (WorkbookControl *wbc)
Jody Goldberg's avatar
Jody Goldberg committed
738
{
739
	WorkbookControlGUI *wbcg = WORKBOOK_CONTROL_GUI (wbc);
Jody Goldberg's avatar
Jody Goldberg committed
740
	WorkbookView *wbv = wb_control_view (wbc);
Jody Goldberg's avatar
Jody Goldberg committed
741

Jody Goldberg's avatar
Jody Goldberg committed
742
743
744
	g_return_if_fail (wbcg != NULL);
	g_return_if_fail (wbv != NULL);
	g_return_if_fail (wbv->auto_expr_value_as_string != NULL);
Jody Goldberg's avatar
Jody Goldberg committed
745

746
	if (wbcg_ui_update_begin (wbcg)) {
747
748
749
		gtk_label_set_text(
			 GTK_LABEL (GTK_BIN (wbcg->auto_expr_label)->child),
			 wbv->auto_expr_value_as_string);
750
751
		wbcg_ui_update_end (wbcg);
	}
Jody Goldberg's avatar
Jody Goldberg committed
752
753
}

754
755
756
757
758
759
760
761
762
763
764
765
766
static GtkComboStack *
ur_stack (WorkbookControl *wbc, gboolean is_undo)
{
	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
	return GTK_COMBO_STACK (is_undo ? wbcg->undo_combo : wbcg->redo_combo);
}

static void
wbcg_undo_redo_clear (WorkbookControl *wbc, gboolean is_undo)
{
	gtk_combo_stack_clear (ur_stack (wbc, is_undo));
}

767
768
769
770
771
772
static void
wbcg_undo_redo_truncate (WorkbookControl *wbc, int n, gboolean is_undo)
{
	gtk_combo_stack_truncate (ur_stack (wbc, is_undo), n);
}

773
774
775
776
777
778
779
780
781
782
783
784
static void
wbcg_undo_redo_pop (WorkbookControl *wbc, gboolean is_undo)
{
	gtk_combo_stack_remove_top (ur_stack (wbc, is_undo), 1);
}

static void
wbcg_undo_redo_push (WorkbookControl *wbc, char const *text, gboolean is_undo)
{
	gtk_combo_stack_push_item (ur_stack (wbc, is_undo), text);
}

Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
785
#ifndef ENABLE_BONOBO
786
787
static void
change_menu_state (GtkWidget *menu_item, gboolean state)
Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
788
789
790
{
	g_return_if_fail (menu_item != NULL);

791
	gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), state);
Jody Goldberg's avatar
enable.    
Jody Goldberg committed
792
}
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812

static void
change_menu_sensitivity (GtkWidget *menu_item, gboolean sensitive)
{
	g_return_if_fail (menu_item != NULL);

	gtk_widget_set_sensitive (menu_item, sensitive);
}

static void
change_menu_label (GtkWidget *menu_item, char const *prefix, char const *suffix)
{
	gchar    *text;
	GtkBin   *bin = GTK_BIN (menu_item);
	GtkLabel *label = GTK_LABEL (bin->child);
	gboolean  sensitive = TRUE;

	g_return_if_fail (label != NULL);

	if (prefix == NULL) {
813
		gtk_label_parse_uline (label, suffix);
814
815
816
817
818
819
820
821
822
823
		return;
	}

	if (suffix == NULL) {
		suffix = _("Nothing");
		sensitive = FALSE;
	}

	text = g_strdup_printf ("%s : %s", prefix, suffix);

824
	gtk_label_parse_uline (label, text);
825
826
827
	gtk_widget_set_sensitive (menu_item, sensitive);
	g_free (text);
}
Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
828
#else
829
830
static void
change_menu_state (WorkbookControlGUI const *wbcg,
Jody Goldberg's avatar
enable.    
Jody Goldberg committed
831
832
		  char const *verb_path, gboolean state)
{
Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
833
834
	CORBA_Environment  ev;

Jody Goldberg's avatar
enable.    
Jody Goldberg committed
835
	g_return_if_fail (IS_WORKBOOK_CONTROL_GUI (wbcg));
Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
836
837
838

	CORBA_exception_init (&ev);
	bonobo_ui_component_set_prop (wbcg->uic, verb_path,
Jody Goldberg's avatar
delete.    
Jody Goldberg committed
839
				      "state", state ? "1" : "0", &ev);
Morten Welinder's avatar
Morten Welinder committed
840
	CORBA_exception_free (&ev);
Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
841
}
Jody Goldberg's avatar
enable.    
Jody Goldberg committed
842

Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
843
static void
Jody Goldberg's avatar
enable.    
Jody Goldberg committed
844
845
846
change_menu_sensitivity (WorkbookControlGUI const *wbcg,
			 char const *verb_path, gboolean sensitive)
{
847
848
	CORBA_Environment  ev;

Jody Goldberg's avatar
enable.    
Jody Goldberg committed
849
	g_return_if_fail (IS_WORKBOOK_CONTROL_GUI (wbcg));
850
851
852
853

	CORBA_exception_init (&ev);
	bonobo_ui_component_set_prop (wbcg->uic, verb_path,
				      "sensitive", sensitive ? "1" : "0", &ev);
Morten Welinder's avatar
Morten Welinder committed
854
	CORBA_exception_free (&ev);
Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
855
}
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871

static void
change_menu_label (WorkbookControlGUI const *wbcg,
		   char const *verb_path,
		   char const *prefix,
		   char const *suffix)
{
	gboolean  sensitive = TRUE;
	gchar    *text;
	CORBA_Environment  ev;

	g_return_if_fail (IS_WORKBOOK_CONTROL_GUI (wbcg));

	CORBA_exception_init (&ev);

	if (prefix == NULL) {
872
		bonobo_ui_component_set_prop (wbcg->uic, verb_path, "label",
873
874
875
876
877
878
879
880
881
					      suffix, &ev);
	} else {
		if (suffix == NULL) {
			suffix = _("Nothing");
			sensitive = FALSE;
		}

		text = g_strdup_printf ("%s : %s", prefix, suffix);

882
		bonobo_ui_component_set_prop (wbcg->uic, verb_path,
883
884
885
886
887
888
889
					      "label", text, &ev);
		bonobo_ui_component_set_prop (wbcg->uic, verb_path,
					      "sensitive", sensitive ? "1" : "0", &ev);
		g_free (text);
	}
	CORBA_exception_free (&ev);
}
Jody Goldberg's avatar
enable.    
Jody Goldberg committed
890
#endif
Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
891

Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
892
static void
893
wbcg_menu_state_update (WorkbookControl *wbc, Sheet const *sheet, int flags)
Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
894
895
{
	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
Morten Welinder's avatar
Morten Welinder committed
896

Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
897
898
899
	g_return_if_fail (wbcg != NULL);

#ifndef ENABLE_BONOBO
Morten Welinder's avatar
Morten Welinder committed
900
	if (MS_INSERT_COLS & flags)
Jody Goldberg's avatar
Jody Goldberg committed
901
902
		change_menu_sensitivity (wbcg->menu_item_insert_cols,
					 sheet->priv->enable_insert_cols);
903
	if (MS_INSERT_ROWS & flags)
Jody Goldberg's avatar
Jody Goldberg committed
904
905
		change_menu_sensitivity (wbcg->menu_item_insert_rows,
					 sheet->priv->enable_insert_rows);
906
	if (MS_INSERT_CELLS & flags)
Jody Goldberg's avatar
Jody Goldberg committed
907
908
		change_menu_sensitivity (wbcg->menu_item_insert_cells,
					 sheet->priv->enable_insert_cells);
909
	if (MS_SHOWHIDE_DETAIL & flags) {
910
911
912
913
914
		change_menu_sensitivity (wbcg->menu_item_show_detail,
					 sheet->priv->enable_showhide_detail);
		change_menu_sensitivity (wbcg->menu_item_hide_detail,
					 sheet->priv->enable_showhide_detail);
	}
915
	if (MS_PASTE_SPECIAL & flags)
916
917
		change_menu_sensitivity (wbcg->menu_item_paste_special,
					 sheet->priv->enable_paste_special);
918
	if (MS_PRINT_SETUP & flags)
919
		change_menu_sensitivity (wbcg->menu_item_print_setup,
920
					 !wbcg_edit_has_guru (wbcg));
921
	if (MS_SEARCH_REPLACE & flags)
922
		change_menu_sensitivity (wbcg->menu_item_search_replace,
923
					 !wbcg_edit_has_guru (wbcg));
924
	if (MS_DEFINE_NAME & flags)
925
		change_menu_sensitivity (wbcg->menu_item_define_name,
926
					 !wbcg_edit_has_guru (wbcg));
927
	if (MS_CONSOLIDATE & flags)
Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
928
929
		change_menu_sensitivity (wbcg->menu_item_consolidate,
					 !wbcg_edit_has_guru (wbcg));
Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
930
#else
931
	if (MS_INSERT_COLS & flags)
Jody Goldberg's avatar
Jody Goldberg committed
932
933
		change_menu_sensitivity (wbcg, "/commands/InsertColumns",
					 sheet->priv->enable_insert_cols);
934
	if (MS_INSERT_ROWS & flags)
Jody Goldberg's avatar
Jody Goldberg committed
935
936
		change_menu_sensitivity (wbcg, "/commands/InsertRows",
					 sheet->priv->enable_insert_rows);
937
	if (MS_INSERT_CELLS & flags)
Jody Goldberg's avatar
Jody Goldberg committed
938
939
		change_menu_sensitivity (wbcg, "/commands/InsertCells",
					 sheet->priv->enable_insert_cells);
940
	if (MS_SHOWHIDE_DETAIL & flags) {
941
942
943
944
945
		change_menu_sensitivity (wbcg, "/commands/DataOutlineShowDetail",
					 sheet->priv->enable_showhide_detail);
		change_menu_sensitivity (wbcg, "/commands/DataOutlineHideDetail",
					 sheet->priv->enable_showhide_detail);
	}
946
	if (MS_PASTE_SPECIAL & flags)
947
948
		change_menu_sensitivity (wbcg, "/commands/EditPasteSpecial",
					 sheet->priv->enable_paste_special);
949
	if (MS_PRINT_SETUP & flags)
950
		change_menu_sensitivity (wbcg, "/commands/FilePrintSetup",
951
					 !wbcg_edit_has_guru (wbcg));
952
	if (MS_SEARCH_REPLACE & flags)
953
		change_menu_sensitivity (wbcg, "/commands/EditSearchReplace",
954
					 !wbcg_edit_has_guru (wbcg));
955
	if (MS_DEFINE_NAME & flags)
956
		change_menu_sensitivity (wbcg, "/commands/EditNames",
957
					 !wbcg_edit_has_guru (wbcg));
958
	if (MS_CONSOLIDATE & flags)
Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
959
960
		change_menu_sensitivity (wbcg, "/commands/DataConsolidate",
					 !wbcg_edit_has_guru (wbcg));
Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
961
#endif
962

963
964
	if (MS_FREEZE_VS_THAW & flags) {
		Sheet *sheet = wb_control_cur_sheet (WORKBOOK_CONTROL (wbcg));
965
966
		/* Cheat and use the same accelerator for both states because
		 * we don't reset it when the label changes */
967
		char const* label = sheet_is_frozen (sheet)
968
			? _("Un_freeze Panes") : _("_Freeze Panes");
969
#ifndef ENABLE_BONOBO
970
971
		change_menu_label (wbcg->menu_item_freeze_panes,
				   NULL, label);
972
#else
973
		change_menu_label (wbcg, "/commands/ViewFreezeThawPanes",
974
		                   NULL, label);
975
976
977
978
#endif
	}
}

979
980
981
982
983
984
985
986
987
static void
wbcg_menu_state_sensitivity (WorkbookControl *wbc, gboolean sensitive)
{
 	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
#ifdef ENABLE_BONOBO
	CORBA_Environment ev;
#endif

	/* Don't disable/enable again (prevent toolbar flickering) */
988
	if (wbcg->toolbar_is_sensitive == sensitive)
989
		return;
990
	wbcg->toolbar_is_sensitive = sensitive;
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022

#ifdef ENABLE_BONOBO
	CORBA_exception_init (&ev);
	bonobo_ui_component_set_prop (wbcg->uic, "/commands/MenuBar",
				      "sensitive", sensitive ? "1" : "0", &ev);
	bonobo_ui_component_set_prop (wbcg->uic, "/commands/StandardToolbar",
				      "sensitive", sensitive ? "1" : "0", &ev);
	bonobo_ui_component_set_prop (wbcg->uic, "/commands/FormatToolbar",
				      "sensitive", sensitive ? "1" : "0", &ev);
	bonobo_ui_component_set_prop (wbcg->uic, "/commands/ObjectToolbar",
				      "sensitive", sensitive ? "1" : "0", &ev);
	CORBA_exception_free (&ev);
	/* TODO : Ugly hack to work around strange bonobo semantics for
	 * sensitivity of containers.  Bonono likes to recursively set the state
	 * rather than just setting the container.
	 */
	if (sensitive) {
		Workbook *wb = wb_control_workbook (WORKBOOK_CONTROL (wbcg));
		if (wb->undo_commands == NULL)
			gtk_widget_set_sensitive (wbcg->undo_combo, FALSE);
		if (wb->redo_commands == NULL)
			gtk_widget_set_sensitive (wbcg->redo_combo, FALSE);
	}
#else
	gtk_widget_set_sensitive (GNOME_APP (wbcg->toplevel)->menubar, sensitive);
	gtk_widget_set_sensitive (wbcg->standard_toolbar, sensitive);
	gtk_widget_set_sensitive (wbcg->format_toolbar, sensitive);
	gtk_widget_set_sensitive (wbcg->object_toolbar, sensitive);
#endif

}

1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
static void
wbcg_undo_redo_labels (WorkbookControl *wbc, char const *undo, char const *redo)
{
	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
	g_return_if_fail (wbcg != NULL);

#ifndef ENABLE_BONOBO
	change_menu_label (wbcg->menu_item_undo, _("Undo"), undo);
	change_menu_label (wbcg->menu_item_redo, _("Redo"), redo);
#else
1033
1034
	change_menu_label (wbcg, "/commands/EditUndo", _("_Undo"), undo);
	change_menu_label (wbcg, "/commands/EditRedo", _("_Redo"), redo);
1035
1036
1037
#endif
}

1038
1039
1040
1041
static void
wbcg_menu_state_sheet_prefs (WorkbookControl *wbc, Sheet const *sheet)
{
 	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
Morten Welinder's avatar
Morten Welinder committed
1042

1043
1044
	if (!wbcg_ui_update_begin (wbcg))
		return;
1045
1046

#ifndef ENABLE_BONOBO
1047
	change_menu_state (wbcg->menu_item_sheet_display_formulas,
1048
		sheet->display_formulas);
1049
	change_menu_state (wbcg->menu_item_sheet_hide_zero,
1050
		sheet->hide_zero);
1051
	change_menu_state (wbcg->menu_item_sheet_hide_grid,
1052
		sheet->hide_grid);
1053
	change_menu_state (wbcg->menu_item_sheet_hide_col_header,
1054
		sheet->hide_col_header);
1055
	change_menu_state (wbcg->menu_item_sheet_hide_row_header,
1056
		sheet->hide_row_header);
1057
	change_menu_state (wbcg->menu_item_sheet_display_outlines,
1058
		sheet->display_outlines);
1059
	change_menu_state (wbcg->menu_item_sheet_outline_symbols_below,
1060
		sheet->outline_symbols_below);
1061
	change_menu_state (wbcg->menu_item_sheet_outline_symbols_right,
1062
		sheet->outline_symbols_right);
1063
#else
1064
	change_menu_state (wbcg,
Jody Goldberg's avatar
enable.    
Jody Goldberg committed
1065
		"/commands/SheetDisplayFormulas", sheet->display_formulas);
1066
	change_menu_state (wbcg,
Jody Goldberg's avatar
enable.    
Jody Goldberg committed
1067
		"/commands/SheetHideZeros", sheet->hide_zero);
1068
	change_menu_state (wbcg,
Jody Goldberg's avatar
enable.    
Jody Goldberg committed
1069
		"/commands/SheetHideGridlines", sheet->hide_grid);
1070
	change_menu_state (wbcg,
Jody Goldberg's avatar
enable.    
Jody Goldberg committed
1071
		"/commands/SheetHideColHeader", sheet->hide_col_header);
1072
	change_menu_state (wbcg,
Jody Goldberg's avatar
enable.    
Jody Goldberg committed
1073
		"/commands/SheetHideRowHeader", sheet->hide_row_header);
1074
	change_menu_state (wbcg,
1075
		"/commands/SheetDisplayOutlines", sheet->display_outlines);
1076
	change_menu_state (wbcg,
1077
		"/commands/SheetOutlineBelow", sheet->outline_symbols_below);
1078
	change_menu_state (wbcg,
1079
		"/commands/SheetOutlineRight", sheet->outline_symbols_right);
1080
#endif
1081
	wbcg_ui_update_end (wbcg);
1082
1083
}

1084
1085
1086
1087
static void
wbcg_menu_state_sheet_count (WorkbookControl *wbc)
{
 	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
1088
1089
1090
	int const sheet_count = g_list_length (wbcg->notebook->children);
	/* Should we anble commands requiring multiple sheets */
	gboolean const multi_sheet = (sheet_count > 1);
1091