5445 lines
178 KiB
JavaScript
5445 lines
178 KiB
JavaScript
/*
|
||
* (c) Copyright Ascensio System SIA 2010-2024
|
||
*
|
||
* This program is a free software product. You can redistribute it and/or
|
||
* modify it under the terms of the GNU Affero General Public License (AGPL)
|
||
* version 3 as published by the Free Software Foundation. In accordance with
|
||
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
|
||
* that Ascensio System SIA expressly excludes the warranty of non-infringement
|
||
* of any third-party rights.
|
||
*
|
||
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
|
||
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
|
||
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
|
||
*
|
||
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
|
||
* street, Riga, Latvia, EU, LV-1050.
|
||
*
|
||
* The interactive user interfaces in modified source and object code versions
|
||
* of the Program must display Appropriate Legal Notices, as required under
|
||
* Section 5 of the GNU AGPL version 3.
|
||
*
|
||
* Pursuant to Section 7(b) of the License you must retain the original Product
|
||
* logo when distributing the program. Pursuant to Section 7(e) we decline to
|
||
* grant you any rights under trademark law for use of our trademarks.
|
||
*
|
||
* All the Product's GUI elements, including illustrations and icon sets, as
|
||
* well as technical writing content are licensed under the terms of the
|
||
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
|
||
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
||
*
|
||
*/
|
||
|
||
"use strict";
|
||
|
||
(/**
|
||
* @param {jQuery} $
|
||
* @param {Window} window
|
||
* @param {undefined} undefined
|
||
*/
|
||
function ($, window, undefined) {
|
||
|
||
/*
|
||
* Import
|
||
* -----------------------------------------------------------------------------
|
||
*/
|
||
var prot;
|
||
var c_oAscBorderStyles = Asc.c_oAscBorderStyles;
|
||
var c_oAscMaxCellOrCommentLength = Asc.c_oAscMaxCellOrCommentLength;
|
||
var doc = window.document;
|
||
var copyPasteUseBinary = true;
|
||
var CopyPasteCorrectString = AscCommon.CopyPasteCorrectString;
|
||
|
||
var c_oSpecialPasteProps = Asc.c_oSpecialPasteProps;
|
||
|
||
var c_MaxStringLength = 536870888;
|
||
var notSupportExternalReferenceFileFormat = {"csv": 1};
|
||
|
||
function number2color(n) {
|
||
if (typeof (n) === "string" && n.indexOf("rgb") > -1)
|
||
return n;
|
||
return "rgb(" + (n >> 16 & 0xFF) + "," + (n >> 8 & 0xFF) + "," + (n & 0xFF) + ")";
|
||
}
|
||
|
||
function CSpecialPasteProps() {
|
||
this.cellStyle = null;
|
||
this.val = null;
|
||
this.numFormat = null;
|
||
this.formula = null;
|
||
this.font = null;
|
||
this.alignVertical = null;
|
||
this.alignHorizontal = null;
|
||
this.fontSize = null;
|
||
this.fontName = null;
|
||
this.merge = null;
|
||
this.borders = null;
|
||
this.wrap = null;
|
||
this.fill = null;
|
||
this.angle = null;
|
||
this.hyperlink = null;
|
||
|
||
this.format = null;
|
||
this.formatTable = null;
|
||
|
||
this.images = null;
|
||
|
||
this.width = null;
|
||
this.transpose = null;
|
||
|
||
this.comment = null;
|
||
|
||
//for paste text as csv
|
||
this.advancedOptions = null;
|
||
|
||
this.operation = null;
|
||
this.skipBlanks = null;
|
||
|
||
this.init();
|
||
}
|
||
|
||
CSpecialPasteProps.prototype = {
|
||
|
||
constructor: CSpecialPasteProps,
|
||
|
||
init: function () {
|
||
this.setBaseOptions();
|
||
},
|
||
|
||
setBaseOptions: function (onlyMain) {
|
||
this.cellStyle = true;
|
||
this.val = true;
|
||
this.numFormat = true;
|
||
this.formula = true;
|
||
this.font = true;
|
||
this.alignVertical = true;
|
||
this.alignHorizontal = true;
|
||
this.fontSize = true;
|
||
this.fontName = true;
|
||
this.merge = true;
|
||
this.borders = true;
|
||
this.wrap = true;
|
||
this.fill = true;
|
||
this.angle = true;
|
||
this.hyperlink = true;
|
||
|
||
this.format = true;
|
||
this.formatTable = true;
|
||
|
||
this.images = true;
|
||
|
||
this.width = null;
|
||
this.transpose = null;
|
||
|
||
this.comment = true;
|
||
this.property = null;
|
||
|
||
this.advancedOptions = null;
|
||
|
||
if (!onlyMain) {
|
||
this.operation = null;
|
||
this.skipBlanks = null;
|
||
}
|
||
},
|
||
_clean: function () {
|
||
this.cellStyle = null;
|
||
this.val = null;
|
||
this.numFormat = null;
|
||
this.formula = null;
|
||
this.font = null;
|
||
this.alignVertical = null;
|
||
this.alignHorizontal = null;
|
||
this.fontSize = null;
|
||
this.fontName = null;
|
||
this.merge = null;
|
||
this.borders = null;
|
||
this.wrap = null;
|
||
this.fill = null;
|
||
this.angle = null;
|
||
this.hyperlink = null;
|
||
|
||
this.format = null;
|
||
this.formatTable = null;
|
||
|
||
this.images = null;
|
||
|
||
this.width = null;
|
||
this.transpose = null;
|
||
|
||
this.comment = null;
|
||
|
||
//for paste text as csv
|
||
this.advancedOptions = null;
|
||
|
||
//this.operation = null;
|
||
this.skipBlanks = null;
|
||
},
|
||
asc_setProps: function (props) {
|
||
this.setBaseOptions(true);
|
||
this.property = props;
|
||
switch (props) {
|
||
case c_oSpecialPasteProps.paste: {
|
||
break;
|
||
}
|
||
case c_oSpecialPasteProps.pasteOnlyFormula: {
|
||
//только формулы(или значения)
|
||
this._clean();
|
||
this.formula = true;
|
||
this.val = true;
|
||
|
||
break;
|
||
}
|
||
case c_oSpecialPasteProps.formulaNumberFormat: {
|
||
//только формулы(или значения) и числовой формат
|
||
this._clean();
|
||
this.formula = true;
|
||
this.numFormat = true;
|
||
this.val = true;
|
||
|
||
break;
|
||
}
|
||
case c_oSpecialPasteProps.formulaAllFormatting: {
|
||
//формулы и формат
|
||
break;
|
||
}
|
||
case c_oSpecialPasteProps.formulaWithoutBorders: {
|
||
//всё кроме бордеров
|
||
this.borders = null;
|
||
break;
|
||
}
|
||
case c_oSpecialPasteProps.formulaColumnWidth: {
|
||
this.width = true;
|
||
break;
|
||
}
|
||
case c_oSpecialPasteProps.mergeConditionalFormating: {
|
||
break;
|
||
}
|
||
case c_oSpecialPasteProps.pasteOnlyValues: {
|
||
//только значения(вместо формул также вставляются значения)
|
||
this._clean();
|
||
this.val = true;
|
||
break;
|
||
}
|
||
case c_oSpecialPasteProps.valueNumberFormat: {
|
||
this._clean();
|
||
this.val = true;
|
||
this.numFormat = true;
|
||
break;
|
||
}
|
||
case c_oSpecialPasteProps.valueAllFormating: {
|
||
//все кроме формул
|
||
this.formula = null;
|
||
this.formatTable = null;
|
||
break;
|
||
}
|
||
case c_oSpecialPasteProps.pasteOnlyFormating: {
|
||
this.formula = null;
|
||
this.val = null;
|
||
this.formatTable = null;
|
||
break;
|
||
}
|
||
case c_oSpecialPasteProps.transpose: {
|
||
this.transpose = true;
|
||
break;
|
||
}
|
||
case c_oSpecialPasteProps.link: {
|
||
this._clean();
|
||
break;
|
||
}
|
||
case c_oSpecialPasteProps.picture: {
|
||
break;
|
||
}
|
||
case c_oSpecialPasteProps.linkedPicture: {
|
||
break;
|
||
}
|
||
case c_oSpecialPasteProps.sourceformatting: {
|
||
break;
|
||
}
|
||
case c_oSpecialPasteProps.destinationFormatting: {
|
||
//только значения(вместо формул также вставляются значения)
|
||
this._clean();
|
||
this.val = true;
|
||
//картинки из word сохраняем в данной ситуации
|
||
if (window['AscCommon'].g_specialPasteHelper.specialPasteData.pasteFromWord) {
|
||
this.images = true;
|
||
}
|
||
|
||
break;
|
||
}
|
||
case c_oSpecialPasteProps.comments: {
|
||
this._clean();
|
||
this.comment = true;
|
||
break;
|
||
}
|
||
case c_oSpecialPasteProps.columnWidth: {
|
||
this._clean();
|
||
this.width = true;
|
||
break;
|
||
}
|
||
}
|
||
},
|
||
asc_getProps: function () {
|
||
return this.property;
|
||
},
|
||
asc_setAdvancedOptions: function (props) {
|
||
this.advancedOptions = props;
|
||
},
|
||
asc_getAdvancedOptions: function () {
|
||
return this.advancedOptions;
|
||
},
|
||
asc_setOperation: function (val) {
|
||
this.operation = val;
|
||
},
|
||
asc_getOperation: function () {
|
||
return this.operation;
|
||
},
|
||
asc_setTranspose: function (val) {
|
||
this.transpose = val;
|
||
},
|
||
asc_setSkipBlanks: function (val) {
|
||
this.skipBlanks = val;
|
||
},
|
||
asc_getTableAllowed: function () {
|
||
return this.formatTable;
|
||
}
|
||
};
|
||
|
||
/** @constructor */
|
||
function Clipboard() {
|
||
this.copyProcessor = new CopyProcessorExcel();
|
||
this.pasteProcessor = new PasteProcessorExcel();
|
||
|
||
return this;
|
||
}
|
||
|
||
Clipboard.prototype.checkCopyToClipboard = function (ws, _clipboard, _formats) {
|
||
var _data = null;
|
||
var wb = window["Asc"]["editor"].wb;
|
||
|
||
window['AscCommon'].g_specialPasteHelper.SpecialPasteButton_Hide();
|
||
ws.handlers.trigger("cleanCutData", true);
|
||
wb.handlers.trigger("cleanCopyData", true);
|
||
|
||
if (wb.getCellEditMode())//text in cell
|
||
{
|
||
//only TEXT
|
||
var fragments = wb.cellEditor.copySelection();
|
||
|
||
if (null !== fragments) {
|
||
_data = AscCommonExcel.getFragmentsText(fragments);
|
||
}
|
||
|
||
if (null !== _data) {
|
||
_clipboard.pushData(AscCommon.c_oAscClipboardDataFormat.Text, _data);
|
||
}
|
||
} else {
|
||
if (!this.copyProcessor.canCopy(ws)) {
|
||
var selectedDrawings = ws.objectRender.getSelectedGraphicObjects();
|
||
if (0 === selectedDrawings.length) {
|
||
ws.handlers.trigger("onErrorEvent", Asc.c_oAscError.ID.CopyMultiselectAreaError,
|
||
Asc.c_oAscError.Level.NoCritical);
|
||
return;
|
||
}
|
||
}
|
||
|
||
wb.model.checkProtectedValue = true;
|
||
|
||
//ignore hidden rows
|
||
var activeCell = ws.model.selectionRange.activeCell.clone();
|
||
var activeRange, selectionRange;
|
||
if (1 !== ws.model.selectionRange.ranges.length) {
|
||
selectionRange = new AscCommonExcel.MultiplyRange(ws.model.selectionRange.ranges).getUnionRange();
|
||
activeRange = ws.model.getRange3(selectionRange.r1, selectionRange.c1, selectionRange.r2, selectionRange.c2);
|
||
} else {
|
||
activeRange = ws.getSelectedRange();
|
||
selectionRange = ws.model.selectionRange.getLast();
|
||
}
|
||
|
||
|
||
//TODO игнорировать нужно и формулы и скрытые строчки в случае, если селект их задевает + стандартные условия в bIsExcludeHiddenRows
|
||
if (ws.model.autoFilters.bIsExcludeHiddenRows(selectionRange, activeCell, true)) {
|
||
ws.model.excludeHiddenRows(true);
|
||
ws.model.ignoreWriteFormulas(true);
|
||
}
|
||
|
||
|
||
// IMAGE
|
||
if (_formats & AscCommon.c_oAscClipboardDataFormat.Image) {
|
||
let imageData = this.drawSelectedArea(ws, true);
|
||
if (imageData) {
|
||
_clipboard.pushData(AscCommon.c_oAscClipboardDataFormat.Image, imageData);
|
||
}
|
||
}
|
||
|
||
//TEXT
|
||
if (AscCommon.c_oAscClipboardDataFormat.Text & _formats) {
|
||
_data = this.copyProcessor.getText(activeRange, ws);
|
||
|
||
if (null !== _data) {
|
||
_clipboard.pushData(AscCommon.c_oAscClipboardDataFormat.Text, _data);
|
||
}
|
||
}
|
||
//HTML
|
||
if (AscCommon.c_oAscClipboardDataFormat.Html & _formats) {
|
||
_data = this.copyProcessor.getHtml(activeRange, ws);
|
||
|
||
if (null !== _data && "" !== _data.html) {
|
||
_clipboard.pushData(AscCommon.c_oAscClipboardDataFormat.Html, _data.html)
|
||
}
|
||
}
|
||
//INTERNAL
|
||
if (AscCommon.c_oAscClipboardDataFormat.Internal & _formats) {
|
||
if (window["NATIVE_EDITOR_ENJINE"]) {
|
||
_data = this.copyProcessor.getBinaryForMobile();
|
||
} else {
|
||
if (_data && _data.base64) {
|
||
_data = _data.base64;
|
||
} else {
|
||
_data = this.copyProcessor.getBinaryForCopy(ws.model, ws.objectRender);
|
||
}
|
||
}
|
||
|
||
if (null !== _data) {
|
||
_clipboard.pushData(AscCommon.c_oAscClipboardDataFormat.Internal, _data);
|
||
}
|
||
}
|
||
|
||
ws.model.excludeHiddenRows(false);
|
||
ws.model.ignoreWriteFormulas(false);
|
||
wb.model.checkProtectedValue = false;
|
||
}
|
||
|
||
if (ws && ws.workbook && !ws.workbook.getCellEditMode()) {
|
||
if (AscCommon.g_clipboardBase.bCut) {
|
||
//в данном случае не вырезаем, а записываем
|
||
if (!ws.isNeedSelectionCut() && false === ws.isMultiSelect()) {
|
||
ws.workbook.cutIdSheet = ws.model.Id;
|
||
ws.setCutRange([ws.model.selectionRange.getLast()]);
|
||
}
|
||
} else if (!ws.objectRender.selectedGraphicObjectsExists()) {
|
||
ws.setCutRange(ws.model.selectionRange.ranges);
|
||
}
|
||
}
|
||
};
|
||
|
||
Clipboard.prototype.pasteData = function (ws, _format, data1, data2, text_data, bIsSpecialPaste, doNotShowButton, isPasteAll, callback) {
|
||
var t = this;
|
||
var wb = window["Asc"]["editor"].wb;
|
||
//if open range dialog - return
|
||
if (ws.getSelectionDialogMode() && (!wb.getCellEditMode() || wb.isWizardMode)) {
|
||
if (callback) {
|
||
callback(false);
|
||
}
|
||
return;
|
||
}
|
||
var cellEditor = wb.cellEditor;
|
||
t.pasteProcessor.clean();
|
||
|
||
// Set the paste callback
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = callback;
|
||
|
||
if (!window['AscCommon'].g_specialPasteHelper.specialPasteStart) {
|
||
window['AscCommon'].g_specialPasteHelper.SpecialPasteButton_Hide();
|
||
}
|
||
window['AscCommon'].g_specialPasteHelper.Paste_Process_Start(doNotShowButton);
|
||
|
||
if (!bIsSpecialPaste && !wb.getCellEditMode()) {
|
||
window['AscCommon'].g_specialPasteHelper.specialPasteData.activeRange = ws.model.selectionRange.clone(ws.model);
|
||
window['AscCommon'].g_specialPasteHelper.specialPasteData.pasteFromWord = false;
|
||
}
|
||
|
||
switch (_format) {
|
||
case AscCommon.c_oAscClipboardDataFormat.HtmlElement: {
|
||
if (wb.getCellEditMode()) {
|
||
//fragments = пока только для плагина вставка символов
|
||
var fragments;
|
||
if (window['AscCommon'].g_clipboardBase.bSaveFormat) {
|
||
//проверяем иероглифы внутри
|
||
fragments = this.pasteProcessor._getFragmentsFromHtml(data1);
|
||
}
|
||
if (fragments) {
|
||
var pasteFragments = fragments.fragments;
|
||
var newFonts = fragments.fonts;
|
||
ws._loadFonts(newFonts, function () {
|
||
cellEditor.paste(pasteFragments);
|
||
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
|
||
|
||
//TODO пересмотреть! по возможности вызывать из меню!
|
||
//при использовании рекдактора ячейки в качестве редактора HF
|
||
//в функции onLongActionEnd(ф-я меню) не вызывается asc_enableKeyEvents(true)
|
||
//из-за этого enableKeyEvents остаётся выставленным в false
|
||
//поэтому приходится вызывать здесь, после того, как пройдет загрузка шрифтов
|
||
|
||
if (cellEditor.getMenuEditorMode()) {
|
||
window["Asc"]["editor"].asc_enableKeyEvents(true);
|
||
}
|
||
});
|
||
|
||
} else {
|
||
this._pasteTextInCellEditor(text_data || data1.innerText);
|
||
}
|
||
} else {
|
||
t.pasteProcessor.editorPasteExec(ws, data1, null, callback);
|
||
}
|
||
|
||
break;
|
||
}
|
||
case AscCommon.c_oAscClipboardDataFormat.Internal: {
|
||
if (wb.getCellEditMode()) {
|
||
if (null !== text_data && undefined !== text_data) {
|
||
this._pasteTextInCellEditor(text_data);
|
||
} else {
|
||
this._pasteTextInCellEditor(this.pasteProcessor.pasteFromBinary(ws, data1, true));
|
||
}
|
||
} else {
|
||
t.pasteProcessor.pasteFromBinary(ws, data1, null, isPasteAll);
|
||
}
|
||
|
||
break;
|
||
}
|
||
case AscCommon.c_oAscClipboardDataFormat.Text: {
|
||
if (wb.getCellEditMode()) {
|
||
this._pasteTextInCellEditor(data1);
|
||
} else {
|
||
//не показываем иконку с/в если вставляется только текст
|
||
//window['AscCommon'].g_specialPasteHelper.Special_Paste_Hide_Button();
|
||
t.pasteProcessor.pasteTextOnSheet(ws, data1);
|
||
}
|
||
wb.handlers.trigger("cleanCopyData", true);
|
||
break;
|
||
}
|
||
}
|
||
|
||
//ws.handlers.trigger("cleanCutData", true);
|
||
|
||
if (!bIsSpecialPaste) {
|
||
window['AscCommon'].g_specialPasteHelper.specialPasteData._format = _format;
|
||
window['AscCommon'].g_specialPasteHelper.specialPasteData.data1 = data1;
|
||
window['AscCommon'].g_specialPasteHelper.specialPasteData.data2 = data2;
|
||
window['AscCommon'].g_specialPasteHelper.specialPasteData.text_data = text_data;
|
||
}
|
||
};
|
||
|
||
Clipboard.prototype._pasteTextInCellEditor = function (text) {
|
||
if (!text) {
|
||
return;
|
||
}
|
||
var editor = window["Asc"]["editor"];
|
||
AscFonts.FontPickerByCharacter.getFontsByString(text);
|
||
editor._loadFonts([], function () {
|
||
editor.wb.skipHelpSelector = true;
|
||
editor.wb.cellEditor.pasteText(text);
|
||
AscCommon.g_specialPasteHelper.Paste_Process_End();
|
||
editor.wb.skipHelpSelector = false;
|
||
|
||
if (editor.wb.cellEditor.getMenuEditorMode()) {
|
||
editor.asc_enableKeyEvents(true);
|
||
}
|
||
});
|
||
};
|
||
|
||
Clipboard.prototype.drawSelectedArea = function (ws, opt_get_bytes) {
|
||
let activeRange = ws.model.selectionRange.getLast();
|
||
|
||
// Canvas limitations for different browsers:
|
||
// Chrome/Edge: 32767px x 32767px
|
||
// Firefox: 32767px x 32767px
|
||
// Safari: 4096px x 4096px (most restrictive)
|
||
// IE9+: 8192px x 8192px
|
||
// IE8: 4096px x 4096px
|
||
|
||
let maxCanvasHeight, maxCanvasWidth, maxCanvasArea;
|
||
|
||
if (AscCommon.AscBrowser.isIE) {
|
||
maxCanvasHeight = 8192;
|
||
maxCanvasWidth = 8192;
|
||
maxCanvasArea = 8192 * 8192;
|
||
} else if (AscCommon.AscBrowser.isSafariMacOs) {
|
||
// Safari (not Chrome)
|
||
maxCanvasHeight = 4096;
|
||
maxCanvasWidth = 4096;
|
||
maxCanvasArea = 4096 * 4096;
|
||
} else {
|
||
// Chrome, Firefox, Edge and other modern browsers
|
||
// Reducing limits. Experimentally determined that when height exceeds 16383px, text rendering speed (fillText) drops by tens of times
|
||
// Setting limits with safety margin
|
||
maxCanvasHeight = 8192;
|
||
maxCanvasWidth = 8192;
|
||
maxCanvasArea = 8192 * 8192;
|
||
}
|
||
|
||
let estimatedHeight = ws._getRowTop(activeRange.r2 + 1) - ws._getRowTop(activeRange.r1);
|
||
let estimatedWidth = ws._getColLeft(activeRange.c2 + 1) - ws._getColLeft(activeRange.c1);
|
||
|
||
// Check height limitations
|
||
if (estimatedHeight > maxCanvasHeight) {
|
||
let currentHeight = 0;
|
||
let maxRow = activeRange.r1;
|
||
|
||
for (let row = activeRange.r1; row <= activeRange.r2; row++) {
|
||
let rowHeight = ws._getRowHeight(row);
|
||
if (currentHeight + rowHeight > maxCanvasHeight) {
|
||
break;
|
||
}
|
||
currentHeight += rowHeight;
|
||
maxRow = row;
|
||
}
|
||
|
||
activeRange = new Asc.Range(activeRange.c1, activeRange.r1, activeRange.c2, maxRow);
|
||
estimatedHeight = ws._getRowTop(activeRange.r2 + 1) - ws._getRowTop(activeRange.r1);
|
||
}
|
||
|
||
// Check width limitations
|
||
if (estimatedWidth > maxCanvasWidth) {
|
||
let currentWidth = 0;
|
||
let maxCol = activeRange.c1;
|
||
|
||
for (let col = activeRange.c1; col <= activeRange.c2; col++) {
|
||
let colWidth = ws._getColLeft(col + 1) - ws._getColLeft(col);
|
||
if (currentWidth + colWidth > maxCanvasWidth) {
|
||
break;
|
||
}
|
||
currentWidth += colWidth;
|
||
maxCol = col;
|
||
}
|
||
|
||
activeRange = new Asc.Range(activeRange.c1, activeRange.r1, maxCol, activeRange.r2);
|
||
estimatedWidth = ws._getColLeft(activeRange.c2 + 1) - ws._getColLeft(activeRange.c1);
|
||
}
|
||
|
||
//TODO cut by max size
|
||
if (estimatedHeight * estimatedWidth >= maxCanvasArea) {
|
||
return;
|
||
}
|
||
|
||
let base64;
|
||
let ctx = ws.workbook.printForCopyPaste(ws, activeRange, true);
|
||
if (ctx && ctx.canvas) {
|
||
base64 = ctx.canvas.toDataURL("image/png");
|
||
}
|
||
|
||
if (opt_get_bytes && base64) {
|
||
// Get base64 data without header
|
||
let base64Data = base64.split(',')[1];
|
||
|
||
// Convert base64 to binary
|
||
let byteCharacters = atob(base64Data);
|
||
let byteArrays = [];
|
||
|
||
for (let offset = 0; offset < byteCharacters.length; offset += 512) {
|
||
let slice = byteCharacters.slice(offset, offset + 512);
|
||
let byteNumbers = new Array(slice.length);
|
||
|
||
for (let i = 0; i < slice.length; i++) {
|
||
byteNumbers[i] = slice.charCodeAt(i);
|
||
}
|
||
|
||
let byteArray = new Uint8Array(byteNumbers);
|
||
byteArrays.push(byteArray);
|
||
}
|
||
|
||
return byteArrays;
|
||
}
|
||
|
||
// Get image data
|
||
return base64;
|
||
};
|
||
|
||
|
||
function CCopyPasteExcelOptions()
|
||
{
|
||
this.isExcel = true;
|
||
this.wb = null;
|
||
this.cachedWbBinaryData = null;
|
||
this.oldWorkbookCoreParameters = {};
|
||
}
|
||
CCopyPasteExcelOptions.prototype.setOldWorkbookCoreParameters = function (oldCreator, oldIdentifier, oldLanguage, oldTitle, oldCategory, oldContentStatus)
|
||
{
|
||
this.oldWorkbookCoreParameters.oldCreator = oldCreator;
|
||
this.oldWorkbookCoreParameters.oldIdentifier = oldIdentifier;
|
||
this.oldWorkbookCoreParameters.oldLanguage = oldLanguage;
|
||
this.oldWorkbookCoreParameters.oldTitle = oldTitle;
|
||
this.oldWorkbookCoreParameters.oldCategory = oldCategory;
|
||
this.oldWorkbookCoreParameters.oldContentStatus = oldContentStatus;
|
||
};
|
||
CCopyPasteExcelOptions.prototype.getCachedWorkbookBinaryData = function ()
|
||
{
|
||
if (!this.cachedWbBinaryData)
|
||
{
|
||
if (this.wb)
|
||
{
|
||
const oOldPPTXWriter = AscCommon.pptx_content_writer;
|
||
AscCommon.pptx_content_writer = new AscCommon.CPPTXContentWriter();
|
||
|
||
const newCreator = this.wb.Core.creator;
|
||
const newIdentifier = this.wb.Core.identifier;
|
||
const newLanguage = this.wb.Core.language;
|
||
const newTitle = this.wb.Core.title;
|
||
const newCategory = this.wb.Core.category;
|
||
const newContentStatus = this.wb.Core.contentStatus;
|
||
this.wb.Core.creator = this.oldWorkbookCoreParameters.oldCreator;
|
||
this.wb.Core.identifier = this.oldWorkbookCoreParameters.oldIdentifier;
|
||
this.wb.Core.language = this.oldWorkbookCoreParameters.oldLanguage;
|
||
this.wb.Core.title = this.oldWorkbookCoreParameters.oldTitle;
|
||
this.wb.Core.category = this.oldWorkbookCoreParameters.oldCategory;
|
||
this.wb.Core.contentStatus = this.oldWorkbookCoreParameters.oldContentStatus;
|
||
|
||
|
||
var oBinaryFileWriter = new AscCommonExcel.BinaryFileWriter(this.wb);
|
||
this.cachedWbBinaryData = oBinaryFileWriter.Write(true, false, true);
|
||
|
||
this.wb.Core.creator = newCreator;
|
||
this.wb.Core.identifier = newIdentifier;
|
||
this.wb.Core.language = newLanguage;
|
||
this.wb.Core.title = newTitle;
|
||
this.wb.Core.category = newCategory;
|
||
this.wb.Core.contentStatus = newContentStatus;
|
||
|
||
AscCommon.pptx_content_writer = oOldPPTXWriter;
|
||
}
|
||
}
|
||
return this.cachedWbBinaryData;
|
||
};
|
||
CCopyPasteExcelOptions.prototype.getChartRangeWithReplaceDefinedName = function(sRange) {
|
||
const wb = this.wb;
|
||
if (wb && sRange && sRange.includes("_xlchart")) {
|
||
const definedName = wb.getDefinesNames(sRange);
|
||
return definedName ? definedName.ref : sRange;
|
||
}
|
||
return sRange;
|
||
};
|
||
|
||
|
||
function CopyProcessorExcel() {
|
||
|
||
}
|
||
|
||
CopyProcessorExcel.prototype = {
|
||
|
||
constructor: CopyProcessorExcel,
|
||
|
||
getHtml: function (range, worksheet) {
|
||
var t = this;
|
||
var sBase64 = null;
|
||
|
||
var objectRender = worksheet.objectRender;
|
||
var isIntoShape = objectRender.controller.getTargetDocContent();
|
||
|
||
History.TurnOff();
|
||
//use binary strings
|
||
if (copyPasteUseBinary) {
|
||
sBase64 = this.getBinaryForCopy(worksheet.model, worksheet.objectRender);
|
||
}
|
||
History.TurnOn();
|
||
|
||
var innerHtml = t._generateHtml(range, worksheet, isIntoShape, sBase64);
|
||
if (innerHtml === false) {
|
||
return null;
|
||
}
|
||
|
||
return {base64: sBase64, html: innerHtml};
|
||
},
|
||
|
||
getBinaryForCopy: function (wsModel, objectRender, activeRange, selectAll, ignoreCopyPaste, allSelectedTabs) {
|
||
let isIntoShape = !selectAll && objectRender && objectRender.controller ? objectRender.controller.getTargetDocContent() : null;
|
||
let sBase64 = null;
|
||
|
||
if (isIntoShape) {
|
||
//в данному случае пишем бинарник с меткой pptData - с префиксом xlsData отдельно параграфы записать не получится
|
||
sBase64 = this._getBinaryShapeContent(isIntoShape);
|
||
} else {
|
||
|
||
AscFormat.ExecuteNoHistory(function () {
|
||
pptx_content_writer.Start_UseFullUrl();
|
||
|
||
let unselectedIndexes = [];
|
||
if (selectAll) {
|
||
activeRange = new Asc.Range(0, 0, AscCommon.gc_nMaxCol - 1, AscCommon.gc_nMaxRow - 1);
|
||
|
||
for (let i = 0; i < wsModel.Drawings.length; i++) {
|
||
if (!wsModel.Drawings[i].graphicObject.selected) {
|
||
unselectedIndexes[i] = true;
|
||
wsModel.Drawings[i].graphicObject.selected = true;
|
||
}
|
||
}
|
||
}
|
||
|
||
let selectionRange;
|
||
if (activeRange) {
|
||
selectionRange = activeRange;
|
||
} else {
|
||
if (1 !== wsModel.selectionRange.ranges.length) {
|
||
selectionRange = new AscCommonExcel.MultiplyRange(wsModel.selectionRange.ranges).getUnionRange();
|
||
} else {
|
||
selectionRange = wsModel.selectionRange.getLast();
|
||
}
|
||
}
|
||
let maxRowCol = this._getRangeMaxRowCol(wsModel, selectionRange);
|
||
if (null !== maxRowCol) {
|
||
if (maxRowCol.col < selectionRange.c1) {
|
||
maxRowCol.col = selectionRange.c1;
|
||
}
|
||
if (maxRowCol.row < selectionRange.r1) {
|
||
maxRowCol.row = selectionRange.r1;
|
||
}
|
||
selectionRange = new Asc.Range(selectionRange.c1, selectionRange.r1, maxRowCol.col, maxRowCol.row);
|
||
}
|
||
|
||
let wb = wsModel.workbook;
|
||
let isNullCore = false;
|
||
if (!wb.Core) {
|
||
isNullCore = true;
|
||
wb.Core = new window['AscCommon'].CCore();
|
||
}
|
||
|
||
//подменяем identifier/creator для того, чтобы протащить id
|
||
let oldCreator = wb.Core.creator;
|
||
let oldIdentifier = wb.Core.identifier;
|
||
let oldLanguage = wb.Core.language;
|
||
let oldTitle = wb.Core.title;
|
||
let oldCategory = wb.Core.category;
|
||
let oldContentStatus = wb.Core.contentStatus;
|
||
|
||
wb.Core.creator = wb.oApi && wb.oApi.CoAuthoringApi ? wb.oApi.CoAuthoringApi.getUserConnectionId() : null;
|
||
wb.Core.identifier = wb.oApi && wb.oApi.DocInfo ? wb.oApi.DocInfo.Id : null;
|
||
|
||
//для внешних данных необходимо протащить docInfo->ReferenceData
|
||
//пока беру данные поля, поскольку для копипаста они не используются. по названию не особо совпадают - пересмотреть
|
||
let isLocalDesktop = window["AscDesktopEditor"] && window["AscDesktopEditor"]["IsLocalFile"]();
|
||
if (isLocalDesktop && window["AscDesktopEditor"]["LocalFileGetSaved"]()) {
|
||
wb.Core.contentStatus = window["AscDesktopEditor"]["LocalFileGetSourcePath"]();
|
||
wb.Core.category = null;
|
||
} else if (wb.oApi && wb.oApi.DocInfo && !notSupportExternalReferenceFileFormat[wb.oApi.DocInfo.Format]) {
|
||
wb.Core.contentStatus = wb.oApi.DocInfo.ReferenceData ? wb.oApi.DocInfo.ReferenceData["fileKey"] : null;
|
||
wb.Core.category = wb.oApi.DocInfo.ReferenceData ? wb.oApi.DocInfo.ReferenceData["instanceId"] : null;
|
||
}
|
||
|
||
wb.Core.title = wb.oApi && wb.oApi.DocInfo && wb.oApi.DocInfo.Title ? wb.oApi.DocInfo.Title : null;
|
||
|
||
//записываю изображение выделенного фрагмента. пока только для изоюражений
|
||
//выбрал для этого поле subject
|
||
let oldSubject = wb.Core.subject;
|
||
let objectRender = Asc.editor.wb.getWorksheet().objectRender;
|
||
let _imgProperty = objectRender && objectRender.controller && objectRender.controller.getSelectionImage();
|
||
if (_imgProperty) {
|
||
let _base64 = _imgProperty.asc_getImageUrl();
|
||
let _width = _imgProperty.Width;
|
||
let _height = _imgProperty.Height;
|
||
wb.Core.subject = _width + ";" + _height + ";" + _base64;
|
||
}
|
||
|
||
//так же необходимо протащить локаль, для этого использую поля language
|
||
//и записываю туда номер локали, предварительно конвертируя его в строку
|
||
//пока буду использовать его только при вставке в документы, а в документах устанавливать -> AscCommon.setCurrentCultureInfo(val)
|
||
let locale = wb.oApi ? wb.oApi.asc_getLocale() : null;
|
||
wb.Core.language = (undefined !== locale && null !== locale) ? locale.toString() : null;
|
||
|
||
|
||
//WRITE
|
||
const oCopyPaste = !ignoreCopyPaste ? selectionRange : false;
|
||
const oBinaryFileWriter = new AscCommonExcel.BinaryFileWriter(wb, !ignoreCopyPaste ? selectionRange : false);
|
||
if (oCopyPaste)
|
||
{
|
||
const oCopyPasteOptions = new CCopyPasteExcelOptions();
|
||
oCopyPasteOptions.wb = wb;
|
||
oCopyPasteOptions.setOldWorkbookCoreParameters(oldCreator, oldIdentifier, oldLanguage, oldTitle, oldCategory, oldContentStatus);
|
||
pptx_content_writer.Start_CopyPaste(oCopyPasteOptions);
|
||
}
|
||
sBase64 = "xslData;" + oBinaryFileWriter.Write();
|
||
pptx_content_writer.End_UseFullUrl();
|
||
if (oCopyPaste)
|
||
{
|
||
pptx_content_writer.End_CopyPaste();
|
||
}
|
||
if (selectAll) {
|
||
for (let i in unselectedIndexes) {
|
||
wsModel.Drawings[i].graphicObject.selected = false;
|
||
}
|
||
}
|
||
|
||
if (isNullCore) {
|
||
wb.Core = null;
|
||
} else {
|
||
wb.Core.creator = oldCreator;
|
||
wb.Core.identifier = oldIdentifier;
|
||
wb.Core.language = oldLanguage;
|
||
wb.Core.subject = oldSubject;
|
||
wb.Core.title = oldTitle;
|
||
wb.Core.category = oldCategory;
|
||
wb.Core.contentStatus = oldContentStatus;
|
||
}
|
||
}, this, []);
|
||
}
|
||
|
||
return sBase64;
|
||
},
|
||
|
||
_getRangeMaxRowCol: function (worksheet, selectionRange, range3) {
|
||
var res = null;
|
||
|
||
//при выделенных столбцах ищем последнюю непустую ячейку
|
||
//ограничиваемся последней пустой строкой/столбцом
|
||
var type = selectionRange.getType();
|
||
var oType = Asc.c_oAscSelectionType;
|
||
if (type === oType.RangeCol || type === oType.RangeRow || type === oType.RangeMax) {
|
||
if (!range3) {
|
||
range3 = worksheet.getRange3(selectionRange.r1, selectionRange.c1, selectionRange.r2, selectionRange.c2);
|
||
}
|
||
|
||
//нужно вычислить последнюю ячейку в столбце, где есть данные
|
||
var maxRow = 0;
|
||
var maxCol = 0;
|
||
range3._foreachNoEmpty(function (cell) {
|
||
if (cell.nCol > maxCol && !cell.ws.getColHidden(cell.nCol)) {
|
||
maxCol = cell.nCol;
|
||
}
|
||
if (cell.nRow > maxRow && !cell.ws.getRowHidden(cell.nRow)) {
|
||
maxRow = cell.nRow;
|
||
}
|
||
});
|
||
|
||
res = {col: maxCol, row: maxRow};
|
||
}
|
||
|
||
return res;
|
||
},
|
||
|
||
_getBinaryShapeContent: function (isIntoShape) {
|
||
var sBase64;
|
||
|
||
var selectedContent = new AscCommonWord.CSelectedContent();
|
||
AscFormat.ExecuteNoHistory(function () {
|
||
isIntoShape.GetSelectedContent(selectedContent);
|
||
}, this, []);
|
||
|
||
|
||
if (!selectedContent || !selectedContent.Elements || !selectedContent.Elements.length) {
|
||
return null;
|
||
}
|
||
|
||
var oPresentationWriter = new AscCommon.CBinaryFileWriter();
|
||
|
||
//начало записи
|
||
oPresentationWriter.WriteString2("");
|
||
oPresentationWriter.WriteString2("");
|
||
oPresentationWriter.WriteDouble(1);
|
||
oPresentationWriter.WriteDouble(1);
|
||
|
||
oPresentationWriter.WriteBool(true);
|
||
oPresentationWriter.WriteULong(1);
|
||
|
||
if (selectedContent)//пишем контент
|
||
{
|
||
var docContent = selectedContent;
|
||
|
||
if (docContent.Elements) {
|
||
var elements = docContent.Elements;
|
||
|
||
//пишем метку и длины
|
||
oPresentationWriter.WriteString2("SelectedContent");
|
||
oPresentationWriter.WriteULong(1);
|
||
oPresentationWriter.WriteULong(1);
|
||
oPresentationWriter.WriteULong(1);
|
||
oPresentationWriter.WriteString2("DocContent");
|
||
oPresentationWriter.WriteDouble(elements.length);
|
||
|
||
//пишем контент
|
||
for (var Index = 0; Index < elements.length; Index++) {
|
||
var Item;
|
||
if (elements[Index].Element) {
|
||
Item = elements[Index].Element;
|
||
} else {
|
||
Item = elements[Index];
|
||
}
|
||
|
||
if (type_Paragraph === Item.GetType()) {
|
||
oPresentationWriter.StartRecord(0);
|
||
oPresentationWriter.WriteParagraph(Item);
|
||
oPresentationWriter.EndRecord();
|
||
}
|
||
}
|
||
|
||
sBase64 = oPresentationWriter.GetBase64Memory();
|
||
}
|
||
|
||
if (null !== sBase64) {
|
||
sBase64 = "pptData;" + oPresentationWriter.pos + ";" + sBase64;
|
||
}
|
||
}
|
||
|
||
return sBase64;
|
||
},
|
||
|
||
getText: function (range, worksheet) {
|
||
var t = this;
|
||
var res = null;
|
||
|
||
var objectRender = worksheet.objectRender;
|
||
var isIntoShape = objectRender.controller.getTargetDocContent();
|
||
|
||
if (isIntoShape) {
|
||
res = t._getTextFromShape(isIntoShape);
|
||
} else {
|
||
res = t._getTextFromSheet(range, worksheet);
|
||
}
|
||
|
||
return res;
|
||
},
|
||
|
||
getBinaryForMobile: function () {
|
||
var api = window["Asc"]["editor"];
|
||
if (!api || !api.wb) {
|
||
return false;
|
||
}
|
||
|
||
var worksheetView = api.wb.getWorksheet();
|
||
|
||
var objectRender = worksheetView.objectRender;
|
||
var isIntoShape = objectRender.controller.getTargetDocContent();
|
||
|
||
History.TurnOff();
|
||
var sBase64 = null;
|
||
if (!isIntoShape) {
|
||
sBase64 = this.getBinaryForCopy(worksheetView.model, worksheetView.objectRender);
|
||
}
|
||
History.TurnOn();
|
||
|
||
var selectedImages = objectRender.getSelectedGraphicObjects();
|
||
|
||
var drawingUrls = [];
|
||
if (selectedImages && selectedImages.length) {
|
||
var correctUrl, graphicObj;
|
||
for (var i = 0; i < selectedImages.length; i++) {
|
||
graphicObj = selectedImages[i];
|
||
if (graphicObj.isImage()) {
|
||
if (window["NativeCorrectImageUrlOnCopy"]) {
|
||
correctUrl = window["NativeCorrectImageUrlOnCopy"](graphicObj.getImageUrl());
|
||
drawingUrls[i] = correctUrl;
|
||
} else {
|
||
drawingUrls[i] = graphicObj.getBase64Img();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return {sBase64: sBase64, drawingUrls: drawingUrls};
|
||
},
|
||
|
||
canCopy: function (ws) {
|
||
var res = true;
|
||
if (1 !== ws.model.selectionRange.ranges.length) {
|
||
if (AscCommon.g_clipboardBase.bCut) {
|
||
return false;
|
||
}
|
||
var firstRange = ws.model.selectionRange.ranges[0];
|
||
var byCol = null;
|
||
for (var i = 1; i < ws.model.selectionRange.ranges.length; i++) {
|
||
var nextRange = ws.model.selectionRange.ranges[i];
|
||
|
||
if (nextRange.isIntersectWithRanges(ws.model.selectionRange.ranges, i)) {
|
||
res = false;
|
||
break;
|
||
}
|
||
|
||
if (byCol === null && firstRange.r1 === nextRange.r1 && firstRange.r2 === nextRange.r2) {
|
||
byCol = false;
|
||
} else if (byCol === null && firstRange.c1 === nextRange.c1 && firstRange.c2 === nextRange.c2) {
|
||
byCol = true;
|
||
} else if ((byCol && firstRange.c1 === nextRange.c1 && firstRange.c2 === nextRange.c2) || (byCol === false && firstRange.r1 === nextRange.r1 && firstRange.r2 === nextRange.r2)) {
|
||
continue;
|
||
} else {
|
||
res = false;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return res;
|
||
},
|
||
|
||
//TODO пересмотреть функцию
|
||
_generateHtml: function (range, worksheet, isIntoShape, sBase64) {
|
||
var isSelectedImages = this._getSelectedDrawingIndex(worksheet);
|
||
var htmlObj, container;
|
||
if (isIntoShape)//если курсор находится внутри шейпа
|
||
{
|
||
var selectedContent = new AscCommonWord.CSelectedContent();
|
||
AscFormat.ExecuteNoHistory(function () {
|
||
isIntoShape.GetSelectedContent(selectedContent);
|
||
}, this, []);
|
||
|
||
var oCopyProcessor = new AscCommon.CopyProcessor({WordControl: {m_oLogicDocument: isIntoShape}});
|
||
oCopyProcessor.CopyDocument2(oCopyProcessor.oRoot, isIntoShape, selectedContent.Elements, true);
|
||
|
||
if (sBase64) {
|
||
if (oCopyProcessor.oRoot && oCopyProcessor.oRoot.aChildren && oCopyProcessor.oRoot.aChildren.length > 0) {
|
||
oCopyProcessor.oRoot.aChildren[0].oAttributes["class"] = sBase64;
|
||
}
|
||
}
|
||
return oCopyProcessor.getInnerHtml();
|
||
} else if (isSelectedImages && isSelectedImages !== -1) {//графические объекты
|
||
htmlObj = this._generateHtmlImg(isSelectedImages, worksheet);
|
||
if (!htmlObj) {
|
||
return false;
|
||
}
|
||
container = doc.createElement("DIV");
|
||
container.appendChild(htmlObj);
|
||
|
||
if (sBase64 && container.children[0]) {
|
||
container.children[0].setAttribute("class", sBase64);
|
||
}
|
||
|
||
return container.innerHTML;
|
||
} else {
|
||
return this._generateHtmlDocStr(range, worksheet, sBase64);
|
||
}
|
||
},
|
||
|
||
_generateHtmlImg: function (isSelectedImages, worksheet) {
|
||
let objectRender = worksheet.objectRender;
|
||
|
||
objectRender.preCopy();
|
||
let res = document.createElement('span');
|
||
let drawings = worksheet.model.Drawings;
|
||
|
||
for (let j = 0; j < isSelectedImages.length; ++j) {
|
||
let oDrawing = drawings[isSelectedImages[j]];
|
||
if (oDrawing) {
|
||
let oGraphicObj = oDrawing.graphicObject;
|
||
if (oGraphicObj) {
|
||
let oHtmlImage = new Image();
|
||
oHtmlImage.src = oGraphicObj.getBase64Img();
|
||
if (oGraphicObj.cachedPixW && oGraphicObj.cachedPixH) {
|
||
oHtmlImage.width = oGraphicObj.cachedPixW;
|
||
oHtmlImage.height = oGraphicObj.cachedPixH;
|
||
} else {
|
||
oHtmlImage.width = oDrawing.getWidthFromTo();
|
||
oHtmlImage.height = oDrawing.getHeightFromTo();
|
||
}
|
||
res.appendChild(oHtmlImage);
|
||
}
|
||
}
|
||
}
|
||
return res;
|
||
},
|
||
|
||
_generateHtmlDoc: function (range, worksheet) {
|
||
function skipMerged() {
|
||
for (var i = 0; i < merged.length; i++) {
|
||
var e = merged[i];
|
||
if (row >= e.r1 && row <= e.r2 && col >= e.c1 && col <= e.c2) {
|
||
col = e.c2;
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
function makeBorder(border) {
|
||
if (!border || border.s === c_oAscBorderStyles.None) {
|
||
return "";
|
||
}
|
||
|
||
var style = "";
|
||
switch (border.s) {
|
||
case c_oAscBorderStyles.Thin:
|
||
style = "solid";
|
||
break;
|
||
case c_oAscBorderStyles.Medium:
|
||
style = "solid";
|
||
break;
|
||
case c_oAscBorderStyles.Thick:
|
||
style = "solid";
|
||
break;
|
||
case c_oAscBorderStyles.DashDot:
|
||
case c_oAscBorderStyles.DashDotDot:
|
||
case c_oAscBorderStyles.Dashed:
|
||
style = "dashed";
|
||
break;
|
||
case c_oAscBorderStyles.Double:
|
||
style = "double";
|
||
break;
|
||
case c_oAscBorderStyles.Hair:
|
||
case c_oAscBorderStyles.Dotted:
|
||
style = "dotted";
|
||
break;
|
||
case c_oAscBorderStyles.MediumDashDot:
|
||
case c_oAscBorderStyles.MediumDashDotDot:
|
||
case c_oAscBorderStyles.MediumDashed:
|
||
case c_oAscBorderStyles.SlantDashDot:
|
||
style = "dashed";
|
||
break;
|
||
}
|
||
return border.w + "px " + style + " " + number2color(border.getRgbOrNull());
|
||
}
|
||
|
||
var fn = worksheet.model.workbook.getDefaultFont();
|
||
var fs = worksheet.model.workbook.getDefaultSize();
|
||
var bbox = range.getBBox0();
|
||
var merged = [];
|
||
var t = this;
|
||
var table, tr, td, cell, j, row, col, mbbox, h, w, b;
|
||
|
||
table = document.createElement("TABLE");
|
||
table.style.display = 'none';
|
||
table.cellPadding = "0";
|
||
table.cellSpacing = "0";
|
||
table.style.borderCollapse = "collapse";
|
||
table.style.fontFamily = fn;
|
||
table.style.fontSize = fs + "pt";
|
||
table.style.color = "#000";
|
||
table.style.backgroundColor = "transparent";
|
||
|
||
var maxRow = bbox.r2;
|
||
var maxCol = bbox.c2;
|
||
var maxRowCol = this._getRangeMaxRowCol(worksheet, bbox, range);
|
||
if (null !== maxRowCol) {
|
||
maxRow = maxRowCol.row;
|
||
maxCol = maxRowCol.col;
|
||
}
|
||
|
||
for (row = bbox.r1; row <= maxRow; ++row) {
|
||
if (worksheet.model.bExcludeHiddenRows && worksheet.model.getRowHidden(row)) {
|
||
continue;
|
||
}
|
||
|
||
tr = document.createElement("TR");
|
||
h = worksheet.model.getRowHeight(row);
|
||
if (h > 0) {
|
||
tr.style.height = h + "pt";
|
||
}
|
||
|
||
for (col = bbox.c1; col <= maxCol; ++col) {
|
||
if (skipMerged()) {
|
||
continue;
|
||
}
|
||
|
||
cell = worksheet.model.getCell3(row, col);
|
||
td = document.createElement("TD");
|
||
|
||
var style = "";
|
||
mbbox = cell.hasMerged();
|
||
if (mbbox) {
|
||
merged.push(mbbox);
|
||
td.colSpan = mbbox.c2 - mbbox.c1 + 1;
|
||
td.rowSpan = mbbox.r2 - mbbox.r1 + 1;
|
||
for (w = 0, j = mbbox.c1; j <= mbbox.c2; ++j) {
|
||
w += worksheet.getColumnWidth(j, 1/*pt*/);
|
||
}
|
||
style += "width:" + w + "pt" + ";";
|
||
} else {
|
||
style += "width:" + worksheet.getColumnWidth(col, 1/*pt*/) + "pt" + ";";
|
||
}
|
||
|
||
if (cell.getType() !== null) {
|
||
var align = cell.getAlign();
|
||
if (!align.getWrap()) {
|
||
style += "white-space:" + "nowrap" + ";";
|
||
} else {
|
||
style += "white-space:" + "normal" + ";";
|
||
}
|
||
|
||
switch (align.getAlignHorizontal()) {
|
||
case AscCommon.align_Left:
|
||
style += "text-align:" + "left" + ";";
|
||
break;
|
||
case AscCommon.align_Right:
|
||
style += "text-align:" + "right" + ";";
|
||
break;
|
||
case AscCommon.align_Center:
|
||
style += "text-align:" + "center" + ";";
|
||
break;
|
||
case AscCommon.align_Justify:
|
||
style += "text-align:" + "justify" + ";";
|
||
break;
|
||
}
|
||
switch (align.getAlignVertical()) {
|
||
case Asc.c_oAscVAlign.Bottom:
|
||
style += "vertical-align:" + "bottom" + ";";
|
||
break;
|
||
case Asc.c_oAscVAlign.Center:
|
||
case Asc.c_oAscVAlign.Dist:
|
||
case Asc.c_oAscVAlign.Just:
|
||
style += "vertical-align:" + "middle" + ";";
|
||
break;
|
||
case Asc.c_oAscVAlign.Top:
|
||
style += "vertical-align:" + "top" + ";";
|
||
break;
|
||
}
|
||
|
||
//borders
|
||
b = cell.getBorderFull();
|
||
var _border;
|
||
if (mbbox) {
|
||
var cellMergeFinish = worksheet.model.getCell3(mbbox.r2, mbbox.c2);
|
||
var borderMergeCell = cellMergeFinish.getBorderFull();
|
||
_border = makeBorder(borderMergeCell.r);
|
||
style += _border ? "border-right:" + _border + ";" : "";
|
||
_border = makeBorder(borderMergeCell.b);
|
||
style += _border ? "border-bottom:" + makeBorder(borderMergeCell.b) + ";" : "";
|
||
} else {
|
||
_border = makeBorder(b.r);
|
||
style += _border ? "border-right:" + makeBorder(b.r) + ";" : "";
|
||
_border = makeBorder(b.b);
|
||
style += _border ? "border-bottom:" + makeBorder(b.b) + ";" : "";
|
||
}
|
||
_border = makeBorder(b.l);
|
||
style += _border ? "border-left:" + makeBorder(b.l) + ";" : "";
|
||
_border = makeBorder(b.t);
|
||
style += _border ? "border-top:" + makeBorder(b.t) + ";" : "";
|
||
|
||
b = cell.getFillColor();
|
||
// если b==0 мы не зайдем в if, хотя b==0 это ни что иное, как черный цвет заливки.
|
||
if (b != null) {
|
||
style += "background-color:" + number2color(b.getRgb()) + ";";
|
||
}
|
||
|
||
td.setAttribute("style", style);
|
||
|
||
this._makeNodesFromCellValue(cell.getValue2(), fn, fs, cell).forEach(function (node) {
|
||
td.appendChild(node);
|
||
});
|
||
}
|
||
|
||
tr.appendChild(td);
|
||
}
|
||
table.appendChild(tr);
|
||
}
|
||
|
||
return table;
|
||
},
|
||
|
||
_generateHtmlDocStr: function (range, worksheet, sBase64) {
|
||
function skipMerged() {
|
||
for (var i = 0; i < merged.length; i++) {
|
||
var e = merged[i];
|
||
if (row >= e.r1 && row <= e.r2 && col >= e.c1 && col <= e.c2) {
|
||
col = e.c2;
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
function makeBorder(border) {
|
||
if (!border || border.s === c_oAscBorderStyles.None) {
|
||
return "";
|
||
}
|
||
|
||
var _style = "";
|
||
switch (border.s) {
|
||
case c_oAscBorderStyles.Thin:
|
||
_style = "solid";
|
||
break;
|
||
case c_oAscBorderStyles.Medium:
|
||
_style = "solid";
|
||
break;
|
||
case c_oAscBorderStyles.Thick:
|
||
_style = "solid";
|
||
break;
|
||
case c_oAscBorderStyles.DashDot:
|
||
case c_oAscBorderStyles.DashDotDot:
|
||
case c_oAscBorderStyles.Dashed:
|
||
_style = "dashed";
|
||
break;
|
||
case c_oAscBorderStyles.Double:
|
||
_style = "double";
|
||
break;
|
||
case c_oAscBorderStyles.Hair:
|
||
case c_oAscBorderStyles.Dotted:
|
||
_style = "dotted";
|
||
break;
|
||
case c_oAscBorderStyles.MediumDashDot:
|
||
case c_oAscBorderStyles.MediumDashDotDot:
|
||
case c_oAscBorderStyles.MediumDashed:
|
||
case c_oAscBorderStyles.SlantDashDot:
|
||
_style = "dashed";
|
||
break;
|
||
}
|
||
return border.w + "px " + _style + " " + number2color(border.getRgbOrNull());
|
||
}
|
||
|
||
var fn = worksheet.model.workbook.getDefaultFont();
|
||
var fs = worksheet.model.workbook.getDefaultSize();
|
||
var bbox = range.getBBox0();
|
||
var merged = [];
|
||
var t = this;
|
||
var table, tr, td, cell, j, row, col, mbbox, h, w, b;
|
||
|
||
var str = "";
|
||
|
||
var addByStr = function (_str) {
|
||
//исследования по максимальной длине строки:
|
||
//Edge/chrome 96.0.4664 -> 536870888 символов(1073741776 байта)
|
||
//FF 95.0.2 -> 1073741822 символов(2147483644 байта)
|
||
if (str.length + _str.length > c_MaxStringLength) {
|
||
return false;
|
||
}
|
||
str += _str;
|
||
return true;
|
||
};
|
||
|
||
if (!addByStr('<table cellpadding="0" cellSpacing="0"')) {
|
||
return false;
|
||
}
|
||
|
||
if (sBase64) {
|
||
if (!addByStr(' class=' + '"' + sBase64 + '"')) {
|
||
return false;
|
||
}
|
||
}
|
||
if (!addByStr(' style="border-collapse: collapse;font-family:' + fn + ';font-size:' + fs + 'pt' + ';color:#000;background-color:transparent;' + '">')) {
|
||
return false;
|
||
}
|
||
|
||
var maxRow = bbox.r2;
|
||
var maxCol = bbox.c2;
|
||
var maxRowCol = this._getRangeMaxRowCol(worksheet, bbox, range);
|
||
if (null !== maxRowCol) {
|
||
maxRow = maxRowCol.row;
|
||
maxCol = maxRowCol.col;
|
||
}
|
||
|
||
for (row = bbox.r1; row <= maxRow; ++row) {
|
||
if (worksheet.model.bExcludeHiddenRows && worksheet.model.getRowHidden(row)) {
|
||
continue;
|
||
}
|
||
if (!addByStr('<tr style="height:')) {
|
||
return false;
|
||
}
|
||
|
||
h = worksheet.model.getRowHeight(row);
|
||
|
||
if (!addByStr(h + "pt" + '"' + ">")) {
|
||
return false;
|
||
}
|
||
|
||
for (col = bbox.c1; col <= maxCol; ++col) {
|
||
if (skipMerged()) {
|
||
continue;
|
||
}
|
||
|
||
if (!addByStr('<td')) {
|
||
return false;
|
||
}
|
||
|
||
var style = "";
|
||
cell = worksheet.model.getCell3(row, col);
|
||
mbbox = cell.hasMerged();
|
||
if (mbbox) {
|
||
merged.push(mbbox);
|
||
if (!addByStr(" colspan=" + (mbbox.c2 - mbbox.c1 + 1))) {
|
||
return false;
|
||
}
|
||
if (!addByStr(" rowSpan=" + (mbbox.r2 - mbbox.r1 + 1))) {
|
||
return false;
|
||
}
|
||
for (w = 0, j = mbbox.c1; j <= mbbox.c2; ++j) {
|
||
w += worksheet.getColumnWidth(j, 1/*pt*/);
|
||
}
|
||
style += "width:" + w + "pt" + ";";
|
||
} else {
|
||
style += "width:" + worksheet.getColumnWidth(col, 1/*pt*/) + "pt" + ";";
|
||
}
|
||
|
||
if (cell.getType() !== null) {
|
||
var align = cell.getAlign();
|
||
if (!align.getWrap()) {
|
||
style += "white-space:" + "nowrap" + ";";
|
||
} else {
|
||
style += "white-space:" + "normal" + ";";
|
||
}
|
||
|
||
switch (align.getAlignHorizontal()) {
|
||
case AscCommon.align_Left:
|
||
style += "text-align:" + "left" + ";";
|
||
break;
|
||
case AscCommon.align_Right:
|
||
style += "text-align:" + "right" + ";";
|
||
break;
|
||
case AscCommon.align_Center:
|
||
style += "text-align:" + "center" + ";";
|
||
break;
|
||
case AscCommon.align_Justify:
|
||
style += "text-align:" + "justify" + ";";
|
||
break;
|
||
}
|
||
switch (align.getAlignVertical()) {
|
||
case Asc.c_oAscVAlign.Bottom:
|
||
style += "vertical-align:" + "bottom" + ";";
|
||
break;
|
||
case Asc.c_oAscVAlign.Center:
|
||
case Asc.c_oAscVAlign.Dist:
|
||
case Asc.c_oAscVAlign.Just:
|
||
style += "vertical-align:" + "middle" + ";";
|
||
break;
|
||
case Asc.c_oAscVAlign.Top:
|
||
style += "vertical-align:" + "top" + ";";
|
||
break;
|
||
}
|
||
|
||
//borders
|
||
b = cell.getBorderFull();
|
||
var _border;
|
||
if (mbbox) {
|
||
var cellMergeFinish = worksheet.model.getCell3(mbbox.r2, mbbox.c2);
|
||
var borderMergeCell = cellMergeFinish.getBorderFull();
|
||
_border = makeBorder(borderMergeCell.r);
|
||
style += _border ? "border-right:" + _border + ";" : "";
|
||
_border = makeBorder(borderMergeCell.b);
|
||
style += _border ? "border-bottom:" + makeBorder(borderMergeCell.b) + ";" : "";
|
||
} else {
|
||
_border = makeBorder(b.r);
|
||
style += _border ? "border-right:" + makeBorder(b.r) + ";" : "";
|
||
_border = makeBorder(b.b);
|
||
style += _border ? "border-bottom:" + makeBorder(b.b) + ";" : "";
|
||
}
|
||
_border = makeBorder(b.l);
|
||
style += _border ? "border-left:" + makeBorder(b.l) + ";" : "";
|
||
_border = makeBorder(b.t);
|
||
style += _border ? "border-top:" + makeBorder(b.t) + ";" : "";
|
||
|
||
b = cell.getFillColor();
|
||
// если b==0 мы не зайдем в if, хотя b==0 это ни что иное, как черный цвет заливки.
|
||
if (b != null) {
|
||
style += "background-color:" + number2color(b.getRgb()) + ";";
|
||
}
|
||
|
||
if (!addByStr(' style=' + '"' + style + '">')) {
|
||
return false;
|
||
}
|
||
if (!addByStr(this._makeNodesFromCellValueStr(cell.getValue2(), fn, fs, cell))) {
|
||
return false;
|
||
}
|
||
} else {
|
||
if (!addByStr('>')) {
|
||
return false;
|
||
}
|
||
}
|
||
if (!addByStr('</td>')) {
|
||
return false;
|
||
}
|
||
}
|
||
if (!addByStr("</tr>")) {
|
||
return false;
|
||
}
|
||
}
|
||
if (!addByStr("</table>")) {
|
||
return false;
|
||
}
|
||
|
||
return str;
|
||
},
|
||
|
||
_getSelectedDrawingIndex: function (worksheet) {
|
||
if (!worksheet) {
|
||
return false;
|
||
}
|
||
var images = worksheet.model.Drawings;
|
||
var n = 0;
|
||
var arrImages = [];
|
||
if (images) {
|
||
for (var i = 0; i < images.length; i++) {
|
||
if ((images[i].graphicObject && images[i].graphicObject.selected === true)) {
|
||
arrImages[n] = i;
|
||
n++;
|
||
}
|
||
}
|
||
}
|
||
if (n === 0) {
|
||
return -1;
|
||
} else {
|
||
return arrImages;
|
||
}
|
||
},
|
||
|
||
_makeNodesFromCellValue: function (val, defFN, defFS, cell) {
|
||
var i, res, span, f;
|
||
|
||
function getTextDecoration(format) {
|
||
var res = [];
|
||
if (Asc.EUnderline.underlineNone !== format.getUnderline()) {
|
||
res.push("underline");
|
||
}
|
||
if (format.getStrikeout()) {
|
||
res.push("line-through");
|
||
}
|
||
return res.length > 0 ? res.join(",") : "";
|
||
}
|
||
|
||
var hyperlink;
|
||
if (cell) {
|
||
hyperlink = cell.getHyperlink();
|
||
}
|
||
|
||
for (res = [], i = 0; i < val.length; ++i) {
|
||
if (val[i] && val[i].format && val[i].format.getSkip()) {
|
||
continue;
|
||
}
|
||
if (cell == undefined || (cell != undefined && (hyperlink == null || (hyperlink != null && hyperlink.getLocation() != null)))) {
|
||
span = doc.createElement("SPAN");
|
||
} else {
|
||
span = doc.createElement("A");
|
||
if (hyperlink.Hyperlink != null) {
|
||
span.href = hyperlink.Hyperlink;
|
||
} else if (hyperlink.getLocation() != null) {
|
||
span.href = "#" + hyperlink.getLocation();
|
||
}
|
||
if (hyperlink.Tooltip != null) {
|
||
span.title = hyperlink.Tooltip;
|
||
}
|
||
}
|
||
|
||
var text = val[i].getFragmentText();
|
||
var isBr = val[i].getFragmentText().indexOf("\n");
|
||
span.textContent = text;
|
||
|
||
f = val[i].format;
|
||
var fn = f.getName();
|
||
var fs = f.getSize();
|
||
var fc = f.getColor();
|
||
var va = f.getVerticalAlign();
|
||
var style = "";
|
||
if (fc && fc.rgb !== 0) {
|
||
style += "color:" + number2color(fc.getRgb()) + ";";
|
||
}
|
||
|
||
if (fn !== defFN) {
|
||
style += "font-family:" + fn + ";";
|
||
}
|
||
if (fs !== defFS) {
|
||
style += "font-size:" + fs + 'pt' + ";";
|
||
}
|
||
if (f.getBold()) {
|
||
style += "font-weight:" + "bold" + ";";
|
||
}
|
||
if (f.getItalic()) {
|
||
style += "font-style:" + "italic" + ";";
|
||
}
|
||
var textDecoration = getTextDecoration(f);
|
||
if (textDecoration) {
|
||
style += "text-decoration:" + textDecoration + ";";
|
||
}
|
||
var verticalAlign = va === AscCommon.vertalign_SubScript ? 'sub' : va === AscCommon.vertalign_SuperScript ? 'super' : 'baseline';
|
||
style += "vertical-align:" + verticalAlign + ";";
|
||
span.setAttribute('style', style);
|
||
|
||
if (isBr !== -1) {
|
||
span.innerHTML = span.innerHTML.replace(/\n/g, '<br>');
|
||
}
|
||
|
||
res.push(span);
|
||
}
|
||
return res;
|
||
},
|
||
|
||
_makeNodesFromCellValueStr: function (val, defFN, defFS, cell) {
|
||
var i, res, span, f;
|
||
|
||
function getTextDecoration(format) {
|
||
var res = [];
|
||
if (Asc.EUnderline.underlineNone !== format.getUnderline()) {
|
||
res.push("underline");
|
||
}
|
||
if (format.getStrikeout()) {
|
||
res.push("line-through");
|
||
}
|
||
return res.length > 0 ? res.join(",") : "";
|
||
}
|
||
|
||
var str = "";
|
||
var hyperlink;
|
||
if (cell) {
|
||
hyperlink = cell.getHyperlink();
|
||
}
|
||
|
||
for (res = [], i = 0; i < val.length; ++i) {
|
||
if (val[i] && val[i].format && val[i].format.getSkip()) {
|
||
continue;
|
||
}
|
||
if (cell == undefined || (cell != undefined && (hyperlink == null || (hyperlink != null && hyperlink.getLocation() != null)))) {
|
||
str += '<span ';
|
||
} else {
|
||
str += '<a';
|
||
if (hyperlink.Hyperlink != null) {
|
||
str += ' href=' + '"' + hyperlink.Hyperlink + '"';
|
||
} else if (hyperlink.getLocation() != null) {
|
||
str += ' href=' + '"' + "#" + hyperlink.getLocation() + '"';
|
||
}
|
||
if (hyperlink.Tooltip) {
|
||
str += ' title=' + '"' + hyperlink.Tooltip + '" ';
|
||
}
|
||
}
|
||
|
||
var text = CopyPasteCorrectString(val[i].getFragmentText());
|
||
text = text.replace(/\n/g, '<br>');
|
||
|
||
f = val[i].format;
|
||
var fn = f.getName();
|
||
var fs = f.getSize();
|
||
var fc = f.getColor();
|
||
var va = f.getVerticalAlign();
|
||
var style = "";
|
||
if (fc && fc.rgb !== 0) {
|
||
style += "color:" + number2color(fc.getRgb()) + ";";
|
||
}
|
||
|
||
if (fn !== defFN) {
|
||
style += "font-family:" + fn + ";";
|
||
}
|
||
if (fs !== defFS) {
|
||
style += "font-size:" + fs + 'pt' + ";";
|
||
}
|
||
if (f.getBold()) {
|
||
style += "font-weight:" + "bold" + ";";
|
||
}
|
||
if (f.getItalic()) {
|
||
style += "font-style:" + "italic" + ";";
|
||
}
|
||
var textDecoration = getTextDecoration(f);
|
||
if (textDecoration) {
|
||
style += "text-decoration:" + textDecoration + ";";
|
||
}
|
||
var verticalAlign = va === AscCommon.vertalign_SubScript ? 'sub' : va === AscCommon.vertalign_SuperScript ? 'super' : 'baseline';
|
||
style += "vertical-align:" + verticalAlign + ";";
|
||
|
||
str += ' style="' + style + '">';
|
||
str += text + '</span>';
|
||
}
|
||
return str;
|
||
},
|
||
|
||
_getTextFromShape: function (documentContent) {
|
||
var res = null;
|
||
|
||
var addByStr = function (_str) {
|
||
if (res && res.length + _str.length > c_MaxStringLength) {
|
||
return false;
|
||
}
|
||
if (!res) {
|
||
res = "";
|
||
}
|
||
res += _str;
|
||
return true;
|
||
};
|
||
|
||
if (documentContent && documentContent.Content && documentContent.Content.length) {
|
||
for (var i = 0; i < documentContent.Content.length; i++) {
|
||
if (documentContent.Content[i]) {
|
||
var paraText = documentContent.Content[i].GetSelectedText();
|
||
if (paraText) {
|
||
if (i !== 0) {
|
||
if (!addByStr('\r\n')) {
|
||
return null;
|
||
}
|
||
}
|
||
if (!addByStr(paraText)) {
|
||
return null;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return res;
|
||
},
|
||
|
||
_getTextFromSheet: function (range, worksheet) {
|
||
var res = null;
|
||
|
||
var addByStr = function (_str) {
|
||
if (res && res.length + _str.length > c_MaxStringLength) {
|
||
return false;
|
||
}
|
||
if (!res) {
|
||
res = "";
|
||
}
|
||
res += _str;
|
||
return true;
|
||
};
|
||
|
||
if (range) {
|
||
var bbox = range.bbox;
|
||
|
||
var maxRow = bbox.r2;
|
||
var maxCol = bbox.c2;
|
||
var maxRowCol = this._getRangeMaxRowCol(worksheet.model, bbox, range);
|
||
if (null !== maxRowCol) {
|
||
maxRow = maxRowCol.row;
|
||
maxCol = maxRowCol.col;
|
||
}
|
||
|
||
res = '';
|
||
for (var row = bbox.r1; row <= maxRow; ++row) {
|
||
if (worksheet.model.bExcludeHiddenRows && worksheet.model.getRowHidden(row)) {
|
||
continue;
|
||
}
|
||
|
||
if (row !== bbox.r1) {
|
||
if (!addByStr('\r\n')) {
|
||
return null;
|
||
}
|
||
}
|
||
|
||
for (var col = bbox.c1; col <= maxCol; ++col) {
|
||
if (col !== bbox.c1) {
|
||
if (!addByStr('\t')) {
|
||
return null;
|
||
}
|
||
}
|
||
|
||
var currentRange = worksheet.model.getCell3(row, col);
|
||
var textRange = currentRange.getValueWithFormat();
|
||
if (textRange !== '' && textRange !== undefined) {
|
||
if (!addByStr(textRange)) {
|
||
return null;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return res;
|
||
}
|
||
};
|
||
|
||
function PasteProcessorExcel() {
|
||
this.activeRange = null;
|
||
this.alreadyLoadImagesOnServer = false;
|
||
|
||
this.fontsNew = {};
|
||
this.oImages = {};
|
||
this.multipleSettings = null;
|
||
this.pasteCallBack = null;
|
||
}
|
||
|
||
PasteProcessorExcel.prototype = {
|
||
|
||
constructor: PasteProcessorExcel,
|
||
|
||
clean: function () {
|
||
this.activeRange = null;
|
||
this.alreadyLoadImagesOnServer = false;
|
||
|
||
this.fontsNew = {};
|
||
this.oImages = {};
|
||
this.multipleSettings = null;
|
||
},
|
||
|
||
pasteFromBinary: function (worksheet, binary, isCellEditMode, isPasteAll) {
|
||
var base64 = null, base64FromWord = null, base64FromPresentation = null, base64FromPDF = null, t = this;
|
||
|
||
if (binary.indexOf("xslData;") > -1) {
|
||
base64 = binary.split('xslData;')[1];
|
||
} else if (binary.indexOf("docData;") > -1) {
|
||
base64FromWord = binary.split('docData;')[1];
|
||
} else if (binary.indexOf("pptData;") > -1) {
|
||
base64FromPresentation = binary.split('pptData;')[1];
|
||
} else if (binary.indexOf("pdfData;") > -1) {
|
||
base64FromPDF = binary.split('pdfData;')[1];
|
||
}
|
||
|
||
var result = false;
|
||
var objectRender = worksheet.objectRender;
|
||
var isIntoShape = objectRender && objectRender.controller && objectRender.controller.getTargetDocContent();
|
||
if (base64 != null)//from excel
|
||
{
|
||
result = this._pasteFromBinaryExcel(worksheet, base64, isIntoShape, isCellEditMode, isPasteAll);
|
||
} else if (base64FromWord)//from word
|
||
{
|
||
this.activeRange = worksheet.model.selectionRange.getLast().clone(true);
|
||
result = this._pasteFromBinaryWord(worksheet, base64FromWord, isIntoShape, isCellEditMode);
|
||
window['AscCommon'].g_specialPasteHelper.specialPasteData.pasteFromWord = true;
|
||
worksheet.workbook.handlers.trigger("cleanCopyData", true);
|
||
} else if (base64FromPresentation) {
|
||
result = this._pasteFromBinaryPresentation(worksheet, base64FromPresentation, isIntoShape, isCellEditMode);
|
||
worksheet.workbook.handlers.trigger("cleanCopyData", true);
|
||
} else if (base64FromPDF) {
|
||
result = this._pasteFromBinaryPDF(worksheet, base64FromPDF, isIntoShape, isCellEditMode);
|
||
worksheet.workbook.handlers.trigger("cleanCopyData", true);
|
||
}
|
||
|
||
return result;
|
||
},
|
||
|
||
_pasteFromBinaryExcel: function (worksheet, base64, isIntoShape, isCellEditMode, isPasteAll) {
|
||
var t = this;
|
||
var newFonts;
|
||
var tempWorkbook = new AscCommonExcel.Workbook(undefined, undefined, false);
|
||
tempWorkbook.DrawingDocument = Asc.editor.wbModel.DrawingDocument;
|
||
var aPastedImages = this._readExcelBinary(base64, tempWorkbook);
|
||
|
||
if (!isIntoShape && this._checkCutBefore(worksheet, tempWorkbook)) {
|
||
return true;
|
||
}
|
||
|
||
var pasteData = null;
|
||
if (tempWorkbook) {
|
||
pasteData = tempWorkbook.aWorksheets[0];
|
||
}
|
||
|
||
if (isPasteAll) {
|
||
History.Create_NewPoint();
|
||
History.StartTransaction();
|
||
}
|
||
|
||
var doPasteData = function () {
|
||
newFonts = {};
|
||
newFonts = tempWorkbook.generateFontMap2();
|
||
newFonts = t._convertFonts(newFonts);
|
||
|
||
if (isPasteAll) {
|
||
window['AscCommon'].g_specialPasteHelper.Special_Paste_Hide_Button();
|
||
}
|
||
|
||
//закрываем общую транзакцию _loadDataBeforePaste после загрузки шрифтов
|
||
worksheet.setSelectionInfo('paste', {
|
||
data: pasteData,
|
||
fromBinary: true,
|
||
fontsNew: newFonts,
|
||
pasteAllSheet: isPasteAll,
|
||
wb: tempWorkbook
|
||
});
|
||
};
|
||
|
||
var doPasteIntoShape = function () {
|
||
History.TurnOff();
|
||
var docContent = t._convertTableFromExcelToDocument(worksheet, pasteData, isIntoShape);
|
||
History.TurnOn();
|
||
|
||
var callback = function (isSuccess) {
|
||
if (isSuccess) {
|
||
t._insertBinaryIntoShapeContent(worksheet, [docContent]);
|
||
}
|
||
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
|
||
};
|
||
|
||
worksheet.objectRender.controller.checkPasteInText(callback);
|
||
};
|
||
|
||
let getFontsFromDrawings = function (_drawings) {
|
||
let _fonts = {};
|
||
if (_drawings) {
|
||
for (var i = 0; i < _drawings.length; i++) {
|
||
_drawings[i].graphicObject.getAllFonts(_fonts);
|
||
}
|
||
}
|
||
return _fonts;
|
||
};
|
||
|
||
var res = false;
|
||
if (isCellEditMode) {
|
||
res = this._getTextFromWorksheet(pasteData);
|
||
} else if (pasteData) {
|
||
if (pasteData.Drawings && pasteData.Drawings.length) {
|
||
|
||
if (window["IS_NATIVE_EDITOR"]) {
|
||
t._insertImagesFromBinary(worksheet, pasteData, isIntoShape, null, isPasteAll, tempWorkbook);
|
||
if (isPasteAll) {
|
||
doPasteData();
|
||
}
|
||
} else if (window["NativeCorrectImageUrlOnPaste"]) {
|
||
newFonts = getFontsFromDrawings(pasteData.Drawings);
|
||
worksheet._loadFonts(newFonts, function () {
|
||
var url;
|
||
for (var i = 0, length = aPastedImages.length; i < length; ++i) {
|
||
url = window["NativeCorrectImageUrlOnPaste"](aPastedImages[i].Url);
|
||
aPastedImages[i].Url = url;
|
||
|
||
var imageElem = aPastedImages[i];
|
||
if (null != imageElem) {
|
||
imageElem.SetUrl(url);
|
||
}
|
||
}
|
||
|
||
t._insertImagesFromBinary(worksheet, pasteData, isIntoShape, null, isPasteAll, tempWorkbook);
|
||
if (isPasteAll) {
|
||
doPasteData();
|
||
}
|
||
});
|
||
} else {
|
||
|
||
newFonts = getFontsFromDrawings(pasteData.Drawings);
|
||
|
||
worksheet._loadFonts(newFonts, function () {
|
||
if (aPastedImages && aPastedImages.length) {
|
||
t._loadImagesOnServer(aPastedImages, function () {
|
||
t._insertImagesFromBinary(worksheet, pasteData, isIntoShape, null, isPasteAll, tempWorkbook);
|
||
if (isPasteAll) {
|
||
doPasteData();
|
||
}
|
||
});
|
||
} else {
|
||
t._insertImagesFromBinary(worksheet, pasteData, isIntoShape, null, isPasteAll, tempWorkbook);
|
||
if (isPasteAll) {
|
||
doPasteData();
|
||
}
|
||
}
|
||
});
|
||
}
|
||
} else {
|
||
if (isIntoShape) {
|
||
doPasteIntoShape();
|
||
} else if (this._checkPasteFromBinaryExcel(worksheet, true, pasteData)) {
|
||
doPasteData();
|
||
}
|
||
}
|
||
|
||
res = true;
|
||
}
|
||
|
||
return res;
|
||
},
|
||
|
||
_readExcelBinary: function (base64, tempWorkbook, selectAllSheet) {
|
||
let oBinaryFileReader = new AscCommonExcel.BinaryFileReader(true);
|
||
oBinaryFileReader.InitOpenManager.copyPasteObj.selectAllSheet = selectAllSheet;
|
||
let t = this;
|
||
let aPastedImages;
|
||
|
||
AscFormat.ExecuteNoHistory(function () {
|
||
pptx_content_loader.Start_UseFullUrl();
|
||
pptx_content_loader.Reader.ClearConnectedObjects();
|
||
oBinaryFileReader.Read(base64, tempWorkbook);
|
||
|
||
//paste multiselect
|
||
//TODO if paste multiselect into multiselect - we must show error
|
||
let pastedWorksheet = tempWorkbook.aWorksheets && tempWorkbook.aWorksheets[0];
|
||
let _ranges = pastedWorksheet && pastedWorksheet.selectionRange && pastedWorksheet.selectionRange.ranges;
|
||
if (_ranges && _ranges.length > 1) {
|
||
//paste - should only be with an equal number of rows/columns
|
||
//there should be only rows/columns between the ranges, then -> delete the extra rows/columns
|
||
let byCol = null;
|
||
if (_ranges[0].r1 === _ranges[1].r1 && _ranges[0].r2 === _ranges[1].r2) {
|
||
byCol = false;
|
||
} else if (_ranges[0].c1 === _ranges[1].c1 && _ranges[0].c2 === _ranges[1].c2) {
|
||
byCol = true;
|
||
}
|
||
|
||
_ranges.sort(function sortArr(a, b) {
|
||
if (!byCol) {
|
||
return a.c1 > b.c1 ? 1 : -1;
|
||
} else {
|
||
return a.r1 > b.r1 ? 1 : -1;
|
||
}
|
||
});
|
||
|
||
|
||
let diff = 0;
|
||
for (let i = 1; i < _ranges.length; i++) {
|
||
if (byCol) {
|
||
if (_ranges[i - 1].r2 + 1 !== _ranges[i].r1) {
|
||
pastedWorksheet.removeRows(_ranges[i - 1].r2 + 1 - diff, _ranges[i].r1 - 1 - diff);
|
||
diff += _ranges[i].r1 - _ranges[i - 1].r2 - 1;
|
||
}
|
||
} else {
|
||
if (_ranges[i - 1].c2 + 1 !== _ranges[i].c1) {
|
||
pastedWorksheet.removeCols(_ranges[i - 1].c2 + 1 - diff, _ranges[i].c1 - 1 - diff);
|
||
diff += _ranges[i].c1 - _ranges[i - 1].c2 - 1;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (diff !== 0) {
|
||
AscCommonExcel.executeInR1C1Mode(false, function () {
|
||
let pasteRange = AscCommonExcel.g_oRangeCache.getAscRange(oBinaryFileReader.InitOpenManager.copyPasteObj.activeRange);
|
||
if (pasteRange) {
|
||
pasteRange = pasteRange.clone();
|
||
if (byCol) {
|
||
pasteRange.r2 -= diff;
|
||
} else {
|
||
pasteRange.c2 -= diff;
|
||
}
|
||
oBinaryFileReader.InitOpenManager.copyPasteObj.activeRange = pasteRange.getName();
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
t.activeRange = oBinaryFileReader.InitOpenManager.copyPasteObj.activeRange;
|
||
|
||
aPastedImages = pptx_content_loader.End_UseFullUrl();
|
||
pptx_content_loader.Reader.AssignConnectedObjects();
|
||
}, this, []);
|
||
|
||
return aPastedImages;
|
||
},
|
||
|
||
_checkCutBefore: function (ws, pastedWb) {
|
||
var res = false;
|
||
|
||
//***MOVE***
|
||
//проверяем, может это вырезанный фрагмент пытаемся вставить в пределах одного документа
|
||
//чтобы не передавать изменения на сервер, даже в случае одного пользователя в разных вкладках
|
||
//вырезать и вставить будут работать независимо, поэтому при вставке сравнивем ещё и id юзера
|
||
var pasteInOriginalDoc = this._checkPastedInOriginalDoc(pastedWb);
|
||
if (pasteInOriginalDoc && null !== window["Asc"]["editor"].wb.cutIdSheet) {
|
||
var wsFrom = window["Asc"]["editor"].wb.getWorksheetById(window["Asc"]["editor"].wb.cutIdSheet);
|
||
var fromRange = wsFrom ? wsFrom.getCutRange() : null;
|
||
if (fromRange) {
|
||
fromRange = fromRange[0];
|
||
var aRange = ws.model.selectionRange.getLast();
|
||
var toRange = new Asc.Range(aRange.c1, aRange.r1, aRange.c1 + (fromRange.c2 - fromRange.c1), aRange.r1 + (fromRange.r2 - fromRange.r1));
|
||
|
||
if (ws.model.getSheetProtection() && ws.model.isIntersectLockedRanges([toRange])) {
|
||
ws.model.workbook.handlers.trigger("asc_onError", c_oAscError.ID.ChangeOnProtectedSheet, c_oAscError.Level.NoCritical);
|
||
ws.handlers.trigger("cleanCutData", true);
|
||
return true;
|
||
}
|
||
|
||
if (ws.model.isUserProtectedRangesIntersection(toRange)) {
|
||
ws.model.workbook.handlers.trigger("asc_onError", c_oAscError.ID.ProtectedRangeByOtherUser, c_oAscError.Level.NoCritical);
|
||
ws.handlers.trigger("cleanCutData", true);
|
||
return;
|
||
}
|
||
|
||
var wsTo = ws.model.Id !== wsFrom.model.Id ? ws : null;
|
||
wsFrom.applyCutRange(fromRange, toRange, wsTo);
|
||
ws.handlers.trigger("cleanCutData", true);
|
||
res = true;
|
||
|
||
AscCommon.g_clipboardBase.needClearBuffer = true;
|
||
}
|
||
} else if (!pasteInOriginalDoc) {
|
||
ws.workbook.handlers.trigger("cleanCopyData", true);
|
||
}
|
||
|
||
return res;
|
||
},
|
||
|
||
_checkPastedInOriginalDoc: function (pastedWb, notCheckUser) {
|
||
var res = false;
|
||
|
||
var api = window["Asc"]["editor"];
|
||
var curDocId = api.DocInfo && api.DocInfo.Id;
|
||
var curUserId = api.CoAuthoringApi && api.CoAuthoringApi.getUserConnectionId();
|
||
|
||
if (pastedWb && pastedWb.Core && pastedWb.Core.identifier === curDocId) {
|
||
if (notCheckUser) {
|
||
res = true;
|
||
} else if (pastedWb.Core.creator === curUserId) {
|
||
res = true;
|
||
}
|
||
}
|
||
|
||
return res;
|
||
},
|
||
|
||
_pasteFromBinaryWord: function (worksheet, base64, isIntoShape, isCellEditMode) {
|
||
var res = true;
|
||
var t = this;
|
||
var pasteData = this.ReadFromBinaryWord(base64, worksheet);
|
||
|
||
if (isCellEditMode) {
|
||
res = this._getTextFromWord(pasteData.content);
|
||
}
|
||
//insert binary from word into SHAPE
|
||
else if (isIntoShape) {
|
||
var callback = function (isSuccess) {
|
||
if (isSuccess) {
|
||
t._insertBinaryIntoShapeContent(worksheet, pasteData.content, true);
|
||
}
|
||
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
|
||
if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) {
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(isSuccess);
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null;
|
||
}
|
||
};
|
||
|
||
worksheet.objectRender.controller.checkPasteInText(callback);
|
||
} else {
|
||
var oPasteFromBinaryWord = new pasteFromBinaryWord(this, worksheet);
|
||
oPasteFromBinaryWord._paste(worksheet, pasteData);
|
||
}
|
||
|
||
return res;
|
||
},
|
||
|
||
_pasteFromBinaryPresentation: function (worksheet, base64, isIntoShape, isCellEditMode) {
|
||
pptx_content_loader.Clear();
|
||
|
||
var _stream = AscFormat.CreateBinaryReader(base64, 0, base64.length);
|
||
var stream = new AscCommon.FileStream(_stream.data, _stream.size);
|
||
var p_url = stream.GetString2();
|
||
var p_theme = stream.GetString2();
|
||
var p_width = stream.GetULong() / 100000;
|
||
var p_height = stream.GetULong() / 100000;
|
||
var t = this;
|
||
|
||
var bIsMultipleContent = stream.GetBool();
|
||
|
||
var selectedContent2 = [], i;
|
||
if (true === bIsMultipleContent) {
|
||
var multipleParamsCount = stream.GetULong();
|
||
for (i = 0; i < multipleParamsCount; i++) {
|
||
selectedContent2.push(this._readPresentationSelectedContent(stream, worksheet));
|
||
}
|
||
}
|
||
|
||
var specialOptionsArr = [];
|
||
var specialProps = Asc.c_oSpecialPasteProps;
|
||
if (2 === multipleParamsCount) {
|
||
specialOptionsArr = [specialProps.sourceformatting];
|
||
} else if (3 === multipleParamsCount) {
|
||
specialOptionsArr = [specialProps.sourceformatting, specialProps.picture];
|
||
}
|
||
|
||
var defaultSelectedContent = selectedContent2[0] ? selectedContent2[0] : selectedContent2[1];
|
||
var bSlideObjects = defaultSelectedContent && defaultSelectedContent.content.SlideObjects &&
|
||
defaultSelectedContent.content.SlideObjects.length > 0;
|
||
var pasteObj = bSlideObjects ? selectedContent2[2] : defaultSelectedContent;
|
||
|
||
if (window['AscCommon'].g_specialPasteHelper.specialPasteStart) {
|
||
var props = window['AscCommon'].g_specialPasteHelper.specialPasteProps.property;
|
||
switch (props) {
|
||
case Asc.c_oSpecialPasteProps.picture: {
|
||
if (selectedContent2[2]) {
|
||
pasteObj = selectedContent2[2];
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
var arr_Images, fonts, content = null;
|
||
if (pasteObj) {
|
||
arr_Images = pasteObj.images;
|
||
fonts = pasteObj.fonts;
|
||
content = pasteObj.content;
|
||
}
|
||
|
||
if (null === content) {
|
||
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
|
||
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
|
||
if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) {
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(false);
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null;
|
||
}
|
||
return;
|
||
}
|
||
|
||
if (content.DocContent) {
|
||
var docContent = content.DocContent.Elements;
|
||
|
||
if (isCellEditMode) {
|
||
var text = this._getTextFromWord(docContent);
|
||
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
|
||
if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) {
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(text !== false);
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null;
|
||
}
|
||
return text;
|
||
} else if (isIntoShape) {
|
||
var callback = function (isSuccess) {
|
||
if (isSuccess) {
|
||
t._insertBinaryIntoShapeContent(worksheet, docContent);
|
||
}
|
||
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
|
||
if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) {
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(isSuccess);
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null;
|
||
}
|
||
};
|
||
|
||
worksheet.objectRender.controller.checkPasteInText(callback);
|
||
return true;
|
||
} else {
|
||
History.TurnOff();
|
||
var oPasteFromBinaryWord = new pasteFromBinaryWord(this, worksheet, true);
|
||
|
||
var oTempDrawingDocument = window["Asc"]["editor"].wbModel.getDrawingDocument();
|
||
var newCDocument = new CDocument(oTempDrawingDocument, false);
|
||
newCDocument.bFromDocument = true;
|
||
newCDocument.theme = window["Asc"]["editor"].wbModel.theme;
|
||
|
||
var newContent = [];
|
||
for (i = 0; i < docContent.length; i++) {
|
||
if (type_Paragraph === docContent[i].GetType())//paragraph
|
||
{
|
||
docContent[i] = AscFormat.ConvertParagraphToWord(docContent[i], newCDocument);
|
||
docContent[i].bFromDocument = true;
|
||
newContent.push(docContent[i]);
|
||
} else if (type_Table === docContent[i].GetType())//table
|
||
{
|
||
//TODO вырезать из таблицы параграфы
|
||
}
|
||
}
|
||
docContent = newContent;
|
||
|
||
History.TurnOn();
|
||
|
||
oPasteFromBinaryWord._paste(worksheet, {content: docContent});
|
||
}
|
||
} else if (content.Drawings) {
|
||
|
||
if (isCellEditMode) {
|
||
return "";
|
||
}
|
||
|
||
if (!bSlideObjects) {
|
||
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
|
||
specialProps = window['AscCommon'].g_specialPasteHelper.buttonInfo;
|
||
if (specialOptionsArr.length > 1) {
|
||
specialProps.asc_setOptions(specialOptionsArr);
|
||
}
|
||
}
|
||
|
||
var arr_shapes = content.Drawings;
|
||
if (arr_shapes && arr_shapes.length) {
|
||
if (!bSlideObjects && content.Drawings.length === selectedContent2[1].content.Drawings.length) {
|
||
var oEndContent = {
|
||
Drawings: []
|
||
};
|
||
var oSourceContent = {
|
||
Drawings: []
|
||
};
|
||
for (i = 0; i < content.Drawings.length; ++i) {
|
||
oEndContent.Drawings.push({Drawing: content.Drawings[i].graphicObject});
|
||
oSourceContent.Drawings.push({Drawing: selectedContent2[1].content.Drawings[i].graphicObject});
|
||
}
|
||
AscFormat.checkDrawingsTransformBeforePaste(oEndContent, oSourceContent, null);
|
||
}
|
||
var newFonts = {};
|
||
for (i = 0; i < arr_shapes.length; i++) {
|
||
arr_shapes[i].graphicObject.getAllFonts(newFonts);
|
||
}
|
||
|
||
var aPastedImages = arr_Images;
|
||
worksheet._loadFonts(newFonts, function () {
|
||
if (aPastedImages && aPastedImages.length) {
|
||
t._loadImagesOnServer(aPastedImages, function () {
|
||
t._insertImagesFromBinary(worksheet, {Drawings: arr_shapes}, isIntoShape, true);
|
||
});
|
||
} else {
|
||
t._insertImagesFromBinary(worksheet, {Drawings: arr_shapes}, isIntoShape, true);
|
||
}
|
||
});
|
||
} else {
|
||
window['AscCommon'].g_specialPasteHelper.buttonInfo.clean();
|
||
}
|
||
|
||
return true;
|
||
}
|
||
},
|
||
|
||
_readPresentationSelectedContent: function (stream, worksheet) {
|
||
|
||
var presentationSelectedContent = null;
|
||
var fonts = [];
|
||
var arr_Images = {};
|
||
var oThis = this;
|
||
|
||
var loader = new AscCommon.BinaryPPTYLoader();
|
||
loader.presentation = worksheet.model;
|
||
loader.DrawingDocument = worksheet.getDrawingDocument();
|
||
loader.stream = stream;
|
||
|
||
var readContent = function () {
|
||
History.TurnOff();
|
||
var docContent = AscCommon.PasteProcessor.prototype.ReadPresentationText.call(this, stream, worksheet);
|
||
History.TurnOn();
|
||
|
||
if (docContent.length === 0) {
|
||
return;
|
||
}
|
||
presentationSelectedContent.DocContent = new AscCommonWord.CSelectedContent();
|
||
presentationSelectedContent.DocContent.Elements = docContent;
|
||
|
||
//перебираем шрифты
|
||
for (var i in oThis.oFonts) {
|
||
fonts.push(new AscFonts.CFont(i));
|
||
}
|
||
};
|
||
|
||
var readDrawings = function () {
|
||
|
||
var objects = oThis.ReadPresentationShapes(stream, worksheet);
|
||
presentationSelectedContent.Drawings = objects.arrShapes;
|
||
|
||
var arr_shapes = objects.arrShapes;
|
||
var font_map = {}, i;
|
||
for (i = 0; i < arr_shapes.length; ++i) {
|
||
if (arr_shapes[i].graphicObject.getAllFonts) {
|
||
arr_shapes[i].graphicObject.getAllFonts(font_map);
|
||
}
|
||
}
|
||
|
||
for (i in font_map) {
|
||
fonts.push(new AscFonts.CFont(i));
|
||
}
|
||
|
||
arr_Images = objects.arrImages;
|
||
};
|
||
|
||
var skipIndexes = function () {
|
||
var count = stream.GetULong();
|
||
|
||
var array = [];
|
||
for (var i = 0; i < count; ++i) {
|
||
stream.GetULong();
|
||
}
|
||
};
|
||
|
||
var skip1 = function () {
|
||
var selected_objs = loader.stream.GetULong();
|
||
|
||
for (var i = 0; i < selected_objs; ++i) {
|
||
loader.stream.GetUChar();
|
||
loader.stream.SkipRecord();
|
||
}
|
||
};
|
||
|
||
var first_content = stream.GetString2();
|
||
if (first_content === "SelectedContent") {
|
||
var PresentationWidth = stream.GetULong() / 100000.0;
|
||
var PresentationHeight = stream.GetULong() / 100000.0;
|
||
var countContent = stream.GetULong();
|
||
for (var i = 0; i < countContent; i++) {
|
||
if (null === presentationSelectedContent) {
|
||
presentationSelectedContent = typeof PresentationSelectedContent !== "undefined" ? new PresentationSelectedContent() : {};
|
||
}
|
||
var first_string = stream.GetString2();
|
||
switch (first_string) {
|
||
case "DocContent": {
|
||
readContent(stream, worksheet);
|
||
break;
|
||
}
|
||
case "Drawings": {
|
||
readDrawings();
|
||
break;
|
||
}
|
||
case "SlideObjects": {
|
||
presentationSelectedContent.SlideObjects = [null];
|
||
skip1();
|
||
break;
|
||
}
|
||
case "LayoutsIndexes": {
|
||
skipIndexes();
|
||
break;
|
||
}
|
||
case "MastersIndexes": {
|
||
skipIndexes();
|
||
break;
|
||
}
|
||
case "NotesMastersIndexes": {
|
||
skipIndexes();
|
||
break;
|
||
}
|
||
case "ThemeIndexes": {
|
||
skipIndexes();
|
||
break;
|
||
}
|
||
default: {
|
||
skip1();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return {content: presentationSelectedContent, fonts: fonts, images: arr_Images};
|
||
},
|
||
|
||
_pasteFromBinaryPDF: function (worksheet, base64, isIntoShape, isCellEditMode) {
|
||
pptx_content_loader.Clear();
|
||
|
||
let _stream = AscFormat.CreateBinaryReader(base64, 0, base64.length);
|
||
let stream = new AscCommon.FileStream(_stream.data, _stream.size);
|
||
let p_url = stream.GetString2();
|
||
let t = this;
|
||
|
||
let bIsMultipleContent = stream.GetBool();
|
||
|
||
let selectedContent2 = [], i;
|
||
let multipleParamsCount = stream.GetULong();
|
||
for (i = 0; i < multipleParamsCount; i++) {
|
||
selectedContent2.push(this._readPDFSelectedContent(stream, worksheet));
|
||
}
|
||
|
||
let specialOptionsArr = [];
|
||
let specialProps = Asc.c_oSpecialPasteProps;
|
||
if (2 === multipleParamsCount) {
|
||
specialOptionsArr = [specialProps.sourceformatting];
|
||
} else if (3 === multipleParamsCount) {
|
||
specialOptionsArr = [specialProps.sourceformatting, specialProps.picture];
|
||
}
|
||
|
||
let pasteObj = selectedContent2[0] ? selectedContent2[0] : selectedContent2[1];
|
||
|
||
if (window['AscCommon'].g_specialPasteHelper.specialPasteStart) {
|
||
let props = window['AscCommon'].g_specialPasteHelper.specialPasteProps.property;
|
||
switch (props) {
|
||
case Asc.c_oSpecialPasteProps.picture: {
|
||
if (selectedContent2[2]) {
|
||
pasteObj = selectedContent2[2];
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
let arr_Images, fonts, content = null;
|
||
if (pasteObj) {
|
||
arr_Images = pasteObj.images;
|
||
fonts = pasteObj.fonts;
|
||
content = pasteObj.content;
|
||
}
|
||
|
||
if (null === content) {
|
||
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
|
||
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
|
||
if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) {
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(false);
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null;
|
||
}
|
||
return;
|
||
}
|
||
|
||
if (content.DocContent) {
|
||
let docContent = content.DocContent.Elements;
|
||
|
||
if (isCellEditMode) {
|
||
let text = this._getTextFromWord(docContent);
|
||
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
|
||
if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) {
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(text !== false);
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null;
|
||
}
|
||
return text;
|
||
} else if (isIntoShape) {
|
||
let callback = function (isSuccess) {
|
||
if (isSuccess) {
|
||
t._insertBinaryIntoShapeContent(worksheet, docContent);
|
||
}
|
||
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
|
||
if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) {
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(isSuccess);
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null;
|
||
}
|
||
};
|
||
|
||
worksheet.objectRender.controller.checkPasteInText(callback);
|
||
return true;
|
||
} else {
|
||
History.TurnOff();
|
||
let oPasteFromBinaryWord = new pasteFromBinaryWord(this, worksheet, true);
|
||
|
||
let oTempDrawingDocument = window["Asc"]["editor"].wbModel.getDrawingDocument();
|
||
let newCDocument = new CDocument(oTempDrawingDocument, false);
|
||
newCDocument.bFromDocument = true;
|
||
newCDocument.theme = window["Asc"]["editor"].wbModel.theme;
|
||
|
||
let newContent = [];
|
||
for (i = 0; i < docContent.length; i++) {
|
||
if (type_Paragraph === docContent[i].GetType())//paragraph
|
||
{
|
||
docContent[i] = AscFormat.ConvertParagraphToWord(docContent[i], newCDocument);
|
||
docContent[i].bFromDocument = true;
|
||
newContent.push(docContent[i]);
|
||
} else if (type_Table === docContent[i].GetType())//table
|
||
{
|
||
//TODO вырезать из таблицы параграфы
|
||
}
|
||
}
|
||
docContent = newContent;
|
||
|
||
History.TurnOn();
|
||
|
||
oPasteFromBinaryWord._paste(worksheet, {content: docContent});
|
||
}
|
||
} else if (content.Drawings) {
|
||
|
||
if (isCellEditMode) {
|
||
return "";
|
||
}
|
||
|
||
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
|
||
specialProps = window['AscCommon'].g_specialPasteHelper.buttonInfo;
|
||
if (specialOptionsArr.length > 1) {
|
||
specialProps.asc_setOptions(specialOptionsArr);
|
||
}
|
||
|
||
let arr_shapes = content.Drawings;
|
||
if (arr_shapes && arr_shapes.length && !(window["Asc"]["editor"] && window["Asc"]["editor"].isChartEditor)) {
|
||
if (content.Drawings.length === pasteObj.content.Drawings.length) {
|
||
let oEndContent = {
|
||
Drawings: []
|
||
};
|
||
let oSourceContent = {
|
||
Drawings: []
|
||
};
|
||
for (i = 0; i < content.Drawings.length; ++i) {
|
||
oEndContent.Drawings.push({Drawing: content.Drawings[i].graphicObject});
|
||
oSourceContent.Drawings.push({Drawing: pasteObj.content.Drawings[i].graphicObject});
|
||
}
|
||
AscFormat.checkDrawingsTransformBeforePaste(oEndContent, oSourceContent, null);
|
||
}
|
||
let newFonts = {};
|
||
for (i = 0; i < arr_shapes.length; i++) {
|
||
arr_shapes[i].graphicObject.getAllFonts(newFonts);
|
||
}
|
||
|
||
let aPastedImages = arr_Images;
|
||
worksheet._loadFonts(newFonts, function () {
|
||
if (aPastedImages && aPastedImages.length) {
|
||
t._loadImagesOnServer(aPastedImages, function () {
|
||
t._insertImagesFromBinary(worksheet, {Drawings: arr_shapes}, isIntoShape, true);
|
||
});
|
||
} else {
|
||
t._insertImagesFromBinary(worksheet, {Drawings: arr_shapes}, isIntoShape, true);
|
||
}
|
||
});
|
||
} else {
|
||
window['AscCommon'].g_specialPasteHelper.buttonInfo.clean();
|
||
}
|
||
|
||
return true;
|
||
}
|
||
},
|
||
|
||
_readPDFSelectedContent: function (stream, worksheet) {
|
||
|
||
var oPdfSelContent = null;
|
||
var fonts = [];
|
||
var arr_Images = {};
|
||
var oThis = this;
|
||
|
||
var loader = new AscCommon.BinaryPPTYLoader();
|
||
loader.presentation = worksheet.model;
|
||
loader.DrawingDocument = worksheet.getDrawingDocument();
|
||
loader.stream = stream;
|
||
|
||
var readContent = function () {
|
||
History.TurnOff();
|
||
var docContent = AscCommon.PasteProcessor.prototype.ReadPresentationText.call(this, stream, worksheet);
|
||
History.TurnOn();
|
||
|
||
if (docContent.length === 0) {
|
||
return;
|
||
}
|
||
oPdfSelContent.DocContent = new AscCommonWord.CSelectedContent();
|
||
oPdfSelContent.DocContent.Elements = docContent;
|
||
|
||
//перебираем шрифты
|
||
for (var i in oThis.oFonts) {
|
||
fonts.push(new AscFonts.CFont(i));
|
||
}
|
||
};
|
||
|
||
var readDrawings = function () {
|
||
|
||
var objects = oThis.ReadPresentationShapes(stream, worksheet);
|
||
oPdfSelContent.Drawings = objects.arrShapes;
|
||
|
||
var arr_shapes = objects.arrShapes;
|
||
var font_map = {}, i;
|
||
for (i = 0; i < arr_shapes.length; ++i) {
|
||
if (arr_shapes[i].graphicObject.getAllFonts) {
|
||
arr_shapes[i].graphicObject.getAllFonts(font_map);
|
||
}
|
||
}
|
||
|
||
for (i in font_map) {
|
||
fonts.push(new AscFonts.CFont(i));
|
||
}
|
||
|
||
arr_Images = objects.arrImages;
|
||
};
|
||
|
||
var skip1 = function () {
|
||
var selected_objs = loader.stream.GetULong();
|
||
|
||
for (var i = 0; i < selected_objs; ++i) {
|
||
loader.stream.GetUChar();
|
||
loader.stream.SkipRecord();
|
||
}
|
||
};
|
||
|
||
var first_content = stream.GetString2();
|
||
if (first_content === "SelectedContent") {
|
||
var countContent = stream.GetULong();
|
||
for (var i = 0; i < countContent; i++) {
|
||
if (null === oPdfSelContent) {
|
||
oPdfSelContent = window["AscPDF"] && window["AscPDF"].PDFSelectedContent ? new window["AscPDF"].PDFSelectedContent() : {};
|
||
}
|
||
var first_string = stream.GetString2();
|
||
switch (first_string) {
|
||
case "DocContent": {
|
||
readContent(stream, worksheet);
|
||
break;
|
||
}
|
||
case "Drawings": {
|
||
readDrawings();
|
||
break;
|
||
}
|
||
default: {
|
||
skip1();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return {content: oPdfSelContent, fonts: fonts, images: arr_Images};
|
||
},
|
||
|
||
_insertBinaryIntoShapeContent: function (worksheet, content, isConvertToPPTX) {
|
||
if (!content || !content.length) {
|
||
return;
|
||
}
|
||
|
||
History.Create_NewPoint();
|
||
History.StartTransaction();
|
||
|
||
//ещё раз вызваем getTargetDocContent с флагом true после создания точки в истории(getTargetDocContent добавляет данные в историю)
|
||
var isIntoShape = worksheet.objectRender.controller.getTargetDocContent(true);
|
||
isIntoShape.Remove(1, true, true);
|
||
|
||
var insertContent = new AscCommonWord.CSelectedContent();
|
||
var target_doc_content = isIntoShape;
|
||
|
||
insertContent.Elements =
|
||
this._convertBeforeInsertIntoShapeContent(worksheet, content, isConvertToPPTX, target_doc_content);
|
||
|
||
//TODO конвертирую в текст без форматирую. пеесмотреть!
|
||
var specialPasteProps = window['AscCommon'].g_specialPasteHelper.specialPasteProps;
|
||
if (specialPasteProps && !specialPasteProps.format) {
|
||
for (var i = 0; i < insertContent.Elements.length; i++) {
|
||
insertContent.Elements[i].Element.Clear_TextFormatting();
|
||
}
|
||
}
|
||
|
||
this._insertSelectedContentIntoShapeContent(worksheet, insertContent, target_doc_content);
|
||
|
||
History.EndTransaction();
|
||
|
||
worksheet.objectRender.controller.startRecalculate();
|
||
//for special paste
|
||
this._setShapeSpecialPasteProperties(worksheet, isIntoShape);
|
||
},
|
||
|
||
_setShapeSpecialPasteProperties: function (worksheet, isIntoShape) {
|
||
//TODO пока выключаю специальную ставку внутри math, позже доработать и включить
|
||
var oInfo = new CSelectedElementsInfo();
|
||
//var selectedElementsInfo = isIntoShape.GetSelectedElementsInfo(oInfo);
|
||
var mathObj = oInfo.GetMath();
|
||
|
||
if (/*!window['AscCommon'].g_specialPasteHelper.specialPasteStart && */null === mathObj) {
|
||
var sProps = Asc.c_oSpecialPasteProps;
|
||
var curShape = isIntoShape.Parent.parent;
|
||
|
||
var asc_getcvt = Asc.getCvtRatio;
|
||
var mmToPx = asc_getcvt(3/*px*/, 0/*pt*/, worksheet._getPPIX());
|
||
|
||
var cellsLeft = worksheet.cellsLeft;
|
||
var cellsTop = worksheet.cellsTop;
|
||
|
||
var cursorPos = isIntoShape.GetCursorPosXY();
|
||
var offsetX = worksheet._getColLeft(worksheet.visibleRange.c1) - cellsLeft;
|
||
var offsetY = worksheet._getRowTop(worksheet.visibleRange.r1) - cellsTop;
|
||
var posX = curShape.transformText.TransformPointX(cursorPos.X, cursorPos.Y) * mmToPx - offsetX +
|
||
cellsLeft;
|
||
var posY = curShape.transformText.TransformPointY(cursorPos.X, cursorPos.Y) * mmToPx - offsetY +
|
||
cellsTop;
|
||
|
||
posX = AscCommon.AscBrowser.convertToRetinaValue(posX);
|
||
posY = AscCommon.AscBrowser.convertToRetinaValue(posY);
|
||
|
||
var position = {x: posX, y: posY};
|
||
|
||
var allowedSpecialPasteProps = [sProps.sourceformatting, sProps.destinationFormatting];
|
||
|
||
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
|
||
window['AscCommon'].g_specialPasteHelper.buttonInfo.asc_setOptions(allowedSpecialPasteProps);
|
||
window['AscCommon'].g_specialPasteHelper.buttonInfo.setPosition(position);
|
||
window['AscCommon'].g_specialPasteHelper.buttonInfo.setRange(cursorPos);
|
||
window['AscCommon'].g_specialPasteHelper.buttonInfo.setShapeId(isIntoShape.Id);
|
||
}
|
||
},
|
||
|
||
_convertBeforeInsertIntoShapeContent: function (worksheet, content, isConvertToPPTX, target_doc_content) {
|
||
var elements = [], selectedElement, element;
|
||
var bRemoveHyperlink = false;
|
||
if (target_doc_content && target_doc_content.Is_ChartTitleContent &&
|
||
target_doc_content.Is_ChartTitleContent()) {
|
||
bRemoveHyperlink = true;
|
||
}
|
||
for (var i = 0; i < content.length; i++) {
|
||
selectedElement = new AscCommonWord.CSelectedElement();
|
||
element = content[i];
|
||
|
||
if (type_Paragraph === element.GetType())//paragraph
|
||
{
|
||
selectedElement.Element =
|
||
AscFormat.ConvertParagraphToPPTX(element, worksheet.getDrawingDocument(),
|
||
target_doc_content, true, bRemoveHyperlink);
|
||
elements.push(selectedElement);
|
||
} else if (type_Table === element.GetType())//table
|
||
{
|
||
//excel (извне и из word) вставляет в шейпы аналогично, а вот из excel в excel вставляет в одну строку(?). мы сделаем для всех случаев одинаково.
|
||
var paragraphs = [];
|
||
element.GetAllParagraphs({All: true}, paragraphs);
|
||
for (var j = 0; j < paragraphs.length; j++) {
|
||
selectedElement = new AscCommonWord.CSelectedElement();
|
||
selectedElement.Element =
|
||
AscFormat.ConvertParagraphToPPTX(paragraphs[j], worksheet.getDrawingDocument(),
|
||
target_doc_content, true, bRemoveHyperlink);
|
||
elements.push(selectedElement);
|
||
}
|
||
}
|
||
}
|
||
|
||
return elements;
|
||
},
|
||
|
||
_insertSelectedContentIntoShapeContent: function (worksheet, selectedContent, target_doc_content) {
|
||
var paragraph = target_doc_content.Content[target_doc_content.CurPos.ContentPos];
|
||
if (null != paragraph && type_Paragraph === paragraph.GetType() && selectedContent.Elements && selectedContent.Elements.length) {
|
||
|
||
selectedContent.EndCollect(target_doc_content);
|
||
let NearPos = {Paragraph: paragraph, ContentPos: paragraph.Get_ParaContentPos(false, false)};
|
||
paragraph.Check_NearestPos(NearPos);
|
||
selectedContent.Insert(NearPos, false);
|
||
var oTargetTextObject = AscFormat.getTargetTextObject(worksheet.objectRender.controller);
|
||
oTargetTextObject && oTargetTextObject.checkExtentsByDocContent &&
|
||
oTargetTextObject.checkExtentsByDocContent();
|
||
worksheet.objectRender.controller.startRecalculate();
|
||
}
|
||
},
|
||
|
||
_insertImagesFromBinary: function (ws, data, isIntoShape, needShowSpecialProps, savePosition, pastedWb) {
|
||
var activeCell = ws.model.selectionRange.activeCell;
|
||
var curCol, drawingObject, curRow, startCol, startRow, xfrm, aImagesSync = [], activeRow, activeCol,
|
||
offX, offY, rot;
|
||
|
||
//отдельная обработка для вставки одной таблички из презентаций
|
||
drawingObject = data.Drawings[0];
|
||
if (data.Drawings.length === 1 && typeof AscFormat.CGraphicFrame !== "undefined" &&
|
||
drawingObject.graphicObject instanceof AscFormat.CGraphicFrame) {
|
||
this._insertTableFromPresentation(ws, data.Drawings[0]);
|
||
return;
|
||
}
|
||
|
||
if (window["Asc"]["editor"].collaborativeEditing.getGlobalLock() || !window["Asc"]["editor"].canEdit()) {
|
||
return;
|
||
}
|
||
|
||
History.Create_NewPoint();
|
||
History.StartTransaction();
|
||
|
||
var _abortPaste = function (_error) {
|
||
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
|
||
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
|
||
if (_error) {
|
||
ws.handlers.trigger("onErrorEvent", Asc.c_oAscError.ID.PasteSlicerError, Asc.c_oAscError.Level.NoCritical);
|
||
}
|
||
History.EndTransaction();
|
||
};
|
||
|
||
var callback = function (success, slicersNames) {
|
||
if (!success) {
|
||
_abortPaste();
|
||
return;
|
||
}
|
||
|
||
//определяем стартовую позицию, если изображений несколько вставляется
|
||
var graphicObject, i;
|
||
for (i = 0; i < data.Drawings.length; i++) {
|
||
drawingObject = data.Drawings[i];
|
||
graphicObject = drawingObject.graphicObject;
|
||
xfrm = graphicObject.spPr.xfrm;
|
||
if (xfrm) {
|
||
offX = 0;
|
||
offY = 0;
|
||
rot = AscFormat.isRealNumber(xfrm.rot) ? xfrm.rot : 0;
|
||
rot = AscFormat.normalizeRotate(rot);
|
||
if (AscFormat.checkNormalRotate(rot)) {
|
||
if (AscFormat.isRealNumber(xfrm.offX) && AscFormat.isRealNumber(xfrm.offY)) {
|
||
offX = xfrm.offX;
|
||
offY = xfrm.offY;
|
||
}
|
||
} else {
|
||
if (AscFormat.isRealNumber(xfrm.offX) && AscFormat.isRealNumber(xfrm.offY) &&
|
||
AscFormat.isRealNumber(xfrm.extX) && AscFormat.isRealNumber(xfrm.extY)) {
|
||
offX = xfrm.offX + xfrm.extX / 2 - xfrm.extY / 2;
|
||
offY = xfrm.offY + xfrm.extY / 2 - xfrm.extX / 2;
|
||
}
|
||
}
|
||
|
||
if (i === 0) {
|
||
startCol = offX;
|
||
startRow = offY;
|
||
} else {
|
||
if (startCol > offX) {
|
||
startCol = offX;
|
||
}
|
||
if (startRow > offY) {
|
||
startRow = offY;
|
||
}
|
||
}
|
||
} else {
|
||
if (i === 0) {
|
||
startCol = drawingObject.from.col;
|
||
startRow = drawingObject.from.row;
|
||
} else {
|
||
if (startCol > drawingObject.from.col) {
|
||
startCol = drawingObject.from.col;
|
||
}
|
||
if (startRow > drawingObject.from.row) {
|
||
startRow = drawingObject.from.row;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
var aCopies = [];
|
||
var oIdMap = {};
|
||
var _slicerCounter = 0;
|
||
var oCopyPr = new AscFormat.CCopyObjectProperties();
|
||
oCopyPr.idMap = oIdMap;
|
||
ws.objectRender.controller.resetSelection();
|
||
let aDrawings = [];
|
||
for (i = 0; i < data.Drawings.length; i++) {
|
||
|
||
if (slicersNames && data.Drawings[i].graphicObject.getObjectType() === AscDFH.historyitem_type_SlicerView) {
|
||
if (slicersNames[_slicerCounter]) {
|
||
data.Drawings[i].graphicObject.setName(slicersNames[_slicerCounter]);
|
||
} else {
|
||
continue;
|
||
}
|
||
_slicerCounter++;
|
||
}
|
||
|
||
var _copy = data.Drawings[i].graphicObject.copy(oCopyPr);
|
||
_copy.applySpecialPasteProps(pastedWb);
|
||
if (_copy.convertFromSmartArt) {
|
||
_copy.convertFromSmartArt(true);
|
||
}
|
||
_copy.clearChartDataCache();
|
||
oIdMap[data.Drawings[i].graphicObject.Id] = _copy.Id;
|
||
data.Drawings[i].graphicObject = _copy;
|
||
aCopies.push(data.Drawings[i].graphicObject);
|
||
|
||
drawingObject = data.Drawings[i];
|
||
AscFormat.CheckSpPrXfrm2(drawingObject.graphicObject);
|
||
xfrm = drawingObject.graphicObject.spPr.xfrm;
|
||
|
||
activeRow = activeCell.row;
|
||
activeCol = activeCell.col;
|
||
if (isIntoShape && isIntoShape.Parent && isIntoShape.Parent.parent &&
|
||
isIntoShape.Parent.parent.drawingBase && isIntoShape.Parent.parent.drawingBase.from) {
|
||
activeRow = isIntoShape.Parent.parent.drawingBase.from.row;
|
||
activeCol = isIntoShape.Parent.parent.drawingBase.from.col;
|
||
}
|
||
|
||
if (savePosition) {
|
||
curCol = xfrm.offX;
|
||
curRow = xfrm.offY;
|
||
} else {
|
||
curCol = xfrm.offX - startCol + ws.objectRender.convertMetric(ws._getColLeft(activeCol + 1*ws.getRightToLeft()) - ws._getColLeft(0), 0, 3);
|
||
curRow = xfrm.offY - startRow + ws.objectRender.convertMetric(ws._getRowTop(activeRow) - ws._getRowTop(0), 0, 3);
|
||
}
|
||
|
||
|
||
drawingObject = ws.objectRender.cloneDrawingObject(drawingObject);
|
||
drawingObject.graphicObject.setDrawingBase(drawingObject);
|
||
|
||
drawingObject.graphicObject.setDrawingObjects(ws.objectRender);
|
||
drawingObject.graphicObject.setWorksheet(ws.model);
|
||
let _left = ws.checkRtl(curCol, null, 3);
|
||
if (ws.getRightToLeft()) {
|
||
let mmToPx = Asc.getCvtRatio(3/*px*/, 0/*pt*/, ws._getPPIX());
|
||
let _widthDrawing = drawingObject.getWidthFromTo() / mmToPx;
|
||
let _widthCtx = ws.getCtxWidth() / mmToPx;
|
||
if (_left + _widthDrawing > _widthCtx) {
|
||
_left -= _left + _widthDrawing - _widthCtx;
|
||
}
|
||
}
|
||
xfrm.setOffX( _left);
|
||
xfrm.setOffY(curRow);
|
||
aDrawings.push(drawingObject.graphicObject);
|
||
drawingObject.graphicObject.getAllRasterImages(aImagesSync);
|
||
}
|
||
|
||
let dShift = ws.objectRender.controller.getDrawingsPasteShift(aDrawings);
|
||
for (let nDrawing = 0; nDrawing < aDrawings.length; ++nDrawing) {
|
||
let oDrawing = aDrawings[nDrawing];
|
||
if (dShift > 0) {
|
||
oDrawing.shiftXfrm(dShift, dShift);
|
||
}
|
||
oDrawing.addToDrawingObjects();
|
||
oDrawing.checkDrawingBaseCoords();
|
||
oDrawing.generateSmartArtDrawingPart();
|
||
oDrawing.recalculate();
|
||
oDrawing.select(ws.objectRender.controller, 0);
|
||
}
|
||
|
||
AscFormat.fResetConnectorsIds(aCopies, oIdMap);
|
||
if (aImagesSync.length > 0) {
|
||
window["Asc"]["editor"].ImageLoader.LoadDocumentImages(aImagesSync);
|
||
}
|
||
ws.objectRender.controller.updateSelectionState();
|
||
ws.objectRender.controller.updatePlaceholders();
|
||
ws.objectRender.showDrawingObjects();
|
||
|
||
if (needShowSpecialProps) {
|
||
if (!window['AscCommon'].g_specialPasteHelper.buttonInfo.options) {
|
||
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
|
||
} else {
|
||
var lastAddedImg = ws.model.Drawings[ws.model.Drawings.length - 1];
|
||
if (drawingObject && lastAddedImg) {
|
||
window['AscCommon'].g_specialPasteHelper.buttonInfo.setRange({
|
||
r1: lastAddedImg.from.row,
|
||
c1: lastAddedImg.from.col,
|
||
r2: lastAddedImg.to.row,
|
||
c2: lastAddedImg.to.col
|
||
});
|
||
}
|
||
}
|
||
}
|
||
|
||
ws.objectRender.controller.updateOverlay();
|
||
ws.setSelectionShape(true);
|
||
History.EndTransaction();
|
||
|
||
|
||
if (!needShowSpecialProps) {
|
||
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
|
||
}
|
||
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
|
||
};
|
||
|
||
//вставляем срезы следующим образом: проверяем что вставлем в оригинальный документ
|
||
//далее смотрим, есть ли такой внутренний объект этого кэша - для таблиц проверяем
|
||
//соответствие имени таблицы и имени колонки
|
||
//если все объекты внутренние имеются, проверяем локи, если нет - ошибка
|
||
var pastedInOriginalDoc = this._checkPastedInOriginalDoc(pastedWb)
|
||
var pastedSlicers = [];
|
||
for (var i = 0; i < data.Drawings.length; i++) {
|
||
if (data.Drawings[i].graphicObject.getObjectType() === AscDFH.historyitem_type_SlicerView) {
|
||
if (pastedInOriginalDoc) {
|
||
var pastedSlicer = data.getSlicerByName(data.Drawings[i].graphicObject.name);
|
||
if (pastedSlicer) {
|
||
if (pastedSlicer.checkModelContent(ws.model)) {
|
||
pastedSlicers.push(pastedSlicer);
|
||
} else {
|
||
//error
|
||
_abortPaste(true);
|
||
return;
|
||
}
|
||
}
|
||
} else {
|
||
//error
|
||
_abortPaste(true);
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (pastedSlicers && pastedSlicers.length) {
|
||
ws.tryPasteSlicers(pastedSlicers, callback);
|
||
} else {
|
||
callback(true);
|
||
}
|
||
},
|
||
|
||
_insertImagesFromBinaryWord: function (ws, data, aImagesSync) {
|
||
var activeRange = ws.model.selectionRange.getLast().clone();
|
||
var curCol, drawingObject, curRow, startCol = 0, startRow = 0, xfrm, drawingBase, graphicObject, offX,
|
||
offY, rot;
|
||
|
||
History.Create_NewPoint();
|
||
History.StartTransaction();
|
||
var api = window["Asc"]["editor"];
|
||
var addImagesFromWord = data.props.addImagesFromWord;
|
||
//определяем стартовую позицию, если изображений несколько вставляется
|
||
let aDrawings = [];
|
||
for (var i = 0; i < addImagesFromWord.length; i++) {
|
||
if (para_Math === addImagesFromWord[i].image.Type) {
|
||
graphicObject = ws.objectRender.createShapeAndInsertContent(addImagesFromWord[i].image);
|
||
} else {
|
||
graphicObject = addImagesFromWord[i].image.GraphicObj;
|
||
|
||
//convert from word
|
||
if (graphicObject.setBDeleted2) {
|
||
graphicObject.setBDeleted2(true);
|
||
} else {
|
||
graphicObject.bDeleted = true;
|
||
}
|
||
graphicObject = graphicObject.convertToPPTX(ws.getDrawingDocument(), ws.model, true);
|
||
}
|
||
|
||
|
||
//create new drawingBase
|
||
drawingObject = ws.objectRender.createDrawingObject();
|
||
drawingObject.graphicObject = graphicObject;
|
||
|
||
if (graphicObject.spPr && graphicObject.spPr.xfrm) {
|
||
xfrm = graphicObject.spPr.xfrm;
|
||
offX = 0;
|
||
offY = 0;
|
||
rot = AscFormat.isRealNumber(xfrm.rot) ? xfrm.rot : 0;
|
||
rot = AscFormat.normalizeRotate(rot);
|
||
if (AscFormat.checkNormalRotate(rot)) {
|
||
if (AscFormat.isRealNumber(xfrm.offX) && AscFormat.isRealNumber(xfrm.offY)) {
|
||
offX = xfrm.offX;
|
||
offY = xfrm.offY;
|
||
}
|
||
} else {
|
||
if (AscFormat.isRealNumber(xfrm.offX) && AscFormat.isRealNumber(xfrm.offY) &&
|
||
AscFormat.isRealNumber(xfrm.extX) && AscFormat.isRealNumber(xfrm.extY)) {
|
||
offX = xfrm.offX + xfrm.extX / 2 - xfrm.extY / 2;
|
||
offY = xfrm.offY + xfrm.extY / 2 - xfrm.extX / 2;
|
||
}
|
||
}
|
||
|
||
if (i === 0) {
|
||
startCol = offX;
|
||
startRow = offY;
|
||
} else {
|
||
if (startCol > offX) {
|
||
startCol = offX;
|
||
}
|
||
if (startRow > offY) {
|
||
startRow = offY;
|
||
}
|
||
}
|
||
} else {
|
||
if (i === 0) {
|
||
startCol = drawingObject.from.col;
|
||
startRow = drawingObject.from.row;
|
||
} else {
|
||
if (startCol > drawingObject.from.col) {
|
||
startCol = drawingObject.from.col;
|
||
}
|
||
if (startRow > drawingObject.from.row) {
|
||
startRow = drawingObject.from.row;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
AscFormat.CheckSpPrXfrm2(graphicObject);
|
||
xfrm = graphicObject.spPr.xfrm;
|
||
|
||
curCol = xfrm.offX - startCol + ws.objectRender.convertMetric(ws._getColLeft(addImagesFromWord[i].col + activeRange.c1, true) - (ws.getRightToLeft() ? - ws._getColLeft(0) : ws._getColLeft(0)), 0, 3);
|
||
curRow = xfrm.offY - startRow + ws.objectRender.convertMetric(ws._getRowTop(addImagesFromWord[i].row + activeRange.r1) - ws._getRowTop(0), 0, 3);
|
||
|
||
xfrm.setOffX(curCol);
|
||
xfrm.setOffY(curRow);
|
||
|
||
drawingObject = ws.objectRender.cloneDrawingObject(drawingObject);
|
||
if (graphicObject.convertFromSmartArt) {
|
||
graphicObject.convertFromSmartArt(true);
|
||
}
|
||
graphicObject.clearChartDataCache();
|
||
graphicObject.setDrawingBase(drawingObject);
|
||
graphicObject.setDrawingObjects(ws.objectRender);
|
||
graphicObject.setWorksheet(ws.model);
|
||
var nAnchorType = AscCommon.c_oAscCellAnchorType.cellanchorTwoCell;
|
||
if (graphicObject.getObjectType() === AscDFH.historyitem_type_ImageShape) {
|
||
nAnchorType = AscCommon.c_oAscCellAnchorType.cellanchorOneCell;
|
||
}
|
||
graphicObject.setDrawingBaseType(nAnchorType);
|
||
if (graphicObject.checkExtentsByDocContent) {
|
||
graphicObject.checkDrawingBaseCoords();
|
||
graphicObject.generateSmartArtDrawingPart();
|
||
graphicObject.checkExtentsByDocContent();
|
||
}
|
||
aDrawings.push(graphicObject);
|
||
}
|
||
let dShift = ws.objectRender.controller.getDrawingsPasteShift(aDrawings);
|
||
ws.objectRender.controller.resetSelection();
|
||
for (let nDrawing = 0; nDrawing < aDrawings.length; ++nDrawing) {
|
||
let oDrawing = aDrawings[nDrawing];
|
||
if (dShift > 0) {
|
||
oDrawing.shiftXfrm(dShift, dShift);
|
||
}
|
||
oDrawing.addToDrawingObjects();
|
||
oDrawing.checkDrawingBaseCoords();
|
||
oDrawing.recalculate();
|
||
oDrawing.select(ws.objectRender.controller, 0);
|
||
}
|
||
|
||
var old_val = api.ImageLoader.bIsAsyncLoadDocumentImages;
|
||
api.ImageLoader.bIsAsyncLoadDocumentImages = true;
|
||
api.ImageLoader.LoadDocumentImages(aImagesSync);
|
||
api.ImageLoader.bIsAsyncLoadDocumentImages = old_val;
|
||
|
||
ws.objectRender.showDrawingObjects();
|
||
ws.setSelectionShape(true);
|
||
ws.objectRender.controller.updatePlaceholders();
|
||
ws.objectRender.controller.updateOverlay();
|
||
History.EndTransaction();
|
||
},
|
||
|
||
|
||
_loadImagesOnServer: function (aPastedImages, callback) {
|
||
var api = Asc["editor"];
|
||
|
||
var oObjectsForDownload = AscCommon.GetObjectsForImageDownload(aPastedImages);
|
||
|
||
AscCommon.sendImgUrls(api, oObjectsForDownload.aUrls, function (data) {
|
||
var oImageMap = {};
|
||
|
||
History.TurnOff();
|
||
AscCommon.ResetNewUrls(data, oObjectsForDownload.aUrls, oObjectsForDownload.aBuilderImagesByUrl, oImageMap);
|
||
History.TurnOn();
|
||
|
||
callback();
|
||
});
|
||
},
|
||
|
||
_insertTableFromPresentation: function (ws, graphicFrame) {
|
||
History.TurnOff();
|
||
//из-за данной строки падение при вставке таблицы pe->se
|
||
//graphicFrame.graphicObject = graphicFrame.graphicObject.copy();
|
||
var drawingObject = graphicFrame;
|
||
|
||
//вставляем табличку из презентаций
|
||
var oPasteFromBinaryWord = new pasteFromBinaryWord(this, ws, true);
|
||
var oTempDrawingDocument = ws.getDrawingDocument();
|
||
|
||
var newCDocument = new CDocument(oTempDrawingDocument, false);
|
||
newCDocument.bFromDocument = true;
|
||
newCDocument.theme = window["Asc"]["editor"].wbModel.theme;
|
||
|
||
drawingObject.graphicObject.setBDeleted(true);
|
||
drawingObject.graphicObject.setWordFlag(false, newCDocument);
|
||
|
||
var oldLogicDocument = oTempDrawingDocument.m_oLogicDocument;
|
||
oTempDrawingDocument.m_oLogicDocument = newCDocument;
|
||
drawingObject.graphicObject.graphicObject.Set_Parent(newCDocument);
|
||
oTempDrawingDocument.m_oLogicDocument = oldLogicDocument;
|
||
|
||
History.TurnOn();
|
||
|
||
oPasteFromBinaryWord._paste(ws, {content: [drawingObject.graphicObject.graphicObject]});
|
||
},
|
||
|
||
editorPasteExec: function (worksheet, node, isText, cb) {
|
||
if (node === undefined) {
|
||
return;
|
||
}
|
||
|
||
var binaryResult, t = this;
|
||
t.alreadyLoadImagesOnServer = false;
|
||
|
||
//если находимся внутри шейпа
|
||
var isIntoShape = worksheet.objectRender.controller.getTargetDocContent();
|
||
if (isIntoShape) {
|
||
var callback = function (isSuccess) {
|
||
if (isSuccess) {
|
||
t._pasteInShape(worksheet, node, isIntoShape);
|
||
} else {
|
||
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
|
||
}
|
||
if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) {
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(isSuccess);
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null;
|
||
}
|
||
};
|
||
|
||
worksheet.objectRender.controller.checkPasteInText(callback);
|
||
return;
|
||
}
|
||
|
||
//****binary****
|
||
if (copyPasteUseBinary) {
|
||
this.activeRange = worksheet.model.selectionRange.getLast().clone();
|
||
binaryResult = this._pasteFromBinaryClassHtml(worksheet, node, isIntoShape);
|
||
|
||
if (binaryResult === true) {
|
||
return;
|
||
} else if (binaryResult !== false && binaryResult !== undefined) {
|
||
node = binaryResult;
|
||
}
|
||
}
|
||
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = cb;
|
||
|
||
this.activeRange = worksheet.model.selectionRange.getLast().clone();
|
||
worksheet.workbook.handlers.trigger("cleanCopyData", true);
|
||
|
||
var callBackAfterLoadImages = function () {
|
||
History.TurnOff();
|
||
|
||
var oTempDrawingDocument = worksheet.getDrawingDocument();
|
||
var newCDocument = new CDocument(oTempDrawingDocument, false);
|
||
newCDocument.bFromDocument = true;
|
||
|
||
//TODo!!!!!!
|
||
newCDocument.Content[0].bFromDocument = true;
|
||
newCDocument.theme = window["Asc"]["editor"].wbModel.theme;
|
||
|
||
var oOldLogicDocument = oTempDrawingDocument.m_oLogicDocument;
|
||
oTempDrawingDocument.m_oLogicDocument = newCDocument;
|
||
var oOldEditor = undefined;
|
||
if ("undefined" !== typeof editor) {
|
||
oOldEditor = editor;
|
||
}
|
||
editor = {WordControl: oTempDrawingDocument, isDocumentEditor: true};
|
||
var oPasteProcessor = new AscCommon.PasteProcessor({
|
||
WordControl: {m_oLogicDocument: newCDocument},
|
||
FontLoader: {}
|
||
}, false, false, null, true);
|
||
oPasteProcessor._Prepeare_recursive(node, true, true);
|
||
|
||
//при специальной вставке в firefox _getComputedStyle возвращает null
|
||
//TODO пересмотреть функцию _getComputedStyle
|
||
let specialPasteHelper = window['AscCommon'].g_specialPasteHelper;
|
||
let specialPasteProps = specialPasteHelper.specialPasteProps;
|
||
let props = specialPasteProps ? specialPasteProps.property : null;
|
||
|
||
if (window['AscCommon'].g_specialPasteHelper.specialPasteStart && window['AscCommon'].g_specialPasteHelper.specialPasteData.aContent && props !== Asc.c_oSpecialPasteProps.picture) {
|
||
oPasteProcessor.aContent = window['AscCommon'].g_specialPasteHelper.specialPasteData.aContent;
|
||
} else {
|
||
oPasteProcessor._Execute(node, {}, true, true, false);
|
||
if (props !== Asc.c_oSpecialPasteProps.picture) {
|
||
window['AscCommon'].g_specialPasteHelper.specialPasteData.aContent = oPasteProcessor.aContent;
|
||
}
|
||
}
|
||
|
||
editor = oOldEditor;
|
||
oTempDrawingDocument.m_oLogicDocument = oOldLogicDocument;
|
||
History.TurnOn();
|
||
|
||
var oPasteFromBinaryWord = new pasteFromBinaryWord(t, worksheet);
|
||
oPasteFromBinaryWord._paste(worksheet, {content: oPasteProcessor.aContent});
|
||
};
|
||
|
||
var aImagesToDownload = this._getImageFromHtml(node, true);
|
||
var specialPasteProps = window['AscCommon'].g_specialPasteHelper.specialPasteProps;
|
||
var api = Asc["editor"];
|
||
if (aImagesToDownload !== null &&
|
||
(!specialPasteProps || (specialPasteProps && specialPasteProps.images)))//load to server
|
||
{
|
||
AscCommon.sendImgUrls(api, aImagesToDownload, function (data) {
|
||
for (var i = 0, length = Math.min(data.length, aImagesToDownload.length); i < length; ++i) {
|
||
var elem = data[i];
|
||
var sFrom = aImagesToDownload[i];
|
||
if (null != elem.url) {
|
||
t.oImages[sFrom] = AscCommon.g_oDocumentUrls.imagePath2Local(elem.path);
|
||
} else {
|
||
t.oImages[sFrom] = sFrom;
|
||
}
|
||
}
|
||
|
||
t.alreadyLoadImagesOnServer = true;
|
||
callBackAfterLoadImages();
|
||
|
||
});
|
||
|
||
} else {
|
||
callBackAfterLoadImages();
|
||
}
|
||
},
|
||
|
||
_pasteFromBinaryClassHtml: function (worksheet, node, isIntoShape) {
|
||
//find class xslData or docData
|
||
var returnBinary = this._getClassBinaryFromHtml(node);
|
||
var base64 = returnBinary.base64;
|
||
var base64FromWord = returnBinary.base64FromWord;
|
||
var base64FromPresentation = returnBinary.base64FromPresentation;
|
||
var base64FromPDF = returnBinary.base64FromPDF;
|
||
|
||
var result = false;
|
||
if (base64 != null)//from excel
|
||
{
|
||
result = this._pasteFromBinaryExcel(worksheet, base64, isIntoShape);
|
||
} else if (base64FromWord)//from word
|
||
{
|
||
result = this._pasteFromBinaryWord(worksheet, base64FromWord, isIntoShape);
|
||
worksheet.workbook.handlers.trigger("cleanCopyData", true);
|
||
} else if (base64FromPresentation) {
|
||
result = this._pasteFromBinaryPresentation(worksheet, base64FromPresentation, isIntoShape);
|
||
worksheet.workbook.handlers.trigger("cleanCopyData", true);
|
||
} else if (base64FromPDF) {
|
||
result = this._pasteFromBinaryPDF(worksheet, base64FromPDF, isIntoShape);
|
||
worksheet.workbook.handlers.trigger("cleanCopyData", true);
|
||
}
|
||
|
||
return result;
|
||
},
|
||
|
||
_getClassBinaryFromHtml: function (node) {
|
||
var base64 = null, base64FromWord = null, base64FromPresentation = null, base64FromPDF;
|
||
var classNode = AscCommon.searchBinaryClass(node);
|
||
|
||
if (classNode != null) {
|
||
var cL = classNode.split(" ");
|
||
for (var i = 0; i < cL.length; i++) {
|
||
if (cL[i].indexOf("xslData;") > -1) {
|
||
base64 = cL[i].split('xslData;')[1];
|
||
} else if (cL[i].indexOf("docData;") > -1) {
|
||
base64FromWord = cL[i].split('docData;')[1];
|
||
} else if (cL[i].indexOf("pptData;") > -1) {
|
||
base64FromPresentation = cL[i].split('pptData;')[1];
|
||
} else if (cL[i].indexOf("pdfData;") > -1) {
|
||
base64FromPDF = cL[i].split('pdfData;')[1];
|
||
}
|
||
}
|
||
}
|
||
|
||
return {base64: base64, base64FromWord: base64FromWord, base64FromPresentation: base64FromPresentation, base64FromPDF: base64FromPDF};
|
||
},
|
||
|
||
_getImageFromHtml: function (html, isGetUrlsArray) {
|
||
var res = null;
|
||
|
||
if (html) {
|
||
var allImages = html.getElementsByTagName('img');
|
||
|
||
if (allImages && allImages.length) {
|
||
if (isGetUrlsArray) {
|
||
var arrayImages = [];
|
||
for (var i = 0; i < allImages.length; i++) {
|
||
arrayImages[i] = allImages[i].src;
|
||
}
|
||
|
||
res = arrayImages;
|
||
} else {
|
||
res = allImages;
|
||
}
|
||
}
|
||
}
|
||
|
||
return res;
|
||
},
|
||
|
||
_getBinaryColor: function (c) {
|
||
var bin, m, x, type, r, g, b, a, s;
|
||
var reColor = /^\s*(?:#?([0-9a-f]{6})|#?([0-9a-f]{3})|rgba?\s*\(\s*((?:\d*\.?\d+)(?:\s*,\s*(?:\d*\.?\d+)){2,3})\s*\))\s*$/i;
|
||
if (typeof c === "number") {
|
||
bin = c;
|
||
} else {
|
||
|
||
m = reColor.exec(c);
|
||
if (!m) {
|
||
return null;
|
||
}
|
||
|
||
if (m[1]) {
|
||
x = [m[1].slice(0, 2), m[1].slice(2, 4), m[1].slice(4)];
|
||
type = 1;
|
||
} else if (m[2]) {
|
||
x = [m[2].slice(0, 1), m[2].slice(1, 2), m[2].slice(2)];
|
||
type = 0;
|
||
} else {
|
||
x = m[3].split(/\s*,\s*/i);
|
||
type = x.length === 3 ? 2 : 3;
|
||
}
|
||
|
||
r = parseInt(type !== 0 ? x[0] : x[0] + x[0], type < 2 ? 16 : 10);
|
||
g = parseInt(type !== 0 ? x[1] : x[1] + x[1], type < 2 ? 16 : 10);
|
||
b = parseInt(type !== 0 ? x[2] : x[2] + x[2], type < 2 ? 16 : 10);
|
||
a = type === 3 ? (Math.round(parseFloat(x[3]) * 100) * 0.01) : 1;
|
||
bin = (r << 16) | (g << 8) | b;
|
||
|
||
}
|
||
return bin;
|
||
},
|
||
|
||
_checkMaxTextLength: function (aResult, r, c) {
|
||
var result = false;
|
||
var isChange = false;
|
||
|
||
var currentCellData = aResult.content[r][c];
|
||
if (currentCellData && currentCellData.content) {
|
||
currentCellData = currentCellData.content;
|
||
for (var i = 0; i < currentCellData.length; i++) {
|
||
if (currentCellData[i] && currentCellData[i].text && currentCellData[i].text.length > c_oAscMaxCellOrCommentLength) {
|
||
isChange = true;
|
||
|
||
var text = currentCellData[i].text;
|
||
var format = currentCellData[i].format;
|
||
var lengthOfText = text.length;
|
||
var iterCount = Math.ceil(lengthOfText / c_oAscMaxCellOrCommentLength);
|
||
var splitText;
|
||
for (var j = 0; j < iterCount; j++) {
|
||
splitText = text.substr(c_oAscMaxCellOrCommentLength * j, c_oAscMaxCellOrCommentLength * (j + 1));
|
||
if (!aResult.content[r]) {
|
||
aResult.content[r] = [];
|
||
}
|
||
if (!aResult.content[r][c]) {
|
||
aResult.content[r][c] = [];
|
||
}
|
||
if (!aResult.content[r][c].content) {
|
||
aResult.content[r][c].content = [];
|
||
}
|
||
|
||
aResult.content[r][c].content[0] = {format: format, text: splitText};
|
||
|
||
if (iterCount !== j + 1) {
|
||
r++;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (isChange) {
|
||
result = {aResult: aResult, r: r, c: c};
|
||
}
|
||
}
|
||
|
||
return result;
|
||
},
|
||
|
||
_getBorderStyleName: function (borderStyle, borderWidth) {
|
||
var res = null;
|
||
var nBorderWidth = parseFloat(borderWidth);
|
||
if (isNaN(nBorderWidth)) {
|
||
return res;
|
||
}
|
||
if (typeof borderWidth === "string" && -1 !== borderWidth.indexOf("pt")) {
|
||
nBorderWidth = nBorderWidth * 96 / 72;
|
||
}
|
||
|
||
switch (borderStyle) {
|
||
case "solid":
|
||
if (0 < nBorderWidth && nBorderWidth <= 1) {
|
||
res = c_oAscBorderStyles.Thin;
|
||
} else if (1 <
|
||
nBorderWidth && nBorderWidth <= 2) {
|
||
res = c_oAscBorderStyles.Medium;
|
||
} else if (2 <
|
||
nBorderWidth && nBorderWidth <= 6) {
|
||
res = c_oAscBorderStyles.Thick;
|
||
} else {
|
||
res = c_oAscBorderStyles.None;
|
||
}
|
||
break;
|
||
case "dashed":
|
||
if (0 < nBorderWidth && nBorderWidth <= 1) {
|
||
res = c_oAscBorderStyles.DashDot;
|
||
} else {
|
||
res = c_oAscBorderStyles.MediumDashDot;
|
||
}
|
||
break;
|
||
case "double":
|
||
res = c_oAscBorderStyles.Double;
|
||
break;
|
||
case "dotted":
|
||
res = c_oAscBorderStyles.Hair;
|
||
break;
|
||
}
|
||
return res;
|
||
},
|
||
|
||
ReadPresentationShapes: function (stream, worksheet) {
|
||
History.TurnOff();
|
||
|
||
var loader = new AscCommon.BinaryPPTYLoader();
|
||
loader.presentation = worksheet.model;
|
||
loader.DrawingDocument = worksheet.getDrawingDocument();
|
||
loader.Start_UseFullUrl();
|
||
|
||
loader.ClearConnectedObjects();
|
||
loader.stream = stream;
|
||
|
||
var count = stream.GetULong();
|
||
var arr_shapes = [];
|
||
var arr_transforms = [];
|
||
var arrBase64Img = [];
|
||
var cStyle;
|
||
|
||
for (var i = 0; i < count; ++i) {
|
||
var style_index = null;
|
||
//читаем флаг о наличии табличного стиля
|
||
if (!loader.stream.GetBool()) {
|
||
if (loader.stream.GetBool()) {
|
||
loader.stream.Skip2(1);
|
||
cStyle = loader.ReadTableStyle();
|
||
|
||
loader.stream.GetBool();
|
||
style_index = stream.GetString2();
|
||
}
|
||
}
|
||
|
||
var drawing = loader.ReadGraphicObject();
|
||
var isGraphicFrame = typeof AscFormat.CGraphicFrame !== "undefined" && drawing instanceof AscFormat.CGraphicFrame;
|
||
|
||
//для случая, когда копируем 1 таблицу из презентаций, в бинарник заносим ещё одну такую же табличку, но со скомпиоированными стилями(для вставки в word / excel)
|
||
if (count === 1 && isGraphicFrame) {
|
||
drawing = loader.ReadGraphicObject();
|
||
}
|
||
|
||
var x = stream.GetULong() / 100000;
|
||
var y = stream.GetULong() / 100000;
|
||
var extX = stream.GetULong() / 100000;
|
||
var extY = stream.GetULong() / 100000;
|
||
var base64 = stream.GetString2();
|
||
|
||
if (count !== 1 && isGraphicFrame) {
|
||
drawing = AscFormat.DrawingObjectsController.prototype.createImage(base64, x, y, extX, extY);
|
||
arrBase64Img.push(
|
||
new AscCommon.CBuilderImages(drawing.blipFill, base64, drawing, drawing.spPr, null));
|
||
}
|
||
|
||
var oDrawingBase = worksheet.objectRender.createDrawingObject();
|
||
oDrawingBase.graphicObject = drawing;
|
||
var nAnchorType = AscCommon.c_oAscCellAnchorType.cellanchorTwoCell;
|
||
if (drawing.getObjectType() === AscDFH.historyitem_type_ImageShape) {
|
||
nAnchorType = AscCommon.c_oAscCellAnchorType.cellanchorOneCell;
|
||
}
|
||
oDrawingBase.Type = nAnchorType;
|
||
arr_shapes[i] = oDrawingBase;
|
||
}
|
||
loader.AssignConnectedObjects();
|
||
History.TurnOn();
|
||
|
||
var arrImages = arrBase64Img.concat(loader.End_UseFullUrl());
|
||
return {arrShapes: arr_shapes, arrImages: arrImages, arrTransforms: arr_transforms};
|
||
},
|
||
|
||
ReadFromBinaryWord: function (sBase64, worksheet) {
|
||
History.TurnOff();
|
||
AscCommon.g_oIdCounter.m_bRead = true;
|
||
|
||
//передавать CDrawingDocument текущего worksheet
|
||
var oTempDrawingDocument = worksheet.getDrawingDocument();
|
||
|
||
var newCDocument = new CDocument(oTempDrawingDocument, false);
|
||
newCDocument.bFromDocument = true;
|
||
newCDocument.theme = window["Asc"]["editor"].wbModel.theme;
|
||
|
||
var old_m_oLogicDocument = oTempDrawingDocument.m_oLogicDocument;
|
||
oTempDrawingDocument.m_oLogicDocument = newCDocument;
|
||
|
||
var oOldEditor = undefined;
|
||
if ("undefined" !== typeof editor) {
|
||
oOldEditor = editor;
|
||
}
|
||
//создается глобальная переменная
|
||
editor = {isDocumentEditor: true, WordControl: {m_oLogicDocument: newCDocument}};
|
||
|
||
pptx_content_loader.Clear();
|
||
pptx_content_loader.Start_UseFullUrl();
|
||
|
||
var openParams = {checkFileSize: false, charCount: 0, parCount: 0, bCopyPaste: true};
|
||
var oBinaryFileReader = new AscCommonWord.BinaryFileReader(newCDocument, openParams);
|
||
var oRes = oBinaryFileReader.ReadFromString(sBase64, {excelCopyPaste: true});
|
||
|
||
//check parents
|
||
if (oRes.content) {
|
||
for (let i = 0; i < oRes.content.length; i++) {
|
||
if (oRes.content[i] && oRes.content[i].Parent == null) {
|
||
oRes.content[i].Parent = newCDocument;
|
||
}
|
||
}
|
||
}
|
||
|
||
var defrPr = oBinaryFileReader.oReadResult && oBinaryFileReader.oReadResult.DefrPr;
|
||
if (defrPr && newCDocument.Styles && newCDocument.Styles.Default && newCDocument.Styles.Default.TextPr) {
|
||
newCDocument.Styles.Default.TextPr.FontSize = defrPr.FontSize;
|
||
if (defrPr.RFonts && defrPr.RFonts.Ascii !== undefined) {
|
||
newCDocument.Styles.Default.TextPr.RFonts = defrPr.RFonts;
|
||
}
|
||
}
|
||
|
||
pptx_content_loader.End_UseFullUrl();
|
||
|
||
oTempDrawingDocument.m_oLogicDocument = old_m_oLogicDocument;
|
||
History.TurnOn();
|
||
AscCommon.g_oIdCounter.m_bRead = false;
|
||
editor = oOldEditor;
|
||
|
||
return oRes;
|
||
},
|
||
|
||
_checkPasteFromBinaryExcel: function (worksheet, isWriteError, insertWorksheet) {
|
||
var t = this;
|
||
var activeCellsPasteFragment = false;
|
||
AscCommonExcel.executeInR1C1Mode(false, function () {
|
||
activeCellsPasteFragment = AscCommonExcel.g_oRangeCache.getAscRange(t.activeRange);
|
||
});
|
||
|
||
var lastRange = worksheet.model.selectionRange.getLast();
|
||
var rMax = (activeCellsPasteFragment.r2 - activeCellsPasteFragment.r1) + lastRange.r1;
|
||
var cMax = (activeCellsPasteFragment.c2 - activeCellsPasteFragment.c1) + lastRange.c1;
|
||
var res = true;
|
||
|
||
//если область вставки выходит за пределы доступной области
|
||
if (cMax > AscCommon.gc_nMaxCol0 || rMax > AscCommon.gc_nMaxRow0) {
|
||
if (isWriteError) {
|
||
worksheet.handlers.trigger("onErrorEvent", Asc.c_oAscError.ID.PasteMaxRangeError, Asc.c_oAscError.Level.NoCritical);
|
||
}
|
||
|
||
res = false;
|
||
} else if (worksheet.handlers && !worksheet.handlers.trigger("getLockDefNameManagerStatus") && insertWorksheet && insertWorksheet.TableParts && insertWorksheet.TableParts.length) {
|
||
//если пытаемся вставить вторым пользователем форматированную таблицу, когда первый уже добавил другую форматированную таблицу
|
||
worksheet.handlers.trigger("onErrorEvent", c_oAscError.ID.LockCreateDefName,
|
||
c_oAscError.Level.NoCritical);
|
||
|
||
res = false;
|
||
}
|
||
|
||
return res;
|
||
},
|
||
|
||
_pasteInShape: function (worksheet, node, targetDocContent) {
|
||
var t = this;
|
||
targetDocContent.DrawingDocument.m_oLogicDocument = null;
|
||
|
||
var oPasteProcessor = new AscCommon.PasteProcessor({
|
||
WordControl: {m_oLogicDocument: targetDocContent},
|
||
FontLoader: {}
|
||
}, false, false, true, true);
|
||
|
||
oPasteProcessor.map_font_index = window["Asc"]["editor"].FontLoader.map_font_index;
|
||
oPasteProcessor.bIsDoublePx = false;
|
||
oPasteProcessor.pasteInPresentationShape = true;
|
||
|
||
var newFonts;
|
||
//если находимся внутри диаграммы убираем ссылки
|
||
if (targetDocContent && targetDocContent.Parent && targetDocContent.Parent.parent && targetDocContent.Parent.parent.chart) {
|
||
var changeTag = $(node).find("a");
|
||
this._changeHtmlTag(changeTag);
|
||
}
|
||
|
||
oPasteProcessor._Prepeare_recursive(node, true, true);
|
||
|
||
oPasteProcessor.aContent = [];
|
||
|
||
newFonts = this._convertFonts(oPasteProcessor.oFonts);
|
||
|
||
|
||
History.StartTransaction();
|
||
oPasteProcessor._Execute(node, {}, true, true, false);
|
||
if (!oPasteProcessor.aContent || !oPasteProcessor.aContent.length) {
|
||
History.EndTransaction();
|
||
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
|
||
return false;
|
||
}
|
||
|
||
var targetContent = worksheet.objectRender.controller.getTargetDocContent(true);//нужно для заголовков диаграмм
|
||
targetContent.Remove(1, true, true);
|
||
|
||
worksheet._loadFonts(newFonts, function () {
|
||
|
||
//TODO конвертирую в текст без форматирую. пеесмотреть!
|
||
var specialPasteProps = window['AscCommon'].g_specialPasteHelper.specialPasteProps;
|
||
if (specialPasteProps && !specialPasteProps.format) {
|
||
for (var i = 0; i < oPasteProcessor.aContent.length; i++) {
|
||
oPasteProcessor.aContent[i].Clear_TextFormatting();
|
||
}
|
||
}
|
||
|
||
oPasteProcessor.InsertInPlace(targetContent, oPasteProcessor.aContent);
|
||
var oTargetTextObject = AscFormat.getTargetTextObject(worksheet.objectRender.controller);
|
||
oTargetTextObject && oTargetTextObject.checkExtentsByDocContent && oTargetTextObject.checkExtentsByDocContent();
|
||
worksheet.objectRender.controller.startRecalculate();
|
||
History.EndTransaction();
|
||
|
||
t._setShapeSpecialPasteProperties(worksheet, targetContent);
|
||
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
|
||
});
|
||
|
||
return true;
|
||
},
|
||
|
||
_convertFonts: function (oFonts) {
|
||
var newFonts = {};
|
||
var fontName;
|
||
for (var i in oFonts) {
|
||
fontName = oFonts[i] ? (oFonts[i].Name || oFonts[i].name) : undefined;
|
||
if (undefined !== fontName) {
|
||
newFonts[fontName] = 1;
|
||
}
|
||
}
|
||
return newFonts;
|
||
},
|
||
|
||
_convertTableFromExcelToDocument: function (worksheet, aContentExcel, documentContent) {
|
||
var oCurPar = new AscWord.Paragraph(documentContent);
|
||
|
||
var getElem = function (text, format, isAddSpace, isHyperLink) {
|
||
var result = null;
|
||
var value = text;
|
||
if (isAddSpace) {
|
||
value += " ";
|
||
}
|
||
if ("" === value) {
|
||
return result;
|
||
}
|
||
|
||
|
||
if (isHyperLink) {
|
||
var oCurHyperlink = new ParaHyperlink();
|
||
oCurHyperlink.SetParagraph(oCurPar);
|
||
var sHValue = "";
|
||
if (typeof isHyperLink.Hyperlink === "string") {
|
||
sHValue = isHyperLink.Hyperlink;
|
||
}
|
||
oCurHyperlink.Set_Value(sHValue);
|
||
if (isHyperLink.Tooltip) {
|
||
oCurHyperlink.SetToolTip(isHyperLink.Tooltip);
|
||
}
|
||
}
|
||
|
||
var oCurRun = new ParaRun(oCurPar);
|
||
//***text property***
|
||
if (format) {
|
||
oCurRun.Pr.Bold = format.getBold();
|
||
oCurRun.Pr.Italic = format.getItalic();
|
||
oCurRun.Pr.Strikeout = format.getStrikeout();
|
||
oCurRun.Pr.Underline = format.getUnderline() !== 2;
|
||
}
|
||
|
||
for (var k = 0, length = value.length; k < length; k++) {
|
||
var nUnicode = null;
|
||
var nCharCode = value.charCodeAt(k);
|
||
if (AscCommon.isLeadingSurrogateChar(nCharCode)) {
|
||
if (k + 1 < length) {
|
||
k++;
|
||
var nTrailingChar = value.charCodeAt(k);
|
||
nUnicode = AscCommon.decodeSurrogateChar(nCharCode, nTrailingChar);
|
||
}
|
||
} else {
|
||
nUnicode = nCharCode;
|
||
}
|
||
|
||
if (null != nUnicode) {
|
||
var Item;
|
||
if (0x20 !== nUnicode && 0xA0 !== nUnicode && 0x2009 !== nUnicode) {
|
||
Item = new AscWord.CRunText(nUnicode);
|
||
} else {
|
||
Item = new AscWord.CRunSpace();
|
||
}
|
||
|
||
//add text
|
||
oCurRun.Add_ToContent(k, Item, false);
|
||
}
|
||
}
|
||
|
||
//add run
|
||
if (oCurHyperlink) {
|
||
oCurHyperlink.Add_ToContent(0, oCurRun, false);
|
||
result = oCurHyperlink;
|
||
} else {
|
||
result = oCurRun;
|
||
}
|
||
|
||
return result;
|
||
};
|
||
|
||
var n = 0;
|
||
aContentExcel._forEachCell(function (cell) {
|
||
var isHyperlink = aContentExcel.getCell3(cell.nRow, cell.nCol).getHyperlink();
|
||
|
||
var multiText = cell.getValueMultiText(), format, elem;
|
||
if (multiText) {
|
||
for (var m = 0; m < multiText.length; m++) {
|
||
var curMultiText = multiText[m];
|
||
format = curMultiText.format;
|
||
|
||
elem = getElem(curMultiText.text, format);
|
||
if (null !== elem) {
|
||
oCurPar.Internal_Content_Add(n, elem, false);
|
||
n++;
|
||
}
|
||
}
|
||
} else {
|
||
format = cell.xfs && cell.xfs.font ? cell.xfs.font : null;
|
||
|
||
elem = getElem(cell.getValue(), format, null, isHyperlink);
|
||
if (null !== elem) {
|
||
oCurPar.Internal_Content_Add(n, elem, false);
|
||
n++;
|
||
}
|
||
}
|
||
//add space
|
||
elem = getElem("", null, true);
|
||
oCurPar.Internal_Content_Add(n, elem, false);
|
||
n++;
|
||
});
|
||
|
||
return oCurPar;
|
||
},
|
||
|
||
//TODO сделать при получаении структуры. игнорировать размер шрифта и тп
|
||
_changeHtmlTag: function (arr) {
|
||
var oldElem, value, style, bold, underline, italic;
|
||
for (var i = 0; i < arr.length; i++) {
|
||
oldElem = arr[i];
|
||
value = oldElem.innerText;
|
||
|
||
underline = "none";
|
||
if (oldElem.style.textDecoration && oldElem.style.textDecoration != "") {
|
||
underline = oldElem.style.textDecoration;
|
||
}
|
||
|
||
italic = "normal";
|
||
if (oldElem.style.textDecoration && oldElem.style.textDecoration != "") {
|
||
italic = oldElem.style.fontStyle;
|
||
}
|
||
|
||
bold = "normal";
|
||
if (oldElem.style.fontWeight && oldElem.style.fontWeight != "") {
|
||
bold = oldElem.style.fontWeight;
|
||
}
|
||
|
||
style = ' style = "text-decoration:' + underline + ";" + "font-style:" + italic + ";" + "font-weight:" + bold + ";" + '"';
|
||
$(oldElem).replaceWith("<span" + style + ">" + value + "</span>");
|
||
}
|
||
},
|
||
|
||
pasteTextOnSheet: function (worksheet, text) {
|
||
var t = this;
|
||
if (!text || (text && !text.length)) {
|
||
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
|
||
if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) {
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(false);
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null;
|
||
}
|
||
return;
|
||
}
|
||
|
||
//TEXT IMPORT WITH OPTIONS
|
||
var specialPasteHelper = window['AscCommon'].g_specialPasteHelper;
|
||
var specialPasteProps = specialPasteHelper.specialPasteProps;
|
||
var textImport;
|
||
|
||
var props = specialPasteProps ? specialPasteProps.property : null;
|
||
textImport = props === c_oSpecialPasteProps.useTextImport;
|
||
|
||
|
||
//TODO сделать вставку текста всегда через эту функцию
|
||
this.activeRange = worksheet.model.selectionRange.getLast().clone(true);
|
||
|
||
//если находимся внутри шейпа
|
||
var isIntoShape = worksheet.objectRender.controller.getTargetDocContent();
|
||
if (isIntoShape) {
|
||
var callback = function (isSuccess) {
|
||
if (isSuccess === false) {
|
||
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
|
||
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
|
||
if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) {
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(false);
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
isIntoShape = worksheet.objectRender.controller.getTargetDocContent(true);
|
||
if (!isIntoShape) {
|
||
return false;
|
||
}
|
||
isIntoShape.Remove(1, true, true);
|
||
var Count = text.length;
|
||
|
||
var newParagraph = new AscWord.Paragraph(isIntoShape);
|
||
var selectedElements = new AscCommonWord.CSelectedContent();
|
||
var insertText = "";
|
||
for (var Index = 0; Index < Count; Index++) {
|
||
var _char = text.charAt(Index);
|
||
var _charCode = text.charCodeAt(Index);
|
||
|
||
if (_charCode !== 0x0A) {
|
||
insertText += _char;
|
||
}
|
||
|
||
if (_charCode === 0x0A || Index === Count - 1) {
|
||
var newParaRun = new ParaRun();
|
||
window['AscCommon'].addTextIntoRun(newParaRun, insertText);
|
||
newParagraph.Internal_Content_Add(newParagraph.Content.length - 1, newParaRun, false);
|
||
var selectedElement = new AscCommonWord.CSelectedElement();
|
||
selectedElement.Element = newParagraph;
|
||
selectedElements.Elements.push(selectedElement);
|
||
|
||
insertText = "";
|
||
newParagraph = new AscWord.Paragraph(isIntoShape);
|
||
}
|
||
}
|
||
|
||
t._insertSelectedContentIntoShapeContent(worksheet, selectedElements, isIntoShape);
|
||
|
||
if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) {
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(true);
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null;
|
||
}
|
||
|
||
window['AscCommon'].g_specialPasteHelper.CleanButtonInfo();
|
||
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
|
||
|
||
//for special paste
|
||
if (!window['AscCommon'].g_specialPasteHelper.specialPasteStart) {
|
||
var sProps = Asc.c_oSpecialPasteProps;
|
||
var allowedSpecialPasteProps = [sProps.sourceformatting, sProps.destinationFormatting];
|
||
}
|
||
};
|
||
//check text
|
||
AscFonts.FontPickerByCharacter.getFontsByString(text);
|
||
worksheet._loadFonts([], function () {
|
||
worksheet.objectRender.controller.checkPasteInText(callback);
|
||
});
|
||
return;
|
||
}
|
||
|
||
if (textImport) {
|
||
var advancedOptions = specialPasteProps.asc_getAdvancedOptions();
|
||
if (Asc.typeOf(text) !== "array") {
|
||
text = AscCommon.parseText(text, advancedOptions, true);
|
||
}
|
||
}
|
||
var aResult = this._getTableFromText(text, textImport);
|
||
if (aResult) {
|
||
if (textImport) {
|
||
var arn = worksheet.model.selectionRange.getLast().clone();
|
||
var width = aResult.content && aResult.content[0] ? aResult.content[0].length - 1 : 0;
|
||
var height = aResult.content ? aResult.content.length - 1 : 0;
|
||
var arnTo = new Asc.Range(arn.c1, arn.r1, arn.c1 + width, arn.r1 + height);
|
||
|
||
var resmove = worksheet.model._prepareMoveRange(arn, arnTo);
|
||
if (resmove === -2) {
|
||
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
|
||
worksheet.handlers.trigger("onErrorEvent", c_oAscError.ID.CannotMoveRange, c_oAscError.Level.NoCritical);
|
||
if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) {
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(false);
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null;
|
||
}
|
||
} else if (resmove === -1) {
|
||
worksheet.model.workbook.handlers.trigger("asc_onConfirmAction", Asc.c_oAscConfirm.ConfirmReplaceRange,
|
||
function (can) {
|
||
if (can) {
|
||
worksheet.setSelectionInfo('paste', {data: aResult, bText: true});
|
||
} else {
|
||
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
|
||
if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) {
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(false);
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null;
|
||
}
|
||
}
|
||
});
|
||
} else {
|
||
worksheet.setSelectionInfo('paste', {data: aResult, bText: true});
|
||
}
|
||
} else {
|
||
worksheet.setSelectionInfo('paste', {data: aResult, bText: true});
|
||
}
|
||
}
|
||
},
|
||
|
||
_getTextFromWorksheet: function (worksheet) {
|
||
var res = "";
|
||
var curRow = -1;
|
||
worksheet._forEachCell(function (cell) {
|
||
if (curRow !== cell.nRow) {
|
||
if (-1 !== curRow) {
|
||
res += '\r\n';
|
||
}
|
||
curRow = cell.nRow;
|
||
} else {
|
||
res += " ";
|
||
}
|
||
res += cell.getValue();
|
||
});
|
||
return res;
|
||
},
|
||
|
||
_getTextFromWord: function (data) {
|
||
var res = "";
|
||
|
||
var getTextFromCell = function (cell) {
|
||
if (cell.Content && cell.Content.Content) {
|
||
getTextFromDocumentContent(cell.Content.Content, true);
|
||
}
|
||
};
|
||
|
||
var getTextFromTable = function (table) {
|
||
for (var i = 0; i < table.Content.length; i++) {
|
||
var row = table.Content[i];
|
||
for (var j = 0; j < row.Content.length; j++) {
|
||
res += " ";
|
||
|
||
var cell = row.Content[j];
|
||
getTextFromCell(cell);
|
||
}
|
||
|
||
res += '\r\n';
|
||
}
|
||
};
|
||
|
||
var getTextFromDocumentContent = function (documentContent, isNAddNewLine) {
|
||
for (var i = 0; i < documentContent.length; i++) {
|
||
var item = documentContent[i];
|
||
if (type_Paragraph === item.GetType()) {
|
||
if (!isNAddNewLine) {
|
||
res += '\r\n';
|
||
}
|
||
|
||
getTextFromParagraph(item);
|
||
} else if (type_Table === item.GetType()) {
|
||
res += '\r\n';
|
||
|
||
getTextFromTable(item);
|
||
}
|
||
}
|
||
};
|
||
|
||
var getTextFromParagraph = function (paragraph) {
|
||
for (var j = 0; j < paragraph.Content.length; j++) {
|
||
if (para_Math === paragraph.Content[j].GetType() && paragraph.Content[j].Root) {
|
||
var mathTextContent = paragraph.Content[j].Root.GetTextContent();
|
||
if (mathTextContent) {
|
||
res += mathTextContent.str;
|
||
}
|
||
} else {
|
||
res += paragraph.Content[j].GetSelectedText(true);
|
||
}
|
||
}
|
||
};
|
||
|
||
getTextFromDocumentContent(data);
|
||
|
||
return res;
|
||
},
|
||
|
||
_getTableFromText: function (text, bPastedArray) {
|
||
|
||
var addTextIntoCell = function (row, col, sText) {
|
||
var cell = aResult.getCell(rowCounter, colCounter);
|
||
|
||
//check text
|
||
AscFonts.FontPickerByCharacter.getFontsByString(sText);
|
||
cell.content[0] = {text: sText, format: new AscCommonExcel.Font()};
|
||
|
||
return cell;
|
||
};
|
||
|
||
var aResult = new excelPasteContent();
|
||
var width = 0;
|
||
var colCounter = 0;
|
||
var rowCounter = 0;
|
||
var sCurChar = "";
|
||
var _parseText = function (sText, ignoreTab) {
|
||
if (bPastedArray && sText === "") {
|
||
if (colCounter > width) {
|
||
width = colCounter;
|
||
}
|
||
addTextIntoCell(rowCounter, colCounter, sText);
|
||
sCurChar = "";
|
||
}
|
||
for (var i = 0, length = sText.length; i < length; i++) {
|
||
var Char = sText.charAt(i);
|
||
var Code = sText.charCodeAt(i);
|
||
|
||
if (colCounter > width) {
|
||
width = colCounter;
|
||
}
|
||
|
||
if (13 === Code || '\n' === Char || sCurChar.length >= Asc.c_oAscMaxCellOrCommentLength) {
|
||
if ("" === sCurChar) {
|
||
addTextIntoCell(rowCounter, colCounter, sCurChar);
|
||
colCounter = 0;
|
||
rowCounter++;
|
||
} else {
|
||
addTextIntoCell(rowCounter, colCounter, sCurChar);
|
||
colCounter = 0;
|
||
|
||
rowCounter++;
|
||
sCurChar = "";
|
||
}
|
||
} else {
|
||
if (32 === Code || 160 === Code) {//160 - nbsp
|
||
sCurChar += " ";
|
||
} else if (9 === Code) {//tab
|
||
if (!ignoreTab) {
|
||
addTextIntoCell(rowCounter, colCounter, sCurChar);
|
||
colCounter++;
|
||
sCurChar = "";
|
||
}
|
||
} else {
|
||
sCurChar += Char;
|
||
}
|
||
|
||
if (i === length - 1) {
|
||
addTextIntoCell(rowCounter, colCounter, sCurChar);
|
||
sCurChar = "";
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
if (!bPastedArray) {
|
||
text = text.replace(/\r\n/g, '\n');
|
||
_parseText(text);
|
||
} else {
|
||
for (var i = 0; i < text.length; i++) {
|
||
colCounter = 0;
|
||
if (text[i]) {
|
||
for (var j = 0; j < text[i].length; j++) {
|
||
_parseText(text[i][j], true);
|
||
colCounter++;
|
||
}
|
||
}
|
||
rowCounter++;
|
||
}
|
||
}
|
||
|
||
aResult.props.cellCount = width + 1;
|
||
aResult.props.rowSpanSpCount = 0;
|
||
|
||
return aResult;
|
||
},
|
||
|
||
_getFragmentsFromHtml: function (html) {
|
||
//даная функция рассчитана только на вставку символа из плагина
|
||
//TODO для вставки полноценной html нужно писать обработку
|
||
|
||
var res = null;
|
||
if (html && html.children) {
|
||
for (var i = 0; i < html.children.length; i++) {
|
||
if (html.children[i] && html.children[i].nodeName) {
|
||
var sChildNodeName = html.children[i].nodeName.toLowerCase();
|
||
if (sChildNodeName === "style" || sChildNodeName === "#comment" || sChildNodeName === "script") {
|
||
continue;
|
||
}
|
||
}
|
||
|
||
if (!res) {
|
||
res = {fragments: [], fonts: {}};
|
||
}
|
||
|
||
var children = html.children[i];
|
||
var computedStyle = this._getComputedStyle(children);
|
||
var fragment = new AscCommonExcel.Fragment();
|
||
var format = new AscCommonExcel.Font();
|
||
|
||
if (computedStyle) {
|
||
var bold = computedStyle.getPropertyValue("font-weight");
|
||
if ("bold" === bold) {
|
||
format.setBold(true);
|
||
}
|
||
/*var color = computedStyle.getPropertyValue("color");
|
||
if(color){
|
||
format.setColor(color);
|
||
}*/
|
||
var italic = computedStyle.getPropertyValue("font-style");
|
||
if ("italic" === italic) {
|
||
format.setItalic(true);
|
||
}
|
||
var fontFamily = window["AscCommon"].CheckDefaultFontFamily(computedStyle.getPropertyValue("font-family"), window["Asc"]["editor"]);
|
||
fontFamily = g_fontApplication.GetFontNameDictionary(fontFamily, true);
|
||
if (fontFamily) {
|
||
format.setName(fontFamily);
|
||
res.fonts[fontFamily] = 1;
|
||
}
|
||
/*var fontSize = computedStyle.getPropertyValue("font-size");
|
||
if(fontSize){
|
||
format.setSize(fontSize);
|
||
}*/
|
||
var text_decoration = computedStyle.getPropertyValue("text-decoration");
|
||
if (text_decoration) {
|
||
var underline, Strikeout;
|
||
if (-1 !== text_decoration.indexOf("underline")) {
|
||
underline = true;
|
||
} else if (-1 !== text_decoration.indexOf("none")) {
|
||
underline = false;
|
||
}
|
||
if (-1 !== text_decoration.indexOf("line-through")) {
|
||
Strikeout = true;
|
||
}
|
||
if (underline) {
|
||
format.setUnderline(true);
|
||
}
|
||
if (Strikeout) {
|
||
format.setUnderline(true);
|
||
}
|
||
}
|
||
}
|
||
|
||
fragment.setFragmentText(children.innerText);
|
||
AscFonts.FontPickerByCharacter.getFontsByString(fragment.getFragmentText());
|
||
fragment.format = format;
|
||
|
||
res.fragments.push(fragment);
|
||
}
|
||
}
|
||
return res;
|
||
},
|
||
|
||
_getComputedStyle: function (node) {
|
||
var computedStyle = null;
|
||
if (null != node && Node.ELEMENT_NODE === node.nodeType) {
|
||
var defaultView = node.ownerDocument.defaultView;
|
||
computedStyle = defaultView.getComputedStyle(node, null);
|
||
}
|
||
return computedStyle;
|
||
}
|
||
};
|
||
|
||
/** @constructor */
|
||
function excelPasteContent() {
|
||
this.content = [];
|
||
this.props = {};
|
||
|
||
return this;
|
||
}
|
||
|
||
excelPasteContent.prototype = {
|
||
|
||
constructor: excelPasteContent,
|
||
|
||
setCellContent: function (row, col, data) {
|
||
if (!this.content[row]) {
|
||
this.content[row] = [];
|
||
}
|
||
if (!this.content[row][col]) {
|
||
this.content[row][col] = [];
|
||
}
|
||
|
||
this.content[row][col] = data;
|
||
},
|
||
|
||
getCell: function (row, col) {
|
||
if (!this.content[row]) {
|
||
this.content[row] = [];
|
||
}
|
||
if (!this.content[row][col]) {
|
||
this.content[row][col] = new pasteCell();
|
||
}
|
||
|
||
return this.content[row][col];
|
||
},
|
||
|
||
deleteCell: function (row, col) {
|
||
delete this.content[row][col];
|
||
}
|
||
};
|
||
|
||
/** @constructor */
|
||
function pasteCell() {
|
||
this.content = [];
|
||
|
||
this.rowSpan = null;
|
||
this.colSpan = null;
|
||
this.bc = null;
|
||
this.borders = null;
|
||
this.toolTip = null;
|
||
this.hyperLink = null;
|
||
this.location = null;
|
||
|
||
this.indent = null;
|
||
this.props = null;
|
||
|
||
return this;
|
||
}
|
||
|
||
pasteCell.prototype = {
|
||
|
||
constructor: pasteCell,
|
||
|
||
addContentItem: function (item) {
|
||
this.content.push(item);
|
||
},
|
||
|
||
clone: function () {
|
||
var result = new pasteCell();
|
||
|
||
for (var item = 0; item < this.content.length; item++) {
|
||
result.content[item] = {text: this.content[item].text, format: this.content[item].format};
|
||
}
|
||
|
||
result.borders = this.borders;
|
||
result.rowSpan = this.rowSpan;
|
||
result.colSpan = this.colSpan;
|
||
result.toolTip = this.toolTip;
|
||
result.bc = this.bc;
|
||
result.hyperLink = this.hyperLink;
|
||
result.location = this.location;
|
||
|
||
result.alignVertical = this.alignVertical;
|
||
result.alignHorizontal = this.alignHorizontal;
|
||
|
||
return result;
|
||
}
|
||
};
|
||
|
||
|
||
/** @constructor */
|
||
function pasteFromBinaryWord(clipboard, ws, bFromPresentation) {
|
||
this.aResult = new excelPasteContent();
|
||
|
||
this.fontsNew = {};
|
||
this.clipboard = clipboard;
|
||
this.ws = ws;
|
||
this.isUsuallyPutImages = null;
|
||
this.maxLengthRowCount = 0;
|
||
//для этого сделал функцию _getParagraphMeasure у DocumentContentBoundsElement
|
||
//this.rowDiff = 0;//для обработки данных в ране, разделенных shift+enter
|
||
|
||
this.paragraphText = "";
|
||
this.bFromPresentation = bFromPresentation;
|
||
this.prevTextPr = null;
|
||
|
||
//работает когда есть внутренние табы
|
||
//TODO в дальнейшем учитывать внутреннии табы в DocumentContentBounds
|
||
this.maxCellCount = 0;
|
||
|
||
this.footnotesCount = 0;
|
||
|
||
return this;
|
||
}
|
||
|
||
pasteFromBinaryWord.prototype = {
|
||
|
||
constructor: pasteFromBinaryWord,
|
||
|
||
_paste: function (worksheet, pasteData) {
|
||
var documentContent = pasteData.content;
|
||
var t = this;
|
||
|
||
//у родителя(CDocument) проставляю контент. нужно для вставки извне нумерованного списка. ф-ия CalculateNumberingValues требует наличие этих параграфов в родителе.
|
||
var cDocument = documentContent && documentContent[0] &&
|
||
documentContent[0].Parent instanceof CDocument ? documentContent[0].Parent : null;
|
||
if (cDocument && cDocument.Content && 1 === cDocument.Content.length) {
|
||
cDocument.Content = documentContent;
|
||
}
|
||
|
||
if (pasteData.images && pasteData.images.length) {
|
||
this.isUsuallyPutImages = true;
|
||
}
|
||
|
||
if (!documentContent || (documentContent && !documentContent.length)) {
|
||
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
|
||
if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) {
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(false);
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null;
|
||
}
|
||
return;
|
||
}
|
||
|
||
var documentContentBounds = new DocumentContentBounds();
|
||
var coverDocument = documentContentBounds.getBounds(0, 0, documentContent);
|
||
AscFormat.ExecuteNoHistory(this._parseChildren, this, [coverDocument]);
|
||
|
||
//не вставляем графику в редактор диаграмм
|
||
//если кроме графики есть ещё данные, то убираем только графику
|
||
if (window["Asc"]["editor"] && window["Asc"]["editor"].isChartEditor) {
|
||
if (this.aResult.props && this.aResult.props.addImagesFromWord && this.aResult.props.addImagesFromWord.length === 1 && this.aResult.content) {
|
||
if (1 === this.aResult.content.length && 1 === this.aResult.content[0].length && this.aResult.content[0][0].content && this.aResult.content[0][0].content.length === 0) {
|
||
window['AscCommon'].g_specialPasteHelper.Paste_Process_End();
|
||
if (AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack) {
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack(false);
|
||
AscCommonExcel.g_clipboardExcel.pasteProcessor.pasteCallBack = null;
|
||
}
|
||
return;
|
||
} else {
|
||
this.aResult.props.addImagesFromWord = [];
|
||
this.clipboard.alreadyLoadImagesOnServer = true;
|
||
}
|
||
}
|
||
}
|
||
|
||
var newFonts = this.fontsNew;
|
||
if (pasteData.fonts && pasteData.fonts.length) {
|
||
newFonts = {};
|
||
for (var i = 0; i < pasteData.fonts.length; i++) {
|
||
newFonts[pasteData.fonts[i].name] = 1;
|
||
}
|
||
}
|
||
|
||
this.aResult.props.fontsNew = newFonts;
|
||
this.aResult.props.rowSpanSpCount = 0;
|
||
this.aResult.props.cellCount = this.maxCellCount + 1 > coverDocument.width ? this.maxCellCount + 1 : coverDocument.width;
|
||
this.aResult.props._images = pasteData.images && pasteData.images.length ? pasteData.images : this.aResult.props._images;
|
||
this.aResult.props._aPastedImages = pasteData.aPastedImages && pasteData.aPastedImages.length ? pasteData.aPastedImages : this.aResult.props._aPastedImages;
|
||
|
||
|
||
//TODO alreadyLoadImagesOnServer - пересмотреть
|
||
//alreadyLoadImagesOnServer - флаг используется для загрузки изображений из html
|
||
//грузим картинки для вствки из документов(если это необходимо)
|
||
//в данный момент в worksheetView не грузятся изображения
|
||
var specialPasteProps = window['AscCommon'].g_specialPasteHelper.specialPasteProps;
|
||
var aImagesToDownload = this.aResult.props._images;
|
||
if (!this.clipboard.alreadyLoadImagesOnServer && aImagesToDownload && (!specialPasteProps || (specialPasteProps && specialPasteProps.images)))//load to server
|
||
{
|
||
var oObjectsForDownload = AscCommon.GetObjectsForImageDownload(t.aResult.props._aPastedImages);
|
||
var api = window["Asc"]["editor"];
|
||
var oImageMap = {};
|
||
AscCommon.sendImgUrls(api, oObjectsForDownload.aUrls, function (data) {
|
||
History.TurnOff();
|
||
AscCommon.ResetNewUrls(data, oObjectsForDownload.aUrls, oObjectsForDownload.aBuilderImagesByUrl,
|
||
oImageMap);
|
||
History.TurnOn();
|
||
t.aResult.props.oImageMap = oImageMap;
|
||
t.aResult.props.data = data;
|
||
worksheet.setSelectionInfo('paste', {data: t.aResult});
|
||
});
|
||
} else {
|
||
worksheet.setSelectionInfo('paste', {data: t.aResult});
|
||
}
|
||
},
|
||
|
||
_parseChildren: function (children) {
|
||
var childrens = children.children;
|
||
var colSpan, rowSpan;
|
||
for (var i = 0; i < childrens.length; i++) {
|
||
if (childrens[i].type === c_oAscBoundsElementType.Cell) {
|
||
for (var row = childrens[i].top; row < childrens[i].top + childrens[i].height; row++) {
|
||
for (var col = childrens[i].left; col < childrens[i].left + childrens[i].width; col++) {
|
||
var isCtable = false;
|
||
var tempChildren = childrens[i].children[0].children;
|
||
colSpan = null;
|
||
rowSpan = null;
|
||
for (var temp = 0; temp < tempChildren.length; temp++) {
|
||
if (tempChildren[temp].type === c_oAscBoundsElementType.Table) {
|
||
isCtable = true;
|
||
}
|
||
}
|
||
if (childrens[i].width > 1 && isCtable && col === childrens[i].left) {
|
||
colSpan = childrens[i].width;
|
||
rowSpan = 1;
|
||
} else if (!isCtable && tempChildren.length === 1) {
|
||
rowSpan = childrens[i].height;
|
||
colSpan = childrens[i].width;
|
||
}
|
||
|
||
|
||
var newCell = this.aResult.getCell(row /*+ this.rowDiff*/, col);
|
||
newCell.rowSpan = rowSpan;
|
||
newCell.colSpan = colSpan;
|
||
|
||
//backgroundColor
|
||
var backgroundColor = this.getBackgroundColorTCell(childrens[i]);
|
||
if (backgroundColor) {
|
||
newCell.bc = backgroundColor;
|
||
}
|
||
|
||
newCell.borders = this._getBorders(childrens[i], row, col, newCell.borders);
|
||
|
||
var alignVertical = childrens[i].elem.Get_VAlign();
|
||
switch (alignVertical) {
|
||
case vertalignjc_Bottom:
|
||
newCell.alignVertical = Asc.c_oAscVAlign.Bottom;
|
||
break;
|
||
case vertalignjc_Center:
|
||
newCell.alignVertical = Asc.c_oAscVAlign.Center;
|
||
break;
|
||
case vertalignjc_Top:
|
||
newCell.alignVertical = Asc.c_oAscVAlign.Top;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (childrens[i].children.length === 0) {
|
||
//if parent - cell of table
|
||
colSpan = null;
|
||
rowSpan = null;
|
||
|
||
this._parseParagraph(childrens[i], childrens[i].top /*+ this.rowDiff*/, childrens[i].left);
|
||
} else {
|
||
this._parseChildren(childrens[i]);
|
||
}
|
||
}
|
||
},
|
||
|
||
_parseParagraph: function (paragraph, row, col) {
|
||
this.paragraphText = "";
|
||
|
||
var t = this;
|
||
var content = paragraph.elem.Content;
|
||
var fontFamily = "Arial";
|
||
var text = null;
|
||
var oNewItem = new pasteCell();
|
||
|
||
var aResult = this.aResult;
|
||
if (row === undefined) {
|
||
if (aResult.content.length === 0) {
|
||
row = 0;
|
||
} else {
|
||
row = aResult.length;
|
||
}
|
||
}
|
||
|
||
var cell = this.aResult.getCell(row + this.maxLengthRowCount, col);
|
||
if (cell && cell.content && cell.content.length === 0 && (cell.borders || cell.rowSpan != null)) {
|
||
if (cell.borders) {
|
||
oNewItem.borders = cell.borders;
|
||
}
|
||
|
||
if (undefined !== cell.alignVertical) {
|
||
oNewItem.alignVertical = cell.alignVertical;
|
||
}
|
||
|
||
if (cell.rowSpan != null) {
|
||
oNewItem.rowSpan = cell.rowSpan;
|
||
oNewItem.colSpan = cell.colSpan;
|
||
}
|
||
this.aResult.deleteCell(row + this.maxLengthRowCount, col)
|
||
}
|
||
|
||
var startRow = row;
|
||
var innerCol = 0;
|
||
if (col === undefined) {
|
||
col = 0;
|
||
}
|
||
|
||
//backgroundColor
|
||
var backgroundColor = this.getBackgroundColorTCell(paragraph);
|
||
if (backgroundColor) {
|
||
oNewItem.bc = backgroundColor;
|
||
}
|
||
|
||
//настройки параграфа
|
||
paragraph.elem.CompiledPr.NeedRecalc = true;
|
||
var paraPr = paragraph.elem.Get_CompiledPr();
|
||
|
||
var firstLine = paraPr && paraPr.ParaPr && paraPr.ParaPr.Ind && paraPr.ParaPr.Ind.Left;
|
||
if (firstLine) {
|
||
oNewItem.indent = parseInt(firstLine / AscCommon.koef_mm_to_indent);
|
||
if (oNewItem.indent < 0) {
|
||
oNewItem.indent = null;
|
||
}
|
||
}
|
||
|
||
//горизонтальное выравнивание
|
||
var horisontalAlign = this._getAlignHorisontal(paraPr);
|
||
if (horisontalAlign == null) {
|
||
oNewItem.wrap = true;
|
||
}
|
||
|
||
oNewItem.alignHorizontal = horisontalAlign;
|
||
|
||
//вертикальное выравнивание
|
||
//oNewItem.alignVertical = Asc.c_oAscVAlign.Center;
|
||
|
||
//так же wrap выставляем у параграфа, чьим родителем является ячейка таблицы
|
||
var cellParent = this._getParentByTag(paragraph, c_oAscBoundsElementType.Cell);
|
||
if (cellParent) {
|
||
oNewItem.wrap = !(cellParent.elem && cellParent.elem.Pr && true === cellParent.elem.Pr.NoWrap);
|
||
}
|
||
|
||
//Numbering
|
||
var LvlPr = null;
|
||
var Lvl = null;
|
||
var oNumPr = paragraph.elem.GetNumPr ? paragraph.elem.GetNumPr() : null;
|
||
var numberingText = null;
|
||
var formatText;
|
||
if (oNumPr != null) {
|
||
var oNum = paragraph.elem.Parent.GetNumbering().GetNum(oNumPr.NumId);
|
||
if (oNum) {
|
||
LvlPr = oNum.GetLvl(oNumPr.Lvl);
|
||
Lvl = oNumPr.Lvl;
|
||
}
|
||
|
||
numberingText = this._parseNumbering(paragraph.elem);
|
||
|
||
if (text == null) {
|
||
text = "";
|
||
}
|
||
|
||
text += this._getAllNumberingText(Lvl, numberingText);
|
||
|
||
formatText = this._getPrParaRun(paraPr, LvlPr.GetTextPr());
|
||
fontFamily = formatText.format.getName();
|
||
this.fontsNew[fontFamily] = 1;
|
||
|
||
oNewItem.content.push(formatText);
|
||
|
||
if (text !== null) {
|
||
oNewItem.content[oNewItem.content.length - 1].text = text;
|
||
this.paragraphText += text;
|
||
}
|
||
text = "";
|
||
}
|
||
|
||
|
||
//проходимся по контенту paragraph
|
||
var paraRunObj;
|
||
//получае общий шрифт для ячейки для случая когда вставляем нумерованный список
|
||
//общего может не быть в том случае, если шрифты внутри ячейки разные
|
||
var allParaFont, textPr;
|
||
for (var n = 0; n < content.length; n++) {
|
||
this.aResult.getCell(row + this.maxLengthRowCount, innerCol + col);
|
||
|
||
if (text == null) {
|
||
text = "";
|
||
}
|
||
|
||
switch (content[n].Type) {
|
||
case para_Run://*paraRun*
|
||
{
|
||
paraRunObj = this._parseParaRun(content[n], oNewItem, paraPr, innerCol, row, col, text);
|
||
|
||
if (null !== allParaFont) {
|
||
textPr = content[n].Get_CompiledPr();
|
||
if (textPr && textPr.FontFamily && textPr.FontFamily.Name) {
|
||
if (undefined === allParaFont) {
|
||
allParaFont = textPr.FontFamily.Name;
|
||
}
|
||
} else if (textPr.FontFamily.Name !== allParaFont) {
|
||
allParaFont = null;
|
||
}
|
||
}
|
||
|
||
innerCol = paraRunObj.col;
|
||
row = paraRunObj.row;
|
||
oNewItem = paraRunObj.oNewItem;
|
||
break;
|
||
}
|
||
case para_Hyperlink://*hyperLink*
|
||
{
|
||
//если несколько ссылок в одном параграфе, то отменяем ссылки
|
||
if (!oNewItem.doNotApplyHyperlink) {
|
||
if (!oNewItem.hyperLink) {
|
||
oNewItem.hyperLink = content[n].Value;
|
||
oNewItem.toolTip = content[n].ToolTip;
|
||
oNewItem.location = content[n].Anchor;
|
||
} else {
|
||
oNewItem.hyperLink = null;
|
||
oNewItem.toolTip = null;
|
||
oNewItem.doNotApplyHyperlink = true;
|
||
}
|
||
}
|
||
|
||
var lastTab;
|
||
for (var h = 0; h < content[n].Content.length; h++) {
|
||
switch (content[n].Content[h].Type) {
|
||
case para_Run://*paraRun*
|
||
{
|
||
paraRunObj = this._parseParaRun(content[n].Content[h], oNewItem, paraPr, innerCol, row, col, text);
|
||
oNewItem = paraRunObj.oNewItem;
|
||
innerCol = paraRunObj.col;
|
||
row = paraRunObj.row;
|
||
if (lastTab) {
|
||
oNewItem.hyperLink = content[n].Value;
|
||
oNewItem.toolTip = content[n].ToolTip;
|
||
oNewItem.location = content[n].Anchor;
|
||
}
|
||
|
||
lastTab = paraRunObj.lastTab;
|
||
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
allParaFont = null;
|
||
break;
|
||
}
|
||
case para_Math://*para_Math*
|
||
{
|
||
|
||
if (this.bFromPresentation) {
|
||
var mathTextContent = content[n].Root.GetTextContent();
|
||
if (mathTextContent) {
|
||
var newParaRun = new ParaRun();
|
||
window['AscCommon'].addTextIntoRun(newParaRun, mathTextContent.str);
|
||
var objTemp = t._parseParaRun(newParaRun, oNewItem, paraPr, innerCol, row, col, text);
|
||
innerCol = objTemp.col;
|
||
row = objTemp.row;
|
||
}
|
||
} else {
|
||
var tempFonts = [];
|
||
content[n].Get_AllFontNames(tempFonts);
|
||
|
||
for (var i in tempFonts) {
|
||
this.fontsNew[i] = 1;
|
||
}
|
||
|
||
if (!aResult.props.addImagesFromWord) {
|
||
aResult.props.addImagesFromWord = [];
|
||
}
|
||
aResult.props.addImagesFromWord.push(
|
||
{image: content[n], col: innerCol + col, row: row});
|
||
|
||
if (null === this.isUsuallyPutImages) {
|
||
this._addImageToMap(content[n]);
|
||
}
|
||
}
|
||
allParaFont = null;
|
||
break;
|
||
}
|
||
case para_InlineLevelSdt://*InlineLevelSdt*
|
||
{
|
||
//TODO allParaFont ?
|
||
for (h = 0; h < content[n].Content.length; h++) {
|
||
switch (content[n].Content[h].Type) {
|
||
case para_Run://*paraRun*
|
||
{
|
||
paraRunObj = this._parseParaRun(content[n].Content[h], oNewItem, paraPr, innerCol, row, col, text);
|
||
|
||
oNewItem = paraRunObj.oNewItem;
|
||
innerCol = paraRunObj.col;
|
||
row = paraRunObj.row;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (null !== numberingText && allParaFont) {
|
||
oNewItem.props = {fontName: allParaFont};
|
||
}
|
||
|
||
oNewItem.textVal = this.paragraphText;
|
||
//this.rowDiff += row - startRow;
|
||
},
|
||
|
||
_parseParaRun: function (paraRun, oNewItem, paraPr, innerCol, row, col, text, prevTextPr) {
|
||
var t = this;
|
||
var paraRunContent = paraRun.Content;
|
||
var aResult = this.aResult;
|
||
var paragraphFontFamily = paraPr.TextPr.FontFamily.Name;
|
||
var cloneNewItem, formatText;
|
||
var newLine = "\n";
|
||
|
||
var cTextPr = prevTextPr ? prevTextPr : paraRun.Get_CompiledPr();
|
||
if (cTextPr && !(paraRunContent.length === 1 && paraRunContent[0] instanceof AscWord.CRunParagraphMark))//settings for text
|
||
{
|
||
formatText = this._getPrParaRun(paraPr, cTextPr);
|
||
} else if (!formatText) {
|
||
formatText = this._getPrParaRun(paraPr, cTextPr);
|
||
}
|
||
this.prevTextPr = cTextPr;
|
||
|
||
var pushData = function () {
|
||
t.fontsNew[paragraphFontFamily] = 1;
|
||
oNewItem.content.push(formatText);
|
||
|
||
if (text !== null) {
|
||
oNewItem.content[oNewItem.content.length - 1].text = text;
|
||
}
|
||
|
||
cloneNewItem = oNewItem.clone();
|
||
cloneNewItem.rowSpan = null;
|
||
cloneNewItem.colSpan = null;
|
||
|
||
//переходим в следующую ячейку
|
||
cell = aResult.getCell(row + t.maxLengthRowCount, innerCol + col);
|
||
aResult.setCellContent(row + t.maxLengthRowCount, innerCol + col, cloneNewItem);
|
||
|
||
text = "";
|
||
oNewItem = new pasteCell();
|
||
};
|
||
|
||
//проходимся по контенту paraRun
|
||
var cell;
|
||
var lastTab;
|
||
for (var pR = 0; pR < paraRunContent.length; pR++) {
|
||
lastTab = false;
|
||
switch (paraRunContent[pR].Type) {
|
||
case para_Math_BreakOperator:
|
||
case para_Math_Text: {
|
||
text += AscCommon.encodeSurrogateChar(paraRunContent[pR].value);
|
||
break;
|
||
}
|
||
case para_Text: {
|
||
text += AscCommon.encodeSurrogateChar(paraRunContent[pR].Value);
|
||
break;
|
||
}
|
||
case para_NewLine: {
|
||
//on feature: read ms style comments and use only sameCell flag
|
||
if (AscCommon.g_clipboardBase.pastedFrom === AscCommon.c_oClipboardPastedFrom.Excel ||
|
||
(paraRunContent[pR].Flags && paraRunContent[pR].Flags.sameCell)) {
|
||
text += newLine;
|
||
} else {
|
||
pushData();
|
||
row++;
|
||
innerCol = 0;
|
||
}
|
||
|
||
break;
|
||
}
|
||
case para_Space: {
|
||
text += " ";
|
||
break;
|
||
}
|
||
case para_Tab: {
|
||
pushData();
|
||
lastTab = true;
|
||
innerCol++;
|
||
|
||
if (innerCol > this.maxCellCount) {
|
||
this.maxCellCount = innerCol;
|
||
}
|
||
|
||
break;
|
||
}
|
||
case para_Drawing: {
|
||
if (!aResult.props.addImagesFromWord) {
|
||
aResult.props.addImagesFromWord = [];
|
||
}
|
||
|
||
var drawing = this._checkDrawingList(paraRunContent[pR]);
|
||
aResult.props.addImagesFromWord.push({image: drawing, col: innerCol + col, row: row});
|
||
|
||
if (null === this.isUsuallyPutImages) {
|
||
this._addImageToMap(drawing);
|
||
}
|
||
|
||
break;
|
||
}
|
||
case para_FootnoteReference: {
|
||
if (1 === paraRunContent.length) {
|
||
var footnotesNumber = this.footnotesCount + 1;
|
||
text += "[" + footnotesNumber + "]";
|
||
this.footnotesCount++;
|
||
}
|
||
break;
|
||
}
|
||
case para_End: {
|
||
cell = aResult.getCell(row, innerCol + col);
|
||
aResult.setCellContent(row, innerCol + col, oNewItem);
|
||
|
||
var checkMaxTextLength = this.clipboard._checkMaxTextLength(this.aResult,
|
||
row + this.maxLengthRowCount, innerCol + col);
|
||
if (checkMaxTextLength) {
|
||
aResult.content = checkMaxTextLength.aResult.content;
|
||
this.maxLengthRowCount += checkMaxTextLength.r - row;
|
||
}
|
||
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (text !== "") {
|
||
this.fontsNew[paragraphFontFamily] = 1;
|
||
oNewItem.content.push(formatText);
|
||
if (text !== null) {
|
||
oNewItem.content[oNewItem.content.length - 1].text = text;
|
||
this.paragraphText += text;
|
||
}
|
||
}
|
||
|
||
return {col: innerCol, row: row, prevTextPr: cTextPr, oNewItem: oNewItem, lastTab: lastTab};
|
||
},
|
||
|
||
_addImageToMap: function (paraDrawing) {
|
||
var aResult = this.aResult;
|
||
if (!aResult.props._aPastedImages) {
|
||
aResult.props._aPastedImages = [];
|
||
}
|
||
if (!aResult.props._images) {
|
||
aResult.props._images = [];
|
||
}
|
||
|
||
var oGraphicObj = paraDrawing.GraphicObj;
|
||
if (!oGraphicObj || (oGraphicObj && !oGraphicObj.blipFill) ||
|
||
(oGraphicObj && oGraphicObj.blipFill && !oGraphicObj.blipFill.RasterImageId)) {
|
||
return;
|
||
}
|
||
|
||
var sImageUrl = oGraphicObj.blipFill.RasterImageId;
|
||
aResult.props._aPastedImages.push(new AscCommon.CBuilderImages(oGraphicObj.blipFill, sImageUrl, oGraphicObj, oGraphicObj.spPr, null));
|
||
aResult.props._images.push(sImageUrl);
|
||
},
|
||
|
||
|
||
_checkDrawingList: function (drawing) {
|
||
var t = this;
|
||
var checkParagraph = function (paragraph) {
|
||
//TODO не могу получить в данном случае GetNumPr
|
||
/*var LvlPr = null;
|
||
var Lvl = null;
|
||
var oNumPr = paragraph.GetNumPr ? paragraph.GetNumPr() : null;
|
||
var numberingText = null;
|
||
var formatText;
|
||
if (oNumPr != null) {
|
||
var oNum = paragraph.Parent.GetNumbering().GetNum(oNumPr.NumId);
|
||
if (oNum) {
|
||
LvlPr = oNum.GetLvl(oNumPr.Lvl);
|
||
Lvl = oNumPr.Lvl;
|
||
}
|
||
|
||
numberingText = t._parseNumbering(paragraph);
|
||
|
||
|
||
var text = t._getAllNumberingText(Lvl, numberingText);
|
||
formatText = this._getPrParaRun(paraPr, LvlPr.GetTextPr());
|
||
}*/
|
||
};
|
||
|
||
if (drawing.GraphicObj && drawing.GraphicObj.textBoxContent &&
|
||
drawing.GraphicObj.textBoxContent.Content) {
|
||
var content = drawing.GraphicObj.textBoxContent.Content;
|
||
for (var i = 0; i < content.length; i++) {
|
||
checkParagraph(content[i]);
|
||
}
|
||
}
|
||
|
||
return drawing;
|
||
},
|
||
|
||
_getBorders: function (cellTable, top, left, oldBorders) {
|
||
var borders = cellTable.elem.Get_Borders();
|
||
var widthCell = cellTable.width;
|
||
var heightCell = cellTable.height;
|
||
var defaultStyle = "solid";
|
||
var borderStyleName;
|
||
var t = this;
|
||
|
||
var getBorderColor = function (curBorder) {
|
||
var color = null;
|
||
var backgroundColor = null;
|
||
|
||
var unifill = curBorder.Unifill && curBorder.Unifill.fill && curBorder.Unifill.fill.color ? curBorder.Unifill.fill.color : null;
|
||
if (unifill && unifill.color && unifill.color.type !== Asc.c_oAscColor.COLOR_TYPE_SCHEME && unifill.color.RGBA) {
|
||
color = unifill.color.RGBA;
|
||
backgroundColor = new AscCommonExcel.RgbColor(t.clipboard._getBinaryColor("rgb(" + color.R + "," + color.G + "," + color.B + ")"));
|
||
} else {
|
||
color = curBorder.Color;
|
||
backgroundColor = new AscCommonExcel.RgbColor(t.clipboard._getBinaryColor("rgb(" + color.r + "," + color.g + "," + color.b + ")"));
|
||
}
|
||
|
||
return backgroundColor;
|
||
};
|
||
|
||
var formatBorders;
|
||
if (oldBorders) {
|
||
formatBorders = oldBorders;
|
||
} else {
|
||
formatBorders = new AscCommonExcel.Border();
|
||
formatBorders.initDefault();
|
||
}
|
||
//top border for cell
|
||
if (top === cellTable.top && (!formatBorders.t || formatBorders.t.isEmpty()) && borders.Top.Value !== AscWord.BorderType.none) {
|
||
borderStyleName = this.clipboard._getBorderStyleName(defaultStyle, this.ws.objectRender.convertMetric(borders.Top.Size, 3, 1));
|
||
if (null !== borderStyleName) {
|
||
formatBorders.t = new AscCommonExcel.BorderProp();
|
||
formatBorders.t.setStyle(borderStyleName);
|
||
formatBorders.t.c = getBorderColor(borders.Top);
|
||
}
|
||
}
|
||
//left border for cell
|
||
if (left === cellTable.left && (!formatBorders.l || formatBorders.l.isEmpty()) && borders.Left.Value !== AscWord.BorderType.none) {
|
||
borderStyleName = this.clipboard._getBorderStyleName(defaultStyle, this.ws.objectRender.convertMetric(borders.Left.Size, 3, 1));
|
||
if (null !== borderStyleName) {
|
||
formatBorders.l = new AscCommonExcel.BorderProp();
|
||
formatBorders.l.setStyle(borderStyleName);
|
||
formatBorders.l.c = getBorderColor(borders.Left);
|
||
}
|
||
}
|
||
//bottom border for cell
|
||
if (top === cellTable.top + heightCell - 1 && (!formatBorders.b || formatBorders.b.isEmpty()) &&
|
||
borders.Bottom.Value !== AscWord.BorderType.none) {
|
||
borderStyleName = this.clipboard._getBorderStyleName(defaultStyle, this.ws.objectRender.convertMetric(borders.Bottom.Size, 3, 1));
|
||
if (null !== borderStyleName) {
|
||
formatBorders.b = new AscCommonExcel.BorderProp();
|
||
formatBorders.b.setStyle(borderStyleName);
|
||
formatBorders.b.c = getBorderColor(borders.Bottom);
|
||
}
|
||
}
|
||
//right border for cell
|
||
if (left === cellTable.left + widthCell - 1 && (!formatBorders.r || formatBorders.r.isEmpty()) &&
|
||
borders.Right.Value !== AscWord.BorderType.none) {
|
||
borderStyleName = this.clipboard._getBorderStyleName(defaultStyle, this.ws.objectRender.convertMetric(borders.Right.Size, 3, 1));
|
||
if (null !== borderStyleName) {
|
||
formatBorders.r = new AscCommonExcel.BorderProp();
|
||
formatBorders.r.setStyle(borderStyleName);
|
||
formatBorders.r.c = getBorderColor(borders.Right);
|
||
}
|
||
}
|
||
|
||
return formatBorders;
|
||
},
|
||
|
||
_getAlignHorisontal: function (paraPr) {
|
||
var result;
|
||
var settings = paraPr.ParaPr;
|
||
|
||
if (!settings) {
|
||
return;
|
||
}
|
||
|
||
switch (settings.Jc) {
|
||
case 0: {
|
||
result = AscCommon.align_Right;
|
||
break;
|
||
}
|
||
case 1: {
|
||
result = AscCommon.align_Left;
|
||
break;
|
||
}
|
||
case 2: {
|
||
result = AscCommon.align_Center;
|
||
break;
|
||
}
|
||
case 3: {
|
||
result = null;
|
||
break;
|
||
}
|
||
}
|
||
|
||
return result;
|
||
},
|
||
|
||
getBackgroundColorTCell: function (elem) {
|
||
var compiledPrCell, color;
|
||
var backgroundColor = null;
|
||
|
||
//TODO внутреннии таблицы без стиля - цвет фона белый
|
||
var tableCell = this._getParentByTag(elem, c_oAscBoundsElementType.Cell);
|
||
|
||
if (tableCell) {
|
||
compiledPrCell = tableCell.elem.Get_CompiledPr();
|
||
|
||
if (compiledPrCell && compiledPrCell.Shd.Value !== 1/*shd_Nil*/) {
|
||
var shd = compiledPrCell.Shd;
|
||
if (shd.Unifill && shd.Unifill.fill && shd.Unifill.fill.color && shd.Unifill.fill.color.color && shd.Unifill.fill.color.color.RGBA) {
|
||
color = shd.Unifill.fill.color.color.RGBA;
|
||
backgroundColor = new AscCommonExcel.RgbColor(this.clipboard._getBinaryColor("rgb(" + color.R + "," + color.G + "," + color.B + ")"));
|
||
} else {
|
||
color = shd.Color;
|
||
backgroundColor = new AscCommonExcel.RgbColor(this.clipboard._getBinaryColor("rgb(" + color.r + "," + color.g + "," + color.b + ")"));
|
||
}
|
||
}
|
||
}
|
||
|
||
return backgroundColor;
|
||
},
|
||
|
||
_getParentByTag: function (elem, tag) {
|
||
var result;
|
||
if (!elem) {
|
||
return null;
|
||
}
|
||
|
||
if (elem.type === tag) {
|
||
result = elem;
|
||
} else if (elem.parent) {
|
||
result = this._getParentByTag(elem.parent, tag);
|
||
} else if (!elem.parent) {
|
||
result = null;
|
||
}
|
||
|
||
return result;
|
||
},
|
||
|
||
_getAllNumberingText: function (Lvl, numberingText) {
|
||
var preSpace, result;
|
||
if (Lvl === 0) {
|
||
preSpace = " ";
|
||
} else if (Lvl === 1) {
|
||
preSpace = " ";
|
||
} else if (Lvl >= 2) {
|
||
preSpace = " ";
|
||
}
|
||
|
||
var betweenSpace = " ";
|
||
result = preSpace + numberingText + betweenSpace;
|
||
|
||
return result;
|
||
},
|
||
|
||
_parseNumbering: function (paragraph) {
|
||
var Pr = paragraph.Get_CompiledPr();
|
||
|
||
if (paragraph.Numbering) {
|
||
var NumberingItem = paragraph.Numbering;
|
||
if (para_Numbering === NumberingItem.Type) {
|
||
var NumPr = Pr.ParaPr.NumPr;
|
||
if (undefined === NumPr || undefined === NumPr.NumId || 0 === NumPr.NumId ||
|
||
"0" === NumPr.NumId) {
|
||
// Ничего не делаем
|
||
} else {
|
||
var Numbering = paragraph.Parent.GetNumbering();
|
||
var NumLvl = Numbering.GetNum(NumPr.NumId).GetLvl(NumPr.Lvl);
|
||
//var NumSuff = NumLvl.GetSuff();
|
||
//var NumJc = NumLvl.GetJc();
|
||
var NumTextPr = paragraph.Get_CompiledPr2(false).TextPr.Copy();
|
||
|
||
// Word не рисует подчеркивание у символа списка, если оно пришло из настроек для
|
||
// символа параграфа.
|
||
|
||
var TextPr_temp = paragraph.TextPr.Value.Copy();
|
||
TextPr_temp.Underline = undefined;
|
||
|
||
NumTextPr.Merge(TextPr_temp);
|
||
NumTextPr.Merge(NumLvl.GetTextPr());
|
||
|
||
var text = null;
|
||
var oNumPr = paragraph.GetNumPr();
|
||
var Lvl;
|
||
if (oNumPr != null) {
|
||
var oNum = paragraph.Parent.GetNumbering().GetNum(oNumPr.NumId);
|
||
if (null != oNum) {
|
||
Lvl = oNumPr.Lvl;
|
||
text = oNum.GetText(Lvl, paragraph.Parent.CalculateNumberingValues(paragraph, NumPr));
|
||
}
|
||
}
|
||
|
||
return text;
|
||
}
|
||
}
|
||
}
|
||
},
|
||
|
||
_getPrParaRun: function (paraPr, cTextPr) {
|
||
var formatText, fontFamily, colorText;
|
||
|
||
var paragraphFontSize = paraPr.TextPr.FontSize;
|
||
var paragraphFontFamily = paraPr.TextPr && paraPr.TextPr.FontFamily ? paraPr.TextPr.FontFamily.Name : "Arial";
|
||
var paragraphBold = paraPr.TextPr.Bold;
|
||
var paragraphItalic = paraPr.TextPr.Italic;
|
||
var paragraphStrikeout = paraPr.TextPr.Strikeout;
|
||
var paragraphUnderline = paraPr.TextPr.Underline ? Asc.EUnderline.underlineSingle :
|
||
Asc.EUnderline.underlineNone;
|
||
var paragraphVertAlign = null;
|
||
if (paraPr.TextPr.VertAlign === 1) {
|
||
paragraphVertAlign = AscCommon.vertalign_SuperScript;
|
||
} else if (paraPr.TextPr.VertAlign === 2) {
|
||
paragraphVertAlign = AscCommon.vertalign_SubScript;
|
||
}
|
||
|
||
var colorParagraph = new AscCommonExcel.RgbColor(this.clipboard._getBinaryColor("rgb(" + paraPr.TextPr.Color.r + "," + paraPr.TextPr.Color.g + "," + paraPr.TextPr.Color.b + ")"));
|
||
|
||
if (cTextPr.Color) {
|
||
colorText = new AscCommonExcel.RgbColor(this.clipboard._getBinaryColor("rgb(" + cTextPr.Color.r + "," + cTextPr.Color.g + "," + cTextPr.Color.b + ")"));
|
||
} else {
|
||
colorText = null;
|
||
}
|
||
|
||
fontFamily = cTextPr.FontFamily ? cTextPr.FontFamily.Name : cTextPr.RFonts.CS ? cTextPr.RFonts.CS.Name : paragraphFontFamily;
|
||
this.fontsNew[fontFamily] = 1;
|
||
|
||
var verticalAlign;
|
||
if (cTextPr.VertAlign === 2) {
|
||
verticalAlign = AscCommon.vertalign_SubScript;
|
||
} else if (cTextPr.VertAlign === 1) {
|
||
verticalAlign = AscCommon.vertalign_SuperScript;
|
||
}
|
||
|
||
var font = new AscCommonExcel.Font();
|
||
font.assignFromObject({
|
||
fn: fontFamily,
|
||
fs: cTextPr.FontSize ? cTextPr.FontSize : paragraphFontSize,
|
||
c: colorText ? colorText : colorParagraph,
|
||
b: cTextPr.Bold ? cTextPr.Bold : paragraphBold,
|
||
i: cTextPr.Italic ? cTextPr.Italic : paragraphItalic,
|
||
u: cTextPr.Underline ? Asc.EUnderline.underlineSingle : paragraphUnderline,
|
||
s: cTextPr.Strikeout ? cTextPr.Strikeout :
|
||
cTextPr.DStrikeout ? cTextPr.DStrikeout : paragraphStrikeout,
|
||
va: verticalAlign ? verticalAlign : paragraphVertAlign
|
||
});
|
||
formatText = {
|
||
format: font
|
||
};
|
||
|
||
return formatText;
|
||
}
|
||
};
|
||
|
||
var c_oAscBoundsElementType = {
|
||
Content: 0,
|
||
Paragraph: 1,
|
||
Table: 2,
|
||
Row: 3,
|
||
Cell: 4
|
||
};
|
||
|
||
function DocumentContentBoundsElement(elem, type, parent) {
|
||
this.elem = elem;
|
||
this.type = type;
|
||
this.parent = parent;
|
||
this.children = [];
|
||
|
||
this.left = 0;
|
||
this.top = 0;
|
||
this.width = 0;
|
||
this.height = 0;
|
||
}
|
||
|
||
function DocumentContentBounds() {
|
||
}
|
||
|
||
DocumentContentBounds.prototype = {
|
||
|
||
constructor: DocumentContentBounds,
|
||
|
||
getBounds: function (nLeft, nTop, aDocumentContent) {
|
||
//в первный проход заполняем размеры
|
||
//и могут заноситься относительные сдвиги при небходимости
|
||
var oRes = this._getMeasure(aDocumentContent, null);
|
||
//заполняем абсолютные сдвиги
|
||
this._getOffset(nLeft, nTop, oRes);
|
||
return oRes;
|
||
},
|
||
_getOffset: function (nLeft, nTop, elem) {
|
||
elem.left += nLeft;
|
||
elem.top += nTop;
|
||
var nCurLeft = elem.left;
|
||
var nCurTop = elem.top;
|
||
var bIsRow = elem.elem instanceof CTableRow;
|
||
for (var i = 0, length = elem.children.length; i < length; i++) {
|
||
var child = elem.children[i];
|
||
this._getOffset(nCurLeft, nCurTop, child);
|
||
if (bIsRow)
|
||
nCurLeft += child.width;
|
||
else
|
||
nCurTop += child.height;
|
||
}
|
||
},
|
||
_getMeasure: function (aDocumentContent, oParent) {
|
||
var oRes = new DocumentContentBoundsElement(aDocumentContent, c_oAscBoundsElementType.Content, oParent);
|
||
for (var i = 0, length = aDocumentContent.length; i < length; i++) {
|
||
var elem = aDocumentContent[i];
|
||
var oNewElem = null;
|
||
if (type_Paragraph === elem.GetType()) {
|
||
oNewElem = this._getParagraphMeasure(elem, oRes);
|
||
} else if (type_Table === elem.GetType()) {
|
||
elem.ReIndexing(0);
|
||
oNewElem = this._getTableMeasure(elem, oRes);
|
||
} else if (type_BlockLevelSdt === elem.GetType()) {
|
||
oNewElem = this._getMeasure(elem.Content.Content, oRes);
|
||
}
|
||
|
||
if (null != oNewElem) {
|
||
oRes.children.push(oNewElem);
|
||
if (oNewElem.width && oNewElem.width > oRes.width)
|
||
oRes.width = oNewElem.width;
|
||
oRes.height += oNewElem.height;
|
||
}
|
||
}
|
||
return oRes;
|
||
},
|
||
_getParagraphMeasure: function (elem, oParent) {
|
||
var oNewElem = new DocumentContentBoundsElement(elem, c_oAscBoundsElementType.Paragraph, oParent);
|
||
oNewElem.width = 1;
|
||
oNewElem.height = 1;
|
||
|
||
for (var i = 0, length = elem.Content.length; i < length; i++) {
|
||
if (elem.Content[i] && elem.Content[i].Content) {
|
||
for (var j = 0; j < elem.Content[i].Content.length; j++) {
|
||
let innerElem = elem.Content[i].Content[j];
|
||
if (innerElem && para_NewLine === innerElem.GetType()) {
|
||
//on feature: read ms style comments and use only sameCell flag
|
||
if (AscCommon.g_clipboardBase.pastedFrom !== AscCommon.c_oClipboardPastedFrom.Excel && !(innerElem.Flags && innerElem.Flags.sameCell === true)) {
|
||
oNewElem.height++;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return oNewElem;
|
||
},
|
||
_getTableMeasure: function (table, oParent) {
|
||
var oRes = new DocumentContentBoundsElement(table, c_oAscBoundsElementType.Table, oParent);
|
||
//надо рассчитать сколько ячеек приходится на tableGrid, по умолчанию по одной
|
||
//todo надо оптимизировать размер
|
||
var aGridWidth = [], i, length;
|
||
for (i = 0, length = table.TableGrid.length; i < length; i++)
|
||
aGridWidth.push(1);
|
||
//заполняем aGridWidth
|
||
for (i = 0, length = table.Content.length; i < length; i++) {
|
||
var row = table.Content[i];
|
||
var oNewElem = this._setRowGridWidth(row, oRes, aGridWidth);
|
||
if (null != oNewElem)
|
||
oRes.children.push(oNewElem);
|
||
}
|
||
var aSumGridWidth = [];
|
||
var nTempSum = 0;
|
||
for (i = 0, length = aGridWidth.length; i < length + 1; i++) {
|
||
aSumGridWidth[i] = nTempSum;
|
||
var nCurValue = aGridWidth[i];
|
||
if (nCurValue)
|
||
nTempSum += nCurValue;
|
||
}
|
||
//заполняем размеры
|
||
for (i = 0, length = oRes.children.length; i < length; i++) {
|
||
var rowWrapped = oRes.children[i];
|
||
this._getRowMeasure(rowWrapped, aSumGridWidth, oRes.children, i);
|
||
oRes.height += rowWrapped.height;
|
||
//в left временно занесен относительный сдвиг
|
||
if (rowWrapped.width + rowWrapped.left > oRes.width)
|
||
oRes.width = rowWrapped.width + rowWrapped.left;
|
||
}
|
||
return oRes;
|
||
},
|
||
_setRowGridWidth: function (row, oParent, aGridWidth) {
|
||
var oRes = new DocumentContentBoundsElement(row, c_oAscBoundsElementType.Row, oParent);
|
||
var nSumGrid = 0;
|
||
var BeforeInfo = row.Get_Before();
|
||
if (BeforeInfo && BeforeInfo.GridBefore)
|
||
nSumGrid += BeforeInfo.GridBefore;
|
||
for (var i = 0, length = row.Content.length; i < length; i++) {
|
||
var cell = row.Content[i];
|
||
var oNewCell = new DocumentContentBoundsElement(cell, c_oAscBoundsElementType.Cell, oRes);
|
||
oRes.children.push(oNewCell);
|
||
var oNewElem = this._getMeasure(cell.Content.Content, oNewCell);
|
||
oNewCell.children.push(oNewElem);
|
||
oNewCell.width = oNewElem.width;
|
||
oNewCell.height = oNewElem.height;
|
||
if (oNewCell.height > oRes.height)
|
||
oRes.height = oNewCell.height;
|
||
var nCellGrid = cell.Get_GridSpan();
|
||
if (oNewElem.width > nCellGrid) {
|
||
var nFirstGridWidth = oNewElem.width - nCellGrid + 1;
|
||
var nCurValue = aGridWidth[nSumGrid];
|
||
if (null != nCurValue && nCurValue < nFirstGridWidth)
|
||
aGridWidth[nSumGrid] = nFirstGridWidth;
|
||
}
|
||
nSumGrid += nCellGrid;
|
||
}
|
||
return oRes;
|
||
},
|
||
_getRowMeasure: function (rowWrapped, aSumGridWidth, rows, index) {
|
||
|
||
var getNotMergedPreviousCell = function (i) {
|
||
var res = null;
|
||
if (rows && index > 0) {
|
||
for (var j = index; j >= 0; j--) {
|
||
if (rows[j] && rows[j].children && rows[j].children[i]) {
|
||
var vMerge = rows[j].children[i].elem.GetVMerge();
|
||
if (1 === vMerge) {
|
||
res = rows[j].children[i];
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return res;
|
||
};
|
||
|
||
var nSumGrid = 0;
|
||
var BeforeInfo = rowWrapped.elem.Get_Before();
|
||
if (BeforeInfo && BeforeInfo.GridBefore) {
|
||
//временно заносим относительный сдвиг
|
||
rowWrapped.left = aSumGridWidth[nSumGrid + BeforeInfo.GridBefore] - aSumGridWidth[nSumGrid];
|
||
nSumGrid += BeforeInfo.GridBefore;
|
||
}
|
||
|
||
for (var i = 0, length = rowWrapped.children.length; i < length; i++) {
|
||
var cellWrapped = rowWrapped.children[i];
|
||
var nCellGrid = cellWrapped.elem.Get_GridSpan();
|
||
cellWrapped.width = aSumGridWidth[nSumGrid + nCellGrid] - aSumGridWidth[nSumGrid];
|
||
//выравниваем высоту ячеек по-максимому
|
||
cellWrapped.height = rowWrapped.height;
|
||
rowWrapped.width += cellWrapped.width;
|
||
nSumGrid += nCellGrid;
|
||
|
||
//vertical merge
|
||
var previousCell = getNotMergedPreviousCell(i);
|
||
if (previousCell) {
|
||
var vMerge = cellWrapped.elem.GetVMerge();
|
||
if (vMerge > 1) {
|
||
previousCell.height += vMerge - 1;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
};
|
||
|
||
|
||
//---------------------------------------------------------export---------------------------------------------------
|
||
var g_clipboardExcel = new Clipboard();
|
||
window['AscCommonExcel'] = window['AscCommonExcel'] || {};
|
||
window['AscCommonExcel'].g_clipboardExcel = g_clipboardExcel;
|
||
|
||
window["Asc"]["SpecialPasteProps"] = window["Asc"].SpecialPasteProps = CSpecialPasteProps;
|
||
prot = CSpecialPasteProps.prototype;
|
||
prot["asc_setProps"] = prot.asc_setProps;
|
||
prot["asc_getProps"] = prot.asc_getProps;
|
||
prot["asc_setAdvancedOptions"] = prot.asc_setAdvancedOptions;
|
||
prot["asc_setOperation"] = prot.asc_setOperation;
|
||
prot["asc_getOperation"] = prot.asc_getOperation;
|
||
prot["asc_setTranspose"] = prot.asc_setTranspose;
|
||
prot["asc_setSkipBlanks"] = prot.asc_setSkipBlanks;
|
||
prot["asc_getTableAllowed"] = prot.asc_getTableAllowed;
|
||
|
||
}
|
||
)(jQuery, window);
|