147
156
wbcg_get_scg (WorkbookControlGUI *wbcg, Sheet *sheet)
151
161
if (sheet == NULL || wbcg->notebook == NULL)
154
164
g_return_val_if_fail (IS_SHEET (sheet), NULL);
165
g_return_val_if_fail (sheet->index_in_wb >= 0, NULL);
156
167
w = gtk_notebook_get_nth_page (wbcg->notebook, sheet->index_in_wb);
157
return g_object_get_data (G_OBJECT (w), SHEET_CONTROL_KEY);
169
SheetControlGUI *scg = g_object_get_data (G_OBJECT (w), SHEET_CONTROL_KEY);
170
if (scg_sheet (scg) == sheet)
175
* index_in_wb is probably not accurate because we are in the
176
* middle of removing or adding a sheet.
178
npages = gtk_notebook_get_n_pages (wbcg->notebook);
179
for (i = 0; i < npages; i++) {
180
GtkWidget *w = gtk_notebook_get_nth_page (wbcg->notebook, i);
181
SheetControlGUI *scg = g_object_get_data (G_OBJECT (w), SHEET_CONTROL_KEY);
182
if (scg_sheet (scg) == sheet)
186
g_warning ("Failed to find scg for sheet %s", sheet->name_quoted);
271
301
return wbcg->wb_control.editing;
275
305
wbcg_autosave_cancel (WorkbookControlGUI *wbcg)
277
g_return_if_fail (IS_WORKBOOK_CONTROL_GUI (wbcg));
279
307
if (wbcg->autosave_timer != 0) {
280
308
g_source_remove (wbcg->autosave_timer);
281
309
wbcg->autosave_timer = 0;
286
wbcg_autosave_set (WorkbookControlGUI *wbcg, int minutes, gboolean prompt)
288
g_return_if_fail (IS_WORKBOOK_CONTROL_GUI (wbcg));
290
wbcg_autosave_cancel (wbcg);
292
wbcg->autosave = (minutes != 0);
293
wbcg->autosave_minutes = minutes;
294
wbcg->autosave_prompt = prompt;
297
wbcg->autosave_timer = g_timeout_add (minutes * 60000,
298
(GSourceFunc) cb_autosave, wbcg);
314
wbcg_autosave_activate (WorkbookControlGUI *wbcg)
316
wbcg_autosave_cancel (wbcg);
318
if (wbcg->autosave_time > 0) {
319
int secs = MIN (wbcg->autosave_time, G_MAXINT / 1000);
320
wbcg->autosave_timer =
321
g_timeout_add (secs * 1000,
322
(GSourceFunc) cb_autosave,
328
wbcg_set_autosave_time (WorkbookControlGUI *wbcg, int secs)
330
if (secs == wbcg->autosave_time)
333
wbcg->autosave_time = secs;
334
wbcg_autosave_activate (wbcg);
300
337
/****************************************************************************/
972
1009
WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc;
973
1010
SheetControlGUI *scg = wbcg_get_scg (wbcg, sheet);
975
gtk_notebook_set_current_page (wbcg->notebook, sheet->index_in_wb);
1013
gtk_notebook_set_current_page (wbcg->notebook,
1014
sheet->index_in_wb);
976
1015
if (wbcg->rangesel == NULL)
977
1016
gnm_expr_entry_set_scg (wbcg->edit_line.entry, scg);
979
1018
disconnect_sheet_signals (wbcg, wbcg_cur_sheet (wbcg), TRUE);
981
wbcg_update_menu_feedback (wbcg, sheet);
1021
wbcg_update_menu_feedback (wbcg, sheet);
985
"signal::notify::display-formulas", cb_toggle_menu_item_changed, wbcg,
986
"signal::notify::display-zeros", cb_toggle_menu_item_changed, wbcg,
987
"signal::notify::display-grid", cb_toggle_menu_item_changed, wbcg,
988
"signal::notify::display-column-header", cb_toggle_menu_item_changed, wbcg,
989
"signal::notify::display-row-header", cb_toggle_menu_item_changed, wbcg,
990
"signal::notify::display-outlines", cb_toggle_menu_item_changed, wbcg,
991
"signal::notify::display-outlines-below", cb_toggle_menu_item_changed, wbcg,
992
"signal::notify::display-outlines-right", cb_toggle_menu_item_changed, wbcg,
993
"signal::notify::text-is-rtl", cb_direction_change, scg,
994
"signal::notify::zoom-factor", cb_zoom_change, wbcg,
1025
"signal::notify::display-formulas", cb_toggle_menu_item_changed, wbcg,
1026
"signal::notify::display-zeros", cb_toggle_menu_item_changed, wbcg,
1027
"signal::notify::display-grid", cb_toggle_menu_item_changed, wbcg,
1028
"signal::notify::display-column-header", cb_toggle_menu_item_changed, wbcg,
1029
"signal::notify::display-row-header", cb_toggle_menu_item_changed, wbcg,
1030
"signal::notify::display-outlines", cb_toggle_menu_item_changed, wbcg,
1031
"signal::notify::display-outlines-below", cb_toggle_menu_item_changed, wbcg,
1032
"signal::notify::display-outlines-right", cb_toggle_menu_item_changed, wbcg,
1033
"signal::notify::text-is-rtl", cb_direction_change, scg,
1034
"signal::notify::zoom-factor", cb_zoom_change, wbcg,
1062
wbcg_auto_expr_value (WorkbookControl *wbc)
1103
wbcg_auto_expr_text_changed (WorkbookView *wbv,
1104
G_GNUC_UNUSED GParamSpec *pspec,
1105
WorkbookControlGUI *wbcg)
1064
WorkbookControlGUI *wbcg = WORKBOOK_CONTROL_GUI (wbc);
1065
WorkbookView *wbv = wb_control_view (wbc);
1067
g_return_if_fail (wbcg != NULL);
1068
g_return_if_fail (wbv != NULL);
1069
g_return_if_fail (wbv->auto_expr_value_as_string != NULL);
1071
if (wbcg_ui_update_begin (wbcg)) {
1073
GTK_LABEL (wbcg->auto_expr_label),
1074
wbv->auto_expr_value_as_string);
1075
wbcg_ui_update_end (wbcg);
1107
gtk_label_set_text (GTK_LABEL (wbcg->auto_expr_label),
1108
wbv->auto_expr_text ? wbv->auto_expr_text : "");
1400
1436
WorkbookControlGUI *wbcg)
1402
1438
if (!wbcg_is_editing (wbcg))
1403
if (!wbcg_edit_start (wbcg, FALSE, TRUE))
1439
if (!wbcg_edit_start (wbcg, FALSE, TRUE)) {
1440
GtkEntry *entry = GTK_ENTRY (w);
1404
1441
wbcg_focus_cur_scg (wbcg);
1442
entry->in_drag = FALSE;
1444
* ->button is private, ugh. Since the text area
1445
* never gets a release event, there seems to be
1446
* no official way of returning the widget to its
1624
wbcg_set_property (GObject *object, guint property_id,
1625
const GValue *value, GParamSpec *pspec)
1627
WorkbookControlGUI *wbcg = (WorkbookControlGUI *)object;
1629
switch (property_id) {
1630
case PROP_AUTOSAVE_PROMPT:
1631
wbcg->autosave_prompt = g_value_get_boolean (value);
1633
case PROP_AUTOSAVE_TIME:
1634
wbcg_set_autosave_time (wbcg, g_value_get_int (value));
1637
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
1643
wbcg_get_property (GObject *object, guint property_id,
1644
GValue *value, GParamSpec *pspec)
1646
WorkbookControlGUI *wbcg = (WorkbookControlGUI *)object;
1648
switch (property_id) {
1649
case PROP_AUTOSAVE_PROMPT:
1650
g_value_set_boolean (value, wbcg->autosave_prompt);
1652
case PROP_AUTOSAVE_TIME:
1653
g_value_set_int (value, wbcg->autosave_time);
1656
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
1576
1662
static GObjectClass *parent_class;
1578
1664
wbcg_finalize (GObject *obj)
1622
(*parent_class->finalize) (obj);
1711
parent_class->finalize (obj);
1627
wbcg_scroll_wheel_support_cb (GtkWidget *ignored, GdkEventScroll *event,
1628
WorkbookControlGUI *wbcg)
1715
cb_scroll_wheel (GtkWidget *ignored, GdkEventScroll *event,
1716
WorkbookControlGUI *wbcg)
1630
1718
/* scroll always operates on pane 0 */
1631
1719
SheetControlGUI *scg = wbcg_cur_scg (wbcg);
1632
Sheet *sheet = sc_sheet (SHEET_CONTROL (scg));
1720
Sheet *sheet = scg_sheet (scg);
1633
1721
GnmCanvas *gcanvas = scg_pane (scg, 0);
1634
1722
gboolean go_horiz = (event->direction == GDK_SCROLL_LEFT ||
1635
1723
event->direction == GDK_SCROLL_RIGHT);
1860
1948
cb_auto_expr_changed (GtkWidget *item, WorkbookControlGUI *wbcg)
1950
const GnmFunc *func;
1952
WorkbookView *wbv = wb_control_view (WORKBOOK_CONTROL (wbcg));
1862
1954
if (wbcg->updating_ui)
1866
wb_control_view (WORKBOOK_CONTROL (wbcg)),
1867
g_object_get_data (G_OBJECT (item), "name"),
1868
g_object_get_data (G_OBJECT (item), "expr"));
1957
func = g_object_get_data (G_OBJECT (item), "func");
1958
descr = g_object_get_data (G_OBJECT (item), "descr");
1961
"auto-expr-func", func,
1962
"auto-expr-descr", descr,
1931
2026
item = gtk_menu_item_new_with_label (
1932
2027
_(quick_compute_routines [i].displayed_name));
1933
g_object_set_data (G_OBJECT (item), "expr", (gpointer)expr);
1934
g_object_set_data (G_OBJECT (item), "name",
2028
g_object_set_data (G_OBJECT (item),
2030
gnm_func_lookup (expr, NULL));
2031
g_object_set_data (G_OBJECT (item), "descr",
1935
2032
(gpointer)_(quick_compute_routines [i].displayed_name));
1936
2033
g_signal_connect (G_OBJECT (item),
2310
2411
g_signal_connect_after (w, "set_focus",
2311
2412
G_CALLBACK (cb_set_focus), wbcg);
2312
2413
g_signal_connect (w, "scroll-event",
2313
G_CALLBACK (wbcg_scroll_wheel_support_cb), wbcg);
2414
G_CALLBACK (cb_scroll_wheel), wbcg);
2314
2415
g_signal_connect (w, "realize",
2315
2416
G_CALLBACK (cb_realize), wbcg);
2397
2498
gtk_progress_bar_set_text (GTK_PROGRESS_BAR (wbcg->progress_bar), msg);
2400
#define DISCONNECT(field) \
2401
if (wbcg->field) { \
2402
g_signal_handler_disconnect (old_wb, wbcg->field); \
2501
#define DISCONNECT(obj,field) \
2502
if (wbcg->field) { \
2503
g_signal_handler_disconnect (obj, wbcg->field); \
2407
2508
wbcg_view_changed (WorkbookControlGUI *wbcg,
2408
2509
G_GNUC_UNUSED GParamSpec *pspec,
2510
WorkbookView *old_wbv)
2411
2512
WorkbookControl *wbc = WORKBOOK_CONTROL (wbcg);
2412
2513
Workbook *wb = wb_control_get_workbook (wbc);
2514
Workbook *old_wb = old_wbv ? wb_view_get_workbook (old_wbv) : NULL;
2515
WorkbookView *wbv = wb_control_view (wbc);
2414
2517
/* Reconnect self because we need to change data. */
2415
if (wbcg->sig_view_changed)
2416
g_signal_handler_disconnect (wbc, wbcg->sig_view_changed);
2518
DISCONNECT (wbc, sig_view_changed);
2417
2519
wbcg->sig_view_changed =
2418
2520
g_signal_connect_object
2419
2521
(G_OBJECT (wbc),
2420
2522
"notify::view",
2421
2523
G_CALLBACK (wbcg_view_changed),
2527
if (wbcg->sig_auto_expr_text)
2528
DISCONNECT (old_wbv, sig_auto_expr_text);
2529
wbcg->sig_auto_expr_text =
2530
g_signal_connect_object
2532
"notify::auto-expr-text",
2533
G_CALLBACK (wbcg_auto_expr_text_changed),
2536
wbcg_auto_expr_text_changed (wbv, NULL, wbcg);
2426
DISCONNECT (sig_sheet_order);
2427
DISCONNECT (sig_notify_uri);
2428
DISCONNECT (sig_notify_dirty);
2539
DISCONNECT (old_wb, sig_sheet_order);
2540
DISCONNECT (old_wb, sig_notify_uri);
2541
DISCONNECT (old_wb, sig_notify_dirty);
2636
workbook_control_gui_class_init (GObjectClass *object_class)
2748
workbook_control_gui_class_init (GObjectClass *gobject_class)
2638
2750
WorkbookControlClass *wbc_class =
2639
WORKBOOK_CONTROL_CLASS (object_class);
2751
WORKBOOK_CONTROL_CLASS (gobject_class);
2640
2752
WorkbookControlGUIClass *wbcg_class =
2641
WORKBOOK_CONTROL_GUI_CLASS (object_class);
2753
WORKBOOK_CONTROL_GUI_CLASS (gobject_class);
2643
2755
g_return_if_fail (wbc_class != NULL);
2645
parent_class = g_type_class_peek_parent (object_class);
2646
object_class->finalize = wbcg_finalize;
2757
parent_class = g_type_class_peek_parent (gobject_class);
2758
gobject_class->finalize = wbcg_finalize;
2759
gobject_class->get_property = wbcg_get_property;
2760
gobject_class->set_property = wbcg_set_property;
2762
g_object_class_install_property
2764
PROP_AUTOSAVE_PROMPT,
2765
g_param_spec_boolean ("autosave-prompt",
2766
_("Autosave prompt"),
2767
_("Ask about autosave?"),
2770
G_PARAM_READWRITE));
2771
g_object_class_install_property
2774
g_param_spec_int ("autosave-time",
2775
_("Autosave time in seconds"),
2776
_("Seconds before autosave"),
2779
G_PARAM_READWRITE));
2648
2781
wbc_class->edit_line_set = wbcg_edit_line_set;
2649
2782
wbc_class->selection_descr_set = wbcg_edit_selection_descr_set;
2650
wbc_class->auto_expr_value = wbcg_auto_expr_value;
2651
2783
wbc_class->update_action_sensitivity = wbcg_update_action_sensitivity;
2653
2785
wbc_class->sheet.add = wbcg_sheet_add;
2699
2831
wbcg->toggle_for_fullscreen = g_hash_table_new_full (
2700
2832
g_str_hash, g_str_equal, (GDestroyNotify)g_free, NULL);
2834
wbcg->autosave_prompt = FALSE;
2835
wbcg->autosave_time = 0;
2703
2836
wbcg->autosave_timer = 0;
2704
wbcg->autosave_minutes = 0;
2705
wbcg->autosave_prompt = FALSE;
2707
#warning why is this here ?
2838
#warning "why is this here ?"
2708
2839
wbcg->current_saver = NULL;