workbook-control-gui.c 113 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
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/*
 * workbook-control-gui.c: GUI specific routines for a workbook-control.
 *
 * Copyright (C) 2000 Jody Goldberg (jgoldberg@home.com)
 *
 * 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
 */
#include <config.h>
#include "workbook-control-gui-priv.h"
#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"
32
#include "sheet-private.h"
33
#include "sheet-control-gui-priv.h"
34
#include "gnumeric-canvas.h"
Jody Goldberg's avatar
Jody Goldberg committed
35
#include "sheet-object.h"
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#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
50
#include "value.h"
Jody Goldberg's avatar
Jody Goldberg committed
51
52
#include "history.h"
#include "str.h"
Jody Goldberg's avatar
Jody Goldberg committed
53
#include "cell.h"
54
#include "gui-file.h"
55
#include "search.h"
56
#include "error-info.h"
Jody Goldberg's avatar
fix.    
Jody Goldberg committed
57
#include "pixmaps/equal-sign.xpm"
58
#include "gui-util.h"
Jody Goldberg's avatar
fix.    
Jody Goldberg committed
59
60
#include "widgets/gnumeric-toolbar.h"
#include "widgets/widget-editable-label.h"
61
#include "widgets/gnumeric-combo-text.h"
62

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

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

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

79
#include <ctype.h>
80
#include <stdarg.h>
81
#include <errno.h>
82

83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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;
}

101
102
103
104
105
106
107
108
109
110
111
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++) {
112
113
114
		GtkObject *obj = gtk_object_get_data (GTK_OBJECT (w),
						      SHEET_CONTROL_KEY);
		SheetControlGUI *scg = SHEET_CONTROL_GUI (obj);
115
		SheetControl *sc = (SheetControl *) scg;
Morten Welinder's avatar
Morten Welinder committed
116

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

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

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

134
135
136
137
138
139
140
141
142
143
/**
 * 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
144
145
146
Sheet *
wb_control_gui_focus_cur_sheet (WorkbookControlGUI *wbcg)
{
147
148
	GtkObject *table;
	GtkObject *obj;
149
	SheetControlGUI *scg;
Jody Goldberg's avatar
Jody Goldberg committed
150

151
	g_return_val_if_fail (IS_WORKBOOK_CONTROL_GUI (wbcg), NULL);
Jody Goldberg's avatar
Jody Goldberg committed
152

153
154
155
	table = GTK_OBJECT ((wbcg->notebook)->cur_page->child);
	obj = gtk_object_get_data (table, SHEET_CONTROL_KEY);
	scg = SHEET_CONTROL_GUI (obj);
156
157
158

	g_return_val_if_fail (scg != NULL, NULL);

159
	scg_take_focus (scg);
160

161
	return ((SheetControl *) scg)->sheet;
162
}
Jody Goldberg's avatar
Jody Goldberg committed
163

164
165
166
167
SheetControlGUI *
wb_control_gui_cur_sheet (WorkbookControlGUI *wbcg)
{
	SheetControlGUI *scg;
Jody Goldberg's avatar
Jody Goldberg committed
168

169
170
	sheet_to_page_index (wbcg,
		wb_control_cur_sheet (WORKBOOK_CONTROL (wbcg)), &scg);
Jody Goldberg's avatar
Jody Goldberg committed
171

172
	return scg;
Jody Goldberg's avatar
Jody Goldberg committed
173
174
}

175
176
177
178
179
180
181
182
/****************************************************************************/
/* Autosave */
static gboolean
cb_autosave (gpointer *data)
{
	WorkbookView *wb_view;
        WorkbookControlGUI *wbcg = (WorkbookControlGUI *)data;

183
	g_return_val_if_fail (IS_WORKBOOK_CONTROL_GUI (wbcg), FALSE);
184
185
186
187
188
189
190
191
192

	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;
193
		gui_file_save (wbcg, wb_view);
194
195
196
197
	}
	return TRUE;
}

198
199
200
201
202
203
204
205
206
207
208
209
210
/**
 * 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);

211
212
	/* Already range selecting */
	if (wbcg->rangesel != NULL)
