From 5846ae5d3e4236a5a1307ab614114813f0b5ffb3 Mon Sep 17 00:00:00 2001
From: "Oleg.Korshul" <Oleg.Korshul@OnlyOffice.com>
Date: Mon, 18 Nov 2013 14:24:27 +0000
Subject: [PATCH] load/save group

git-svn-id: svn://192.168.3.15/activex/AVS/Sources/TeamlabOffice/trunk/OfficeWeb@52147 954022d7-b5bf-4e40-9824-e11837661b57
---
 Common/Shapes/Serialize.js       | 112 +++++++++++++++++++++++++++++++
 Common/Shapes/SerializeWriter.js |   6 ++
 Word/Editor/SerializeCommon.js   |  80 +++++++++++++++++-----
 3 files changed, 180 insertions(+), 18 deletions(-)

diff --git a/Common/Shapes/Serialize.js b/Common/Shapes/Serialize.js
index 69412b83b..c3a356fc1 100644
--- a/Common/Shapes/Serialize.js
+++ b/Common/Shapes/Serialize.js
@@ -4729,6 +4729,118 @@ function BinaryPPTYLoader()
         return shape;
     }
 
+    this.ReadChartDataInGroup = function(group)
+    {
+        var s = this.stream;
+
+        var _rec_start = s.cur;
+        var _end_rec = _rec_start + s.GetULong() + 4;
+
+        this.TempGroupObject = group;
+
+        s.Skip2(1); // start attributes
+
+        while (true)
+        {
+            var _at = s.GetUChar();
+            if (_at == g_nodeAttributeEnd)
+                break;
+
+            switch (_at)
+            {
+                case 0:
+                {
+                    var spid = s.GetString2();
+                    break;
+                }
+                default:
+                    break;
+            }
+        }
+
+        var _nvGraphicFramePr = null;
+        var _xfrm = null;
+        var _chart = null;
+
+        while (s.cur < _end_rec)
+        {
+            var _at = s.GetUChar();
+            switch (_at)
+            {
+                case 0:
+                {
+                    _nvGraphicFramePr = this.ReadNvUniProp();
+                    break;
+                }
+                case 1:
+                {
+                    _xfrm = this.ReadXfrm();
+                    break;
+                }
+                case 2:
+                {
+                    s.SkipRecord();
+                    break;
+                }
+                case 3:
+                {
+                    var _length = s.GetLong();
+                    var _pos = s.cur;
+
+                    _chart = new CChartAsGroup(this.TempGroupObject);
+                    if(g_oTableId)
+                        g_oTableId.m_bTurnOff = true;
+                    var chart = new asc_CChart();
+                    if(g_oTableId)
+                        g_oTableId.m_bTurnOff = false;
+
+                    var _stream = new FT_Stream2();
+                    _stream.data = s.data;
+                    _stream.pos = s.pos;
+                    _stream.cur = s.cur;
+                    _stream.size = s.size;
+
+                    var oBinary_ChartReader = new Binary_ChartReader(_stream, chart, _chart);
+                    oBinary_ChartReader.ReadExternal(_length);
+                    if (null != chart.range.interval && chart.range.interval.length > 0)
+                    {
+                        if (_xfrm)
+                        {
+                            if (_chart.setXfrm)
+                            {
+                                _chart.setXfrm(_xfrm.offX, _xfrm.offY, _xfrm.extX, _xfrm.extY, _xfrm.rot, _xfrm.flipH, _xfrm.flipV);
+                            }
+                            else
+                            {
+                                _chart.setPosition(_xfrm.offX, _xfrm.offY);
+                                _chart.setExtents(_xfrm.extX, _xfrm.extY);
+                            }
+                        }
+                        _chart.setAscChart(chart);
+                    }
+                    else
+                        _chart = null;
+
+
+                    s.Seek2(_pos + _length);
+                    break;
+                }
+                default:
+                {
+                    break;
+                }
+            }
+        }
+
+        s.Seek2(_end_rec);
+
+        this.TempGroupObject = null;
+        if (_chart == null)
+            return null;
+
+        return _chart;
+    }
+
     this.ReadGrFrame = function()
     {
         var s = this.stream;
diff --git a/Common/Shapes/SerializeWriter.js b/Common/Shapes/SerializeWriter.js
index 04f5f7809..ea4ab9c84 100644
--- a/Common/Shapes/SerializeWriter.js
+++ b/Common/Shapes/SerializeWriter.js
@@ -74,6 +74,8 @@ function CBinaryFileWriter()
     this.pos = 0;
     this.Init();
 
+    this.UseContinueWriter = false;
+
     this.IsUseFullUrl = false;
     this.DocumentOrigin = "";
     this.PresentationThemesOrigin = "";
@@ -2580,6 +2582,8 @@ function CBinaryFileWriter()
         _memory.len = oThis.len;
         _memory.pos = oThis.pos;
 
+        oThis.UseContinueWriter = true;
+
         var oBinaryChartWriter = new BinaryChartWriter(_memory);
         oBinaryChartWriter.WriteChartContent(grObj);
 
@@ -2588,6 +2592,8 @@ function CBinaryFileWriter()
         oThis.len = _memory.len;
         oThis.pos = _memory.pos;
 
+        oThis.UseContinueWriter = false;
+
         _memory.ImData = null;
         _memory.data = null;
     }
