[gnumeric] xls: export lines and arrows.



commit 46be1389567b9bd57aad3f26d03fb63853afc53c
Author: Morten Welinder <terra gnome org>
Date:   Mon Oct 5 21:51:02 2009 -0400

    xls: export lines and arrows.

 NEWS                           |    1 +
 plugins/excel/ChangeLog        |    6 ++--
 plugins/excel/ms-excel-write.c |   74 ++++++++++++++++++++++++++++++++++++++--
 3 files changed, 75 insertions(+), 6 deletions(-)
---
diff --git a/NEWS b/NEWS
index 5308856..d6222ab 100644
--- a/NEWS
+++ b/NEWS
@@ -29,6 +29,7 @@ Morten:
 	* Add name property to sheet objects.
 	* Start cleaning up xls sheet object writing.
 	* Plug xls export leaks.
+	* Implement export of lines and arrows to xls.  [Part of #597035]
 
 --------------------------------------------------------------------------
 Gnumeric 1.9.13
diff --git a/plugins/excel/ChangeLog b/plugins/excel/ChangeLog
index 9d4c810..e9b908f 100644
--- a/plugins/excel/ChangeLog
+++ b/plugins/excel/ChangeLog
@@ -1,19 +1,19 @@
 2009-10-05  Morten Welinder  <terra gnome org>
 
-	* plugins/excel/ms-excel-write.c (excel_write_textbox_v8): Export
+	* ms-excel-write.c (excel_write_textbox_v8): Export
 	object name.
 	(excel_sheet_new): Prepare for handling lines.
 	(blipinf_new): Plug leak.
 	(extract_txomarkup): Plug leak.
 	(xf_init, cb_cell_pre_pass, cb_accum_styles,
 	excel_write_ClientTextbox): Plug leak.
-
-	* ms-chart.c (map_1_5d_type): Plug leak.
+	(excel_write_line_v8): Export lines and arrows.
 
 	* ms-biff.h (_BiffPut): Change type of streamPos to gsf_off_t.
 
 	* ms-chart.c (chart_write_axis): Don't dump uninitialized memory
 	into file.
+	(map_1_5d_type): Plug leak.
 
 	* ms-biff.c (ms_biff_put_len_next): Make sure we don't mix _var_
 	and _len_ calls.  Make sure we commit.
diff --git a/plugins/excel/ms-excel-write.c b/plugins/excel/ms-excel-write.c
index 2fcf898..f231d22 100644
--- a/plugins/excel/ms-excel-write.c
+++ b/plugins/excel/ms-excel-write.c
@@ -4368,7 +4368,77 @@ excel_write_textbox_v8 (ExcelWriteSheet *esheet, SheetObject *so)
 static gsize
 excel_write_line_v8 (ExcelWriteSheet *esheet, SheetObject *so)
 {
-	return 0;
+	gboolean is_arrow;
+	GString *escher = g_string_new (NULL);
+	GString *extra;
+	ExcelWriteState *ewb = esheet->ewb;
+	BiffPut *bp = ewb->bp;
+	guint32 id = excel_write_start_drawing (esheet);
+	SheetObjectAnchor const *anchor = sheet_object_get_anchor (so);
+	gsize draw_len = 0;
+	int type = 1;
+	int shape = 0x14;
+	int flags = 0x6011; /* autofilled */
+	gsize spmark, optmark;
+	char *name;
+	guint8 zero[4] = { 0, 0, 0, 0 };
+
+	g_object_get (so, "is-arrow", &is_arrow, NULL);
+
+	spmark = ms_escher_spcontainer_start (escher);
+
+	ms_escher_sp (escher, id, shape, 0x00000a00); /* fHaveAnchor+fHaveSpt */
+
+	optmark = ms_escher_opt_start (escher);
+	extra = g_string_new (NULL);
+	ms_escher_opt_add_simple (escher, optmark,
+				  0x00bf, 0x00080008);
+	ms_escher_opt_add_simple (escher, optmark,
+				  0x0144, 4); /* shapePath */
+	ms_escher_opt_add_simple (escher, optmark,
+				  0x017f, 0x00010000);
+	ms_escher_opt_add_simple (escher, optmark,
+				  0x01bf, 0x00110001);
+	ms_escher_opt_add_simple (escher, optmark,
+				  0x01c0, 0x0800000a); /* lineColor */
+	ms_escher_opt_add_simple (escher, optmark,
+				  0x01cb, 19050); /* lineWidth */
+	if (is_arrow)
+		ms_escher_opt_add_simple (escher, optmark,
+					  0x01d1, 1);  /* lineEndArrowhead */
+	ms_escher_opt_add_simple (escher, optmark,
+				  0x1ff, 0x00180018);
+	g_object_get (so, "name", &name, NULL);
+	if (name) {
+		ms_escher_opt_add_str_wchar (escher, optmark, extra,
+					     0x0380, name);
+		g_free (name);
+	}
+	ms_escher_opt_add_simple (escher, optmark,
+				  0x03bf, 0x00080008); /* fPrint */
+	go_string_append_gstring (escher, extra);
+	ms_escher_opt_end (escher, optmark);
+	g_string_free (extra, TRUE);
+
+	ms_escher_clientanchor (escher, anchor);
+
+	ms_escher_clientdata (escher, NULL, 0);
+
+	ms_escher_spcontainer_end (escher, spmark);
+
+	ms_biff_put_var_write (bp, escher->str, escher->len);
+	ms_biff_put_commit (bp);
+	draw_len += escher->len;
+
+	g_string_free (escher, TRUE);
+
+	ms_biff_put_var_next (bp, BIFF_OBJ);
+	ms_objv8_write_common (bp, esheet->cur_obj, type, flags);
+	ms_biff_put_var_write (bp, zero, 4);
+
+	ms_biff_put_commit (bp);
+
+	return draw_len;
 }
 
 static void
@@ -5149,8 +5219,6 @@ excel_sheet_new (ExcelWriteState *ewb, Sheet *sheet,
 				g_slist_prepend (esheet->textboxes, so);
 			handled = TRUE;
 		} else if (IS_GNM_SO_LINE (so)) {
-			if (1)
-				goto unhandled;
 			esheet->lines =
 				g_slist_prepend (esheet->lines, so);
 			handled = TRUE;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]