213
214
		return TRUE;

215
	/* Rangesel requires that we be editing somthing */
216
	if (!wbcg_is_editing (wbcg) && !wbcg_edit_entry_redirect_p (wbcg))
217
218
		return FALSE;

219
	return gnumeric_expr_entry_rangesel_meaningful (wbcg_get_entry_logical (wbcg));
220
221
}

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

229
void
230
wbcg_autosave_cancel (WorkbookControlGUI *wbcg)
231
{
Jody Goldberg's avatar
Jody Goldberg committed
232
233
	g_return_if_fail (IS_WORKBOOK_CONTROL_GUI (wbcg));

234
235
236
237
238
239
240
	if (wbcg->autosave_timer != 0) {
		gtk_timeout_remove (wbcg->autosave_timer);
		wbcg->autosave_timer = 0;
	}
}

void
241
wbcg_autosave_set (WorkbookControlGUI *wbcg, int minutes, gboolean prompt)
242
{
Jody Goldberg's avatar
Jody Goldberg committed
243
244
	g_return_if_fail (IS_WORKBOOK_CONTROL_GUI (wbcg));

245
	wbcg_autosave_cancel (wbcg);
246
247
248
249
250
251
252
253
254
255
256

	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
257
258
259
260
261
262
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
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
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));
}

279
280
281
282
283
284
285
286
287
288
289
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
290
 	gtk_window_set_title (wb_control_gui_toplevel (wbcg), full_title);
291
292
293
294
295
296
297
	g_free (full_title);
}

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

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

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

static void
Jody Goldberg's avatar
Jody Goldberg committed
314
wbcg_format_feedback (WorkbookControl *wbc)
315
{
Jody Goldberg's avatar
Jody Goldberg committed
316
	workbook_feedback_set ((WorkbookControlGUI *)wbc);
317
318
319
}

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

Jody Goldberg's avatar
delete.    
Jody Goldberg committed
324
	g_return_if_fail (IS_SHEET (sheet));
325
326
327
	g_return_if_fail (wbcg->zoom_entry != NULL);

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

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

	scg_object_update_bbox (wb_control_gui_cur_sheet (wbcg),
337
				NULL, NULL);
338
339
340
341
342
343
344
}

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
345
	zoom_changed (wbcg, sheet);
346
347
348
349
350
}

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

353
	entry = GTK_ENTRY (wbcg_get_entry ((WorkbookControlGUI*)wbc));
354
355
356
	gtk_entry_set_text (entry, text);
}

Jody Goldberg's avatar
Jody Goldberg committed
357
358
359
360
361
362
363
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
364
365
366
367
368
369
370
371
372
373
374
375
376
/*
 * 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
377
378
379
380
381
382
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
383
static void
384
sheet_action_add_sheet (GtkWidget *widget, SheetControlGUI *scg)
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
385
{
386
387
388
	SheetControl *sc = (SheetControl *) scg;

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

Jody Goldberg's avatar
be safe    
Jody Goldberg committed
392
static void
393
delete_sheet_if_possible (GtkWidget *ignored, SheetControlGUI *scg)
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
394
{
395
396
	SheetControl *sc = (SheetControl *) scg;
	Workbook *wb = wb_control_workbook (sc->wbc);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
397
398
399
400
401
402
403
404
405
406
407
408
	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;

	message = g_strdup_printf (
		_("Are you sure you want to remove the sheet called `%s'?"),
409
		sc->sheet->name_unquoted);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
410
411
412
413
414
415
416
417
418
419

	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);

420
	r = gnumeric_dialog_run (scg->wbcg, GNOME_DIALOG (d));
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
421
422
423
424

	if (r != 0)
		return;

425
	workbook_sheet_delete (sc->sheet);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
426
427
428
	workbook_recalc_all (wb);
}

Jody Goldberg's avatar
update    
Jody Goldberg committed
429
static void
430
sheet_action_rename_sheet (GtkWidget *widget, SheetControlGUI *scg)
Jody Goldberg's avatar
update    
Jody Goldberg committed
431
{
432
433
	SheetControl *sc = (SheetControl *) scg;
	Sheet *sheet = sc->sheet;
434
	char *new_name = dialog_get_sheet_name (scg->wbcg, sheet->name_unquoted);
Jody Goldberg's avatar
update    
Jody Goldberg committed
435
436
437
438
	if (!new_name)
		return;

	/* We do not care if it fails */
