[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
[patch] Locking cells in gnumeric, backport to 1.0.8
- From: Floris Kraak <floris snow nl>
- To: gnumeric-list gnome org
- Subject: [patch] Locking cells in gnumeric, backport to 1.0.8
- Date: Thu, 20 Jun 2002 14:54:11 +0200
Hi,
I've made a patch to partially port support for locked cells back
to the 1.0.x branch. It doesn't deal with cell ranges or analysis tools,
just the single-cell edit case.
Note this is not useful until it's possible to toggle workbook
protection from the GUI and possibly import this property
from excel spreadsheets (or is it in there already?)
Regards,
Floris Kraak
--
A thorough software professional is one who when his wife yells at him
"goto hell", worries more about the goto.
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);
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]