Index: plugins/excel/ms-excel-write.c =================================================================== RCS file: /cvs/gnome/gnumeric/plugins/excel/ms-excel-write.c,v retrieving revision 1.146 diff -u -p -r1.146 ms-excel-write.c --- plugins/excel/ms-excel-write.c 2002/02/19 06:22:57 1.146 +++ plugins/excel/ms-excel-write.c 2002/02/20 20:11:37 @@ -2044,7 +2044,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/cell-draw.c =================================================================== RCS file: /cvs/gnome/gnumeric/src/cell-draw.c,v retrieving revision 1.76 diff -u -p -r1.76 cell-draw.c --- src/cell-draw.c 2001/12/21 23:50:47 1.76 +++ src/cell-draw.c 2002/02/20 20:11:38 @@ -162,7 +162,8 @@ cell_split_text (GdkFont *font, char con void cell_draw (Cell const *cell, MStyle const *mstyle, GdkGC *gc, GdkDrawable *drawable, - int x1, int y1, int width, int height, int h_center) + int x1, int y1, int width, int height, int h_center, + gboolean is_workbook_protected) { StyleFont *style_font; GdkFont *font; @@ -259,6 +260,17 @@ cell_draw (Cell const *cell, MStyle cons fore = mstyle_get_color (mstyle, MSTYLE_COLOR_FORE); g_return_if_fail (fore != NULL); /* Be extra careful */ gdk_gc_set_foreground (gc, &fore->color); + /* grey out the color if the cell is locked */ + if (is_workbook_protected && mstyle_get_content_locked(mstyle)) { + StyleColor *back = mstyle_get_color (mstyle, MSTYLE_COLOR_BACK); + /* compute alpha blend of foreground and background colors. */ + StyleColor *alpha = style_color_new + (fore->red + (back->red - fore->red)/2, + fore->green + (back->green - fore->green)/2, + fore->blue + (back->blue - fore->blue)/2); + gdk_gc_set_foreground (gc, &alpha->color); + style_color_unref(alpha); + } /* Handle underlining and strikethrough */ switch (mstyle_get_font_uline (mstyle)) { Index: src/cell-draw.h =================================================================== RCS file: /cvs/gnome/gnumeric/src/cell-draw.h,v retrieving revision 1.12 diff -u -p -r1.12 cell-draw.h --- src/cell-draw.h 2001/12/21 23:50:47 1.12 +++ src/cell-draw.h 2002/02/20 20:11:38 @@ -6,6 +6,7 @@ void cell_draw (Cell const *cell, MStyle const *mstyle, GdkGC *gc, GdkDrawable *drawable, - int x, int y, int height, int width, int h_center); + int x, int y, int height, int width, int h_center, + gboolean is_workbook_protected); #endif /* GNUMERIC_CELL_DRAW_H */ 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/20 20:11:38 @@ -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/item-grid.c =================================================================== RCS file: /cvs/gnome/gnumeric/src/item-grid.c,v retrieving revision 1.282 diff -u -p -r1.282 item-grid.c --- src/item-grid.c 2002/02/15 05:51:07 1.282 +++ src/item-grid.c 2002/02/20 20:11:39 @@ -171,6 +171,8 @@ item_grid_draw_merged_range (GdkDrawable GdkGC *gc = ig->gc.empty; Sheet const *sheet = ((SheetControl *) ig->scg)->sheet; Cell const *cell = sheet_cell_get (sheet, range->start.col, range->start.row); + gboolean protected = + wb_control_view (sc_wbc ((SheetControl *) ig->scg))->protected; /* load style from corner which may not be visible */ MStyle const *style = sheet_style_get (sheet, range->start.col, range->start.row); @@ -226,7 +228,8 @@ item_grid_draw_merged_range (GdkDrawable cell_draw (cell, style, ig->gc.cell, drawable, l, t, r - l - (ci->margin_b + ci->margin_a + 1), - b - t - (ri->margin_b + ri->margin_a + 1), -1); + b - t - (ri->margin_b + ri->margin_a + 1), -1, + protected); } style_border_draw_diag (style, drawable, l, t, r, b); } @@ -270,6 +273,8 @@ item_grid_draw (GnomeCanvasItem *item, G Cell const * const edit_cell = gcanvas->simple.scg->wbcg->editing_cell; ItemGrid *ig = ITEM_GRID (item); ColRowInfo const *ri = NULL, *next_ri = NULL; + gboolean protected = + wb_control_view (sc_wbc ((SheetControl *) gcanvas->simple.scg))->protected; /* To ensure that far and near borders get drawn we pretend to draw +-2 * pixels around the target area which would include the surrounding @@ -520,7 +525,8 @@ item_grid_draw (GnomeCanvasItem *item, G if (!cell_is_blank (cell) && cell != edit_cell) cell_draw (cell, style, ig->gc.cell, drawable, - x, y, -1, -1, -1); + x, y, -1, -1, -1, + protected); /* Only draw spaning cells after all the backgrounds * that we are goign to draw have been drawn. No need @@ -566,7 +572,8 @@ item_grid_draw (GnomeCanvasItem *item, G cell_draw (cell, style, ig->gc.cell, drawable, - real_x, y, tmp_width, -1, center_offset); + real_x, y, tmp_width, -1, center_offset, + protected); } else if (col != span->left) sr.vertical [col] = NULL; Index: src/preview-grid.c =================================================================== RCS file: /cvs/gnome/gnumeric/src/preview-grid.c,v retrieving revision 1.28 diff -u -p -r1.28 preview-grid.c --- src/preview-grid.c 2002/02/16 07:15:52 1.28 +++ src/preview-grid.c 2002/02/20 20:11:39 @@ -522,7 +522,7 @@ preview_grid_draw (GnomeCanvasItem *item if (!cell_is_blank (cell)) cell_draw (cell, style, pg->gc.cell, drawable, - x, y, -1, -1, -1); + x, y, -1, -1, -1, FALSE); pg_destruct_cell (cell); x += colwidths [col]; Index: src/workbook-control-gui.c =================================================================== RCS file: /cvs/gnome/gnumeric/src/workbook-control-gui.c,v retrieving revision 1.234 diff -u -p -r1.234 workbook-control-gui.c --- src/workbook-control-gui.c 2002/02/18 05:40:39 1.234 +++ src/workbook-control-gui.c 2002/02/20 20:12:10 @@ -303,7 +303,7 @@ static void cb_prefs_update (gpointer key, gpointer value, gpointer user_data) { Sheet *sheet = value; - sheet_adjust_preferences (sheet, FALSE, FALSE); + sheet_adjust_preferences (sheet, TRUE, FALSE); } static void @@ -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. @@ -4377,6 +4381,27 @@ wbcg_validation_msg (WorkbookControl *wb } 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.")); + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + return; +} + +static void workbook_control_gui_ctor_class (GObjectClass *object_class) { WorkbookControlClass *wbc_class = WORKBOOK_CONTROL_CLASS (object_class); @@ -4425,6 +4450,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/20 20:12:10 @@ -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/20 20:12:10 @@ -173,6 +173,21 @@ wb_control_validation_msg (WorkbookContr return 1; /* no handler, always accept */ } +/** + * wb_control_locked_msg : notify user that this cell is locked. + */ +void +wb_control_locked_msg (WorkbookControl *wbc, Cell const *cell) +{ + WorkbookControlClass *wbc_class; + + g_return_if_fail (IS_WORKBOOK_CONTROL (wbc)); + + wbc_class = WBC_CLASS (wbc); + if (wbc_class != NULL && wbc_class->locked_msg != NULL) + wbc_class->locked_msg (wbc, cell); +} + WorkbookView * wb_control_view (WorkbookControl *wbc) { 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/20 20:12:10 @@ -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.79 diff -u -p -r1.79 workbook-edit.c --- src/workbook-edit.c 2002/02/19 15:09:58 1.79 +++ src/workbook-edit.c 2002/02/20 20:12:11 @@ -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/20 20:12:11 @@ -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/20 20:12:11 @@ -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/20 20:12:11 @@ -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.305 diff -u -p -r1.305 xml-io.c --- src/xml-io.c 2002/02/04 03:19:11 1.305 +++ src/xml-io.c 2002/02/20 20:12:13 @@ -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/20 20:12:15 @@ -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.203 diff -u -p -r1.203 dialog-cell-format.c --- src/dialogs/dialog-cell-format.c 2002/02/18 21:45:03 1.203 +++ src/dialogs/dialog-cell-format.c 2002/02/20 20:12:16 @@ -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.22 diff -u -p -r1.22 dialog-workbook-attr.c --- src/dialogs/dialog-workbook-attr.c 2002/02/15 05:51:50 1.22 +++ src/dialogs/dialog-workbook-attr.c 2002/02/20 20:12:16 @@ -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/20 20:12:17 @@ -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