439
	cmd_rename_sheet (sc->wbc, sheet->name_unquoted, new_name);
Jody Goldberg's avatar
update    
Jody Goldberg committed
440
441
442
443
	g_free (new_name);
}

static void
444
sheet_action_clone_sheet (GtkWidget *widget, SheetControlGUI *scg)
Jody Goldberg's avatar
update    
Jody Goldberg committed
445
{
446
447
	SheetControl *sc = (SheetControl *) scg;
     	Sheet *new_sheet = sheet_duplicate (sc->sheet);
Morten Welinder's avatar
Morten Welinder committed
448

449
	workbook_sheet_attach (sc->sheet->workbook, new_sheet, sc->sheet);
Jody Goldberg's avatar
update    
Jody Goldberg committed
450
	sheet_set_dirty (new_sheet, TRUE);
451
	wb_control_gui_focus_cur_sheet (scg->wbcg);
Jody Goldberg's avatar
update    
Jody Goldberg committed
452
453
454
}

static void
455
sheet_action_reorder_sheet (GtkWidget *widget, SheetControlGUI *scg)
Jody Goldberg's avatar
update    
Jody Goldberg committed
456
{
457
	dialog_sheet_order (scg->wbcg);
Jody Goldberg's avatar
update    
Jody Goldberg committed
458
459
}

Jody Goldberg's avatar
be safe    
Jody Goldberg committed
460
461
462
463
/**
 * sheet_menu_label_run:
 */
static void
464
sheet_menu_label_run (SheetControlGUI *scg, GdkEventButton *event)
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
465
466
{
#define SHEET_CONTEXT_TEST_SIZE 1
467
	SheetControl *sc = (SheetControl *) scg;
Morten Welinder's avatar
Morten Welinder committed
468

Jody Goldberg's avatar
be safe    
Jody Goldberg committed
469
470
	struct {
		const char *text;
471
		void (*function) (GtkWidget *widget, SheetControlGUI *scg);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
		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
491
		if (flags & SHEET_CONTEXT_TEST_SIZE &&
492
		    workbook_sheet_count (sc->sheet->workbook) < 2)
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
493
				continue;
Jody Goldberg's avatar
update    
Jody Goldberg committed
494

Jody Goldberg's avatar
be safe    
Jody Goldberg committed
495
496
497
498
499
500
501
502
		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),
503
			scg);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
504
505
506
507
508
509
510
511
512
513
514
	}

	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
515
static gboolean
Jody Goldberg's avatar
update    
Jody Goldberg committed
516
517
cb_sheet_label_button_press (GtkWidget *widget, GdkEventButton *event,
			     GtkWidget *child)
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
518
519
520
{
	GtkWidget *notebook;
	gint page_number;
521
522
523
524
525
	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
526
527
528
529
530
531
532

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

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

533
	if (event->button == 1 || NULL != scg->wbcg->rangesel) {
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
534
535
536
537
538
		gtk_notebook_set_page (GTK_NOTEBOOK (notebook), page_number);
		return TRUE;
	}

	if (event->button == 3) {
539
540
541

		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
542
543
544
545
546
547
		return TRUE;
	}

	return FALSE;
}

Jody Goldberg's avatar
update    
Jody Goldberg committed
548
static void workbook_setup_sheets (WorkbookControlGUI *wbcg);
549
static void wbcg_menu_state_sheet_count (WorkbookControl *wbc);
Jody Goldberg's avatar
update    
Jody Goldberg committed
550

Jody Goldberg's avatar
be safe    
Jody Goldberg committed
551
552
553
554
/**
 * wbcg_sheet_add:
 * @sheet: a sheet
 *
555
 * Creates a new SheetControlGUI for the sheet and adds it to the workbook-control-gui.
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
556
557
558
559
560
 */