diff --git a/Word/Editor/SerializeCommon.js b/Word/Editor/SerializeCommon.js
index 0fd75f0ab..f98c0596e 100644
--- a/Word/Editor/SerializeCommon.js
+++ b/Word/Editor/SerializeCommon.js
@@ -525,7 +525,9 @@ function CPPTXContentLoader()
                             }
                             case 5:
                             {
-                                s.SkipRecord();
+                                var _chart = this.Reader.ReadChartDataInGroup(shape);
+                                if (null != _chart)
+                                    shape.addGraphicObject(_chart);
                                 break;
                             }
                             default:
@@ -731,42 +733,80 @@ function CPPTXContentWriter()
     }
 	this.WriteTextBody = function(memory, textBody)
     {
-        this.TreeDrawingIndex++;
-
-        this.arrayStackStarts.push(this.BinaryFileWriter.pos);
+        if (this.BinaryFileWriter.UseContinueWriter)
+        {
+            this.BinaryFileWriter.ImData = memory.ImData;
+            this.BinaryFileWriter.data = memory.data;
+            this.BinaryFileWriter.len = memory.len;
+            this.BinaryFileWriter.pos = memory.pos;
+        }
+        else
+        {
+            this.TreeDrawingIndex++;
+            this.arrayStackStarts.push(this.BinaryFileWriter.pos);
+        }
 
         var _writer = this.BinaryFileWriter;
         _writer.StartRecord(0);
         _writer.WriteTxBody(textBody);
         _writer.EndRecord();
 
-        this.TreeDrawingIndex--;
+        if (this.BinaryFileWriter.UseContinueWriter)
+        {
+            memory.ImData = this.BinaryFileWriter.ImData;
+            memory.data = this.BinaryFileWriter.data;
+            memory.len = this.BinaryFileWriter.len;
+            memory.pos = this.BinaryFileWriter.pos;
+        }
+        else
+        {
+            this.TreeDrawingIndex--;
 
-        var oldPos = this.arrayStackStarts[this.arrayStackStarts.length - 1];
-        memory.WriteBuffer(this.BinaryFileWriter.data, oldPos, this.BinaryFileWriter.pos - oldPos);
-        this.BinaryFileWriter.pos = oldPos;
+            var oldPos = this.arrayStackStarts[this.arrayStackStarts.length - 1];
+            memory.WriteBuffer(this.BinaryFileWriter.data, oldPos, this.BinaryFileWriter.pos - oldPos);
+            this.BinaryFileWriter.pos = oldPos;
 
-        this.arrayStackStarts.splice(this.arrayStackStarts.length - 1, 1);
+            this.arrayStackStarts.splice(this.arrayStackStarts.length - 1, 1);
+        }
     }
 	this.WriteSpPr = function(memory, spPr)
     {
-        this.TreeDrawingIndex++;
-
-        this.arrayStackStarts.push(this.BinaryFileWriter.pos);
+        if (this.BinaryFileWriter.UseContinueWriter)
+        {
+            this.BinaryFileWriter.ImData = memory.ImData;
+            this.BinaryFileWriter.data = memory.data;
+            this.BinaryFileWriter.len = memory.len;
+            this.BinaryFileWriter.pos = memory.pos;
+        }
+        else
+        {
+            this.TreeDrawingIndex++;
+            this.arrayStackStarts.push(this.BinaryFileWriter.pos);
+            this.BinaryFileWriter.pos = 0;
+        }
 
-        this.BinaryFileWriter.pos = 0;
         var _writer = this.BinaryFileWriter;
         _writer.StartRecord(0);
         _writer.WriteSpPr(spPr);
         _writer.EndRecord();
 
-        this.TreeDrawingIndex--;
+        if (this.BinaryFileWriter.UseContinueWriter)
+        {
+            memory.ImData = this.BinaryFileWriter.ImData;
+            memory.data = this.BinaryFileWriter.data;
+            memory.len = this.BinaryFileWriter.len;
+            memory.pos = this.BinaryFileWriter.pos;
+        }
+        else
+        {
+            this.TreeDrawingIndex--;
 
-        var oldPos = this.arrayStackStarts[this.arrayStackStarts.length - 1];
-        memory.WriteBuffer(this.BinaryFileWriter.data, oldPos, this.BinaryFileWriter.pos - oldPos);
-        this.BinaryFileWriter.pos = oldPos;
+            var oldPos = this.arrayStackStarts[this.arrayStackStarts.length - 1];
+            memory.WriteBuffer(this.BinaryFileWriter.data, oldPos, this.BinaryFileWriter.pos - oldPos);
+            this.BinaryFileWriter.pos = oldPos;
 
-        this.arrayStackStarts.splice(this.arrayStackStarts.length - 1, 1);
+            this.arrayStackStarts.splice(this.arrayStackStarts.length - 1, 1);
+        }
     }
     this.WriteDrawing = function(memory, grObject, Document, oMapCommentId, oNumIdMap, copyParams)
     {
@@ -1005,6 +1045,10 @@ function CPPTXContentWriter()
 				{
 					this.WriteGroup(elem, Document, oMapCommentId, oNumIdMap, copyParams);
 				}
+                else if ("undefined" !== typeof(CChartAsGroup) && elem instanceof CChartAsGroup)
+                {
+                    this.BinaryFileWriter.WriteChart(elem);
+                }
 
                 _writer.EndRecord(0);
             }
-- 
2.30.9