[gnumeric] xls: attempt to write rectangles and ovals.
- From: Morten Welinder <mortenw src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnumeric] xls: attempt to write rectangles and ovals.
- Date: Mon, 5 Oct 2009 00:35:19 +0000 (UTC)
commit ba77c2998e09236fd5a769bcbe5c309ccdaf0001
Author: Morten Welinder <terra gnome org>
Date: Sun Oct 4 20:34:36 2009 -0400
xls: attempt to write rectangles and ovals.
plugins/excel/ChangeLog | 3 ++
plugins/excel/ms-escher.c | 9 +++++--
plugins/excel/ms-escher.h | 2 +-
plugins/excel/ms-excel-write.c | 41 ++++++++++++++++++++++++++++-----------
4 files changed, 39 insertions(+), 16 deletions(-)
---
diff --git a/plugins/excel/ChangeLog b/plugins/excel/ChangeLog
index d3ddc1f..1bea120 100644
--- a/plugins/excel/ChangeLog
+++ b/plugins/excel/ChangeLog
@@ -1,5 +1,8 @@
2009-10-04 Morten Welinder <terra gnome org>
+ * ms-excel-write.c (excel_write_textbox_v8): Attempt to handle
+ rectangles and ovals.
+
* ms-escher.c (ms_escher_get_inst, ms_escher_set_inst,
ms_escher_spcontainer_start, ms_escher_spcontainer_end,
ms_escher_sp, ms_escher_opt_start, ms_escher_opt_end,
diff --git a/plugins/excel/ms-escher.c b/plugins/excel/ms-escher.c
index 704a0d2..04ce555 100644
--- a/plugins/excel/ms-escher.c
+++ b/plugins/excel/ms-escher.c
@@ -664,7 +664,7 @@ ms_escher_read_Sp (MSEscherState *state, MSEscherHeader *h)
spid = GSF_LE_GET_GUINT32 (data+0);
flags = GSF_LE_GET_GUINT32 (data+4);
- d (0, printf ("SPID %d, Type %d,%s%s%s%s%s%s%s%s%s%s%s;\n",
+ d (0, printf ("SPID %d, Type %d,%s%s%s%s%s%s%s%s%s%s%s%s;\n",
spid, h->instance,
(flags&0x01) ? " Group": "",
(flags&0x02) ? " Child": "",
@@ -676,7 +676,8 @@ ms_escher_read_Sp (MSEscherState *state, MSEscherHeader *h)
(flags&0x80) ? " FlipV": "",
(flags&0x100) ? " Connector":"",
(flags&0x200) ? " HasAnchor": "",
- (flags&0x400) ? " TypeProp": ""
+ (flags&0x400) ? " HasBackground": "",
+ (flags&0x800) ? " HasSpt": ""
););
if (flags & 0x40)
@@ -2214,8 +2215,9 @@ ms_escher_spcontainer_end (GString *buf, gsize marker)
}
void
-ms_escher_sp (GString *buf, guint32 spid, guint32 flags)
+ms_escher_sp (GString *buf, guint32 spid, guint16 shape, guint32 flags)
{
+ gsize marker = buf->len;
guint8 tmp[16] = {
0xa2, 0xc, 0xa, 0xf0, 0xde, 0xad, 0xbe, 0xef,
0, 0, 0, 0, 0, 0, 0, 0
@@ -2224,6 +2226,7 @@ ms_escher_sp (GString *buf, guint32 spid, guint32 flags)
GSF_LE_SET_GUINT32 (tmp + 8, spid);
GSF_LE_SET_GUINT32 (tmp + 12, flags);
g_string_append_len (buf, tmp, sizeof tmp);
+ ms_escher_set_inst (buf, marker, shape);
}
gsize
diff --git a/plugins/excel/ms-escher.h b/plugins/excel/ms-escher.h
index c7d938f..9c87655 100644
--- a/plugins/excel/ms-escher.h
+++ b/plugins/excel/ms-escher.h
@@ -37,7 +37,7 @@ void ms_escher_set_inst (GString *buf, gsize marker, guint inst);
gsize ms_escher_spcontainer_start (GString *buf);
void ms_escher_spcontainer_end (GString *buf, gsize marker);
-void ms_escher_sp (GString *buf, guint32 spid, guint32 flags);
+void ms_escher_sp (GString *buf, guint32 spid, guint16 shape, guint32 flags);
gsize ms_escher_opt_start (GString *buf);
void ms_escher_opt_add_simple (GString *buf, gsize marker,
diff --git a/plugins/excel/ms-excel-write.c b/plugins/excel/ms-excel-write.c
index c40a624..56de42f 100644
--- a/plugins/excel/ms-excel-write.c
+++ b/plugins/excel/ms-excel-write.c
@@ -4174,7 +4174,7 @@ excel_write_ClientTextbox (ExcelWriteState *ewb, SheetObject *so)
if (!label) {
g_warning ("Not sure why label is NULL here for %s at %p.",
g_type_name (G_OBJECT_TYPE (so)), so);
- label = g_strdup ("");
+ label = g_strdup ("?");
}
char_len = excel_strlen (label, NULL);
GSF_LE_SET_GUINT16 (buf + 10, char_len);
@@ -4225,6 +4225,8 @@ excel_write_textbox_v8 (ExcelWriteSheet *esheet, SheetObject *so)
gsize spmark, optmark;
guint16 flags;
int type;
+ guint16 shape = 0xca; /* Textbox */
+ gboolean do_textbox;
if (IS_CELL_COMMENT (so)) {
static float const offset [4] = { .5, .5, .5, .5 };
@@ -4239,17 +4241,39 @@ excel_write_textbox_v8 (ExcelWriteSheet *esheet, SheetObject *so)
GOD_ANCHOR_DIR_DOWN_RIGHT);
type = 0x19;
flags = 0x4011; /* not autofilled */
+ do_textbox = TRUE;
g_hash_table_insert (esheet->commentshash,
so, GINT_TO_POINTER (esheet->cur_obj));
- } else {
+ } else if (IS_GNM_SO_FILLED (so)) {
+ gboolean is_oval;
+ char *label;
+
anchor = *real_anchor;
type = 6;
flags = 0x6011; /* autofilled */
+
+ g_object_get (so,
+ "is-oval", &is_oval,
+ "text", &label,
+ NULL);
+ do_textbox = (label != NULL);
+ if (is_oval) {
+ shape = 3;
+ type = 3;
+ } else if (!do_textbox) {
+ shape = 1;
+ type = 2;
+ }
+
+ g_free (label);
+ } else {
+ g_assert_not_reached ();
+ return;
}
spmark = ms_escher_spcontainer_start (escher);
- ms_escher_sp (escher, id, 0x00000a00); /* fHaveAnchor+fHaveSpt */
+ ms_escher_sp (escher, id, shape, 0x00000a00); /* fHaveAnchor+fHaveSpt */
optmark = ms_escher_opt_start (escher);
ms_escher_opt_add_simple (escher, optmark,
@@ -4275,7 +4299,6 @@ excel_write_textbox_v8 (ExcelWriteSheet *esheet, SheetObject *so)
ms_escher_spcontainer_end (escher, spmark);
ms_biff_put_var_write (bp, escher->str, escher->len);
- gsf_mem_dump (escher->str, escher->len);
ms_biff_put_commit (bp);
g_string_free (escher, TRUE);
@@ -4288,7 +4311,8 @@ excel_write_textbox_v8 (ExcelWriteSheet *esheet, SheetObject *so)
ms_biff_put_commit (bp);
- excel_write_ClientTextbox (ewb, so);
+ if (do_textbox)
+ excel_write_ClientTextbox (ewb, so);
}
static void
@@ -5057,13 +5081,6 @@ excel_sheet_new (ExcelWriteState *ewb, Sheet *sheet,
so);
handled = TRUE;
} else if (IS_GNM_SO_FILLED (so)) {
- char *label = NULL;
-
- g_object_get (G_OBJECT (so), "text", &label, NULL);
- if (!label)
- goto unhandled;
-
- g_free (label);
esheet->textboxes =
g_slist_prepend (esheet->textboxes, so);
handled = TRUE;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]