Index: plugins/excel/ms-excel-write.c =================================================================== RCS file: /cvs/gnome/gnumeric/plugins/excel/ms-excel-write.c,v retrieving revision 1.150 diff -u -p -r1.150 ms-excel-write.c --- plugins/excel/ms-excel-write.c 2002/02/21 21:32:07 1.150 +++ plugins/excel/ms-excel-write.c 2002/02/23 07:41:27 @@ -2043,7 +2043,7 @@ log_xf_data (ExcelWorkbook *wb, BiffXFDa * See S59E1E.HTM * * All BIFF V7 features are implemented, except: - * - hidden and locked - not yet in gnumeric. + * - hidden - not yet in gnumeric. * * Apart from font, the style elements we retrieve do *not* need to be unrefed. **/ Index: src/gnumeric-canvas.c =================================================================== RCS file: /cvs/gnome/gnumeric/src/gnumeric-canvas.c,v retrieving revision 1.271 diff -u -p -r1.271 gnumeric-canvas.c --- src/gnumeric-canvas.c 2002/02/15 05:50:53 1.271 +++ src/gnumeric-canvas.c 2002/02/23 07:41:28 @@ -302,7 +302,8 @@ gnm_canvas_key_mode_sheet (GnumericCanva if (gnm_canvas_guru_key (wbcg, event)) break; - wbcg_edit_start (wbcg, FALSE, FALSE); + if (!wbcg_edit_start (wbcg, FALSE, FALSE)) + return FALSE; /* attempt to edit failed */ /* fall down */ case GDK_BackSpace: @@ -322,7 +323,8 @@ gnm_canvas_key_mode_sheet (GnumericCanva 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); Index: src/workbook-control-gui.c =================================================================== RCS file: /cvs/gnome/gnumeric/src/workbook-control-gui.c,v retrieving revision 1.237 diff -u -p -r1.237 workbook-control-gui.c --- src/workbook-control-gui.c 2002/02/21 21:04:07 1.237 +++ src/workbook-control-gui.c 2002/02/23 07:41:31 @@ -425,7 +425,7 @@ delete_sheet_if_possible (GtkWidget *ign message); g_free (message); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_NO); - response = gtk_dialog_run (GTK_DIALOG (dialog)); + response = gnumeric_dialog_run (scg->wbcg, GTK_DIALOG (dialog)); if (response == GTK_RESPONSE_YES) { workbook_sheet_delete (sc->sheet); workbook_recalc_all (wb); @@ -2427,11 +2427,13 @@ cb_autosum (GtkWidget *widget, WorkbookC 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! @@ -3422,7 +3424,7 @@ cb_editline_focus_in (GtkWidget *w, GdkE WorkbookControlGUI *wbcg) { if (!wbcg->editing) - wbcg_edit_start (wbcg, FALSE, TRUE); + return wbcg_edit_start (wbcg, FALSE, TRUE); return TRUE; } @@ -3461,11 +3463,13 @@ cb_autofunction (GtkWidget *widget, Work 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. @@ -4372,8 +4376,28 @@ wbcg_validation_msg (WorkbookControl *wb if (title) gtk_window_set_title (GTK_WINDOW (dialog), title); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_NO); - response = gtk_dialog_run (GTK_DIALOG (dialog)); - return (response != GTK_RESPONSE_NO) ? res1 : res0; + response = gnumeric_dialog_run (wbcg, GTK_DIALOG (dialog)); + return (response != GTK_RESPONSE_NO) ? res0 : res1; +} + +static void +wbcg_locked_msg (WorkbookControl *wbc, Cell const *cell) +{ + WorkbookControlGUI *wbcg = (WorkbookControlGUI *)wbc; + GtkWidget *dialog; + + dialog = gtk_message_dialog_new (wbcg_toplevel (wbcg), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, + _("Cell %s is locked.\n" + "You must unprotect this worksheet\n" + "(in the Format->Workbook->Protection dialog)\n" + "or unlock this cell (in Format->Cells->Protection)\n" + "before you can edit this value."), cell_name(cell)); + /* TODO : do we want the document name here too ? */ + gtk_window_set_title (GTK_WINDOW (dialog), _("Cell locked.")); + gnumeric_dialog_run (wbcg, GTK_DIALOG (dialog)); + return; } static void @@ -4425,6 +4449,7 @@ workbook_control_gui_ctor_class (GObject wbc_class->claim_selection = wbcg_claim_selection; wbc_class->paste_from_selection = wbcg_paste_from_selection; wbc_class->validation_msg = wbcg_validation_msg; + wbc_class->locked_msg = wbcg_locked_msg; } E_MAKE_TYPE(workbook_control_gui, "WorkbookControlGUI", WorkbookControlGUI, Index: src/workbook-control-priv.h =================================================================== RCS file: /cvs/gnome/gnumeric/src/workbook-control-priv.h,v retrieving revision 1.17 diff -u -p -r1.17 workbook-control-priv.h --- src/workbook-control-priv.h 2002/02/15 05:51:27 1.17 +++ src/workbook-control-priv.h 2002/02/23 07:41:31 @@ -54,6 +54,7 @@ typedef struct { PasteTarget const *pt, guint32 time); int (*validation_msg) (WorkbookControl *wbc, ValidationStyle v, char const *title, char const *msg); + void (*locked_msg) (WorkbookControl *wbc, Cell const *cell); } WorkbookControlClass; #define WORKBOOK_CONTROL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), WORKBOOK_CONTROL_TYPE, WorkbookControlClass)) Index: src/workbook-control.c =================================================================== RCS file: /cvs/gnome/gnumeric/src/workbook-control.c,v retrieving revision 1.40 diff -u -p -r1.40 workbook-control.c --- src/workbook-control.c 2002/02/16 07:15:53 1.40 +++ src/workbook-control.c 2002/02/23 07:41:31 @@ -101,6 +101,11 @@ WBC_VIRTUAL_FULL (undo_redo_labels, undo (WorkbookControl *wbc, char const *undo, char const *redo), (wbc, undo, redo)) +/* notify user that this cell is locked */ +WBC_VIRTUAL(locked_msg, + (WorkbookControl *wbc, Cell const *cell), + (wbc, cell)) + WBC_VIRTUAL_FULL (menu_state_sheet_prefs, menu_state.sheet_prefs, (WorkbookControl *wbc, Sheet const *sheet), (wbc, sheet)) WBC_VIRTUAL_FULL (menu_state_update, menu_state.update, Index: src/workbook-control.h =================================================================== RCS file: /cvs/gnome/gnumeric/src/workbook-control.h,v retrieving revision 1.26 diff -u -p -r1.26 workbook-control.h --- src/workbook-control.h 2002/02/15 05:51:28 1.26 +++ src/workbook-control.h 2002/02/23 07:41:31 @@ -44,6 +44,7 @@ void wb_control_undo_redo_labels (Wo char const *undo, char const *redo); int wb_control_validation_msg (WorkbookControl *wbc, ValidationStyle v, char const *title, char const *msg); +void wb_control_locked_msg (WorkbookControl *wbc, Cell const *cell); /* Menu state update flags, use them to specify which menu items to update */ enum { Index: src/workbook-edit.c =================================================================== RCS file: /cvs/gnome/gnumeric/src/workbook-edit.c,v retrieving revision 1.80 diff -u -p -r1.80 workbook-edit.c --- src/workbook-edit.c 2002/02/22 06:40:12 1.80 +++ src/workbook-edit.c 2002/02/23 07:41:31 @@ -311,8 +311,11 @@ entry_changed (GtkEntry *entry, void *da * 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) { @@ -324,14 +327,14 @@ wbcg_edit_start (WorkbookControlGUI *wbc 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; @@ -342,11 +345,19 @@ wbcg_edit_start (WorkbookControlGUI *wbc col = sheet->edit_pos.col; row = sheet->edit_pos.row; + cell = sheet_cell_get (sheet, col, row); + + /* don't edit a locked cell */ + if (wbv->protected && + mstyle_get_content_locked(cell_get_mstyle(cell))) { + inside_editing = FALSE; + wb_control_locked_msg(WORKBOOK_CONTROL (wbcg), cell); + return FALSE; + } + application_clipboard_unant (); workbook_edit_set_sensitive (wbcg, TRUE, FALSE); - cell = sheet_cell_get (sheet, col, row); - if (!blankp) { if (cell != NULL) text = cell_get_entered_text (cell); @@ -405,6 +416,7 @@ wbcg_edit_start (WorkbookControlGUI *wbc g_free (text); inside_editing = FALSE; + return TRUE; } GtkEntry * Index: src/workbook-edit.h =================================================================== RCS file: /cvs/gnome/gnumeric/src/workbook-edit.h,v retrieving revision 1.15 diff -u -p -r1.15 workbook-edit.h --- src/workbook-edit.h 2002/02/15 05:51:28 1.15 +++ src/workbook-edit.h 2002/02/23 07:41:31 @@ -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); Index: src/workbook-view.c =================================================================== RCS file: /cvs/gnome/gnumeric/src/workbook-view.c,v retrieving revision 1.82 diff -u -p -r1.82 workbook-view.c --- src/workbook-view.c 2002/02/15 05:51:28 1.82 +++ src/workbook-view.c 2002/02/18 21:28:58 @@ -47,14 +47,6 @@ #include #include -/* Persistent attribute ids, do not change them */ -enum { - ARG_VIEW_HSCROLLBAR = 1, - ARG_VIEW_VSCROLLBAR, - ARG_VIEW_TABS, - ARG_VIEW_DO_AUTO_COMPLETION, -}; - /* WorkbookView signals */ enum { LAST_SIGNAL @@ -131,6 +123,8 @@ wb_view_set_attribute (WorkbookView *wbv wbv->show_notebook_tabs = res; else if (!strcmp (name , "WorkbookView::do_auto_completion")) wbv->do_auto_completion = res; + else if (!strcmp (name , "WorkbookView::protected")) + wbv->protected = res; else g_warning ("WorkbookView unknown arg '%s'", name); } @@ -445,6 +439,7 @@ workbook_view_init (WorkbookView *wbv, W wbv->show_vertical_scrollbar = TRUE; wbv->show_notebook_tabs = TRUE; wbv->do_auto_completion = application_use_auto_complete (); + wbv->protected = FALSE; /* Set the default operation to be performed over selections */ wbv->auto_expr = NULL; Index: src/workbook-view.h =================================================================== RCS file: /cvs/gnome/gnumeric/src/workbook-view.h,v retrieving revision 1.29 diff -u -p -r1.29 workbook-view.h --- src/workbook-view.h 2002/02/15 05:51:29 1.29 +++ src/workbook-view.h 2002/02/18 21:28:58 @@ -18,6 +18,7 @@ struct _WorkbookView { gboolean show_vertical_scrollbar; gboolean show_notebook_tabs; gboolean do_auto_completion; + gboolean protected; /* Non-normative size information */ int preferred_width, preferred_height; Index: src/xml-io.c =================================================================== RCS file: /cvs/gnome/gnumeric/src/xml-io.c,v retrieving revision 1.306 diff -u -p -r1.306 xml-io.c --- src/xml-io.c 2002/02/20 20:21:00 1.306 +++ src/xml-io.c 2002/02/23 07:19:00 @@ -864,6 +864,8 @@ xml_write_wbv_attributes (XmlParseContex wbv->show_notebook_tabs ? "TRUE" : "FALSE"); xml_write_attribute (attributes, "WorkbookView::do_auto_completion", wbv->do_auto_completion ? "TRUE" : "FALSE"); + xml_write_attribute (attributes, "WorkbookView::protected", + wbv->protected ? "TRUE" : "FALSE"); return attributes; } Index: src/dialogs/cell-format.glade =================================================================== RCS file: /cvs/gnome/gnumeric/src/dialogs/cell-format.glade,v retrieving revision 1.53 diff -u -p -r1.53 cell-format.glade --- src/dialogs/cell-format.glade 2002/02/17 17:36:53 1.53 +++ src/dialogs/cell-format.glade 2002/02/23 07:41:33 @@ -3288,7 +3288,7 @@ - no + yes yes Worksheet _protected no Index: src/dialogs/dialog-cell-format.c =================================================================== RCS file: /cvs/gnome/gnumeric/src/dialogs/dialog-cell-format.c,v retrieving revision 1.206 diff -u -p -r1.206 dialog-cell-format.c --- src/dialogs/dialog-cell-format.c 2002/02/22 06:40:13 1.206 +++ src/dialogs/dialog-cell-format.c 2002/02/23 07:41:34 @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -159,7 +160,10 @@ typedef struct _FormatState PatternPicker pattern; } back; struct { - GtkCheckButton *hidden, *locked; + GtkCheckButton *hidden, *locked, *sheet_protected; + + gboolean sheet_protected_changed; + gboolean sheet_protected_value; } protection; struct { GtkTable *criteria_table; @@ -1972,6 +1976,17 @@ cb_protection_hidden_toggle (GtkToggleBu } static void +cb_protection_sheet_protected_toggle (GtkToggleButton *button, FormatState *state) +{ + if (state->enable_edit) { + state->protection.sheet_protected_value = + gtk_toggle_button_get_active (button); + state->protection.sheet_protected_changed = TRUE; + fmt_dialog_changed (state); + } +} + +static void fmt_dialog_init_protection_page (FormatState *state) { GtkWidget *w; @@ -1994,6 +2009,15 @@ fmt_dialog_init_protection_page (FormatS g_signal_connect (GTK_OBJECT (w), "toggled", G_CALLBACK (cb_protection_hidden_toggle), state); + + state->protection.sheet_protected_changed = FALSE; + flag = wb_control_view (WORKBOOK_CONTROL (state->wbcg))->protected; + w = glade_xml_get_widget (state->gui, "protection_sheet_protected"); + state->protection.sheet_protected = GTK_CHECK_BUTTON (w); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), flag); + gtk_signal_connect (GTK_OBJECT (w), + "toggled", GTK_SIGNAL_FUNC (cb_protection_sheet_protected_toggle), + state); } /*****************************************************************************/ @@ -2319,6 +2351,11 @@ cb_fmt_dialog_dialog_buttons (GtkWidget if (state->validation.changed) validation_rebuild_validation (state); + if (state->protection.sheet_protected_changed) { + wb_control_view (WORKBOOK_CONTROL (state->wbcg))->protected = + state->protection.sheet_protected_value; + state->protection.sheet_protected_changed = FALSE; + } mstyle_ref (state->result); Index: src/dialogs/dialog-workbook-attr.c =================================================================== RCS file: /cvs/gnome/gnumeric/src/dialogs/dialog-workbook-attr.c,v retrieving revision 1.23 diff -u -p -r1.23 dialog-workbook-attr.c --- src/dialogs/dialog-workbook-attr.c 2002/02/22 06:40:13 1.23 +++ src/dialogs/dialog-workbook-attr.c 2002/02/23 07:41:34 @@ -47,6 +47,7 @@ typedef struct _AttrState GtkToggleButton *show_vsb; GtkToggleButton *show_tabs; GtkToggleButton *autocomplete; + GtkToggleButton *protected; } view; } AttrState; @@ -94,6 +95,8 @@ cb_attr_dialog_dialog_apply (GtkObject * gtk_toggle_button_get_active (state->view.show_tabs); state->wbv->do_auto_completion = gtk_toggle_button_get_active (state->view.autocomplete); + state->wbv->protected = + gtk_toggle_button_get_active (state->view.protected); wb_view_prefs_update (state->wbv); } @@ -147,6 +150,9 @@ attr_dialog_init_view_page (AttrState *s state->view.autocomplete = attr_dialog_init_toggle (state, "WorkbookView::do_auto_completion", state->wbv->do_auto_completion); + state->view.protected = attr_dialog_init_toggle (state, + "WorkbookView::workbook_protected", + state->wbv->protected); } /*****************************************************************************/ Index: src/dialogs/workbook-attr.glade =================================================================== RCS file: /cvs/gnome/gnumeric/src/dialogs/workbook-attr.glade,v retrieving revision 1.10 diff -u -p -r1.10 workbook-attr.glade --- src/dialogs/workbook-attr.glade 2002/01/23 08:44:25 1.10 +++ src/dialogs/workbook-attr.glade 2002/02/23 07:41:34 @@ -135,6 +135,55 @@ tab + + + + 4 + no + 0 + 0 + 1 + 2 + yes + + + + yes + Workbook _Protected + no + yes + yes + yes + + + 0 + 2 + 0 + 1 + 0 + 0 + fill + + + + + + + + + Protection + GTK_JUSTIFY_CENTER + no + 0.5 + 0.5 + 0 + 0 + yes + + + tab + + 0