diff -urN --ignore-space-change gnumeric-1.0.8/src/gnumeric-canvas.c gnumeric-1.0.8-patched/src/gnumeric-canvas.c --- gnumeric-1.0.8/src/gnumeric-canvas.c Sat Dec 29 20:08:53 2001 +++ gnumeric-1.0.8-patched/src/gnumeric-canvas.c Thu Jun 20 14:35:07 2002 @@ -283,7 +283,8 @@ return TRUE; case GDK_F2: - wbcg_edit_start (wbcg, FALSE, FALSE); + if (!wbcg_edit_start (wbcg, FALSE, FALSE)) + return FALSE; /* attempt to edit failed */ /* fall down */ case GDK_BackSpace: @@ -303,7 +304,8 @@ if (event->length == 0) return FALSE; - wbcg_edit_start (wbcg, TRUE, TRUE); + if (!wbcg_edit_start (wbcg, TRUE, TRUE)) + return FALSE; /* attempt to edit failed */ } scg_rangesel_stop (gcanvas->simple.scg, FALSE); diff -urN --ignore-space-change gnumeric-1.0.8/src/sheet.c gnumeric-1.0.8-patched/src/sheet.c --- gnumeric-1.0.8/src/sheet.c Sat May 4 19:23:33 2002 +++ gnumeric-1.0.8-patched/src/sheet.c Thu Jun 20 14:35:37 2002 @@ -257,6 +257,7 @@ sheet->hide_grid = FALSE; sheet->hide_col_header = FALSE; sheet->hide_row_header = FALSE; + sheet->is_protected = FALSE; sheet->display_outlines = TRUE; sheet->outline_symbols_below = TRUE; sheet->outline_symbols_right = TRUE; diff -urN --ignore-space-change gnumeric-1.0.8/src/sheet.h gnumeric-1.0.8-patched/src/sheet.h --- gnumeric-1.0.8/src/sheet.h Sat May 4 19:23:33 2002 +++ gnumeric-1.0.8-patched/src/sheet.h Thu Jun 20 14:30:54 2002 @@ -63,6 +63,7 @@ gboolean hide_grid; gboolean hide_col_header; gboolean hide_row_header; + gboolean is_protected; gboolean display_outlines; gboolean outline_symbols_below; diff -urN --ignore-space-change gnumeric-1.0.8/src/workbook-control-gui.c gnumeric-1.0.8-patched/src/workbook-control-gui.c --- gnumeric-1.0.8/src/workbook-control-gui.c Sun Jun 2 02:08:32 2002 +++ gnumeric-1.0.8-patched/src/workbook-control-gui.c Thu Jun 20 14:38:08 2002 @@ -2452,11 +2452,13 @@ entry = GTK_ENTRY (wbcg_get_entry (wbcg)); txt = gtk_entry_get_text (entry); if (strncmp (txt, "=sum(", 5)) { - wbcg_edit_start (wbcg, TRUE, TRUE); + if (!wbcg_edit_start (wbcg, TRUE, TRUE)) + return; /* attempt to edit failed */ gtk_entry_set_text (entry, "=sum()"); gtk_entry_set_position (entry, 5); } else { - wbcg_edit_start (wbcg, FALSE, TRUE); + if (!wbcg_edit_start (wbcg, FALSE, TRUE)) + return; /* attempt to edit failed */ /* * FIXME : This is crap! @@ -3470,7 +3472,8 @@ WorkbookControlGUI *wbcg) { if (!wbcg->editing) - wbcg_edit_start (wbcg, FALSE, TRUE); + if (!wbcg_edit_start (wbcg, FALSE, TRUE)) + wb_control_gui_focus_cur_sheet (wbcg); return TRUE; } @@ -3509,11 +3512,13 @@ entry = GTK_ENTRY (wbcg_get_entry (wbcg)); txt = gtk_entry_get_text (entry); if (strncmp (txt, "=", 1)) { - wbcg_edit_start (wbcg, TRUE, TRUE); + if (!wbcg_edit_start (wbcg, TRUE, TRUE)) + return; /* attempt to edit failed */ gtk_entry_set_text (entry, "="); gtk_entry_set_position (entry, 1); } else { - wbcg_edit_start (wbcg, FALSE, TRUE); + if (!wbcg_edit_start (wbcg, FALSE, TRUE)) + return; /* attempt to edit failed */ /* FIXME : This is crap! * When the function druid is more complete use that. diff -urN --ignore-space-change gnumeric-1.0.8/src/workbook-edit.c gnumeric-1.0.8-patched/src/workbook-edit.c --- gnumeric-1.0.8/src/workbook-edit.c Tue Feb 19 16:05:43 2002 +++ gnumeric-1.0.8-patched/src/workbook-edit.c Thu Jun 20 14:49:45 2002 @@ -322,8 +322,12 @@ * editing: * 1) in-cell editing when you just start typing, and * 2) above sheet editing when you hit F2. + * + * Returns TRUE if we did indeed start editing. Returns FALSE if the + * cell-to-be-edited was locked. + * */ -void +gboolean wbcg_edit_start (WorkbookControlGUI *wbcg, gboolean blankp, gboolean cursorp) { @@ -335,14 +339,14 @@ int col, row; WorkbookView *wbv; - g_return_if_fail (IS_WORKBOOK_CONTROL_GUI (wbcg)); + g_return_val_if_fail (IS_WORKBOOK_CONTROL_GUI (wbcg), FALSE); if (wbcg->editing) - return; + return TRUE; /* Avoid recursion, and do not begin editing if a guru is up */ if (inside_editing || wbcg_edit_has_guru (wbcg)) - return; + return TRUE; inside_editing = TRUE; @@ -353,6 +357,24 @@ col = sheet->edit_pos.col; row = sheet->edit_pos.row; + /* don't edit a locked cell */ + /* TODO : extend this to disable edits that can not succeed + * like editing a single cell of an array. I think we have enough + * information if we look at the selection. + */ + if (wb_view_is_protected (wbv, TRUE) && + mstyle_get_content_locked (sheet_style_get (sheet, col, row))) { + char *pos = g_strdup_printf ( _("%s!%s is locked"), + sheet->name_quoted, cell_coord_name (col, row)); + gnumeric_error_invalid (COMMAND_CONTEXT (wbcg), pos, + wb_view_is_protected (wbv, FALSE) + ? _("Unprotect the workbook to enable editing.") + : _("Unprotect the sheet to enable editing.")); + inside_editing = FALSE; + g_free (pos); + return FALSE; + } + application_clipboard_unant (); workbook_edit_set_sensitive (wbcg, TRUE, FALSE); @@ -407,7 +429,7 @@ * If this assert fails, it means editing was not shut down * properly before */ - g_assert (wbcg->edit_line.signal_changed == -1); + g_return_val_if_fail (wbcg->edit_line.signal_changed == -1, TRUE); wbcg->edit_line.signal_changed = gtk_signal_connect ( GTK_OBJECT (wbcg_get_entry (wbcg)), "changed", GTK_SIGNAL_FUNC (entry_changed), wbcg); @@ -416,6 +438,7 @@ g_free (text); inside_editing = FALSE; + return TRUE; } GnumericExprEntry * diff -urN --ignore-space-change gnumeric-1.0.8/src/workbook-edit.h gnumeric-1.0.8-patched/src/workbook-edit.h --- gnumeric-1.0.8/src/workbook-edit.h Sun Nov 11 01:18:57 2001 +++ gnumeric-1.0.8-patched/src/workbook-edit.h Thu Jun 20 14:30:54 2002 @@ -8,7 +8,7 @@ void wbcg_edit_ctor (WorkbookControlGUI *wbcg); void wbcg_edit_dtor (WorkbookControlGUI *wbcg); gboolean wbcg_edit_finish (WorkbookControlGUI *wbcg, gboolean accept); -void wbcg_edit_start (WorkbookControlGUI *wbcg, +gboolean wbcg_edit_start (WorkbookControlGUI *wbcg, gboolean blankp, gboolean cursorp); void wbcg_edit_attach_guru (WorkbookControlGUI *wbcg, GtkWidget *guru); diff -urN --ignore-space-change gnumeric-1.0.8/src/workbook-view.c gnumeric-1.0.8-patched/src/workbook-view.c --- gnumeric-1.0.8/src/workbook-view.c Sun Jun 2 02:08:33 2002 +++ gnumeric-1.0.8-patched/src/workbook-view.c Thu Jun 20 14:42:32 2002 @@ -117,6 +117,15 @@ wb_control_sheet_add (control, new_sheet);); } +gboolean +wb_view_is_protected (WorkbookView *wbv, gboolean check_sheet) +{ + g_return_val_if_fail (IS_WORKBOOK_VIEW (wbv), FALSE); + + return wbv->is_protected || (check_sheet && + wbv->current_sheet != NULL && wbv->current_sheet->is_protected); +} + void wb_view_set_attribute_list (WorkbookView *wbv, GList *list) { diff -urN --ignore-space-change gnumeric-1.0.8/src/workbook-view.h gnumeric-1.0.8-patched/src/workbook-view.h --- gnumeric-1.0.8/src/workbook-view.h Thu Jan 31 04:11:27 2002 +++ gnumeric-1.0.8-patched/src/workbook-view.h Thu Jun 20 14:44:21 2002 @@ -18,6 +18,7 @@ gboolean show_vertical_scrollbar; gboolean show_notebook_tabs; gboolean do_auto_completion; + gboolean is_protected; /* Non-normative size information */ int preferred_width, preferred_height; @@ -57,6 +58,7 @@ Sheet *wb_view_cur_sheet (WorkbookView *wbv); void wb_view_sheet_focus (WorkbookView *wbv, Sheet *sheet); void wb_view_sheet_add (WorkbookView *wbv, Sheet *new_sheet); +gboolean wb_view_is_protected (WorkbookView *wbv, gboolean check_sheet); /* Manipulation */ GtkArg *wb_view_get_attributev (WorkbookView *wbv, guint *n_args);