[gnumeric] Fix column wdth and row height adjustments when entering in ranges. [#626789]
- From: Andreas J. Guelzow <guelzow src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnumeric] Fix column wdth and row height adjustments when entering in ranges. [#626789]
- Date: Fri, 13 Aug 2010 07:56:55 +0000 (UTC)
commit 23a92c7dd1a371d303a46426f51876c7cfaa0a8e
Author: Andreas J Guelzow <aguelzow pyrshep ca>
Date: Fri Aug 13 01:56:25 2010 -0600
Fix column wdth and row height adjustments when entering in ranges. [#626789]
2010-08-13 Andreas J. Guelzow <aguelzow pyrshep ca>
* src/commands.c (cmd_set_text_*): deleted
(cmd_set_text_full): new
(cmd_set_text): use cmd_set_text_full
(cmd_area_set_text): use cmd_set_text_full
ChangeLog | 7 +
NEWS | 2 +
src/commands.c | 346 ++++++++++++++++++++------------------------------------
3 files changed, 131 insertions(+), 224 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 19e543d..4cece8f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2010-08-13 Andreas J. Guelzow <aguelzow pyrshep ca>
+
+ * src/commands.c (cmd_set_text_*): deleted
+ (cmd_set_text_full): new
+ (cmd_set_text): use cmd_set_text_full
+ (cmd_area_set_text): use cmd_set_text_full
+
2010-08-12 Andreas J. Guelzow <aguelzow pyrshep ca>
* src/commands.c (cmd_area_set_text): use autocorrection
diff --git a/NEWS b/NEWS
index 2ff669f..c4a2733 100644
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,8 @@ Andreas:
* Import and export boxplots to and from ODF files. [#626653]
* Improve handling of corrupted ODF files. [#626654][#626655]
* Fix autocorrection when entering in ranges. [#626781]
+ * Fix column wdth and row height adjustments when entering in ranges.
+ [#626789]
Jean:
* Import Guppi graphs from gnumeric-1.0.x files. [#567953]
diff --git a/src/commands.c b/src/commands.c
index 021c2eb..ff2076d 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -735,263 +735,76 @@ command_undo_sheet_delete (Sheet* sheet)
/******************************************************************/
-#define CMD_SET_TEXT_TYPE (cmd_set_text_get_type ())
-#define CMD_SET_TEXT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), CMD_SET_TEXT_TYPE, CmdSetText))
-
-typedef struct {
- GnmCommand cmd;
-
- GnmEvalPos pos;
- gchar *text;
- PangoAttrList *markup;
- gboolean has_user_format, first_time;
- GnmCellRegion *old_contents;
- ColRowIndexList *columns, *rows;
- ColRowStateGroup *old_widths, *old_heights;
- gboolean first;
-} CmdSetText;
-
-static void
-cmd_set_text_repeat (GnmCommand const *cmd, WorkbookControl *wbc)
-{
- CmdSetText const *orig = (CmdSetText const *) cmd;
- SheetView *sv = wb_control_cur_sheet_view (wbc);
- cmd_set_text (wbc, sv_sheet (sv), &sv->edit_pos,
- orig->text, orig->markup);
-#warning validation from workbook-edit
-}
-MAKE_GNM_COMMAND (CmdSetText, cmd_set_text, cmd_set_text_repeat)
-
-static gboolean
-cmd_set_text_undo (GnmCommand *cmd, WorkbookControl *wbc)
-{
- CmdSetText *me = CMD_SET_TEXT (cmd);
- GnmRange r;
- GnmPasteTarget pt;
-
- r.start = r.end = me->pos.eval;
- clipboard_paste_region (me->old_contents,
- paste_target_init (&pt, me->cmd.sheet, &r, PASTE_CONTENTS | PASTE_FORMATS),
- GO_CMD_CONTEXT (wbc));
-
- if (me->old_widths) {
- colrow_restore_state_group (me->cmd.sheet, TRUE,
- me->columns,
- me->old_widths);
- colrow_state_group_destroy (me->old_widths);
- me->old_widths = NULL;
- colrow_index_list_destroy (me->columns);
- me->columns = NULL;
- }
-
- if (me->old_heights) {
- colrow_restore_state_group (me->cmd.sheet, FALSE,
- me->rows,
- me->old_heights);
- colrow_state_group_destroy (me->old_heights);
- me->old_heights = NULL;
- colrow_index_list_destroy (me->rows);
- me->rows = NULL;
- }
-
- select_range (me->cmd.sheet, &r, wbc);
-
- return FALSE;
-}
-
-static gboolean
-cmd_set_text_redo (GnmCommand *cmd, WorkbookControl *wbc)
-{
- CmdSetText *me = CMD_SET_TEXT (cmd);
- GnmRange r;
- GnmExprTop const *texpr;
- GnmCell *cell = sheet_cell_fetch (me->pos.sheet,
- me->pos.eval.col,
- me->pos.eval.row);
- sheet_cell_set_text (cell, me->text, me->markup);
- texpr = cell->base.texpr;
-
- if (!me->has_user_format && texpr) {
- GnmEvalPos ep;
- GOFormat *sf = auto_style_format_suggest
- (texpr,
- eval_pos_init_pos (&ep,
- me->cmd.sheet,
- &me->pos.eval));
- if (sf) {
- GnmStyle *new_style = gnm_style_new ();
- GnmRange r;
-
- gnm_style_set_format (new_style, sf);
- go_format_unref (sf);
- r.start = r.end = me->pos.eval;
- sheet_apply_style (me->cmd.sheet, &r, new_style);
- }
- }
-
- range_init_cellpos (&r, &me->pos.eval);
- if (texpr || !VALUE_IS_STRING (cell->value))
- colrow_autofit (me->cmd.sheet, &r, TRUE, TRUE,
- TRUE, FALSE,
- &me->columns, &me->old_widths);
- else
- colrow_autofit (me->cmd.sheet, &r, FALSE, FALSE,
- TRUE, FALSE,
- &me->rows, &me->old_heights);
-
- if (me->first)
- me->first = FALSE;
- else
- select_range (me->cmd.sheet, &r, wbc);
-
- return FALSE;
-}
-
-static void
-cmd_set_text_finalize (GObject *cmd)
-{
- CmdSetText *me = CMD_SET_TEXT (cmd);
- if (me->old_contents)
- cellregion_unref (me->old_contents);
- if (me->markup)
- pango_attr_list_unref (me->markup);
- g_free (me->text);
- colrow_index_list_destroy (me->columns);
- colrow_index_list_destroy (me->rows);
- colrow_state_group_destroy (me->old_widths);
- colrow_state_group_destroy (me->old_heights);
- gnm_command_finalize (cmd);
-}
-
-gboolean
-cmd_set_text (WorkbookControl *wbc,
- Sheet *sheet, GnmCellPos const *pos,
- char const *new_text,
- PangoAttrList *markup)
-{
- CmdSetText *me;
- gchar *corrected_text;
- GnmCell const *cell;
- char *where;
- GnmRange r;
- gboolean same_text = FALSE, same_markup = FALSE;
- GString *text;
-
- g_return_val_if_fail (IS_SHEET (sheet), TRUE);
- g_return_val_if_fail (new_text != NULL, TRUE);
-
- /* Ensure that we are not splitting up an array */
- cell = sheet_cell_get (sheet, pos->col, pos->row);
- if (gnm_cell_is_nonsingleton_array (cell)) {
- gnm_cmd_context_error_splits_array (GO_CMD_CONTEXT (wbc),
- _("Set Text"), NULL);
- return TRUE;
- }
-
- corrected_text = autocorrect_tool (new_text);
-
- if (go_pango_attr_list_is_empty (markup))
- markup = NULL;
-
- if (cell) {
- char *old_text = gnm_cell_get_entered_text (cell);
- same_text = strcmp (old_text, corrected_text) == 0;
- g_free (old_text);
-
- if (same_text && cell->value && VALUE_IS_STRING (cell->value)) {
- const GOFormat *fmt = VALUE_FMT (cell->value);
- if (fmt && go_format_is_markup (fmt)) {
- const PangoAttrList *old_markup =
- go_format_get_markup (fmt);
- same_markup = gnm_pango_attr_list_equal (old_markup, markup);
- }
- }
- }
-
- if (same_text && same_markup) {
- g_free (corrected_text);
- return TRUE;
- }
-
- me = g_object_new (CMD_SET_TEXT_TYPE, NULL);
-
- me->pos.sheet = sheet;
- me->pos.eval = *pos;
- me->text = corrected_text;
- if (NULL != (me->markup = markup))
- pango_attr_list_ref (me->markup);
- r.start = r.end = *pos;
- me->old_contents = clipboard_copy_range (sheet, &r);
- me->first = TRUE;
-
- text = gnm_cmd_trunc_descriptor (g_string_new (corrected_text), NULL);
-
- me->cmd.sheet = sheet;
- me->cmd.size = 1;
- where = undo_cell_pos_name (sheet, pos);
-
- me->cmd.cmd_descriptor =
- same_text
- ? g_strdup_printf (_("Editing style in %s"), where)
- : g_strdup_printf (_("Typing \"%s\" in %s"),
- text->str, where);
- g_free (where);
- g_string_free (text, TRUE);
-
- me->first_time = TRUE;
- me->has_user_format = !go_format_is_general (
- gnm_style_get_format (sheet_style_get (sheet, pos->col, pos->row)));
-
- return gnm_command_push_undo (wbc, G_OBJECT (me));
-}
-
-/******************************************************************/
-
-
/*
- * cmd_area_set_text
+ * cmd_set_text_full
*
* the caller is expected to have ensured:
*
* 1) that no array is being split
* 2) that the range is not locked.
*
+ * Note:
+ * We will free the selection but nothing else.
+ *
*/
-gboolean
-cmd_area_set_text (WorkbookControl *wbc, SheetView *sv,
+static gboolean
+cmd_set_text_full (WorkbookControl *wbc, GSList *selection, GnmEvalPos *ep,
char const *new_text, PangoAttrList *markup)
{
- GSList *selection = selection_get_ranges (sv, FALSE), *l;
- GnmParsePos pp;
+ GSList *l;
char const *expr_txt;
GnmExprTop const *texpr = NULL;
GOUndo *undo = NULL;
GOUndo *redo = NULL;
gboolean result;
char *text = NULL;
- Sheet *sheet = sv_sheet (sv);
char *name;
+ Sheet *sheet = ep->sheet;
+ GnmParsePos pp;
+ ColRowIndexList *cri_col_list = NULL, *cri_row_list = NULL;
g_return_val_if_fail (selection != NULL , TRUE);
+ /* We should check whether we are in fact changing anything: */
+
+/* if (cell) { */
+/* char *old_text = gnm_cell_get_entered_text (cell); */
+/* same_text = strcmp (old_text, corrected_text) == 0; */
+/* g_free (old_text); */
+
+/* if (same_text && cell->value && VALUE_IS_STRING (cell->value)) { */
+/* const GOFormat *fmt = VALUE_FMT (cell->value); */
+/* if (fmt && go_format_is_markup (fmt)) { */
+/* const PangoAttrList *old_markup = */
+/* go_format_get_markup (fmt); */
+/* same_markup = gnm_pango_attr_list_equal
+ (old_markup, markup); */
+/* } */
+/* } */
+/* } */
+
+/* if (same_text && same_markup) { */
+/* g_free (corrected_text); */
+/* return TRUE; */
+/* } */
+
+
+ parse_pos_init_evalpos (&pp, ep);
name = undo_range_list_name (sheet, selection);
- parse_pos_init_editpos (&pp, sv);
expr_txt = gnm_expr_char_start_p (new_text);
if (expr_txt != NULL)
texpr = gnm_expr_parse_str
(expr_txt, &pp, GNM_EXPR_PARSE_DEFAULT,
- sheet_get_conventions (pp.sheet), NULL);
+ sheet_get_conventions (sheet), NULL);
if (texpr != NULL) {
GOFormat *sf;
- GnmEvalPos ep;
GnmStyle *new_style = NULL;
text = g_strdup_printf (_("Inserting expression in %s"), name);
- sf = auto_style_format_suggest
- (texpr, eval_pos_init_editpos (&ep, sv));
+ sf = auto_style_format_suggest (texpr, ep);
if (sf != NULL) {
new_style = gnm_style_new ();
gnm_style_set_format (new_style, sf);
@@ -1055,6 +868,34 @@ cmd_area_set_text (WorkbookControl *wbc, SheetView *sv,
}
g_free (name);
+
+ for (l = selection; l != NULL; l = l->next) {
+ GnmRange *r = l->data;
+
+ cri_col_list = colrow_get_index_list
+ (r->start.col, r->end.col, cri_col_list);
+ cri_row_list = colrow_get_index_list
+ (r->start.row, r->end.row, cri_row_list);
+ }
+ undo = go_undo_combine (undo,
+ gnm_undo_colrow_restore_state_group_new
+ (sheet, TRUE,
+ colrow_index_list_copy (cri_col_list),
+ colrow_get_sizes (sheet, TRUE,
+ cri_col_list, -1)));
+ undo = go_undo_combine (undo,
+ gnm_undo_colrow_restore_state_group_new
+ (sheet, FALSE,
+ colrow_index_list_copy (cri_row_list),
+ colrow_get_sizes (sheet, FALSE,
+ cri_row_list, -1)));
+ redo = go_undo_combine (gnm_undo_colrow_set_sizes_new
+ (sheet, TRUE, cri_col_list, -1, NULL),
+ redo);
+ redo = go_undo_combine (gnm_undo_colrow_set_sizes_new
+ (sheet, FALSE, cri_row_list, -1, NULL),
+ redo);
+
result = cmd_generic (wbc, text, undo, redo);
g_free (text);
range_fragment_free (selection);
@@ -1062,6 +903,63 @@ cmd_area_set_text (WorkbookControl *wbc, SheetView *sv,
}
/*
+ * cmd_area_set_text
+ *
+ * the caller is expected to have ensured:
+ *
+ * 1) that no array is being split
+ * 2) that the range is not locked.
+ *
+ */
+
+gboolean
+cmd_area_set_text (WorkbookControl *wbc, SheetView *sv,
+ char const *new_text, PangoAttrList *markup)
+{
+ GnmEvalPos ep;
+ gboolean result;
+ GSList *selection = selection_get_ranges (sv, FALSE);
+
+ eval_pos_init_editpos (&ep, sv);
+ result = cmd_set_text_full (wbc, selection, &ep,
+ new_text, markup);
+ return result;
+}
+
+gboolean
+cmd_set_text (WorkbookControl *wbc,
+ Sheet *sheet, GnmCellPos const *pos,
+ char const *new_text,
+ PangoAttrList *markup)
+{
+ GnmCell const *cell;
+ GnmEvalPos ep;
+ gboolean result;
+ GSList *selection;
+ GnmRange *r;
+
+ g_return_val_if_fail (IS_SHEET (sheet), TRUE);
+ g_return_val_if_fail (new_text != NULL, TRUE);
+
+ /* Ensure that we are not splitting up an array */
+ cell = sheet_cell_get (sheet, pos->col, pos->row);
+ if (gnm_cell_is_nonsingleton_array (cell)) {
+ gnm_cmd_context_error_splits_array (GO_CMD_CONTEXT (wbc),
+ _("Set Text"), NULL);
+ return TRUE;
+ }
+
+ eval_pos_init_pos (&ep, sheet, pos);
+ r = g_new (GnmRange, 1);
+ r->start = r->end = *pos;
+ selection = g_slist_prepend (NULL, r);
+ result = cmd_set_text_full (wbc, selection, &ep,
+ new_text, markup);
+ return result;
+}
+
+
+/*
* cmd_area_set_array_expr
*
* the caller is expected to have ensured:
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]