From ff0bc13bbf12e670ede14ad3a1d39d8e96b4d45e Mon Sep 17 00:00:00 2001 From: Vladimir Privezenov Date: Thu, 13 Feb 2025 19:29:53 +0300 Subject: [PATCH] For bug 72801 New scheme for deleting inks in sse and pe editors --- cell/api.js | 14 + cell/model/Workbook.js | 41 +++ cell/view/WorkbookView.js | 13 + common/Drawings/CommonController.js | 212 +++++++------ common/Drawings/Format/Format.js | 40 ++- common/Drawings/Format/GraphicObjectBase.js | 3 + common/Drawings/Format/GroupShape.js | 48 +-- common/HistoryCommon.js | 2 + slide/Editor/Format/Presentation.js | 3 +- slide/api.js | 2 +- word/Editor/GraphicObjects/GraphicObjects.js | 318 +++++++++++-------- 11 files changed, 430 insertions(+), 266 deletions(-) diff --git a/cell/api.js b/cell/api.js index eec2feab8e..8e892d7e10 100644 --- a/cell/api.js +++ b/cell/api.js @@ -9996,6 +9996,20 @@ var editor; } return wb.getShowHorizontalScroll(); }; + spreadsheet_api.prototype.haveInks = function() { + if (!this.wbModel) { + return false; + } + + return !!this.wbModel.getAllInks().length; + }; + spreadsheet_api.prototype.removeAllInks = function() { + if (!this.wb) { + return; + } + + this.wb.removeAllInks(); + }; /* * Export diff --git a/cell/model/Workbook.js b/cell/model/Workbook.js index 9fa25b3644..e92c120844 100644 --- a/cell/model/Workbook.js +++ b/cell/model/Workbook.js @@ -5733,6 +5733,20 @@ Workbook.prototype.getShowHorizontalScroll = function() { return this.showHorizontalScroll; }; + Workbook.prototype.getAllInks = function(arrInks) { + arrInks = arrInks || []; + for (let i = 0; i < this.aWorksheets.length; i += 1) { + const oWorksheet = this.aWorksheets[i]; + oWorksheet.getAllInks(arrInks); + } + return arrInks; + }; + Workbook.prototype.removeAllInks = function() { + for (let i = 0; i < this.aWorksheets.length; i += 1) { + const oWorksheet = this.aWorksheets[i]; + oWorksheet.removeAllInks(); + } + }; @@ -13999,6 +14013,33 @@ return new AscCommon.CellBase(lastR, lastC); }; + Worksheet.prototype.removeAllInks = function() { + for (let i = this.Drawings.length - 1; i >= 0; i -= 1) { + const oGraphicObject = this.Drawings[i].graphicObject; + if (oGraphicObject.isInk() || oGraphicObject.isHaveOnlyInks()) { + oGraphicObject.deleteDrawingBase(true); + if (oGraphicObject.setBDeleted2) { + oGraphicObject.setBDeleted2(true); + } else { + oGraphicObject.setBDeleted(true); + } + } else { + oGraphicObject.removeAllInks(); + } + } + }; + Worksheet.prototype.getAllInks = function(arrInks) { + arrInks = arrInks || []; + for (let i = 0; i < this.Drawings.length; i++) { + const oGraphicObject = this.Drawings[i].graphicObject; + if (oGraphicObject.isInk() || oGraphicObject.isHaveOnlyInks()) { + arrInks.push(oGraphicObject); + } else { + oGraphicObject.getAllInks(arrInks); + } + } + return arrInks; + }; //------------------------------------------------------------------------------------------------- diff --git a/cell/view/WorkbookView.js b/cell/view/WorkbookView.js index f3e9dbd236..ff556a4252 100644 --- a/cell/view/WorkbookView.js +++ b/cell/view/WorkbookView.js @@ -6373,6 +6373,19 @@ } return val === true || val == null; }; + WorkbookView.prototype.removeAllInks = function() { + const oWs = this.getWorksheet(); + const oWbModel = this.model; + const oController = oWs.objectRender && oWs.objectRender.controller; + if (oController) { + const arrInks = oWbModel.getAllInks(); + if (arrInks.length > 0) { + oController.checkObjectsAndCallback(function() { + oWbModel.removeAllInks(); + }, [], false, AscDFH.historydescription_RemoveAllInks, arrInks); + } + } + }; diff --git a/common/Drawings/CommonController.js b/common/Drawings/CommonController.js index 98ec7d48a9..77b19a21b2 100644 --- a/common/Drawings/CommonController.js +++ b/common/Drawings/CommonController.js @@ -4974,7 +4974,95 @@ } this.checkSelectedObjectsAndCallback(this.removeCallback, [dir, bOnlyText, bRemoveOnlySelection, bOnTextAdd, isWord, undefined], false, AscDFH.historydescription_Spreadsheet_Remove, undefined, !!(oTargetContent && AscCommon.CollaborativeEditing.Is_Fast())); }, - + removeInGroup: function(oGroup, arrShapes, arrSlicerNames) { + if (oGroup.getObjectType() === AscDFH.historyitem_type_GroupShape) { + arrSlicerNames = arrSlicerNames || []; + this.resetConnectors(arrShapes); + var group_map = {}, group_arr = [], i, cur_group, sp, xc, yc, hc, vc, rel_xc, + rel_yc, j; + for (i = 0; i < arrShapes.length; ++i) { + const oSp = arrShapes[i]; + if (oSp.getObjectType() === AscDFH.historyitem_type_SlicerView) { + arrSlicerNames.push(oSp.getName()); + } else { + oSp.group.removeFromSpTree(oSp.Get_Id()); + group_map[oSp.group.Get_Id()] = oSp.group; + oSp.setBDeleted(true); + } + } + group_map[oGroup.Get_Id() + ""] = oGroup; + for (var key in group_map) { + if (group_map.hasOwnProperty(key)) + group_arr.push(group_map[key]); + } + group_arr.sort(CompareGroups); + for (i = 0; i < group_arr.length; ++i) { + cur_group = group_arr[i]; + if (isRealObject(cur_group.group)) { + if (cur_group.spTree.length === 0) { + cur_group.group.removeFromSpTree(cur_group.Get_Id()); + } else if (cur_group.spTree.length === 1) { + sp = cur_group.spTree[0]; + hc = sp.spPr.xfrm.extX / 2; + vc = sp.spPr.xfrm.extY / 2; + xc = sp.transform.TransformPointX(hc, vc); + yc = sp.transform.TransformPointY(hc, vc); + rel_xc = cur_group.group.invertTransform.TransformPointX(xc, yc); + rel_yc = cur_group.group.invertTransform.TransformPointY(xc, yc); + sp.spPr.xfrm.setOffX(rel_xc - hc); + sp.spPr.xfrm.setOffY(rel_yc - vc); + sp.spPr.xfrm.setRot(AscFormat.normalizeRotate(cur_group.rot + sp.rot)); + sp.spPr.xfrm.setFlipH(cur_group.spPr.xfrm.flipH === true ? !(sp.spPr.xfrm.flipH === true) : sp.spPr.xfrm.flipH === true); + sp.spPr.xfrm.setFlipV(cur_group.spPr.xfrm.flipV === true ? !(sp.spPr.xfrm.flipV === true) : sp.spPr.xfrm.flipV === true); + sp.setGroup(cur_group.group); + for (j = 0; j < cur_group.group.spTree.length; ++j) { + if (cur_group.group.spTree[j] === cur_group) { + cur_group.group.addToSpTree(j, sp); + cur_group.group.removeFromSpTree(cur_group.Get_Id()); + } + } + } + } else { + if (cur_group.spTree.length === 0) { + if (this.selection.groupSelection === cur_group) { + this.resetSelection(); + } + cur_group.deleteDrawingBase(true); + cur_group.setBDeleted(true); + return true; + } else if (cur_group.spTree.length === 1) { + sp = cur_group.spTree[0]; + sp.spPr.xfrm.setOffX(cur_group.spPr.xfrm.offX + sp.spPr.xfrm.offX); + sp.spPr.xfrm.setOffY(cur_group.spPr.xfrm.offY + sp.spPr.xfrm.offY); + sp.spPr.xfrm.setRot(AscFormat.normalizeRotate(cur_group.rot + sp.rot)); + sp.spPr.xfrm.setFlipH(cur_group.spPr.xfrm.flipH === true ? !(sp.spPr.xfrm.flipH === true) : sp.spPr.xfrm.flipH === true); + sp.spPr.xfrm.setFlipV(cur_group.spPr.xfrm.flipV === true ? !(sp.spPr.xfrm.flipV === true) : sp.spPr.xfrm.flipV === true); + sp.setGroup(null); + sp.addToDrawingObjects(); + sp.checkDrawingBaseCoords(); + cur_group.deleteDrawingBase(); + if (cur_group.selected || sp.selected) { + cur_group.deselectInternal(this); + this.deselectObject(cur_group); + this.selectObject(sp, cur_group.selectStartPage); + } + } else { + cur_group.updateCoordinatesAfterInternalResize(); + if (this.selection.groupSelection === cur_group) { + this.resetInternalSelection(); + } + } + const oWBView = Asc.editor && Asc.editor.wb; + if (arrSlicerNames.length > 0 && oWBView) { + History.StartTransaction(); + oWBView.deleteSlicers(arrSlicerNames); + } + return true; + } + } + this.resetInternalSelection(); + } + }, removeCallback: function (dir, bOnlyText, bRemoveOnlySelection, bOnTextAdd, isWord, bNoCheck) { var target_text_object = getTargetTextObject(this); if (target_text_object) { @@ -5008,85 +5096,10 @@ if (this.selection.groupSelection.selection.chartSelection) { this.selection.groupSelection.selection.chartSelection.remove(); } else { - if (this.selection.groupSelection.getObjectType() === AscDFH.historyitem_type_GroupShape) { - aSO = this.selection.groupSelection.selectedObjects; - this.resetConnectors(aSO); - var group_map = {}, group_arr = [], i, cur_group, sp, xc, yc, hc, vc, rel_xc, - rel_yc, j; - for (i = 0; i < aSO.length; ++i) { - oSp = aSO[i]; - if (oSp.getObjectType() === AscDFH.historyitem_type_SlicerView) { - aSlicerNames.push(oSp.getName()); - } else { - oSp.group.removeFromSpTree(oSp.Get_Id()); - group_map[oSp.group.Get_Id()] = oSp.group; - oSp.setBDeleted(true); - } - } - group_map[this.selection.groupSelection.Get_Id() + ""] = this.selection.groupSelection; - for (var key in group_map) { - if (group_map.hasOwnProperty(key)) - group_arr.push(group_map[key]); - } - group_arr.sort(CompareGroups); - for (i = 0; i < group_arr.length; ++i) { - cur_group = group_arr[i]; - if (isRealObject(cur_group.group)) { - if (cur_group.spTree.length === 0) { - cur_group.group.removeFromSpTree(cur_group.Get_Id()); - } else if (cur_group.spTree.length === 1) { - sp = cur_group.spTree[0]; - hc = sp.spPr.xfrm.extX / 2; - vc = sp.spPr.xfrm.extY / 2; - xc = sp.transform.TransformPointX(hc, vc); - yc = sp.transform.TransformPointY(hc, vc); - rel_xc = cur_group.group.invertTransform.TransformPointX(xc, yc); - rel_yc = cur_group.group.invertTransform.TransformPointY(xc, yc); - sp.spPr.xfrm.setOffX(rel_xc - hc); - sp.spPr.xfrm.setOffY(rel_yc - vc); - sp.spPr.xfrm.setRot(AscFormat.normalizeRotate(cur_group.rot + sp.rot)); - sp.spPr.xfrm.setFlipH(cur_group.spPr.xfrm.flipH === true ? !(sp.spPr.xfrm.flipH === true) : sp.spPr.xfrm.flipH === true); - sp.spPr.xfrm.setFlipV(cur_group.spPr.xfrm.flipV === true ? !(sp.spPr.xfrm.flipV === true) : sp.spPr.xfrm.flipV === true); - sp.setGroup(cur_group.group); - for (j = 0; j < cur_group.group.spTree.length; ++j) { - if (cur_group.group.spTree[j] === cur_group) { - cur_group.group.addToSpTree(j, sp); - cur_group.group.removeFromSpTree(cur_group.Get_Id()); - } - } - } - } else { - if (cur_group.spTree.length === 0) { - this.resetInternalSelection(); - this.removeCallback(-1, undefined, undefined, undefined, undefined, undefined); - return; - } else if (cur_group.spTree.length === 1) { - sp = cur_group.spTree[0]; - sp.spPr.xfrm.setOffX(cur_group.spPr.xfrm.offX + sp.spPr.xfrm.offX); - sp.spPr.xfrm.setOffY(cur_group.spPr.xfrm.offY + sp.spPr.xfrm.offY); - sp.spPr.xfrm.setRot(AscFormat.normalizeRotate(cur_group.rot + sp.rot)); - sp.spPr.xfrm.setFlipH(cur_group.spPr.xfrm.flipH === true ? !(sp.spPr.xfrm.flipH === true) : sp.spPr.xfrm.flipH === true); - sp.spPr.xfrm.setFlipV(cur_group.spPr.xfrm.flipV === true ? !(sp.spPr.xfrm.flipV === true) : sp.spPr.xfrm.flipV === true); - sp.setGroup(null); - sp.addToDrawingObjects(); - sp.checkDrawingBaseCoords(); - cur_group.deleteDrawingBase(); - this.resetSelection(); - this.selectObject(sp, cur_group.selectStartPage); - } else { - cur_group.updateCoordinatesAfterInternalResize(); - } - this.resetInternalSelection(); - this.recalculate(); - oWBView = Asc.editor && Asc.editor.wb; - if (aSlicerNames.length > 0 && oWBView) { - History.StartTransaction(); - oWBView.deleteSlicers(aSlicerNames); - } - return; - } - } - this.resetInternalSelection(); + if (this.removeInGroup(this.selection.groupSelection, this.selection.groupSelection.selectedObjects, aSlicerNames)) { + this.recalculate(); + this.updateOverlay(); + return; } } } else if (this.selection.chartSelection) { @@ -8607,41 +8620,39 @@ } }, - - checkSelectedObjectsAndCallback: function (callback, args, bNoSendProps, nHistoryPointType, aAdditionalObjects, bNoCheckLock) { + checkObjectsAndCallback: function(callback, args, bNoSendProps, nHistoryPointType, aObjects, bNoCheckLock) { var oApi = Asc.editor; if (oApi && oApi.collaborativeEditing && oApi.collaborativeEditing.getGlobalLock()) { return; } + const oObjects = {}; + const aMainObjects = []; + for (let i = 0; i < aObjects.length; i += 1) { + const oObject = aObjects[i].getMainGroup() || aObjects[i]; + const sId = oObject.Get_Id(); + if (!oObjects[sId]) { + oObjects[sId] = true; + aMainObjects.push(oObject); + } + } var selection_state = this.getSelectionState(); var aId = [], i; if (!(bNoCheckLock === true)) { - for (i = 0; i < this.selectedObjects.length; ++i) { - aId.push(this.selectedObjects[i].Get_Id()); - } - if (aAdditionalObjects) { - for (i = 0; i < aAdditionalObjects.length; ++i) { - aId.push(aAdditionalObjects[i].Get_Id()); - } + for (i = 0; i < aMainObjects.length; ++i) { + aId.push(aMainObjects[i].Get_Id()); } } var _this = this; var callback2 = function (bLock, bSync) { if (bLock) { - const API = _this.getEditorApi(); API.sendEvent("asc_onUserActionStart"); var nPointType = AscFormat.isRealNumber(nHistoryPointType) ? nHistoryPointType : AscDFH.historydescription_CommonControllerCheckSelected; History.Create_NewPoint(nPointType); if (bSync !== true) { _this.setSelectionState(selection_state); - for (var i = 0; i < _this.selectedObjects.length; ++i) { - _this.selectedObjects[i].lockType = c_oAscLockTypes.kLockTypeMine; - } - if (aAdditionalObjects) { - for (var i = 0; i < aAdditionalObjects.length; ++i) { - aAdditionalObjects[i].lockType = c_oAscLockTypes.kLockTypeMine; - } + for (var i = 0; i < aMainObjects.length; ++i) { + aMainObjects[i].lockType = c_oAscLockTypes.kLockTypeMine; } } callback.apply(_this, args); @@ -8659,6 +8670,13 @@ callback2(true, true); return true; }, + checkSelectedObjectsAndCallback: function (callback, args, bNoSendProps, nHistoryPointType, aAdditionalObjects, bNoCheckLock) { + const aObjects = this.selectedObjects.slice(); + if (aAdditionalObjects) { + aObjects.push.apply(aObjects, aAdditionalObjects); + } + return this.checkObjectsAndCallback(callback, args, bNoSendProps, nHistoryPointType, aObjects, bNoCheckLock); + }, checkSelectedObjectsAndCallback2: function (callback) { var aId = []; diff --git a/common/Drawings/Format/Format.js b/common/Drawings/Format/Format.js index 17fd756165..830df95617 100644 --- a/common/Drawings/Format/Format.js +++ b/common/Drawings/Format/Format.js @@ -10088,30 +10088,46 @@ InitClass(CSld, CBaseNoIdObject, 0); CSld.prototype.removeAllInks = function () { - if (!this.parent) { + const oController = this.parent && this.parent.graphicObjects; + if (!oController) { return; } - const arrSpTree = this.spTree; - for (let i = arrSpTree.length - 1; i >= 0; i -= 1) { - const oDrawing = arrSpTree[i]; - if (oDrawing.isInk()) { - this.parent.removeFromSpTreeByPos(i); - if (oDrawing.setBDeleted2) { - oDrawing.setBDeleted2(true); - } else { - oDrawing.setBDeleted(true); + + const arrInks = this.getAllInks(); + const oGroups = {}; + for (let i = 0; i < arrInks.length; i += 1) { + const oShape = arrInks[i]; + if (oShape.group) { + const oMainGroup = oShape.getMainGroup(); + const sMainGroupId = oMainGroup.Get_Id(); + if (!oGroups[sMainGroupId]) { + oGroups[sMainGroupId] = {group: oMainGroup, shapes: []}; + } + oGroups[sMainGroupId].shapes.push(oShape); + if (oShape.isGroup()) { + oShape.deselectInternal(oController); } } else { - oDrawing.removeAllInks(); + oShape.deleteDrawingBase(true); + oShape.setBDeleted(true); + if (oShape.isGroup()) { + oShape.deselectInternal(oController); + } + oController.deselectObject(oShape); } } + + for (let sId in oGroups) { + const oGroupInfo = oGroups[sId]; + oController.removeInGroup(oGroupInfo.group, oGroupInfo.shapes); + } }; CSld.prototype.getAllInks = function (arrInks) { arrInks = arrInks || []; const arrSpTree = this.spTree; for (let i = arrSpTree.length - 1; i >= 0; i -= 1) { const oDrawing = arrSpTree[i]; - if (oDrawing.isInk()) { + if (oDrawing.isInk() || oDrawing.isHaveOnlyInks()) { arrInks.push(oDrawing); } else { oDrawing.getAllInks(arrInks); diff --git a/common/Drawings/Format/GraphicObjectBase.js b/common/Drawings/Format/GraphicObjectBase.js index b5af94973d..b21fa81069 100644 --- a/common/Drawings/Format/GraphicObjectBase.js +++ b/common/Drawings/Format/GraphicObjectBase.js @@ -1249,6 +1249,9 @@ CGraphicObjectBase.prototype.isInk = function () { return false; }; + CGraphicObjectBase.prototype.isHaveOnlyInks = function () { + return false; + }; CGraphicObjectBase.prototype.isPlaceholder = function () { let oUniPr = this.getUniNvProps(); if (oUniPr) { diff --git a/common/Drawings/Format/GroupShape.js b/common/Drawings/Format/GroupShape.js index f524767c44..d9c130fe9d 100644 --- a/common/Drawings/Format/GroupShape.js +++ b/common/Drawings/Format/GroupShape.js @@ -491,6 +491,32 @@ } } }; + CGroupShape.prototype.deselectInternal = function(oController) { + const oMainGroup = this.getMainGroup(); + if (oMainGroup.selectedObjects.length) { + const oSelectedObjects = {}; + for (let i = 0; i < oMainGroup.selectedObjects.length; i += 1) { + const oSelectedObject = oMainGroup.selectedObjects[i]; + oSelectedObjects[oSelectedObject.Get_Id()] = oSelectedObject; + } + + const arrGroups = [this]; + while (arrGroups.length) { + const oGroup = arrGroups.pop(); + for (let i = 0; i < oGroup.spTree.length; i += 1) { + const oShape = oGroup.spTree[i]; + if (oShape.isGroup()) { + arrGroups.push(oShape); + } else if (oSelectedObjects[oShape.Get_Id()]) { + oMainGroup.deselectObject(oShape); + } + } + } + if (!oMainGroup.selectedObjects.length) { + oController.selection.groupSelection = null; + } + } + }; CGroupShape.prototype.getLocalTransform = function () { @@ -1716,38 +1742,24 @@ this.spTree[i].generateSmartArtDrawingPart(); } }; - CGroupShape.prototype.isInk = function () { + CGroupShape.prototype.isHaveOnlyInks = function () { if (!this.spTree.length) { return false; } for (let i = 0; i < this.spTree.length; i++) { const oDrawing = this.spTree[i]; - if (!oDrawing.isInk()) { + if (!(oDrawing.isInk() || oDrawing.isHaveOnlyInks())) { return false; } } return true; }; - CGroupShape.prototype.removeAllInks = function () { - for (let i = this.spTree.length - 1; i >= 0; i -= 1) { - const oDrawing = this.spTree[i]; - if (oDrawing.isInk()) { - this.removeFromSpTreeByPos(i); - if (oDrawing.setBDeleted2) { - oDrawing.setBDeleted2(true); - } else { - oDrawing.setBDeleted(true); - } - } else { - oDrawing.removeAllInks(); - } - } - }; + CGroupShape.prototype.getAllInks = function (arrInks) { arrInks = arrInks || []; for (let i = this.spTree.length - 1; i >= 0; i -= 1) { const oDrawing = this.spTree[i]; - if (oDrawing.isInk()) { + if (oDrawing.isInk() || oDrawing.isHaveOnlyInks()) { arrInks.push(oDrawing); } else { oDrawing.getAllInks(arrInks); diff --git a/common/HistoryCommon.js b/common/HistoryCommon.js index 0290102b4d..0d067567a9 100644 --- a/common/HistoryCommon.js +++ b/common/HistoryCommon.js @@ -4558,6 +4558,8 @@ window['AscDFH'].historydescription_Presentation_MergeSelectedShapes = 0x01c1; window['AscDFH'].historydescription_Presentation_SaveAnnotations = 0x01c2; window['AscDFH'].historydescription_Document_SetParagraphBidi = 0x01c3; + + window['AscDFH'].historydescription_RemoveAllInks = 0x01c4; // pdf window['AscDFH'].historydescription_Pdf_AddAnnot = 0x29a; window['AscDFH'].historydescription_Pdf_FreeTextGeom = 0x29b; diff --git a/slide/Editor/Format/Presentation.js b/slide/Editor/Format/Presentation.js index 09b76cb55c..38067b9081 100644 --- a/slide/Editor/Format/Presentation.js +++ b/slide/Editor/Format/Presentation.js @@ -11359,7 +11359,8 @@ CPresentation.prototype.RemoveAllInks = function () { return; } - this.StartAction(0); + this.StartAction(AscDFH.historydescription_RemoveAllInks); + for (let i = 0; i < this.Slides.length; i += 1) { const oSlide = this.Slides[i]; oSlide.removeAllInks(); diff --git a/slide/api.js b/slide/api.js index 7210254b87..522dabbd6e 100644 --- a/slide/api.js +++ b/slide/api.js @@ -9601,7 +9601,7 @@ background-repeat: no-repeat;\ oLogicDocument.RemoveAllInks(); }; - baseEditorsApi.prototype.haveInks = function() { + asc_docs_api.prototype.haveInks = function() { let oLogicDocument = this.getLogicDocument(); if(!oLogicDocument) return; diff --git a/word/Editor/GraphicObjects/GraphicObjects.js b/word/Editor/GraphicObjects/GraphicObjects.js index 687f5acb97..e0614ec2c0 100644 --- a/word/Editor/GraphicObjects/GraphicObjects.js +++ b/word/Editor/GraphicObjects/GraphicObjects.js @@ -429,40 +429,74 @@ CGraphicObjects.prototype = createWatermarkImage: DrawingObjectsController.prototype.createWatermarkImage, - getAllInksDrawings: function () + getAllInksShapes: function () { let aDrawings = this.document.GetAllDrawingObjects(); let aInksDrawings = []; for(let nIdx = 0; nIdx < aDrawings.length; ++nIdx) { let oDrawing = aDrawings[nIdx]; - if(oDrawing.GraphicObj.isInk()) + if(oDrawing.GraphicObj.isInk() || oDrawing.GraphicObj.isHaveOnlyInks()) { - aInksDrawings.push(oDrawing); - } + aInksDrawings.push(oDrawing.GraphicObj); + } else { + oDrawing.GraphicObj.getAllInks(aInksDrawings); + } } return aInksDrawings; }, haveInks: function () { - return this.getAllInksDrawings().length > 0; - }, - removeAllInks: function () - { - let aInksDrawings = this.getAllInksDrawings(); - if(aInksDrawings.length > 0) - { - this.document.StartAction(0); - for(let nIdx = 0; nIdx < aInksDrawings.length; ++nIdx) - { - let oDrawing = aInksDrawings[nIdx]; - oDrawing.Remove_FromDocument(false); - this.deselectObject(oDrawing.GraphicObj); - } - this.document.Recalculate(); - this.document.FinalizeAction(); - } - }, + return this.getAllInksShapes().length > 0; + }, + removeAllInks: function() { + let aInkShapes = this.getAllInksShapes(); + if (aInkShapes.length > 0) { + const arrDrawings = []; + for (let nIdx = 0; nIdx < aInkShapes.length; ++nIdx) { + let oShape = aInkShapes[nIdx]; + const oDrawing = oShape.GetParaDrawing(); + if (oDrawing) { + arrDrawings.push(oDrawing); + } + } + if (this.document.Document_Is_SelectionLocked(changestype_None, { + Type: changestype_2_ElementsArray_and_Type, + Elements: arrDrawings, + CheckType: AscCommon.changestype_Drawing_Props + })) { + return; + } + this.document.StartAction(AscDFH.historydescription_RemoveAllInks); + const oGroups = {}; + for (let i = 0; i < aInkShapes.length; i++) { + const oShape = aInkShapes[i]; + if (oShape.parent instanceof AscCommonWord.ParaDrawing) { + oShape.parent.Remove_FromDocument(false); + if (oShape.isGroup()) { + oShape.deselectInternal(this); + } + this.deselectObject(oShape); + } else if (oShape.group) { + const oMainGroup = oShape.getMainGroup(); + const sGroupId = oMainGroup.Get_Id(); + if (!oGroups[sGroupId]) { + oGroups[sGroupId] = {group: oMainGroup, shapes: []}; + } + oGroups[sGroupId].shapes.push(oShape); + if (oShape.isGroup()) { + oShape.deselectInternal(this); + } + } + } + for (let sId in oGroups) { + const oGroupInfo = oGroups[sId]; + this.removeFromGroup(oGroupInfo.group, oGroupInfo.shapes); + } + this.document.Recalculate(); + this.document.FinalizeAction(); + } + }, createWatermark: function(oProps) @@ -3370,7 +3404,130 @@ CGraphicObjects.prototype = Transform : null }; }, + removeFromGroup: function(oMainGroup, arrShapes) { + if(oMainGroup.getObjectType() === AscDFH.historyitem_type_GroupShape) + { + var group_map = {}, group_arr = [], i, cur_group, sp, xc, yc, hc, vc, rel_xc, rel_yc, j; + for(i = 0; i < arrShapes.length; ++i) + { + arrShapes[i].group.removeFromSpTree(arrShapes[i].Get_Id()); + group_map[arrShapes[i].group.Get_Id()+""] = arrShapes[i].group; + } + group_map[oMainGroup.Get_Id()] = oMainGroup; + for(var key in group_map) + { + if(group_map.hasOwnProperty(key)) + group_arr.push(group_map[key]); + } + group_arr.sort(AscFormat.CompareGroups); + for(i = 0; i < group_arr.length; ++i) + { + cur_group = group_arr[i]; + if(isRealObject(cur_group.group)) + { + if(cur_group.spTree.length === 0) + { + cur_group.group.removeFromSpTree(cur_group.Get_Id()); + } + else if(cur_group.spTree.length === 1) + { + sp = cur_group.spTree[0]; + hc = sp.spPr.xfrm.extX/2; + vc = sp.spPr.xfrm.extY/2; + xc = sp.transform.TransformPointX(hc, vc); + yc = sp.transform.TransformPointY(hc, vc); + rel_xc = cur_group.group.invertTransform.TransformPointX(xc, yc); + rel_yc = cur_group.group.invertTransform.TransformPointY(xc, yc); + sp.spPr.xfrm.setOffX(rel_xc - hc); + sp.spPr.xfrm.setOffY(rel_yc - vc); + sp.spPr.xfrm.setRot(AscFormat.normalizeRotate(cur_group.rot + sp.rot)); + sp.spPr.xfrm.setFlipH(cur_group.spPr.xfrm.flipH === true ? !(sp.spPr.xfrm.flipH === true) : sp.spPr.xfrm.flipH === true); + sp.spPr.xfrm.setFlipV(cur_group.spPr.xfrm.flipV === true ? !(sp.spPr.xfrm.flipV === true) : sp.spPr.xfrm.flipV === true); + sp.setGroup(cur_group.group); + for(j = 0; j < cur_group.group.spTree.length; ++j) + { + if(cur_group.group.spTree[j] === cur_group) + { + cur_group.group.addToSpTree(j, sp); + cur_group.group.removeFromSpTree(cur_group.Get_Id()); + } + } + } + } + else + { + var para_drawing = cur_group.parent; + if(cur_group.spTree.length === 0) + { + para_drawing.GoToText(); + para_drawing.PreDelete(); + para_drawing.Remove_FromDocument(false); + if (this.selection.groupSelection === cur_group) { + this.resetSelection(); + } + return true; + } + else if(cur_group.spTree.length === 1) + { + sp = cur_group.spTree[0]; + sp.spPr.xfrm.setOffX(0); + sp.spPr.xfrm.setOffY(0); + sp.spPr.xfrm.setRot(AscFormat.normalizeRotate(cur_group.rot + sp.rot)); + sp.spPr.xfrm.setFlipH(cur_group.spPr.xfrm.flipH === true ? !(sp.spPr.xfrm.flipH === true) : sp.spPr.xfrm.flipH === true); + sp.spPr.xfrm.setFlipV(cur_group.spPr.xfrm.flipV === true ? !(sp.spPr.xfrm.flipV === true) : sp.spPr.xfrm.flipV === true); + sp.setGroup(null); + para_drawing.Set_GraphicObject(sp); + sp.setParent(para_drawing); + if (cur_group.selected || sp.selected) { + this.resetSelection(); + this.selectObject(sp, cur_group.selectStartPage); + } + new_x = sp.transform.tx; + new_y = sp.transform.ty; + para_drawing.CheckWH(); + if(!para_drawing.Is_Inline()) + { + para_drawing.Set_XY(new_x, new_y, para_drawing.Get_ParentParagraph(), para_drawing.GraphicObj.selectStartPage, true); + } + this.document.Recalculate(); + return true; + } + else + { + if (this.selection.groupSelection === cur_group) { + this.resetInternalSelection(); + } + var new_x, new_y; + // var pos = cur_group.getBoundsPos(); + var oPos = cur_group.updateCoordinatesAfterInternalResize(); + + var g_pos_x = 0, g_pos_y = 0; + if(oPos) + { + if(AscFormat.isRealNumber(oPos.posX)) + { + g_pos_x = oPos.posX; + } + if(AscFormat.isRealNumber(oPos.posY)) + { + g_pos_y = oPos.posY; + } + } + new_x = cur_group.x + g_pos_x; + new_y = cur_group.y + g_pos_y; + + cur_group.spPr.xfrm.setOffX(0); + cur_group.spPr.xfrm.setOffY(0); + para_drawing.CheckWH(); + para_drawing.Set_XY(new_x, new_y, cur_group.parent.Get_ParentParagraph(), cur_group.selectStartPage, false);//X, Y, Paragraph, PageNum, bResetAlign + this.document.Recalculate(); + break; + } + } + } + } + }, remove: function(Count, bOnlyText, bRemoveOnlySelection, bOnTextAdd, isWord) { var content = this.getTargetDocContent(true); @@ -3390,122 +3547,9 @@ CGraphicObjects.prototype = this.selection.groupSelection.selection.chartSelection.remove(); this.document.Recalculate(); } - else + else if (this.removeFromGroup(this.selection.groupSelection, this.selection.groupSelection.selectedObjects)) { - if(this.selection.groupSelection.getObjectType() === AscDFH.historyitem_type_GroupShape) - { - var group_map = {}, group_arr = [], i, cur_group, sp, xc, yc, hc, vc, rel_xc, rel_yc, j; - for(i = 0; i < this.selection.groupSelection.selectedObjects.length; ++i) - { - this.selection.groupSelection.selectedObjects[i].group.removeFromSpTree(this.selection.groupSelection.selectedObjects[i].Get_Id()); - group_map[this.selection.groupSelection.selectedObjects[i].group.Get_Id()+""] = this.selection.groupSelection.selectedObjects[i].group; - } - group_map[this.selection.groupSelection.Get_Id()] = this.selection.groupSelection; - for(var key in group_map) - { - if(group_map.hasOwnProperty(key)) - group_arr.push(group_map[key]); - } - group_arr.sort(AscFormat.CompareGroups); - for(i = 0; i < group_arr.length; ++i) - { - cur_group = group_arr[i]; - if(isRealObject(cur_group.group)) - { - if(cur_group.spTree.length === 0) - { - cur_group.group.removeFromSpTree(cur_group.Get_Id()); - } - else if(cur_group.spTree.length === 1) - { - sp = cur_group.spTree[0]; - hc = sp.spPr.xfrm.extX/2; - vc = sp.spPr.xfrm.extY/2; - xc = sp.transform.TransformPointX(hc, vc); - yc = sp.transform.TransformPointY(hc, vc); - rel_xc = cur_group.group.invertTransform.TransformPointX(xc, yc); - rel_yc = cur_group.group.invertTransform.TransformPointY(xc, yc); - sp.spPr.xfrm.setOffX(rel_xc - hc); - sp.spPr.xfrm.setOffY(rel_yc - vc); - sp.spPr.xfrm.setRot(AscFormat.normalizeRotate(cur_group.rot + sp.rot)); - sp.spPr.xfrm.setFlipH(cur_group.spPr.xfrm.flipH === true ? !(sp.spPr.xfrm.flipH === true) : sp.spPr.xfrm.flipH === true); - sp.spPr.xfrm.setFlipV(cur_group.spPr.xfrm.flipV === true ? !(sp.spPr.xfrm.flipV === true) : sp.spPr.xfrm.flipV === true); - sp.setGroup(cur_group.group); - for(j = 0; j < cur_group.group.spTree.length; ++j) - { - if(cur_group.group.spTree[j] === cur_group) - { - cur_group.group.addToSpTree(j, sp); - cur_group.group.removeFromSpTree(cur_group.Get_Id()); - } - } - } - } - else - { - var para_drawing = cur_group.parent; - if(cur_group.spTree.length === 0) - { - this.resetInternalSelection(); - this.remove(); - return; - } - else if(cur_group.spTree.length === 1) - { - sp = cur_group.spTree[0]; - sp.spPr.xfrm.setOffX(0); - sp.spPr.xfrm.setOffY(0); - sp.spPr.xfrm.setRot(AscFormat.normalizeRotate(cur_group.rot + sp.rot)); - sp.spPr.xfrm.setFlipH(cur_group.spPr.xfrm.flipH === true ? !(sp.spPr.xfrm.flipH === true) : sp.spPr.xfrm.flipH === true); - sp.spPr.xfrm.setFlipV(cur_group.spPr.xfrm.flipV === true ? !(sp.spPr.xfrm.flipV === true) : sp.spPr.xfrm.flipV === true); - sp.setGroup(null); - para_drawing.Set_GraphicObject(sp); - sp.setParent(para_drawing); - this.resetSelection(); - this.selectObject(sp, cur_group.selectStartPage); - new_x = sp.transform.tx; - new_y = sp.transform.ty; - para_drawing.CheckWH(); - if(!para_drawing.Is_Inline()) - { - para_drawing.Set_XY(new_x, new_y, para_drawing.Get_ParentParagraph(), para_drawing.GraphicObj.selectStartPage, true); - } - this.document.Recalculate(); - return; - } - else - { - this.resetInternalSelection(); - var new_x, new_y; - // var pos = cur_group.getBoundsPos(); - var oPos = cur_group.updateCoordinatesAfterInternalResize(); - - var g_pos_x = 0, g_pos_y = 0; - if(oPos) - { - if(AscFormat.isRealNumber(oPos.posX)) - { - g_pos_x = oPos.posX; - } - if(AscFormat.isRealNumber(oPos.posY)) - { - g_pos_y = oPos.posY; - } - } - new_x = cur_group.x + g_pos_x; - new_y = cur_group.y + g_pos_y; - - cur_group.spPr.xfrm.setOffX(0); - cur_group.spPr.xfrm.setOffY(0); - para_drawing.CheckWH(); - para_drawing.Set_XY(new_x, new_y, cur_group.parent.Get_ParentParagraph(), cur_group.selectStartPage, false);//X, Y, Paragraph, PageNum, bResetAlign - this.document.Recalculate(); - break; - } - - } - } - } + return; } } else if(this.selection.chartSelection)