983 lines
37 KiB
JavaScript
983 lines
37 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";
|
|
(function (window, undefined){
|
|
|
|
|
|
/**
|
|
* CDrawingDocContent
|
|
* @constructor
|
|
* @extends {CDocumentContent}
|
|
*/
|
|
function CDrawingDocContent(Parent, DrawingDocument, X, Y, XLimit, YLimit) {
|
|
CDocumentContent.call(this, Parent, DrawingDocument, X, Y, XLimit, YLimit, false, false, true);
|
|
this.FullRecalc = new CDocumentRecalculateState();
|
|
this.AllFields = [];
|
|
}
|
|
|
|
CDrawingDocContent.prototype = Object.create(CDocumentContent.prototype);
|
|
CDrawingDocContent.prototype.constructor = CDrawingDocContent;
|
|
|
|
CDrawingDocContent.prototype.CalculateAllFields = function () {
|
|
var aParagraphs = this.Content;
|
|
this.AllFields.length = 0;
|
|
for(var i = 0; i < aParagraphs.length; ++i){
|
|
var aContent = aParagraphs[i].Content;
|
|
for(var j = 0; j < aContent.length; ++j){
|
|
if(aContent[j] instanceof AscCommonWord.CPresentationField){
|
|
this.AllFields.push(aContent[j]);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
CDrawingDocContent.prototype.CanAddComment = function() {
|
|
return false;
|
|
};
|
|
|
|
CDrawingDocContent.prototype.getFontSizeForConstr = function () {
|
|
return this.Content.reduce(function (pAcc, paragraph) {
|
|
var maxFontSizeInParagraph = paragraph.Content.reduce(function (acc, paraRun) {
|
|
return paraRun.Pr && paraRun.Pr.FontSize && paraRun.Pr.FontSize > acc ? paraRun.Pr.FontSize : acc;
|
|
}, 0);
|
|
return maxFontSizeInParagraph > pAcc ? maxFontSizeInParagraph : pAcc;
|
|
}, 0);
|
|
};
|
|
|
|
CDrawingDocContent.prototype.getBulletImages = function (arrImages) {
|
|
var aParagraphs = this.Content;
|
|
var sImageId;
|
|
for(var nPar = 0; nPar < aParagraphs.length; ++nPar)
|
|
{
|
|
var oPr = aParagraphs[nPar].Pr;
|
|
if(oPr.Bullet)
|
|
{
|
|
sImageId = oPr.Bullet.getImageBulletURL();
|
|
if(sImageId)
|
|
{
|
|
arrImages.push(sImageId);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
CDrawingDocContent.prototype.GetFieldByType = function (sType) {
|
|
var sType_ = sType.toLowerCase();
|
|
var oField;
|
|
for(var i = 0; i < this.AllFields.length; ++i){
|
|
oField = this.AllFields[i];
|
|
if(oField.GetFieldType() === sType_){
|
|
return oField;
|
|
}
|
|
}
|
|
return null;
|
|
};
|
|
|
|
CDrawingDocContent.prototype.GetFieldByType2 = function (sType) {
|
|
var sType_ = sType.toLowerCase();
|
|
var oField;
|
|
var sFieldType;
|
|
for(var i = 0; i < this.AllFields.length; ++i){
|
|
oField = this.AllFields[i];
|
|
sFieldType = oField.GetFieldType();
|
|
if(typeof sFieldType === "string" && sFieldType.indexOf(sType_) === 0){
|
|
return oField;
|
|
}
|
|
}
|
|
return null;
|
|
};
|
|
|
|
CDrawingDocContent.prototype.GetAllDrawingObjects = function(arrDrawings){
|
|
if (undefined === arrDrawings || null === arrDrawings)
|
|
arrDrawings = [];
|
|
return arrDrawings;
|
|
};
|
|
CDrawingDocContent.prototype.GetSummaryHeight = function(){
|
|
var fSummHeight = 0;
|
|
var nColumnsCount = this.GetColumnCount();
|
|
for(var i = 0; i < this.Pages.length; ++i){
|
|
var oPage = this.Pages[i];
|
|
var fPageHeight = 0;
|
|
if(oPage.Sections.length > 0){
|
|
var aColumns = oPage.Sections[0].Columns;
|
|
for(var j = 0; j < aColumns.length; ++j){
|
|
var oColumn = aColumns[j];
|
|
for(var k = oColumn.Pos; k <= oColumn.EndPos; ++k){
|
|
var nElementPageIndex = this.private_GetElementPageIndex(k, i, j, nColumnsCount);
|
|
var fParagraphPageBottom = this.Content[k].Get_PageBounds(nElementPageIndex).Bottom;
|
|
if(fPageHeight < fParagraphPageBottom){
|
|
fPageHeight = fParagraphPageBottom;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else{
|
|
var Bounds = this.Get_PageBounds(i);
|
|
fPageHeight = Bounds.Bottom - Bounds.Top;
|
|
}
|
|
fSummHeight += fPageHeight;
|
|
}
|
|
return fSummHeight;
|
|
};
|
|
|
|
CDrawingDocContent.prototype.GetSummaryHeight_ =function () {
|
|
var dHeight = 0.0;
|
|
for(var i = 0; i < this.Content.length; ++i){
|
|
var oElement = this.Content[i];
|
|
if(oElement.GetType() === type_Paragraph){
|
|
for(var j = 0; j < oElement.Lines.length; ++j){
|
|
var oLine = oElement.Lines[j];
|
|
dHeight += (oLine.Bottom - oLine.Top - oLine.Metrics.Descent);
|
|
}
|
|
}
|
|
}
|
|
return dHeight;
|
|
};
|
|
|
|
// function to find the maximum width of the text inside the rect, as each line contains different widths
|
|
CDrawingDocContent.prototype.GetSummaryWidth =function () {
|
|
// width of single line label
|
|
let width = 20000;
|
|
if (!this.Content || !Array.isArray(this.Content )) {
|
|
return width;
|
|
}
|
|
const lines = this.Content[0].Lines;
|
|
if (lines && Array.isArray(lines)) {
|
|
for (let i = 0; i < lines.length; i++) {
|
|
const newWidth = lines[i] && lines[i].Ranges && Array.isArray(lines[i].Ranges) && lines[i].Ranges.length > 0 ? lines[i].Ranges[0].W : null;
|
|
if (newWidth !== null && (i === 0 || width < newWidth)) {
|
|
width = newWidth;
|
|
}
|
|
}
|
|
}
|
|
|
|
return width;
|
|
};
|
|
|
|
// function to find the width of the unfolded 2d array, simply add width of each line
|
|
CDrawingDocContent.prototype.getUnfoldedWidth = function (nLines) {
|
|
// width of single line label
|
|
if (!this.Content || !Array.isArray(this.Content )) {
|
|
return 20000;
|
|
}
|
|
let width = 0;
|
|
const boxError = 0.1;
|
|
const lines = this.Content[0].Lines;
|
|
if (lines && Array.isArray(lines)) {
|
|
for (let i = 0; i < nLines; i++) {
|
|
if (lines.length < i) {
|
|
break;
|
|
}
|
|
const newWidth = lines[i] && lines[i].Ranges && Array.isArray(lines[i].Ranges) && lines[i].Ranges.length > 0 ? lines[i].Ranges[0].W : null;
|
|
if (newWidth !== null) {
|
|
width += newWidth;
|
|
}
|
|
}
|
|
}
|
|
|
|
return width + boxError;
|
|
};
|
|
|
|
CDrawingDocContent.prototype.GetColumnCount = function(){
|
|
var nColumnCount = 1;
|
|
if(this.Parent.getBodyPr){
|
|
var oBodyPr = this.Parent.getBodyPr();
|
|
nColumnCount = AscFormat.isRealNumber(oBodyPr.numCol) ? oBodyPr.numCol : 1;
|
|
}
|
|
return nColumnCount;
|
|
};
|
|
|
|
CDrawingDocContent.prototype.GetPageContentFrame = function(page, sectPr){
|
|
return this._GetColumnContentFrame(0);
|
|
};
|
|
|
|
CDrawingDocContent.prototype.GetColumnContentFrame = function(page, column, sectPr){
|
|
return this._GetColumnContentFrame(column);
|
|
};
|
|
|
|
CDrawingDocContent.prototype._GetColumnContentFrame = function(nColumnIndex){
|
|
|
|
var X = this.X;
|
|
var Y = this.Y;
|
|
var XLimit = this.XLimit;
|
|
var YLimit = this.YLimit;
|
|
var ColumnSpaceBefore = 0;
|
|
var ColumnSpaceAfter = 0;
|
|
var nNumCol = this.GetColumnCount();
|
|
var oBodyPr = this.Parent.getBodyPr && this.Parent.getBodyPr();
|
|
if(nNumCol > 1 && oBodyPr)
|
|
{
|
|
var fSpace = AscFormat.isRealNumber(oBodyPr.spcCol) ? oBodyPr.spcCol : 0;
|
|
fSpace = Math.min(fSpace, this.XLimit/(nNumCol - 1));
|
|
var fColumnWidth = Math.max((this.XLimit - this.X - (nNumCol - 1)*fSpace)/nNumCol, 0);
|
|
X += nColumnIndex*(fColumnWidth + fSpace);
|
|
XLimit = X + fColumnWidth;
|
|
if(nColumnIndex > 0)
|
|
{
|
|
ColumnSpaceBefore = fSpace;
|
|
}
|
|
if(nColumnIndex < nNumCol - 1)
|
|
{
|
|
ColumnSpaceAfter = fSpace;
|
|
}
|
|
}
|
|
return {
|
|
X : X,
|
|
Y : Y,
|
|
XLimit : XLimit,
|
|
YLimit : YLimit,
|
|
ColumnSpaceBefore : ColumnSpaceBefore,
|
|
ColumnSpaceAfter : ColumnSpaceAfter
|
|
};
|
|
};
|
|
|
|
|
|
CDrawingDocContent.prototype.RecalculateContent = function(fWidth, fHeight, nStartPage){
|
|
this.Recalculated = true;
|
|
this.CalculateAllFields();
|
|
if(this.GetColumnCount() === 1){
|
|
CDocumentContent.prototype.RecalculateContent.call(this, fWidth, fHeight, nStartPage);
|
|
}
|
|
else{
|
|
this.Start_Recalculate(fWidth, fHeight);
|
|
if(this.Pages.length > 1){
|
|
var fSummaryHeight = this.GetSummaryHeight();
|
|
|
|
var fLow = fHeight, fHigh = fSummaryHeight;
|
|
this.Start_Recalculate(fWidth, fHigh);
|
|
var nItCount = 0;
|
|
while(this.Pages.length > 1 && nItCount < 5){
|
|
fHigh += fSummaryHeight;
|
|
this.Start_Recalculate(fWidth, fHigh);
|
|
++nItCount;
|
|
}
|
|
var fNeedHeight = fHigh;
|
|
if(this.GetColumnCount() > 1){
|
|
while((fHigh - fLow) > 0.1){
|
|
var fCheckHeight = fLow + (fHigh - fLow)/2;
|
|
this.Start_Recalculate(fWidth, fCheckHeight);
|
|
if(this.Pages.length > 1){
|
|
fLow = fCheckHeight;
|
|
}
|
|
else{
|
|
fHigh = fCheckHeight;
|
|
fNeedHeight = fCheckHeight;
|
|
}
|
|
}
|
|
}
|
|
this.Start_Recalculate(fWidth, fNeedHeight + 0.01);
|
|
}
|
|
}
|
|
};
|
|
|
|
CDrawingDocContent.prototype.Start_Recalculate = function(fWidth, fHeight){
|
|
this.FullRecalc.PageIndex = 0;
|
|
this.FullRecalc.SectionIndex = 0;
|
|
this.FullRecalc.ColumnIndex = 0;
|
|
this.FullRecalc.StartIndex = 0;
|
|
this.FullRecalc.Start = true;
|
|
this.FullRecalc.StartPage = 0;
|
|
this.Reset(0, 0, fWidth, fHeight);
|
|
this.Recalculate_PageDrawing();
|
|
};
|
|
|
|
CDrawingDocContent.prototype.Recalculate_PageDrawing = function()
|
|
{
|
|
var nColumnsCount = this.GetColumnCount();
|
|
var nPageIndex = this.FullRecalc.PageIndex;
|
|
this.Pages.length = nPageIndex + 1;
|
|
if(0 === this.FullRecalc.ColumnIndex && true === this.FullRecalc.Start)
|
|
{
|
|
var oPage = new AscWord.DocumentPage();
|
|
oPage.Pos = this.FullRecalc.StartIndex;
|
|
oPage.Sections[0] = new AscWord.DocumentPageSection();
|
|
for (var i = 0; i < nColumnsCount; ++i)
|
|
{
|
|
oPage.Sections[0].Columns[i] = new AscWord.DocumentPageColumn();
|
|
}
|
|
this.Pages[nPageIndex] = oPage;
|
|
}
|
|
this.Recalculate_PageColumn();
|
|
};
|
|
|
|
CDrawingDocContent.prototype.Recalculate_PageColumn = function()
|
|
{
|
|
var nPageIndex = this.FullRecalc.PageIndex;
|
|
var nColumnIndex = this.FullRecalc.ColumnIndex;
|
|
var nStartIndex = this.FullRecalc.StartIndex;
|
|
|
|
var oStartPos = this._GetColumnContentFrame(nColumnIndex);
|
|
var X = oStartPos.X;
|
|
var Y = oStartPos.Y;
|
|
var XLimit = oStartPos.XLimit;
|
|
var YLimit = oStartPos.YLimit;
|
|
|
|
var nColumnsCount = this.GetColumnCount();
|
|
|
|
var aContent = this.Content;
|
|
var nCount = aContent.length;
|
|
var nRecalcResult = recalcresult_NextPage;
|
|
var oParagraph;
|
|
var bContinue = false;
|
|
|
|
var oPage = this.Pages[nPageIndex];
|
|
var oSection = oPage.Sections[0];
|
|
var oColumn = oSection.Columns[nColumnIndex];
|
|
oColumn.X = X;
|
|
oColumn.XLimit = XLimit;
|
|
oColumn.Y = Y;
|
|
oColumn.YLimit = YLimit;
|
|
oColumn.Pos = nStartIndex;
|
|
oColumn.Empty = false;
|
|
oColumn.SpaceBefore = oStartPos.ColumnSpaceBefore;
|
|
oColumn.SpaceAfter = oStartPos.ColumnSpaceAfter;
|
|
for(var i = nStartIndex; i < nCount; ++i)
|
|
{
|
|
oParagraph = this.Content[i];
|
|
|
|
if((0 === i && 0 === nPageIndex && 0 === nColumnIndex) || i != nStartIndex || (i === nStartIndex && true === this.FullRecalc.ResetStartElement))
|
|
{
|
|
oParagraph.Set_DocumentIndex(i);
|
|
oParagraph.Reset(X, Y, XLimit, YLimit, nPageIndex, nColumnIndex, nColumnsCount);
|
|
}
|
|
var nElementPageIndex = this.private_GetElementPageIndex(i, nPageIndex, nColumnIndex, nColumnsCount);
|
|
nRecalcResult = oParagraph.Recalculate_Page(nElementPageIndex);
|
|
if(nRecalcResult & recalcresult_NextElement)
|
|
{
|
|
Y = oParagraph.Get_PageBounds(nElementPageIndex).Bottom;
|
|
}
|
|
oColumn.Bounds.Bottom = Y;
|
|
if (nRecalcResult & recalcresult_CurPage)
|
|
{
|
|
if (nRecalcResult & recalcresultflags_Column)
|
|
{
|
|
this.FullRecalc.ColumnIndex = nColumnIndex;
|
|
}
|
|
else
|
|
{
|
|
this.FullRecalc.ColumnIndex = 0;
|
|
}
|
|
bContinue = true;
|
|
break;
|
|
}
|
|
else if(nRecalcResult & recalcresult_NextPage)
|
|
{
|
|
if (nRecalcResult & recalcresultflags_LastFromNewColumn)
|
|
{
|
|
oColumn.EndPos = i - 1;
|
|
oSection.EndPos = i - 1;
|
|
oPage.EndPos = i - 1;
|
|
bContinue = true;
|
|
this.FullRecalc.ColumnIndex = nColumnIndex + 1;
|
|
this.FullRecalc.PageIndex = nPageIndex;
|
|
this.FullRecalc.StartIndex = i;
|
|
this.FullRecalc.Start = true;
|
|
if (this.FullRecalc.ColumnIndex >= nColumnsCount)
|
|
{
|
|
this.FullRecalc.ColumnIndex = 0;
|
|
this.FullRecalc.PageIndex = nPageIndex + 1;
|
|
}
|
|
break;
|
|
}
|
|
else if (nRecalcResult & recalcresultflags_LastFromNewPage)
|
|
{
|
|
oColumn.EndPos = i - 1;
|
|
oSection.EndPos = i - 1;
|
|
oPage.EndPos = i - 1;
|
|
bContinue = true;
|
|
this.FullRecalc.SectionIndex = 0;
|
|
this.FullRecalc.ColumnIndex = 0;
|
|
this.FullRecalc.PageIndex = nPageIndex + 1;
|
|
this.FullRecalc.StartIndex = i;
|
|
this.FullRecalc.Start = true;
|
|
if (oColumn.EndPos === oColumn.Pos)
|
|
{
|
|
var Element = this.Content[oColumn.Pos];
|
|
var ElementPageIndex = this.private_GetElementPageIndex(i, nPageIndex, nColumnIndex, nColumnsCount);
|
|
if (true === Element.IsEmptyPage(ElementPageIndex))
|
|
oColumn.Empty = true;
|
|
}
|
|
for (var TempColumnIndex = nColumnIndex + 1; TempColumnIndex < nColumnsCount; ++TempColumnIndex)
|
|
{
|
|
oSection.Columns[TempColumnIndex].Empty = true;
|
|
oSection.Columns[TempColumnIndex].Pos = i;
|
|
oSection.Columns[TempColumnIndex].EndPos = i - 1;
|
|
}
|
|
break;
|
|
}
|
|
else if (nRecalcResult & recalcresultflags_Page)
|
|
{
|
|
oColumn.EndPos = i;
|
|
oSection.EndPos = i;
|
|
oPage.EndPos = i;
|
|
|
|
bContinue = true;
|
|
|
|
this.FullRecalc.SectionIndex = 0;
|
|
this.FullRecalc.ColumnIndex = 0;
|
|
this.FullRecalc.PageIndex = nPageIndex + 1;
|
|
this.FullRecalc.StartIndex = i;
|
|
this.FullRecalc.Start = true;
|
|
|
|
if (oColumn.EndPos === oColumn.Pos)
|
|
{
|
|
var Element = this.Content[oColumn.Pos];
|
|
var ElementPageIndex = this.private_GetElementPageIndex(i, nPageIndex, nColumnIndex, nColumnsCount);
|
|
if (true === Element.IsEmptyPage(nElementPageIndex))
|
|
oColumn.Empty = true;
|
|
}
|
|
for (var TempColumnIndex = nColumnIndex + 1; TempColumnIndex < nColumnsCount; ++TempColumnIndex)
|
|
{
|
|
var ElementPageIndex = this.private_GetElementPageIndex(i, nPageIndex, TempColumnIndex, nColumnsCount);
|
|
this.Content[i].Recalculate_SkipPage(ElementPageIndex);
|
|
oSection.Columns[TempColumnIndex].Empty = true;
|
|
oSection.Columns[TempColumnIndex].Pos = i;
|
|
oSection.Columns[TempColumnIndex].EndPos = i - 1;
|
|
}
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
oColumn.EndPos = i;
|
|
oSection.EndPos = i;
|
|
oPage.EndPos = i;
|
|
|
|
bContinue = true;
|
|
|
|
this.FullRecalc.ColumnIndex = nColumnIndex + 1;
|
|
if (this.FullRecalc.ColumnIndex >= nColumnsCount)
|
|
{
|
|
this.FullRecalc.SectionIndex = 0;
|
|
this.FullRecalc.ColumnIndex = 0;
|
|
this.FullRecalc.PageIndex = nPageIndex + 1;
|
|
}
|
|
|
|
this.FullRecalc.StartIndex = i;
|
|
this.FullRecalc.Start = true;
|
|
|
|
if (oColumn.EndPos === oColumn.Pos)
|
|
{
|
|
var Element = this.Content[oColumn.Pos];
|
|
var ElementPageIndex = this.private_GetElementPageIndex(i, nPageIndex, nColumnIndex, nColumnsCount);
|
|
if (true === Element.IsEmptyPage(ElementPageIndex))
|
|
oColumn.Empty = true;
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (i === nCount)
|
|
{
|
|
oPage.EndPos = nCount - 1;
|
|
oSection.EndPos = nCount - 1;
|
|
oColumn.EndPos = nCount - 1;
|
|
}
|
|
if(bContinue)
|
|
{
|
|
this.Recalculate_PageDrawing();
|
|
}
|
|
};
|
|
|
|
CDrawingDocContent.prototype.Draw = function(nPageIndex, pGraphics){
|
|
if(this.Pages.length > 0){
|
|
|
|
var oSection = this.Pages[0].Sections[0];
|
|
if(oSection){
|
|
|
|
pGraphics.Start_Command(AscFormat.DRAW_COMMAND_CONTENT);
|
|
|
|
for (var ColumnIndex = 0, ColumnsCount = oSection.Columns.length; ColumnIndex < ColumnsCount; ++ColumnIndex)
|
|
{
|
|
var Column = oSection.Columns[ColumnIndex];
|
|
var ColumnStartPos = Column.Pos;
|
|
var ColumnEndPos = Column.EndPos;
|
|
|
|
// Плавающие объекты не должны попадать в клип колонок
|
|
var FlowElements = [];
|
|
|
|
if (ColumnsCount > 1)
|
|
{
|
|
// pGraphics.SaveGrState();
|
|
|
|
var X = ColumnIndex === 0 ? 0 : Column.X - Column.SpaceBefore / 2;
|
|
// var XEnd = (ColumnIndex >= ColumnsCount - 1 ? Page.Width : Column.XLimit + Column.SpaceAfter / 2);
|
|
// pGraphics.AddClipRect(X, 0, XEnd - X, Page.Height);
|
|
}
|
|
|
|
for (var ContentPos = ColumnStartPos; ContentPos <= ColumnEndPos; ++ContentPos)
|
|
{
|
|
var ElementPageIndex = this.private_GetElementPageIndex(ContentPos, 0, ColumnIndex, ColumnsCount);
|
|
this.Content[ContentPos].Draw(ElementPageIndex, pGraphics);
|
|
}
|
|
|
|
/*if (ColumnsCount > 1)
|
|
{
|
|
pGraphics.RestoreGrState();
|
|
}*/
|
|
}
|
|
|
|
pGraphics.End_Command();
|
|
}
|
|
|
|
else{
|
|
CDocumentContent.prototype.Draw.call(this, nPageIndex, pGraphics);
|
|
}
|
|
}
|
|
};
|
|
|
|
CDrawingDocContent.prototype.Write_ToBinary2 = function(oWriter){
|
|
oWriter.WriteLong(AscDFH.historyitem_type_DrawingContent);
|
|
CDocumentContent.prototype.Write_ToBinary2.call(this, oWriter);
|
|
};
|
|
CDrawingDocContent.prototype.Read_FromBinary2 = function(oReader){
|
|
oReader.GetLong();//type of DocumentContent
|
|
CDocumentContent.prototype.Read_FromBinary2.call(this, oReader);
|
|
};
|
|
CDrawingDocContent.prototype.IsTableCellContent = function(isReturnCell){
|
|
|
|
if (true === isReturnCell)
|
|
return null;
|
|
|
|
return false;
|
|
};
|
|
|
|
CDrawingDocContent.prototype.Is_ChartTitleContent = function(){
|
|
if(this.Parent instanceof AscFormat.CTextBody &&
|
|
this.Parent.parent instanceof AscFormat.CTitle){
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
CDrawingDocContent.prototype.DrawSelectionOnPage = function(PageIndex, clipInfo){
|
|
var CurPage = PageIndex;
|
|
if (CurPage < 0 || CurPage >= this.Pages.length)
|
|
return;
|
|
var Pos_start = this.Pages[CurPage].Pos;
|
|
var Pos_end = this.Pages[CurPage].EndPos;
|
|
|
|
clipInfo = this.IntersectClip(clipInfo, PageIndex);
|
|
|
|
if (true === this.Selection.Use)
|
|
{
|
|
if(this.Selection.Flag === selectionflag_Common)
|
|
{
|
|
var Start = this.Selection.StartPos;
|
|
var End = this.Selection.EndPos;
|
|
|
|
if (Start > End)
|
|
{
|
|
Start = this.Selection.EndPos;
|
|
End = this.Selection.StartPos;
|
|
}
|
|
|
|
var Start = Math.max(Start, Pos_start);
|
|
var End = Math.min(End, Pos_end);
|
|
|
|
var Page = this.Pages[PageIndex];
|
|
if(this.Pages[PageIndex].Sections.length === 0){
|
|
for (var Index = Start; Index <= End; Index++)
|
|
{
|
|
var ElementPageIndex = this.private_GetElementPageIndex(Index, CurPage, 0, 1);
|
|
this.Content[Index].DrawSelectionOnPage(ElementPageIndex, clipInfo);
|
|
}
|
|
}
|
|
else{
|
|
var PageSection = Page.Sections[0];
|
|
for (var ColumnIndex = 0, ColumnsCount = PageSection.Columns.length; ColumnIndex < ColumnsCount; ++ColumnIndex)
|
|
{
|
|
var Pos_start = Page.Pos;
|
|
var Pos_end = Page.EndPos;
|
|
|
|
var Start = this.Selection.StartPos;
|
|
var End = this.Selection.EndPos;
|
|
|
|
if (Start > End)
|
|
{
|
|
Start = this.Selection.EndPos;
|
|
End = this.Selection.StartPos;
|
|
}
|
|
|
|
var Start = Math.max(Start, Pos_start);
|
|
var End = Math.min(End, Pos_end);
|
|
|
|
for (var Index = Start; Index <= End; ++Index)
|
|
{
|
|
var ElementPage = this.private_GetElementPageIndex(Index, 0, ColumnIndex, ColumnsCount);
|
|
this.Content[Index].DrawSelectionOnPage(ElementPage, clipInfo);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
};
|
|
|
|
CDrawingDocContent.prototype.Internal_GetContentPosByXY = function(X, Y, PageNum)
|
|
{
|
|
if (undefined === PageNum || null === PageNum)
|
|
PageNum = this.CurPage;
|
|
// Теперь проверим пустые параграфы с окончанием секций
|
|
var SectCount = this.Pages[PageNum].EndSectionParas.length;
|
|
if(this.Pages[PageNum].Sections.length === 0){
|
|
return CDocumentContent.prototype.Internal_GetContentPosByXY.call(this, X, Y, PageNum);
|
|
}
|
|
for (var Index = 0; Index < SectCount; ++Index)
|
|
{
|
|
var Item = this.Pages[PageNum].EndSectionParas[Index];
|
|
var Bounds = Item.Pages[0].Bounds;
|
|
|
|
if (Y < Bounds.Bottom && Y > Bounds.Top && X > Bounds.Left && X < Bounds.Right)
|
|
return Item.Index;
|
|
}
|
|
|
|
// Сначала мы определим секцию и колонку, в которую попали
|
|
var Page = this.Pages[PageNum];
|
|
|
|
var SectionIndex = 0;
|
|
for (var SectionsCount = Page.Sections.length; SectionIndex < SectionsCount - 1; ++SectionIndex)
|
|
{
|
|
if (Y < Page.Sections[SectionIndex + 1].Y)
|
|
break;
|
|
}
|
|
|
|
var PageSection = this.Pages[PageNum].Sections[SectionIndex];
|
|
var ColumnsCount = PageSection.Columns.length;
|
|
var ColumnIndex = 0;
|
|
for (; ColumnIndex < ColumnsCount - 1; ++ColumnIndex)
|
|
{
|
|
if (X < (PageSection.Columns[ColumnIndex].XLimit + PageSection.Columns[ColumnIndex + 1].X) / 2)
|
|
break;
|
|
}
|
|
|
|
// TODO: Разобраться с ситуацией, когда пустые колонки стоят не только в конце
|
|
while (ColumnIndex > 0 && true === PageSection.Columns[ColumnIndex].Empty)
|
|
ColumnIndex--;
|
|
|
|
var Column = PageSection.Columns[ColumnIndex];
|
|
var StartPos = Column.Pos;
|
|
var EndPos = Column.EndPos;
|
|
|
|
for (var Pos = StartPos; Pos < EndPos; ++Pos)
|
|
{
|
|
var Item = this.Content[Pos + 1];
|
|
var PageBounds = Item.Get_PageBounds(0);
|
|
if (Y < PageBounds.Top)
|
|
return Pos;
|
|
}
|
|
|
|
if (Pos === EndPos)
|
|
{
|
|
return EndPos;
|
|
}
|
|
return 0;
|
|
};
|
|
|
|
CDrawingDocContent.prototype.private_GetElementPageIndexByXY = function(ElementPos, X, Y, PageIndex){
|
|
if(this.Pages.length > 0){
|
|
if(this.Pages[0].Sections.length > 0){
|
|
return CDocument_prototype_private_GetElementPageIndexByXY.call(this, ElementPos, X, Y, PageIndex);
|
|
}
|
|
}
|
|
return CDocumentContent.prototype.private_GetElementPageIndexByXY.call(this, ElementPos, X, Y, PageIndex);
|
|
};
|
|
CDrawingDocContent.prototype.Copy = function(Parent, DrawingDocument)
|
|
{
|
|
var DC = new CDrawingDocContent(Parent, DrawingDocument ? DrawingDocument : this.DrawingDocument, 0, 0, 0, 0, this.Split, this.TurnOffInnerWrap, this.bPresentation);
|
|
|
|
// Копируем содержимое
|
|
DC.Internal_Content_RemoveAll();
|
|
|
|
var Count = this.Content.length;
|
|
for (var Index = 0; Index < Count; Index++)
|
|
{
|
|
DC.Internal_Content_Add(Index, this.Content[Index].Copy(DC, DrawingDocument, {}), false);
|
|
}
|
|
|
|
return DC;
|
|
};
|
|
CDrawingDocContent.prototype.Copy3 = function(Parent)//для заголовков диаграмм
|
|
{
|
|
var DC = new CDrawingDocContent(Parent, this.DrawingDocument, 0, 0, 0, 0, this.Split, this.TurnOffInnerWrap, true);
|
|
|
|
// Копируем содержимое
|
|
DC.Internal_Content_RemoveAll();
|
|
|
|
var Count = this.Content.length;
|
|
for (var Index = 0; Index < Count; Index++)
|
|
{
|
|
DC.Internal_Content_Add(Index, this.Content[Index].Copy2(DC), false);
|
|
}
|
|
return DC;
|
|
};
|
|
|
|
CDrawingDocContent.prototype.Recalculate = function()
|
|
{
|
|
|
|
if(typeof editor !== "undefined" && editor &&
|
|
(editor.isPresentationEditor || editor.isDocumentEditor)){
|
|
if(editor.WordControl && editor.WordControl.m_oLogicDocument){
|
|
editor.WordControl.m_oLogicDocument.Recalculate();
|
|
}
|
|
}
|
|
else{
|
|
if(this.Parent){
|
|
if(this.Parent instanceof AscFormat.CShape){
|
|
this.Parent.recalculateContent();
|
|
return;
|
|
}
|
|
else if(this.Parent && this.Parent.parent){
|
|
if(this.Parent.parent instanceof AscFormat.CShape){
|
|
this.Parent.parent.recalculateContent();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
if(this.XLimit > 0){
|
|
this.Recalculate_PageDrawing();
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
CDrawingDocContent.prototype.ClearParagraphFormatting = function(isClearParaPr, isClearTextPr)
|
|
{
|
|
if (true === this.ApplyToAll)
|
|
{
|
|
for (var Index = 0; Index < this.Content.length; Index++)
|
|
{
|
|
var Item = this.Content[Index];
|
|
Item.SetApplyToAll(true);
|
|
Item.ClearParagraphFormatting(isClearParaPr, isClearTextPr);
|
|
Item.SetApplyToAll(false);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
if (docpostype_DrawingObjects == this.CurPos.Type)
|
|
{
|
|
return this.LogicDocument.DrawingObjects.paragraphClearFormatting(isClearParaPr, isClearTextPr);
|
|
}
|
|
else //if ( docpostype_Content === this.CurPos.Type )
|
|
{
|
|
if (true === this.Selection.Use)
|
|
{
|
|
if (selectionflag_Common === this.Selection.Flag)
|
|
{
|
|
var StartPos = this.Selection.StartPos;
|
|
var EndPos = this.Selection.EndPos;
|
|
if (StartPos > EndPos)
|
|
{
|
|
var Temp = StartPos;
|
|
StartPos = EndPos;
|
|
EndPos = Temp;
|
|
}
|
|
|
|
for (var Index = StartPos; Index <= EndPos; Index++)
|
|
{
|
|
var Item = this.Content[Index];
|
|
Item.ClearParagraphFormatting(isClearParaPr, isClearTextPr);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
var Item = this.Content[this.CurPos.ContentPos];
|
|
Item.ClearParagraphFormatting(isClearParaPr, isClearTextPr);
|
|
}
|
|
}
|
|
};
|
|
CDrawingDocContent.prototype.Is_Empty = function(bDefault)
|
|
{
|
|
if (!bDefault) {
|
|
if (this.isDocumentContentInSmartArtShape()) {
|
|
var oShape = this.Parent.parent;
|
|
var contentPoints = oShape.getSmartArtPointContent();
|
|
if (contentPoints && contentPoints.length !== 0) {
|
|
var isPhldr = contentPoints.every(function (node) {
|
|
const point = node.point;
|
|
return point && point.prSet && point.prSet.phldr;
|
|
});
|
|
if (isPhldr) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return CDocumentContent.prototype.Is_Empty.call(this);
|
|
};
|
|
CDrawingDocContent.prototype.Shift = function(pageIndex, dx, dy, keepClip) {
|
|
if (!this.IsRecalculated() || pageIndex !== 0)
|
|
return;
|
|
|
|
this.Pages[0].Shift(dx, dy);
|
|
|
|
if (this.ClipInfo[0] && true !== keepClip)
|
|
this.ClipInfo[0].shift(dx, dy);
|
|
|
|
if (this.GetColumnCount() > 1) {
|
|
let pageSection = this.Pages[0].Sections[0];
|
|
if (!pageSection)
|
|
return;
|
|
|
|
for (let columnIndex = 0, columnCount = pageSection.Columns.length; columnIndex < columnCount; ++columnIndex) {
|
|
let pageColumn = pageSection.Columns[columnIndex];
|
|
|
|
let startPos = pageColumn.Pos;
|
|
let endPos = pageColumn.EndPos;
|
|
for (let pos = startPos; pos <= endPos; ++pos) {
|
|
let element = this.Content[pos];
|
|
let elementPageIndex = element.GetElementPageIndex(0, columnIndex, columnCount);
|
|
element.Shift(elementPageIndex, dx, dy);
|
|
}
|
|
}
|
|
} else {
|
|
let startPos = this.Pages[pageIndex].Pos;
|
|
let endPos = this.Pages[pageIndex].EndPos;
|
|
for (let pos = startPos; pos <= endPos; ++pos) {
|
|
let element = this.Content[pos];
|
|
let elementPageIndex = element.GetElementPageIndex(0, 0, 1);
|
|
element.Shift(elementPageIndex, dx, dy);
|
|
}
|
|
}
|
|
};
|
|
|
|
CDrawingDocContent.prototype.isDocumentContentInSmartArtShape = function () {
|
|
return this.Parent && this.Parent.parent && this.Parent.parent.isObjectInSmartArt && this.Parent.parent.isObjectInSmartArt();
|
|
};
|
|
|
|
CDrawingDocContent.prototype.RecalcAllFields = function() {
|
|
const aFields = this.AllFields;
|
|
for(let nField = 0; nField < aFields.length; ++nField)
|
|
{
|
|
let oField = aFields[nField];
|
|
oField.RecalcMeasure();
|
|
oField.Refresh_RecalcData2();
|
|
}
|
|
};
|
|
|
|
CDrawingDocContent.prototype.getDrawingDocument = function() {
|
|
if(this.Parent && this.Parent.getDrawingDocument) {
|
|
return this.Parent.getDrawingDocument();
|
|
}
|
|
return null;
|
|
};
|
|
CDrawingDocContent.prototype.GetLogicDocument = function() {
|
|
if(Asc.editor.private_GetLogicDocument)
|
|
return Asc.editor.private_GetLogicDocument();
|
|
return null;
|
|
};
|
|
CDrawingDocContent.prototype.Remove = function (Count, bOnlyText, bRemoveOnlySelection, bOnTextAdd, isWord) {
|
|
const res = CDocumentContent.prototype.Remove.call(this, Count, bOnlyText, bRemoveOnlySelection, bOnTextAdd, isWord);
|
|
const oShape = this.Is_DrawingShape(true);
|
|
if (oShape) {
|
|
oShape.onRemoveContent();
|
|
}
|
|
return res;
|
|
}
|
|
CDrawingDocContent.prototype.getCharContentLength = function () {
|
|
let nContentLength = 0;
|
|
this.CheckRunContent(function (oRun) {
|
|
nContentLength += oRun.Content.length;
|
|
});
|
|
return nContentLength;
|
|
};
|
|
// TODO: сделать по-нормальному!!!
|
|
function CDocument_prototype_private_GetElementPageIndexByXY(ElementPos, X, Y, PageIndex)
|
|
{
|
|
var Element = this.Content[ElementPos];
|
|
if (!Element)
|
|
return 0;
|
|
|
|
var Page = this.Pages[PageIndex];
|
|
if (!Page)
|
|
return 0;
|
|
|
|
var PageSection = null;
|
|
for (var SectionIndex = 0, SectionsCount = Page.Sections.length; SectionIndex < SectionsCount; ++SectionIndex)
|
|
{
|
|
if (Page.Sections[SectionIndex].Pos <= ElementPos && ElementPos <= Page.Sections[SectionIndex].EndPos)
|
|
{
|
|
PageSection = Page.Sections[SectionIndex];
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!PageSection)
|
|
return 0;
|
|
|
|
var ElementStartPage = Element.GetRelativeStartPage();
|
|
var ElementStartColumn = Element.GetStartColumn();
|
|
var ElementPagesCount = Element.Get_PagesCount();
|
|
|
|
var ColumnsCount = PageSection.Columns.length;
|
|
var StartColumn = 0;
|
|
var EndColumn = ColumnsCount - 1;
|
|
|
|
if (PageIndex === ElementStartPage)
|
|
{
|
|
StartColumn = Element.GetStartColumn();
|
|
EndColumn = Math.min(ElementStartColumn + ElementPagesCount - 1, ColumnsCount - 1);
|
|
}
|
|
else
|
|
{
|
|
StartColumn = 0;
|
|
EndColumn = Math.min(ElementPagesCount - ElementStartColumn + (PageIndex - ElementStartPage) * ColumnsCount, ColumnsCount - 1);
|
|
}
|
|
|
|
// TODO: Разобраться с ситуацией, когда пустые колонки стоят не только в конце
|
|
while (true === PageSection.Columns[EndColumn].Empty && EndColumn > StartColumn)
|
|
EndColumn--;
|
|
|
|
var ResultColumn = EndColumn;
|
|
for (var ColumnIndex = StartColumn; ColumnIndex < EndColumn; ++ColumnIndex)
|
|
{
|
|
if (X < (PageSection.Columns[ColumnIndex].XLimit + PageSection.Columns[ColumnIndex + 1].X) / 2)
|
|
{
|
|
ResultColumn = ColumnIndex;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return this.private_GetElementPageIndex(ElementPos, PageIndex, ResultColumn, ColumnsCount);
|
|
}
|
|
|
|
function fReadParagraphs(reader) {
|
|
|
|
}
|
|
|
|
AscFormat.CDrawingDocContent = CDrawingDocContent;
|
|
})(window);
|