static void
wbcg_sheet_add (WorkbookControl *wbc, Sheet *sheet)
{
	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
561
	SheetControlGUI *scg;
562
	SheetControl *sc;
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
563
	GtkWidget *sheet_label;
Jody Goldberg's avatar
Jody Goldberg committed
564
	GList     *ptr;
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
565
566

	g_return_if_fail (wbcg != NULL);
Jody Goldberg's avatar
update    
Jody Goldberg committed
567
568
569

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

571
	scg = sheet_control_gui_new (sheet);
572
573
	sc = (SheetControl *) scg;
	sc->wbc = wbc;
574
	scg->wbcg = wbcg;
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
575
576
577
578
579
580
581
582
583
584
585
586
587
588

	/*
	 * 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",
589
		GTK_SIGNAL_FUNC (cb_sheet_label_button_press), scg->table);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
590
591

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

594
595
	if (wbcg_ui_update_begin (wbcg)) {
		gtk_notebook_insert_page (wbcg->notebook,
596
			GTK_WIDGET (scg->table), sheet_label,
597
598
599
			workbook_sheet_index_get (wb_control_workbook (wbc), sheet));
		wbcg_ui_update_end (wbcg);
	}
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
600

601
	wbcg_menu_state_sheet_count (wbc);
Jody Goldberg's avatar
Jody Goldberg committed
602
603
604

	/* create views for the sheet objects */
	for (ptr = sheet->sheet_objects; ptr != NULL ; ptr = ptr->next)
605
		sheet_object_new_view (ptr->data, scg);
606
607
	scg_adjust_preferences (sc);
	scg_set_zoom_factor (sc);
608
	scg_take_focus (scg);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
609
610
611
612
613
614
}

static void
wbcg_sheet_remove (WorkbookControl *wbc, Sheet *sheet)
{
	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
615
	SheetControlGUI *scg;
Jody Goldberg's avatar
update    
Jody Goldberg committed
616
617
618
619
620
621
	int i;

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

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

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

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

628
	wbcg_menu_state_sheet_count (wbc);
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
629
630
}

Jody Goldberg's avatar
Jody Goldberg committed
631
632
633
634
635
static void
wbcg_sheet_rename (WorkbookControl *wbc, Sheet *sheet)
{
	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
	GtkWidget *label;
636
637
	SheetControlGUI *scg;
	int i = sheet_to_page_index (wbcg, sheet, &scg);
Jody Goldberg's avatar
Jody Goldberg committed
638
639
640

	g_return_if_fail (i >= 0);

641
	label = gtk_notebook_get_tab_label (wbcg->notebook, GTK_WIDGET (scg->table));
Jody Goldberg's avatar
Jody Goldberg committed
642
643
	editable_label_set_text (EDITABLE_LABEL (label), sheet->name_unquoted);
}
Jody Goldberg's avatar
be safe    
Jody Goldberg committed
644

Jody Goldberg's avatar
Jody Goldberg committed
645
static void
Jody Goldberg's avatar
Jody Goldberg committed
646
wbcg_sheet_focus (WorkbookControl *wbc, Sheet *sheet)
Jody Goldberg's avatar
Jody Goldberg committed
647
648
{
	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
649
650
	SheetControlGUI *scg;
	int i = sheet_to_page_index (wbcg, sheet, &scg);
Jody Goldberg's avatar
Jody Goldberg committed
651
652
653
654
655
656
657
658
659

	/* 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
660
wbcg_sheet_move (WorkbookControl *wbc, Sheet *sheet, int new_pos)
Jody Goldberg's avatar
Jody Goldberg committed
661
{
Jody Goldberg's avatar
Jody Goldberg committed
662
	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
663
	SheetControlGUI *scg;
Jody Goldberg's avatar
Jody Goldberg committed
664
665
666
667

	g_return_if_fail (IS_SHEET (sheet));

	/* No need for sanity checking, the workbook did that */
668
        if (sheet_to_page_index (wbcg, sheet, &scg) >= 0)
Jody Goldberg's avatar
Jody Goldberg committed
669
		gtk_notebook_reorder_child (wbcg->notebook,
670
			GTK_WIDGET (scg->table), new_pos);
Jody Goldberg's avatar
Jody Goldberg committed
671
672
}

