[gnumeric] xls: attempt to write rectangles and ovals.



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]