[gnumeric] Paste: fix Excel-to-Gnumeric paste.
- From: Morten Welinder <mortenw src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnumeric] Paste: fix Excel-to-Gnumeric paste.
- Date: Fri, 16 Oct 2009 17:39:26 +0000 (UTC)
commit a08926dbc4ff2a83fd59ed21a78aba0f65c281bb
Author: Morten Welinder <terra gnome org>
Date: Fri Oct 16 13:39:02 2009 -0400
Paste: fix Excel-to-Gnumeric paste.
ChangeLog | 2 +
NEWS | 1 +
plugins/excel/ChangeLog | 5 +
plugins/excel/ms-excel-read.c | 231 ++++++++++++++++++++++-------------------
src/gui-clipboard.c | 15 ++-
5 files changed, 142 insertions(+), 112 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 80c9c5e..93b5d11 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,8 @@
* src/gui-clipboard.c: Support Biff8 via Citrix which yields a
different target name.
+ (table_cellregion_read): Use original area (from Excel) for paste.
+ Fixes #381732, #388531.
* src/gnm-so-line.c (gnm_so_line_prep_sax_parser): Read new
format.
diff --git a/NEWS b/NEWS
index 5de65fd..9f43003 100644
--- a/NEWS
+++ b/NEWS
@@ -19,6 +19,7 @@ Morten:
* Implement round arrow heads.
* Fix xls import and export of line styles.
* Save and read new arrow attributes in xml format.
+ * Fix Excel-to-Gnumeric paste problem. [#381732, #388531].
--------------------------------------------------------------------------
Gnumeric 1.9.14
diff --git a/plugins/excel/ChangeLog b/plugins/excel/ChangeLog
index 9e410ad..fbcc3b1 100644
--- a/plugins/excel/ChangeLog
+++ b/plugins/excel/ChangeLog
@@ -1,3 +1,8 @@
+2009-10-16 Morten Welinder <terra gnome org>
+
+ * ms-excel-read.c (excel_read_DIMENSIONS): Store dimensions for
+ clipboard use.
+
2009-10-15 Morten Welinder <terra gnome org>
* ms-excel-write.c (excel_write_line_v8): Fix handling of
diff --git a/plugins/excel/ms-excel-read.c b/plugins/excel/ms-excel-read.c
index 535ae29..b4831ef 100644
--- a/plugins/excel/ms-excel-read.c
+++ b/plugins/excel/ms-excel-read.c
@@ -395,7 +395,7 @@ ms_sheet_obj_anchor_to_pos (Sheet const * sheet, MsBiffVersion const ver,
d (0,
{
- fprintf (stderr,"anchored to %s\n", sheet->name_unquoted);
+ g_printerr ("anchored to %s\n", sheet->name_unquoted);
gsf_mem_dump (raw_anchor, 18);
});
@@ -412,13 +412,13 @@ ms_sheet_obj_anchor_to_pos (Sheet const * sheet, MsBiffVersion const ver,
int const nths = GSF_LE_GET_GUINT16 (raw_anchor + 2);
d (2, {
- fprintf (stderr,"%d/%d cell %s from ",
+ g_printerr ("%d/%d cell %s from ",
nths, (i & 1) ? 256 : 1024,
(i & 1) ? "widths" : "heights");
if (i & 1)
- fprintf (stderr,"row %d;\n", pos + 1);
+ g_printerr ("row %d;\n", pos + 1);
else
- fprintf (stderr,"col %s (%d);\n", col_name (pos), pos);
+ g_printerr ("col %s (%d);\n", col_name (pos), pos);
});
if (i & 1) { /* odds are rows */
@@ -713,7 +713,7 @@ ms_sheet_realize_obj (MSContainer *container, MSObj *obj)
break;
default:
- d (2, fprintf (stderr, "EXCEL: unhandled excel object of type %s (0x%x) id = %d.",
+ d (2, g_printerr ("EXCEL: unhandled excel object of type %s (0x%x) id = %d.",
obj->excel_type_name, obj->excel_type, obj->id););
return TRUE;
}
@@ -871,7 +871,7 @@ excel_sheet_new (GnmXLImporter *importer, char const *sheet_name, GnmSheetType t
? XLS_MaxRow_V8
: XLS_MaxRow_V7));
workbook_sheet_attach (importer->wb, sheet);
- d (1, fprintf (stderr,"Adding sheet '%s'\n", sheet_name););
+ d (1, g_printerr ("Adding sheet '%s'\n", sheet_name););
}
/* Flag a respan here in case nothing else does */
@@ -963,7 +963,7 @@ excel_read_string_header (guint8 const *data, guint32 maxlen,
*post_data_len += len_ext_rst;
len += 4;
- d (4, fprintf (stderr, "Extended string support unimplemented; "
+ d (4, g_printerr ("Extended string support unimplemented; "
"ignoring %u bytes\n", len_ext_rst););
}
@@ -1052,7 +1052,7 @@ excel_get_text (GnmXLImporter const *importer,
ans = excel_get_chars (importer, ptr, length, use_utf16);
d (4, {
- fprintf (stderr,"String len %d, byte length %d: %s %s %s:\n",
+ g_printerr ("String len %d, byte length %d: %s %s %s:\n",
length, *byte_length,
(use_utf16 ? "UTF16" : "1byte"),
((n_markup > 0) ? "has markup" :""),
@@ -1293,7 +1293,7 @@ excel_read_SST (BiffQuery *q, GnmXLImporter *importer)
XL_CHECK_CONDITION (q->length >= 8);
d (4, {
- fprintf (stderr, "SST total = %u, sst = %u\n",
+ g_printerr ("SST total = %u, sst = %u\n",
GSF_LE_GET_GUINT32 (q->data + 0),
GSF_LE_GET_GUINT32 (q->data + 4));
gsf_mem_dump (q->data, q->length);
@@ -1311,7 +1311,7 @@ excel_read_SST (BiffQuery *q, GnmXLImporter *importer)
break;
if (importer->sst[i].content == NULL)
- d (4, fprintf (stderr,"Blank string in table at 0x%x.\n", i););
+ d (4, g_printerr ("Blank string in table at 0x%x.\n", i););
#ifndef NO_DEBUG_EXCEL
else if (ms_excel_read_debug > 4)
puts (importer->sst[i].content->str);
@@ -1323,7 +1323,7 @@ static void
excel_read_EXSST (BiffQuery *q, GnmXLImporter *importer)
{
XL_CHECK_CONDITION (q->length >= 2);
- d (10, fprintf (stderr,"Bucketsize = %hu,\tnum buckets = %d\n",
+ d (10, g_printerr ("Bucketsize = %hu,\tnum buckets = %d\n",
GSF_LE_GET_GUINT16 (q->data), (q->length - 2) / 8););
}
@@ -1364,7 +1364,7 @@ ms_biff_bof_data_new (BiffQuery *q)
case BIFF_BOF_v4: ans->version = MS_BIFF_V4; break;
case BIFF_BOF_v8:
d (2, {
- fprintf (stderr,"Complicated BIFF version 0x%x\n",
+ g_printerr ("Complicated BIFF version 0x%x\n",
GSF_LE_GET_GUINT16 (q->non_decrypted_data));
gsf_mem_dump (q->non_decrypted_data, q->length);
});
@@ -1414,7 +1414,7 @@ ms_biff_bof_data_new (BiffQuery *q)
break;
}
/* Now store in the directory array: */
- d (2, fprintf (stderr,"BOF %x, %d == %d, %d\n", q->opcode, q->length,
+ d (2, g_printerr ("BOF %x, %d == %d, %d\n", q->opcode, q->length,
ans->version, ans->type););
} else {
g_printerr ("Not a BOF !\n");
@@ -1520,7 +1520,7 @@ excel_read_BOUNDSHEET (BiffQuery *q, GnmXLImporter *importer)
g_hash_table_insert (importer->boundsheet_data_by_stream,
GUINT_TO_POINTER (bs->streamStartPos), bs);
- d (1, fprintf (stderr,"Boundsheet: %d) '%s' %p, %d:%d\n", bs->index,
+ d (1, g_printerr ("Boundsheet: %d) '%s' %p, %d:%d\n", bs->index,
bs->name, bs->esheet, bs->type, bs->visibility););
}
@@ -1556,7 +1556,7 @@ excel_read_FORMAT (BiffQuery *q, GnmXLImporter *importer)
: excel_biff_text_1 (importer, q, 0);
}
- d (3, fprintf (stderr, "Format data: 0x%x == '%s'\n", d->idx, d->name););
+ d (3, g_printerr ("Format data: 0x%x == '%s'\n", d->idx, d->name););
g_hash_table_insert (importer->format_table, GUINT_TO_POINTER (d->idx), d);
}
@@ -1632,9 +1632,9 @@ excel_read_FONT (BiffQuery *q, GnmXLImporter *importer)
fd->index++;
g_hash_table_insert (importer->font_data, GINT_TO_POINTER (fd->index), fd);
- d (1, fprintf (stderr,"Insert font '%s' (%d) size %d pts color %d\n",
+ d (1, g_printerr ("Insert font '%s' (%d) size %d pts color %d\n",
fd->fontname, fd->index, fd->height / 20, fd->color_idx););
- d (3, fprintf (stderr,"Font color = 0x%x\n", fd->color_idx););
+ d (3, g_printerr ("Font color = 0x%x\n", fd->color_idx););
}
static void
@@ -1748,7 +1748,7 @@ excel_palette_get (GnmXLImporter *importer, gint idx)
* the grid color from WINDOW2.
*/
- d (4, fprintf (stderr,"Color Index %d\n", idx););
+ d (4, g_printerr ("Color Index %d\n", idx););
if (idx == 1 || idx == 65)
return style_color_white ();
@@ -1835,7 +1835,7 @@ excel_read_PALETTE (BiffQuery *q, GnmXLImporter *importer)
pal->blue = g_new (int, len);
pal->gnm_colors = g_new (GnmColor *, len);
- d (3, fprintf (stderr,"New palette with %d entries\n", len););
+ d (3, g_printerr ("New palette with %d entries\n", len););
for (lp = 0; lp < len; lp++) {
guint32 num = GSF_LE_GET_GUINT32 (q->data + 2 + lp * 4);
@@ -1845,7 +1845,7 @@ excel_read_PALETTE (BiffQuery *q, GnmXLImporter *importer)
pal->blue[lp] = (num & 0x00ff0000) >> 16;
pal->green[lp] = (num & 0x0000ff00) >> 8;
pal->red[lp] = (num & 0x000000ff) >> 0;
- d (5, fprintf (stderr,"Colour %d: 0x%8x (%x,%x,%x)\n", lp,
+ d (5, g_printerr ("Colour %d: 0x%8x (%x,%x,%x)\n", lp,
num, pal->red[lp], pal->green[lp], pal->blue[lp]););
pal->gnm_colors[lp] = NULL;
@@ -1988,7 +1988,7 @@ excel_get_style_from_xf (ExcelReadSheet *esheet, BiffXFData const *xf)
back_index = xf->pat_backgnd_col;
}
- d (4, fprintf (stderr,"back = %d, pat = %d, font = %d, pat_style = %d\n",
+ d (4, g_printerr ("back = %d, pat = %d, font = %d, pat_style = %d\n",
back_index, pattern_index, font_index, xf->fill_pattern_idx););
if (font_index == 127)
@@ -2025,7 +2025,7 @@ excel_get_style_from_xf (ExcelReadSheet *esheet, BiffXFData const *xf)
g_return_val_if_fail (back_color && pattern_color && font_color, NULL);
- d (4, fprintf (stderr,"back = #%02x%02x%02x, pat = #%02x%02x%02x, font = #%02x%02x%02x, pat_style = %d\n",
+ d (4, g_printerr ("back = #%02x%02x%02x, pat = #%02x%02x%02x, font = #%02x%02x%02x, pat_style = %d\n",
GO_COLOR_UINT_R (back_color->go_color),
GO_COLOR_UINT_G (back_color->go_color),
GO_COLOR_UINT_B (back_color->go_color),
@@ -2053,14 +2053,14 @@ excel_get_style_from_xf (ExcelReadSheet *esheet, BiffXFData const *xf)
case 64:
color = sheet_style_get_auto_pattern_color
(esheet->sheet);
- d (4, fprintf (stderr,"border with color_index=%d\n",
+ d (4, g_printerr ("border with color_index=%d\n",
color_index););
break;
case 65:
color = style_color_auto_back ();
/* We haven't seen this yet.
We know that 64 and 127 occur in the wild */
- d (4, fprintf (stderr,"border with color_index=%d\n",
+ d (4, g_printerr ("border with color_index=%d\n",
color_index););
break;
case 127:
@@ -2098,7 +2098,7 @@ excel_set_xf (ExcelReadSheet *esheet, BiffQuery *q)
XL_CHECK_CONDITION_VAL (row < gnm_sheet_get_max_rows (sheet), xf);
mstyle = excel_get_style_from_xf (esheet, xf);
- d (3, fprintf (stderr,"%s!%s%d = xf(0x%hx) = style (%p) [LEN = %u]\n", sheet->name_unquoted,
+ d (3, g_printerr ("%s!%s%d = xf(0x%hx) = style (%p) [LEN = %u]\n", sheet->name_unquoted,
col_name (col), row + 1, GSF_LE_GET_GUINT16 (q->data + 4), mstyle, q->length););
if (mstyle != NULL)
@@ -2125,9 +2125,9 @@ excel_set_xf_segment (ExcelReadSheet *esheet,
sheet_style_set_range (esheet->sheet, &range, mstyle);
d (3, {
- fprintf (stderr,"%s!", esheet->sheet->name_unquoted);
+ g_printerr ("%s!", esheet->sheet->name_unquoted);
range_dump (&range, "");
- fprintf (stderr, " = xf(%d)\n", xfidx);
+ g_printerr (" = xf(%d)\n", xfidx);
});
}
@@ -2478,7 +2478,7 @@ excel_read_XF (BiffQuery *q, GnmXLImporter *importer)
xf->pat_foregnd_col = (data & 0x007f);
xf->pat_backgnd_col = (data & 0x3f80) >> 7;
- d (2, fprintf (stderr,"Color f=0x%x b=0x%x pat=0x%x\n",
+ d (2, g_printerr ("Color f=0x%x b=0x%x pat=0x%x\n",
xf->pat_foregnd_col,
xf->pat_backgnd_col,
xf->fill_pattern_idx););
@@ -2494,7 +2494,7 @@ excel_read_XF (BiffQuery *q, GnmXLImporter *importer)
xf->fill_pattern_idx =
excel_map_pattern_index_from_excel (data & 0x3f);
- d (2, fprintf (stderr,"Color f=0x%x b=0x%x pat=0x%x\n",
+ d (2, g_printerr ("Color f=0x%x b=0x%x pat=0x%x\n",
xf->pat_foregnd_col,
xf->pat_backgnd_col,
xf->fill_pattern_idx););
@@ -2652,7 +2652,7 @@ excel_formula_shared (BiffQuery *q, ExcelReadSheet *esheet, GnmCell *cell)
sf->data_len = data_len;
sf->array_data_len = array_data_len;
- d (1, fprintf (stderr,"Shared formula, extent %s\n", range_as_string (&r)););
+ d (1, g_printerr ("Shared formula, extent %s\n", range_as_string (&r)););
g_hash_table_insert (esheet->shared_formulae, &sf->key, sf);
@@ -2700,7 +2700,7 @@ excel_read_FORMULA (BiffQuery *q, ExcelReadSheet *esheet)
* that would avoid the scary
* 'this file was calculated with a different version of XL'
* warning when exiting without changing. */
- d (1, fprintf (stderr,"Formula in %s!%s has recalc tag 0x%x;\n",
+ d (1, g_printerr ("Formula in %s!%s has recalc tag 0x%x;\n",
esheet->sheet->name_quoted, cell_name (cell),
GSF_LE_GET_GUINT32 (q->data + 16)););
@@ -2855,7 +2855,7 @@ excel_sheet_shared_formula (ExcelReadSheet const *esheet,
{
g_return_val_if_fail (esheet != NULL, NULL);
- d (5, fprintf (stderr,"FIND SHARED: %s\n", cellpos_as_string (key)););
+ d (5, g_printerr ("FIND SHARED: %s\n", cellpos_as_string (key)););
return g_hash_table_lookup (esheet->shared_formulae, key);
}
@@ -2866,7 +2866,7 @@ excel_sheet_data_table (ExcelReadSheet const *esheet,
{
g_return_val_if_fail (esheet != NULL, NULL);
- d (5, fprintf (stderr,"FIND DATA TABLE: %s\n", cellpos_as_string (key)););
+ d (5, g_printerr ("FIND DATA TABLE: %s\n", cellpos_as_string (key)););
return g_hash_table_lookup (esheet->tables, key);
}
@@ -2927,7 +2927,7 @@ excel_read_NOTE (BiffQuery *q, ExcelReadSheet *esheet)
g_warning ("unknown flag on NOTE record %hx", options);
author = excel_biff_text_2 (esheet->container.importer, q, 8);
- d (1, fprintf (stderr,"Comment at %s%d id %d options"
+ d (1, g_printerr ("Comment at %s%d id %d options"
" 0x%x hidden %d by '%s'\n",
col_name (pos.col), pos.row + 1,
obj_id, options, hidden, author););
@@ -2968,7 +2968,7 @@ excel_read_NOTE (BiffQuery *q, ExcelReadSheet *esheet)
}
g_string_append (comment, excel_biff_text (esheet->container.importer, q, 6, len));
- d (2, fprintf (stderr,"Comment in %s%d: '%s'\n",
+ d (2, g_printerr ("Comment in %s%d: '%s'\n",
col_name (pos.col), pos.row + 1, comment->str););
cell_set_comment (sheet, &pos, NULL, comment->str, NULL);
@@ -3441,7 +3441,7 @@ excel_read_EXTERNNAME (BiffQuery *q, MSContainer *container)
char *name = NULL;
d (2, {
- fprintf (stderr,"EXTERNNAME\n");
+ g_printerr ("EXTERNNAME\n");
gsf_mem_dump (q->data, q->length); });
/* use biff version to differentiate, not the record version because
@@ -3568,7 +3568,7 @@ excel_read_NAME (BiffQuery *q, GnmXLImporter *importer, ExcelReadSheet *esheet)
name_len = GSF_LE_GET_GUINT8 (q->data + 3);
d (2, {
- fprintf (stderr,"NAME\n");
+ g_printerr ("NAME\n");
gsf_mem_dump (q->data, q->length); });
if (ver >= MS_BIFF_V2) {
@@ -3872,7 +3872,7 @@ excel_read_ROW (BiffQuery *q, ExcelReadSheet *esheet)
xf = flags2 & 0xfff;
d (1, {
- fprintf (stderr,"Row %d height 0x%x, flags=0x%x 0x%x;\n", row + 1, height, flags, flags2);
+ g_printerr ("Row %d height 0x%x, flags=0x%x 0x%x;\n", row + 1, height, flags, flags2);
if (is_std_height)
fputs ("Is Std Height;\n", stderr);
if (flags2 & 0x1000)
@@ -3899,7 +3899,7 @@ excel_read_ROW (BiffQuery *q, ExcelReadSheet *esheet)
excel_set_xf_segment (esheet,
0, gnm_sheet_get_max_cols (esheet->sheet) - 1,
row, row, xf);
- d (1, fprintf (stderr,"row %d has flags 0x%x a default style %hd;\n",
+ d (1, g_printerr ("row %d has flags 0x%x a default style %hd;\n",
row + 1, flags, xf););
}
@@ -3943,7 +3943,7 @@ office 12 seems to add 8 bytes
"tab-foreground", text_color,
"tab-background", color,
NULL);
- d (1, fprintf (stderr,"%s tab colour = %08x\n",
+ d (1, g_printerr ("%s tab colour = %08x\n",
esheet->sheet->name_unquoted,
color->go_color););
@@ -3994,11 +3994,11 @@ excel_read_COLINFO (BiffQuery *q, ExcelReadSheet *esheet)
width = 4;
d (1, {
- fprintf (stderr,"Column Formatting %s!%s of width "
+ g_printerr ("Column Formatting %s!%s of width "
"%hu/256 characters (%f pts)\n",
esheet->sheet->name_quoted,
cols_name (firstcol, lastcol), charwidths, width);
- fprintf (stderr,"Options 0x%hx, default style %hu\n", options, xf);
+ g_printerr ("Options 0x%hx, default style %hu\n", options, xf);
});
/* NOTE: seems like this is inclusive firstcol, inclusive lastcol */
@@ -4131,7 +4131,7 @@ excel_read_IMDATA (BiffQuery *q, gboolean keep_image)
}
d (1, { /* WARNING KEEP THIS DEBUG THE SAME AS BELOW */
- fprintf (stderr,"Picture from %s in %s format\n",
+ g_printerr ("Picture from %s in %s format\n",
from_name, format_name);
file_name = g_strdup_printf ("imdata%d", count++);
@@ -4177,8 +4177,8 @@ excel_read_SELECTION (BiffQuery *q, ExcelReadSheet *esheet)
if (pane_number != esheet->active_pane)
return;
- d (5, fprintf (stderr,"Start selection in pane #%d\n", pane_number););
- d (5, fprintf (stderr,"Cursor: %s in Ref #%d\n", cellpos_as_string (&edit_pos),
+ d (5, g_printerr ("Start selection in pane #%d\n", pane_number););
+ d (5, g_printerr ("Cursor: %s in Ref #%d\n", cellpos_as_string (&edit_pos),
j););
g_return_if_fail (sv != NULL);
@@ -4187,7 +4187,7 @@ excel_read_SELECTION (BiffQuery *q, ExcelReadSheet *esheet)
for (i = 0; i++ < num_refs ; ) {
xls_read_range8 (&r, q->data + 9 + 6 * (++j % num_refs));
- d (5, fprintf (stderr,"Ref %d = %s\n", i-1, range_as_string (&r)););
+ d (5, g_printerr ("Ref %d = %s\n", i-1, range_as_string (&r)););
tmp = (i == num_refs) ? edit_pos : r.start;
sv_selection_add_full (sv,
@@ -4196,7 +4196,7 @@ excel_read_SELECTION (BiffQuery *q, ExcelReadSheet *esheet)
r.end.col, r.end.row);
}
- d (5, fprintf (stderr,"Done selection\n"););
+ d (5, g_printerr ("Done selection\n"););
}
static void
@@ -4218,11 +4218,11 @@ excel_read_DEF_ROW_HEIGHT (BiffQuery *q, ExcelReadSheet *esheet)
height_units = get_row_height_units (height);
d (2, {
- fprintf (stderr,"Default row height %3.3g;\n", height_units);
+ g_printerr ("Default row height %3.3g;\n", height_units);
if (flags & 0x04)
- fprintf (stderr," + extra space above;\n");
+ g_printerr (" + extra space above;\n");
if (flags & 0x08)
- fprintf (stderr," + extra space below;\n");
+ g_printerr (" + extra space below;\n");
});
sheet_row_set_default_size_pts (esheet->sheet, height_units);
@@ -4237,7 +4237,7 @@ excel_read_DEF_COL_WIDTH (BiffQuery *q, ExcelReadSheet *esheet)
XL_CHECK_CONDITION (q->length >= 2);
charwidths = GSF_LE_GET_GUINT16 (q->data);
- d (0, fprintf (stderr,"Default column width %hu characters\n", charwidths););
+ d (0, g_printerr ("Default column width %hu characters\n", charwidths););
/* According to the tooltip the default width is 8.43 character widths
* and 64 pixels wide (Arial 10) which appears to include margins, and
@@ -4259,11 +4259,11 @@ excel_read_GUTS (BiffQuery *q, ExcelReadSheet *esheet)
/* ignore the specification of how wide/tall the gutters are */
row_gut = GSF_LE_GET_GUINT16 (q->data + 4);
- d (2, fprintf (stderr, "row_gut = %d", row_gut););
+ d (2, g_printerr ("row_gut = %d", row_gut););
if (row_gut >= 1)
row_gut--;
col_gut = GSF_LE_GET_GUINT16 (q->data + 6);
- d (2, fprintf (stderr, "col_gut = %d", col_gut););
+ d (2, g_printerr ("col_gut = %d", col_gut););
if (col_gut >= 1)
col_gut--;
sheet_colrow_gutter (esheet->sheet, TRUE, col_gut);
@@ -4411,7 +4411,7 @@ excel_read_SETUP (BiffQuery *q, ExcelReadSheet *esheet)
if (0 == (flags & 0x4)) {
guint16 papersize = GSF_LE_GET_GUINT16 (q->data + 0);
- d (2, fprintf (stderr,"Paper size %hu\n", papersize););
+ d (2, g_printerr ("Paper size %hu\n", papersize););
if (papersize < G_N_ELEMENTS (paper_size_table)) {
guchar *paper_name = (guchar *)paper_size_table[papersize].gp_name;
@@ -4457,7 +4457,7 @@ excel_read_SETUP (BiffQuery *q, ExcelReadSheet *esheet)
GO_IN_TO_PT (gsf_le_get_double (q->data + 24)));
if (0 == (flags & 0x4))
pi->n_copies = GSF_LE_GET_GUINT16 (q->data + 32);
- d (2, fprintf (stderr,"resolution %hu vert. res. %hu\n",
+ d (2, g_printerr ("resolution %hu vert. res. %hu\n",
GSF_LE_GET_GUINT16 (q->data + 12),
GSF_LE_GET_GUINT16 (q->data + 14)););
}
@@ -4529,9 +4529,9 @@ excel_read_MULBLANK (BiffQuery *q, ExcelReadSheet *esheet)
row = XL_GETROW (q);
lastcol = GSF_LE_GET_GUINT16 (ptr);
d (0, {
- fprintf (stderr,"Cells in row %d are blank starting at col %s until col ",
+ g_printerr ("Cells in row %d are blank starting at col %s until col ",
row + 1, col_name (firstcol));
- fprintf (stderr,"%s;\n",
+ g_printerr ("%s;\n",
col_name (lastcol));
});
@@ -4548,9 +4548,9 @@ excel_read_MULBLANK (BiffQuery *q, ExcelReadSheet *esheet)
ptr -= 2;
xf_index = GSF_LE_GET_GUINT16 (ptr);
d (2, {
- fprintf (stderr," xf (%s) = 0x%x", col_name (i), xf_index);
+ g_printerr (" xf (%s) = 0x%x", col_name (i), xf_index);
if (i == firstcol)
- fprintf (stderr,"\n");
+ g_printerr ("\n");
});
if (prev_xf != xf_index) {
@@ -4563,7 +4563,7 @@ excel_read_MULBLANK (BiffQuery *q, ExcelReadSheet *esheet)
} while (--i >= firstcol);
excel_set_xf_segment (esheet, firstcol, range_end,
row, row, prev_xf);
- d (2, fprintf (stderr,"\n"););
+ d (2, g_printerr ("\n"););
}
void
@@ -4630,11 +4630,15 @@ excel_read_MERGECELLS (BiffQuery *q, ExcelReadSheet *esheet)
}
static void
-excel_read_DIMENSIONS (BiffQuery *q, GnmXLImporter *importer)
+excel_read_DIMENSIONS (BiffQuery *q, ExcelReadSheet *esheet)
{
GnmRange r;
+ const char *key = "DIMENSION";
- if (importer->ver >= MS_BIFF_V8) {
+ if (!esheet)
+ return;
+
+ if (esheet_ver (esheet) >= MS_BIFF_V8) {
XL_CHECK_CONDITION (q->length >= 12);
xls_read_range32 (&r, q->data);
} else {
@@ -4642,7 +4646,20 @@ excel_read_DIMENSIONS (BiffQuery *q, GnmXLImporter *importer)
xls_read_range16 (&r, q->data);
}
- d (1, fprintf (stderr,"Dimension = %s\n", range_as_string (&r)););
+ if (range_width (&r) <= 1 || range_height (&r) <= 1) {
+ g_object_set_data (G_OBJECT (esheet->sheet), key, NULL);
+ d (1, g_printerr ("Dimension = -\n"););
+ } else {
+ r.end.col--;
+ r.end.row--;
+ d (1, g_printerr ("Dimension = %s\n", range_as_string (&r)););
+
+ /* Hack: we need to get this information out to
+ table_cellregion_read */
+ g_object_set_data_full (G_OBJECT (esheet->sheet),
+ key, gnm_range_dup (&r),
+ g_free);
+ }
}
static MSContainer *
@@ -4822,7 +4839,7 @@ excel_read_WINDOW2 (BiffQuery *q, ExcelReadSheet *esheet, WorkbookView *wb_view)
left_col = GSF_LE_GET_GUINT16 (q->data + 4);
biff_pat_col = GSF_LE_GET_GUINT32 (q->data + 6);
- d (0, if (options & 0x0200) fprintf (stderr,"Sheet flag selected\n"););
+ d (0, if (options & 0x0200) g_printerr ("Sheet flag selected\n"););
if (options & 0x0400)
wb_view_sheet_focus (wb_view, esheet->sheet);
@@ -4830,7 +4847,7 @@ excel_read_WINDOW2 (BiffQuery *q, ExcelReadSheet *esheet, WorkbookView *wb_view)
d (2, {
guint16 const pageBreakZoom = GSF_LE_GET_GUINT16 (q->data + 10);
guint16 const normalZoom = GSF_LE_GET_GUINT16 (q->data + 12);
- fprintf (stderr,"%hx %hx\n", normalZoom, pageBreakZoom);
+ g_printerr ("%hx %hx\n", normalZoom, pageBreakZoom);
});
}
} else {
@@ -4864,7 +4881,7 @@ excel_read_WINDOW2 (BiffQuery *q, ExcelReadSheet *esheet, WorkbookView *wb_view)
b = (guint8) (biff_pat_col >> 16);
pattern_color = style_color_new_i8 (r, g, b);
}
- d (2, fprintf (stderr,"auto pattern color "
+ d (2, g_printerr ("auto pattern color "
"0x%08x\n",
pattern_color->go_color););
sheet_style_set_auto_pattern_color (
@@ -4913,7 +4930,7 @@ excel_read_CF (BiffQuery *q, ExcelReadSheet *esheet, GnmStyleConditions *sc)
d (1, {
gsf_mem_dump (q->data+6, 6);
- fprintf (stderr,"cond type = %d, op type = %d, flags = 0x%08x\n", (int)type, (int)op, flags);
+ g_printerr ("cond type = %d, op type = %d, flags = 0x%08x\n", (int)type, (int)op, flags);
});
switch (type) {
case 1 :
@@ -5108,7 +5125,7 @@ excel_read_CONDFMT (BiffQuery *q, ExcelReadSheet *esheet)
num_fmts = GSF_LE_GET_GUINT16 (q->data + 0);
num_areas = GSF_LE_GET_GUINT16 (q->data + 12);
- d (1, fprintf (stderr,"Num areas == %hu\n", num_areas););
+ d (1, g_printerr ("Num areas == %hu\n", num_areas););
#if 0
/* The bounding box or the region containing all conditional formats.
* It seems like this region is 0,0 -> 0xffff,0xffff when there are no
@@ -5191,21 +5208,21 @@ excel_read_DV (BiffQuery *q, ExcelReadSheet *esheet)
data += len + 2;
d (1, {
- fprintf (stderr,"Input Title : '%s'\n", input_title);
- fprintf (stderr,"Input Msg : '%s'\n", input_msg);
- fprintf (stderr,"Error Title : '%s'\n", error_title);
- fprintf (stderr,"Error Msg : '%s'\n", error_msg);
+ g_printerr ("Input Title : '%s'\n", input_title);
+ g_printerr ("Input Msg : '%s'\n", input_msg);
+ g_printerr ("Error Title : '%s'\n", error_title);
+ g_printerr ("Error Msg : '%s'\n", error_msg);
});
XL_CHECK_CONDITION (data+2 <= end);
expr1_len = GSF_LE_GET_GUINT16 (data);
- d (5, fprintf (stderr,"Unknown1 = %hx\n", GSF_LE_GET_GUINT16 (data+2)););
+ d (5, g_printerr ("Unknown1 = %hx\n", GSF_LE_GET_GUINT16 (data+2)););
expr1_dat = data + 4; /* TODO : What are the missing 2 bytes ? */
data += expr1_len + 4;
XL_CHECK_CONDITION (data+2 <= end);
expr2_len = GSF_LE_GET_GUINT16 (data);
- d (5, fprintf (stderr,"Unknown2 = %hx\n", GSF_LE_GET_GUINT16 (data+2)););
+ d (5, g_printerr ("Unknown2 = %hx\n", GSF_LE_GET_GUINT16 (data+2)););
expr2_dat = data + 4; /* TODO : What are the missing 2 bytes ? */
data += expr2_len + 4;
@@ -5283,7 +5300,7 @@ excel_read_DV (BiffQuery *q, ExcelReadSheet *esheet)
expr2_dat, expr2_len, 0 /* FIXME */,
TRUE, NULL);
- d (1, fprintf (stderr,"style = %d, type = %d, op = %d\n",
+ d (1, g_printerr ("style = %d, type = %d, op = %d\n",
style, type, op););
mstyle = gnm_style_new ();
@@ -5327,9 +5344,9 @@ excel_read_DVAL (BiffQuery *q, ExcelReadSheet *esheet)
drop_down_id = GSF_LE_GET_GUINT32 (q->data + 10);
dv_count = GSF_LE_GET_GUINT32 (q->data + 14);
- d (5, if (options & 0x1) fprintf (stderr,"DV input window is closed"););
- d (5, if (options & 0x2) fprintf (stderr,"DV input window is pinned"););
- d (5, if (options & 0x4) fprintf (stderr,"DV info has been cached ??"););
+ d (5, if (options & 0x1) g_printerr ("DV input window is closed"););
+ d (5, if (options & 0x2) g_printerr ("DV input window is pinned"););
+ d (5, if (options & 0x4) g_printerr ("DV info has been cached ??"););
for (i = 0 ; i < dv_count ; i++) {
guint16 next;
@@ -5433,7 +5450,7 @@ excel_read_HLINK (BiffQuery *q, ExcelReadSheet *esheet)
d (1, {
range_dump (&r, "");
- fprintf (stderr, " = hlink options(0x%04x)\n", options);
+ g_printerr (" = hlink options(0x%04x)\n", options);
});
if ((options & 0x14) == 0x14) { /* label */
@@ -5443,7 +5460,7 @@ excel_read_HLINK (BiffQuery *q, ExcelReadSheet *esheet)
XL_NEED_ITEMS (len, 2);
label = read_utf16_str (len, data);
data += len*2;
- d (1, fprintf (stderr, "label = %s\n", label););
+ d (1, g_printerr ("label = %s\n", label););
}
if (options & 0x80) { /* target_base */
@@ -5453,7 +5470,7 @@ excel_read_HLINK (BiffQuery *q, ExcelReadSheet *esheet)
XL_NEED_ITEMS (len, 2);
target_base = read_utf16_str (len, data);
data += len*2;
- d (1, fprintf (stderr, "target_base = %s\n", target_base););
+ d (1, g_printerr ("target_base = %s\n", target_base););
}
if (options & 0x8) { /* 'text mark' */
@@ -5464,7 +5481,7 @@ excel_read_HLINK (BiffQuery *q, ExcelReadSheet *esheet)
XL_NEED_ITEMS (len, 2);
mark = read_utf16_str (len, data);
data += len*2;
- d (1, fprintf (stderr, "mark = %s\n", mark););
+ d (1, g_printerr ("mark = %s\n", mark););
}
if ((options & 0x163) == 0x003 && !memcmp (data, url_guid, sizeof (url_guid))) {
@@ -5495,7 +5512,7 @@ excel_read_HLINK (BiffQuery *q, ExcelReadSheet *esheet)
XL_NEED_BYTES (6);
up = GSF_LE_GET_GUINT16 (data + 0);
len = GSF_LE_GET_GUINT32 (data + 2);
- d (1, fprintf (stderr,"# leading ../ %d len 0x%04x\n",
+ d (1, g_printerr ("# leading ../ %d len 0x%04x\n",
up, len););
data += 6;
@@ -5717,7 +5734,7 @@ excel_read_SCL (BiffQuery *q, Sheet *sheet)
ExcelExternSheetV8 const *
excel_externsheet_v8 (GnmXLImporter const *importer, guint16 i)
{
- d (2, fprintf (stderr, "externv8 %hd\n", i););
+ d (2, g_printerr ("externv8 %hd\n", i););
g_return_val_if_fail (importer->v8.externsheet != NULL, NULL);
@@ -5775,7 +5792,7 @@ excel_read_EXTERNSHEET_v8 (BiffQuery const *q, GnmXLImporter *importer)
num = GSF_LE_GET_GUINT16 (q->data);
XL_CHECK_CONDITION (q->length >= 2 + num * 6);
- d (2, fprintf (stderr,"ExternSheet (%d entries)\n", num););
+ d (2, g_printerr ("ExternSheet (%d entries)\n", num););
d (10, gsf_mem_dump (q->data, q->length););
importer->v8.externsheet = g_array_set_size (
@@ -5786,14 +5803,14 @@ excel_read_EXTERNSHEET_v8 (BiffQuery const *q, GnmXLImporter *importer)
first = GSF_LE_GET_GUINT16 (q->data + 2 + i * 6 + 2);
last = GSF_LE_GET_GUINT16 (q->data + 2 + i * 6 + 4);
- d (2, fprintf (stderr,"ExternSheet: sup = %hd First sheet 0x%x, Last sheet 0x%x\n",
+ d (2, g_printerr ("ExternSheet: sup = %hd First sheet 0x%x, Last sheet 0x%x\n",
sup_index, first, last););
v8 = &g_array_index(importer->v8.externsheet, ExcelExternSheetV8, i);
v8->supbook = sup_index;
v8->first = supbook_get_sheet (importer, sup_index, first);
v8->last = supbook_get_sheet (importer, sup_index, last);
- d (2, fprintf (stderr,"\tFirst sheet %p, Last sheet %p\n",
+ d (2, g_printerr ("\tFirst sheet %p, Last sheet %p\n",
v8->first, v8->last););
}
}
@@ -5807,7 +5824,7 @@ excel_externsheet_v7 (MSContainer const *container, gint16 idx)
{
GPtrArray const *externsheets;
- d (2, fprintf (stderr, "externv7 %hd\n", idx););
+ d (2, g_printerr ("externv7 %hd\n", idx););
externsheets = container->v7.externsheets;
g_return_val_if_fail (externsheets != NULL, NULL);
@@ -5828,7 +5845,7 @@ excel_read_EXTERNSHEET_v7 (BiffQuery const *q, MSContainer *container)
type = GSF_LE_GET_GUINT8 (q->data + 1);
d (1, {
- fprintf (stderr,"extern v7 %p\n", container);
+ g_printerr ("extern v7 %p\n", container);
gsf_mem_dump (q->data, q->length); });
switch (type) {
@@ -5961,7 +5978,7 @@ excel_read_LABEL (BiffQuery *q, ExcelReadSheet *esheet, gboolean has_markup)
txt = excel_get_text_fixme (esheet->container.importer, q->data + 8,
in_len, &str_len);
- d (0, fprintf (stderr,"%s in %s;\n",
+ d (0, g_printerr ("%s in %s;\n",
has_markup ? "formatted string" : "string",
cell_name (cell)););
@@ -6036,7 +6053,7 @@ excel_read_HEADER_FOOTER (GnmXLImporter const *importer,
else
str = excel_biff_text_1 (importer, q, 0);
- d (2, fprintf (stderr,"%s == '%s'\n", is_header ? "header" : "footer", str););
+ d (2, g_printerr ("%s == '%s'\n", is_header ? "header" : "footer", str););
r = xl_hf_strstr (str, 'R'); /* order is important */
c = xl_hf_strstr (str, 'C');
@@ -6223,7 +6240,7 @@ excel_read_sheet (BiffQuery *q, GnmXLImporter *importer,
g_return_val_if_fail (esheet->sheet != NULL, FALSE);
g_return_val_if_fail (esheet->sheet->print_info != NULL, FALSE);
- d (1, fprintf (stderr,"----------------- '%s' -------------\n",
+ d (1, g_printerr ("----------------- '%s' -------------\n",
esheet->sheet->name_unquoted););
if (ver <= MS_BIFF_V4) {
@@ -6243,11 +6260,11 @@ excel_read_sheet (BiffQuery *q, GnmXLImporter *importer,
for (; ms_biff_query_next (q) ;
go_io_value_progress_update (importer->context, q->streamPos)) {
- d (5, fprintf (stderr,"Opcode: 0x%x\n", q->opcode););
+ d (5, g_printerr ("Opcode: 0x%x\n", q->opcode););
switch (q->opcode) {
case BIFF_DIMENSIONS_v0: break; /* ignore ancient XL2 variant */
- case BIFF_DIMENSIONS_v2: excel_read_DIMENSIONS (q, importer); break;
+ case BIFF_DIMENSIONS_v2: excel_read_DIMENSIONS (q, esheet); break;
case BIFF_BLANK_v0:
case BIFF_BLANK_v2: excel_set_xf (esheet, q); break;
@@ -6296,7 +6313,7 @@ excel_read_sheet (BiffQuery *q, GnmXLImporter *importer,
case BIFF_PASSWORD:
if (q->length == 2) {
- d (2, fprintf (stderr,"sheet password '%hx'\n",
+ d (2, g_printerr ("sheet password '%hx'\n",
GSF_LE_GET_GUINT16 (q->data)););
}
break;
@@ -6513,7 +6530,7 @@ excel_read_SUPBOOK (BiffQuery *q, GnmXLImporter *importer)
numTabs = GSF_LE_GET_GUINT16 (q->data);
len = GSF_LE_GET_GUINT16 (q->data + 2);
- d (2, fprintf (stderr,"supbook %d has %d\n", importer->v8.supbook->len, numTabs););
+ d (2, g_printerr ("supbook %d has %d\n", importer->v8.supbook->len, numTabs););
i = importer->v8.supbook->len;
g_array_set_size (importer->v8.supbook, i+1);
@@ -6524,12 +6541,12 @@ excel_read_SUPBOOK (BiffQuery *q, GnmXLImporter *importer)
/* undocumented guess */
if (q->length == 4 && len == 0x0401) {
- d (2, fprintf (stderr,"\t is self referential\n"););
+ d (2, g_printerr ("\t is self referential\n"););
new_supbook->type = EXCEL_SUP_BOOK_SELFREF;
return;
}
if (q->length == 4 && len == 0x3A01) {
- d (2, fprintf (stderr,"\t is a plugin\n"););
+ d (2, g_printerr ("\t is a plugin\n"););
new_supbook->type = EXCEL_SUP_BOOK_PLUGIN;
return;
}
@@ -6550,13 +6567,13 @@ excel_read_SUPBOOK (BiffQuery *q, GnmXLImporter *importer)
#warning create a workbook and sheets when we have a facility for merging things
encodeType = GSF_LE_GET_GUINT8 (q->data + 5);
- d (1, fprintf (stderr,"Supporting workbook with %d Tabs\n", numTabs););
+ d (1, g_printerr ("Supporting workbook with %d Tabs\n", numTabs););
switch (encodeType) {
case 0x00:
- d (0, fprintf (stderr,"--> SUPBOOK VirtPath encoding = chEmpty"););
+ d (0, g_printerr ("--> SUPBOOK VirtPath encoding = chEmpty"););
break;
case 0x01:
- d (0, fprintf (stderr,"--> SUPBOOK VirtPath encoding = chEncode"););
+ d (0, g_printerr ("--> SUPBOOK VirtPath encoding = chEncode"););
break;
case 0x02: /* chSelf */
break;
@@ -6765,7 +6782,7 @@ excel_read_workbook (GOIOContext *context, WorkbookView *wb_view, GsfInput *inpu
problem_loading == NULL && /* there were no problems so far */
ms_biff_query_next (q)) { /* we can load the record */
- d (5, fprintf (stderr,"Opcode: 0x%x\n", q->opcode););
+ d (5, g_printerr ("Opcode: 0x%x\n", q->opcode););
switch (q->opcode) {
case BIFF_BOF_v0:
@@ -6777,7 +6794,7 @@ excel_read_workbook (GOIOContext *context, WorkbookView *wb_view, GsfInput *inpu
case BIFF_EOF:
prev_was_eof = TRUE;
- d (0, fprintf (stderr,"End of worksheet spec.\n"););
+ d (0, g_printerr ("End of worksheet spec.\n"););
break;
case BIFF_FONT_v0:
@@ -6867,7 +6884,7 @@ excel_read_workbook (GOIOContext *context, WorkbookView *wb_view, GsfInput *inpu
}
/* fall through */
case BIFF_DIMENSIONS_v2:
- excel_read_DIMENSIONS (q, importer);
+ excel_read_DIMENSIONS (q, NULL);
break;
case BIFF_OBJ: ms_read_OBJ (q, &importer->container, NULL); break;
@@ -6880,7 +6897,7 @@ excel_read_workbook (GOIOContext *context, WorkbookView *wb_view, GsfInput *inpu
break;
case BIFF_ADDMENU:
- d (1, fprintf (stderr,"%smenu with %d sub items",
+ d (1, g_printerr ("%smenu with %d sub items",
(GSF_LE_GET_GUINT8 (q->data + 6) == 1) ? "" : "Placeholder ",
GSF_LE_GET_GUINT8 (q->data + 5)););
break;
@@ -6893,7 +6910,7 @@ excel_read_workbook (GOIOContext *context, WorkbookView *wb_view, GsfInput *inpu
{
gboolean dsf = (q->length >= 2 &&
GSF_LE_GET_GUINT16 (q->data));
- d (0, fprintf (stderr, "Double stream file : %d\n",
+ d (0, g_printerr ("Double stream file : %d\n",
dsf););
if (dsf)
*is_double_stream_file = TRUE;
@@ -6932,7 +6949,7 @@ excel_read_workbook (GOIOContext *context, WorkbookView *wb_view, GsfInput *inpu
ms_biff_bof_data_destroy (ver);
go_io_progress_unset (context);
- d (1, fprintf (stderr,"finished read\n"););
+ d (1, g_printerr ("finished read\n"););
gnm_xl_importer_free (importer);
diff --git a/src/gui-clipboard.c b/src/gui-clipboard.c
index 28061d9..4529262 100644
--- a/src/gui-clipboard.c
+++ b/src/gui-clipboard.c
@@ -288,11 +288,16 @@ table_cellregion_read (WorkbookControl *wbc, char const *reader_id,
if (sheets) {
GnmRange r;
Sheet *tmpsheet = sheets->data;
-
- r.start.col = 0;
- r.start.row = 0;
- r.end.col = tmpsheet->cols.max_used;
- r.end.row = tmpsheet->rows.max_used;
+ GnmRange *rp = g_object_get_data (G_OBJECT (tmpsheet),
+ "DIMENSION");
+ if (rp) {
+ r = *rp;
+ } else {
+ r.start.col = 0;
+ r.start.row = 0;
+ r.end.col = tmpsheet->cols.max_used;
+ r.end.row = tmpsheet->rows.max_used;
+ }
ret = clipboard_copy_range (tmpsheet, &r);
}
g_slist_free (sheets);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]