[gnumeric] xlsx: initial import of sheet widgets.



commit fc9af1b92d6135747a6a3402ee71665739f51514
Author: Morten Welinder <terra gnome org>
Date:   Fri Feb 6 14:49:47 2015 -0500

    xlsx: initial import of sheet widgets.

 NEWS                              |    3 ++
 plugins/excel/ChangeLog           |    6 ++++
 plugins/excel/xlsx-read-drawing.c |   55 ++++++++++++++++++++++++++++++++++---
 3 files changed, 60 insertions(+), 4 deletions(-)
---
diff --git a/NEWS b/NEWS
index 547f1b5..211c0dd 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,8 @@
 Gnumeric 1.12.21
 
+Morten:
+       * Initial xlsx import of sheet widgets.
+
 --------------------------------------------------------------------------
 Gnumeric 1.12.20
 
diff --git a/plugins/excel/ChangeLog b/plugins/excel/ChangeLog
index 5e5d0fa..fb49321 100644
--- a/plugins/excel/ChangeLog
+++ b/plugins/excel/ChangeLog
@@ -1,3 +1,9 @@
+2015-02-06  Morten Welinder  <terra gnome org>
+
+       * xlsx-read-drawing.c (xlsx_vml_client_data_start)
+       (xlsx_vml_client_data_end): First attempt at reading scrollbars,
+       radio buttons, checkboxes, buttons, and spin buttons.
+
 2015-02-04  Morten Welinder <terra gnome org>
 
        * Release 1.12.20
diff --git a/plugins/excel/xlsx-read-drawing.c b/plugins/excel/xlsx-read-drawing.c
index 07af630..e77e3ce 100644
--- a/plugins/excel/xlsx-read-drawing.c
+++ b/plugins/excel/xlsx-read-drawing.c
@@ -3145,7 +3145,44 @@ xlsx_vml_drop_style (GsfXMLIn *xin, G_GNUC_UNUSED GsfXMLBlob *blob)
 }
 
 static void
-xlsx_vml_client_data (GsfXMLIn *xin, G_GNUC_UNUSED GsfXMLBlob *blob)
+xlsx_vml_client_data_start (GsfXMLIn *xin, xmlChar const **attrs)
+{
+       XLSXReadState *state = (XLSXReadState *)xin->user_state;
+       GType typ = G_TYPE_NONE;
+
+       static EnumVal const types[] = {
+               { "Scroll", 0 },
+               { "Radio", 1 },
+               { "Spin", 2 },
+               { "Button", 3 },
+               { "Checkbox", 4 },
+               { NULL, 0 }
+       };
+       static GType gtypes[G_N_ELEMENTS(types) - 1];
+
+       if (!gtypes[0]) {
+               gtypes[0] = GNM_SOW_SCROLLBAR_TYPE;
+               gtypes[1] = GNM_SOW_RADIO_BUTTON_TYPE;
+               gtypes[2] = GNM_SOW_SPIN_BUTTON_TYPE;
+               gtypes[3] = GNM_SOW_BUTTON_TYPE;
+               gtypes[4] = GNM_SOW_CHECKBOX_TYPE;
+       }
+
+       for (; attrs != NULL && attrs[0] && attrs[1] ; attrs += 2) {
+               int tmp;
+
+               if (attr_enum (xin, attrs, "ObjectType", types, &tmp))
+                       typ = gtypes[tmp];
+       }
+
+       if (typ != G_TYPE_NONE && !state->so) {
+               state->so = SHEET_OBJECT (g_object_new (typ, NULL));
+               state->pending_objects = g_slist_prepend (state->pending_objects, state->so);
+       }
+}
+
+static void
+xlsx_vml_client_data_end (GsfXMLIn *xin, G_GNUC_UNUSED GsfXMLBlob *blob)
 {
        XLSXReadState *state = (XLSXReadState *)xin->user_state;
        if (state->so) {
@@ -3196,9 +3233,19 @@ xlsx_vml_client_data (GsfXMLIn *xin, G_GNUC_UNUSED GsfXMLBlob *blob)
                coords[3] = (state->chart_pos[3] - sum) / size;
                sheet_object_anchor_init (&anchor, &r, coords, GOD_ANCHOR_DIR_DOWN_RIGHT);
                sheet_object_set_anchor (state->so, &anchor);
-               if (GNM_IS_SOW_LIST (state->so) || GNM_IS_SOW_COMBO (state->so))
+               if (GNM_IS_SOW_LIST (state->so) ||
+                   GNM_IS_SOW_COMBO (state->so))
                        sheet_widget_list_base_set_links (state->so, state->link_texpr, state->texpr);
-               g_object_unref (state->so);
+               else if (GNM_IS_SOW_SCROLLBAR (state->so) ||
+                        GNM_IS_SOW_SPINBUTTON (state->so) ||
+                        GNM_IS_SOW_SLIDER (state->so))
+                       sheet_widget_adjustment_set_link (state->so, state->link_texpr);
+               else if (GNM_IS_SOW_RADIO_BUTTON (state->so))
+                       sheet_widget_radio_button_set_link (state->so, state->link_texpr);
+               else if (GNM_IS_SOW_BUTTON (state->so))
+                       sheet_widget_button_set_link (state->so, state->link_texpr);
+               else if (GNM_IS_SOW_CHECKBOX (state->so))
+                       sheet_widget_checkbox_set_link (state->so, state->link_texpr);
                state->so = NULL;
        }
        if (state->texpr) {
@@ -3247,7 +3294,7 @@ GSF_XML_IN_NODE_FULL (START, SP, XL_NS_LEG_VML, "shape", GSF_XML_NO_CONTENT, FAL
   GSF_XML_IN_NODE (SP, TEXTBOX, XL_NS_LEG_VML, "textbox", GSF_XML_NO_CONTENT, NULL, NULL),
     GSF_XML_IN_NODE (TEXTBOX, DIV, -1, "div", GSF_XML_NO_CONTENT, NULL, NULL),
   GSF_XML_IN_NODE (SP, LOCK, XL_NS_LEG_OFF, "lock", GSF_XML_NO_CONTENT, NULL, NULL), /* already defined */
-  GSF_XML_IN_NODE (SP, CLIENT_DATA, XL_NS_LEG_XL, "ClientData", GSF_XML_NO_CONTENT, NULL, 
&xlsx_vml_client_data),
+  GSF_XML_IN_NODE (SP, CLIENT_DATA, XL_NS_LEG_XL, "ClientData", GSF_XML_NO_CONTENT, 
&xlsx_vml_client_data_start, &xlsx_vml_client_data_end),
     GSF_XML_IN_NODE (CLIENT_DATA, ANCHOR, XL_NS_LEG_XL, "Anchor", GSF_XML_NO_CONTENT, NULL, NULL),
     GSF_XML_IN_NODE (CLIENT_DATA, AUTO_FILL, XL_NS_LEG_XL, "AutoFill", GSF_XML_NO_CONTENT, NULL, NULL),
     GSF_XML_IN_NODE (CLIENT_DATA, AUTO_LINE, XL_NS_LEG_XL, "AutoLine", GSF_XML_NO_CONTENT, NULL, NULL),


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