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
23
24
25
26
27
28
29
30
31
 *
 * 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 <stdio.h>
82
#include <errno.h>
83

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

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

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

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

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

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

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

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

	g_return_val_if_fail (scg != NULL, NULL);

160
	scg_take_focus (scg);
161

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	if (r != 0)
		return;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	return FALSE;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	g_return_if_fail (i >= 0);

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

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

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

	g_return_if_fail (IS_SHEET (sheet));

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

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

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

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

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

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

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

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

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

	wb_control_gui_focus_cur_sheet (wbcg);
724

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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
1016
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

}

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

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

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

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

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

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

1089
#ifndef ENABLE_BONOBO
1090
1091
1092
	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);
1093
#else
1094
1095
	change_menu_sensitivity (wbcg, "/commands/SheetRemove", multi_sheet);
	change_menu_sensitivity (wbcg, "/commands/SheetReorder", multi_sheet);
1096
1097
1098
#endif
}

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

1105
static gboolean