Jody Goldberg's avatar
update    
Jody Goldberg committed
673
674
675
676
677
678
static void
wbcg_sheet_remove_all (WorkbookControl *wbc)
{
	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;

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

681
		/* Be sure we are no longer editing */
682
		wbcg_edit_finish (wbcg, FALSE);
683

684
685
686
		/* Clear notebook to disable updates as focus changes for pages
		 * during destruction
		 */
Jody Goldberg's avatar
update    
Jody Goldberg committed
687
		wbcg->notebook = NULL;
688
		gtk_container_remove (GTK_CONTAINER (wbcg->table), tmp);
Jody Goldberg's avatar
update    
Jody Goldberg committed
689
690
691
	}
}

Jody Goldberg's avatar
Jody Goldberg committed
692
693
694
695
696
697
698
699
static void
wbcg_history_setup (WorkbookControlGUI *wbcg)
{
	GList *hl = application_history_get_list ();
	if (hl)
		history_menu_setup (wbcg, hl);
}

700
701
static gboolean
cb_change_zoom (GtkWidget *caller, char *new_zoom, WorkbookControlGUI *wbcg)
Jody Goldberg's avatar
Jody Goldberg committed
702
703
704
{
	Sheet *sheet = wb_control_cur_sheet (WORKBOOK_CONTROL (wbcg));
	int factor;
705
	char *end;
Jody Goldberg's avatar
Jody Goldberg committed
706

Jody Goldberg's avatar
delete.    
Jody Goldberg committed
707
	if (sheet == NULL || wbcg->updating_ui)
708
		return TRUE;
Jody Goldberg's avatar
Jody Goldberg committed
709

710
711
712
713
714
715
716
717
718
719
720
	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
721
722

	wb_control_gui_focus_cur_sheet (wbcg);
723

724
725
	/* because we are updating it there is no need to apply it now */
	return FALSE;
Jody Goldberg's avatar
Jody Goldberg committed
726
727
728
}

static void
Jody Goldberg's avatar
Jody Goldberg committed
729
wbcg_auto_expr_value (WorkbookControl *wbc)
Jody Goldberg's avatar
Jody Goldberg committed
730
{
731
	WorkbookControlGUI *wbcg = WORKBOOK_CONTROL_GUI (wbc);
Jody Goldberg's avatar
Jody Goldberg committed
732
	WorkbookView *wbv = wb_control_view (wbc);
Jody Goldberg's avatar
Jody Goldberg committed
733

Jody Goldberg's avatar
Jody Goldberg committed
734
735
736
	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
737

738
	if (wbcg_ui_update_begin (wbcg)) {
739
740
741
		gtk_label_set_text(
			 GTK_LABEL (GTK_BIN (wbcg->auto_expr_label)->child),
			 wbv->auto_expr_value_as_string);
742
743
		wbcg_ui_update_end (wbcg);
	}
Jody Goldberg's avatar
Jody Goldberg committed
744
745
}

746
747
748
749
750
751
752
753
754
755
756
757
758
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));
}

759
760
761
762
763
764
static void
wbcg_undo_redo_truncate (WorkbookControl *wbc, int n, gboolean is_undo)
{
	gtk_combo_stack_truncate (ur_stack (wbc, is_undo), n);
}

765
766
767
768
769
770
771
772
773
774
775
776
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
777
#ifndef ENABLE_BONOBO
778
779
static void
change_menu_state (GtkWidget *menu_item, gboolean state)
Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
780
781
782
{
	g_return_if_fail (menu_item != NULL);

783
	gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), state);
Jody Goldberg's avatar
enable.    
Jody Goldberg committed
784
}
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804

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) {
805
		gtk_label_parse_uline (label, suffix);
806
807
808
809
810
811
812
813
814
815
		return;
	}

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

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

816
	gtk_label_parse_uline (label, text);
817
818
819
	gtk_widget_set_sensitive (menu_item, sensitive);
	g_free (text);
}
Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
820
#else
821
822
static void
change_menu_state (WorkbookControlGUI const *wbcg,
Jody Goldberg's avatar
enable.    
Jody Goldberg committed
823
824
		  char const *verb_path, gboolean state)
{
Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
825
826
	CORBA_Environment  ev;

Jody Goldberg's avatar
enable.    
Jody Goldberg committed
827
	g_return_if_fail (IS_WORKBOOK_CONTROL_GUI (wbcg));
Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
828
829
830

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

Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
835
static void
Jody Goldberg's avatar
enable.    
Jody Goldberg committed
836
837
838
change_menu_sensitivity (WorkbookControlGUI const *wbcg,
			 char const *verb_path, gboolean sensitive)
{
839
840
	CORBA_Environment  ev;

Jody Goldberg's avatar
enable.    
Jody Goldberg committed
841
	g_return_if_fail (IS_WORKBOOK_CONTROL_GUI (wbcg));
842
843
844
845

	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
846
	CORBA_exception_free (&ev);
Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
847
}
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863

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) {
864
		bonobo_ui_component_set_prop (wbcg->uic, verb_path, "label",
865
866
867
868
869
870
871
872
873
					      suffix, &ev);
	} else {
		if (suffix == NULL) {
			suffix = _("Nothing");
			sensitive = FALSE;
		}

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

874
		bonobo_ui_component_set_prop (wbcg->uic, verb_path,
875
876
877
878
879
880
881
					      "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
882
#endif
Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
883

Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
884
static void
885
wbcg_menu_state_update (WorkbookControl *wbc, Sheet const *sheet, int flags)
Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
886
887
{
	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
Morten Welinder's avatar
Morten Welinder committed
888

Almer S. Tigelaar's avatar
Almer S. Tigelaar committed
889
890
891
	g_return_if_fail (wbcg != NULL);

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

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

971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
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
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) */
	if (wbcg->toolbar_is_sensitive != sensitive)
		wbcg->toolbar_is_sensitive = sensitive;
	else
		return;

#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

}

1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
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
1026
1027
	change_menu_label (wbcg, "/commands/EditUndo", _("_Undo"), undo);
	change_menu_label (wbcg, "/commands/EditRedo", _("_Redo"), redo);
1028
1029
1030
#endif
}

1031
1032
1033
1034
static void
wbcg_menu_state_sheet_prefs (WorkbookControl *wbc, Sheet const *sheet)
{
 	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
Morten Welinder's avatar
Morten Welinder committed
1035

1036
1037
	if (!wbcg_ui_update_begin (wbcg))
		return;
1038
1039

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

1077
1078
1079
1080
static void
wbcg_menu_state_sheet_count (WorkbookControl *wbc)
{
 	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
1081
1082
1083
	int const sheet_count = g_list_length (wbcg->notebook->children);
	/* Should we anble commands requiring multiple sheets */
	gboolean const multi_sheet = (sheet_count > 1);
1084

1085
1086
	/* Scrollable if there are more than 3 tabs */
	gtk_notebook_set_scrollable (wbcg->notebook, sheet_count > 3);
Morten Welinder's avatar
Morten Welinder committed
1087

1088
#ifndef ENABLE_BONOBO
1089
1090
1091
	change_menu_sensitivity (wbcg->menu_item_sheet_remove, multi_sheet);
	change_menu_sensitivity (wbcg->menu_item_sheets_edit_reorder, multi_sheet);
	change_menu_sensitivity (wbcg->menu_item_sheets_format_reorder, multi_sheet);
1092
#else
1093
1094
	change_menu_sensitivity (wbcg, "/commands/SheetRemove", multi_sheet);
	change_menu_sensitivity (wbcg, "/commands/SheetReorder", multi_sheet);
1095
1096
1097
#endif
}

1098
1099
1100
1101
1102
1103
static void
wbcg_paste_from_selection (WorkbookControl *wbc, PasteTarget const *pt, guint32 time)
{
	x_request_clipboard ((WorkbookControlGUI *)wbc, pt, time);
}

1104
static gboolean
1105
wbcg_claim_selection (WorkbookControl *wbc)
1106
1107
{
	WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;