Files
Yajbir Singh f1b860b25c
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

1328 lines
51 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
*
*/
(function (window)
{
const asc_PreviewBulletType = {
text: 0,
char: 1,
image: 2,
number: 3,
multiLevel: 4
}
window["Asc"].asc_PreviewBulletType = window["Asc"]["asc_PreviewBulletType"] = asc_PreviewBulletType;
asc_PreviewBulletType["text"] = asc_PreviewBulletType.text;
asc_PreviewBulletType["char"] = asc_PreviewBulletType.char;
asc_PreviewBulletType["image"] = asc_PreviewBulletType.image;
asc_PreviewBulletType["number"] = asc_PreviewBulletType.number;
asc_PreviewBulletType["multiLevel"] = asc_PreviewBulletType.multiLevel;
function CBulletPreviewDrawerBase()
{
this.m_arrNumberingLvl = [];
this.m_oApi = editor || Asc.editor || window["Asc"]["editor"];
this.m_oLogicDocument = this.m_oApi.WordControl && this.m_oApi.WordControl.m_oLogicDocument;
this.m_oDrawingDocument = this.m_oLogicDocument && this.m_oLogicDocument.DrawingDocument;
this.m_oLang = this.m_oApi.asc_GetPossibleNumberingLanguage();
this.m_oCurrentPara = null;
this.m_oPrimaryTextColor = new AscCommonWord.CDocumentColor(0, 0, 0);
// для словесного текста используем цвет контрастнее
this.m_oSecondaryTextColor = new AscCommonWord.CDocumentColor(121, 121, 121);
this.m_oSecondaryLineTextColor = new AscCommonWord.CDocumentColor(203, 203, 203);
this.m_oBackgroundColor = new AscCommonWord.CDocumentColor(255, 255, 255);
this.m_nAmountOfLvls = 9;
this.m_bIsMobile = AscCommon.AscBrowser.isMobile;
}
CBulletPreviewDrawerBase.prototype.cleanTextPr = function (oTextPr)
{
oTextPr.VertAlign = undefined;
oTextPr.RStyle = undefined;
oTextPr.Position = undefined; // Смещение по Y
oTextPr.BoldCS = undefined;
oTextPr.ItalicCS = undefined;
oTextPr.FontSizeCS = undefined;
oTextPr.CS = undefined;
oTextPr.RTL = undefined;
oTextPr.FontRef = undefined;
oTextPr.Shd = undefined;
oTextPr.Vanish = undefined;
oTextPr.Ligatures = undefined;
oTextPr.TextOutline = undefined;
oTextPr.TextFill = undefined;
oTextPr.PrChange = undefined;
oTextPr.ReviewInfo = undefined;
};
CBulletPreviewDrawerBase.prototype.drawImageBulletsWithLine = function (oImageInfo, nX, nY, nLineHeight, oGraphics, oStyleTextOptions, oTextPr) {
const oImage = oImageInfo.image;
if (oImage)
{
const sFullImageSrc = oImage.src;
const oSizes = AscCommon.getSourceImageSize(sFullImageSrc);
const nImageHeight = oSizes.height;
const nImageWidth = oSizes.width;
const nAdaptImageHeight = nLineHeight;
const nAdaptImageWidth = (nImageWidth * nAdaptImageHeight / (nImageHeight ? nImageHeight : 1));
for (let i = 0; i < oImageInfo.amount; i += 1)
{
this.cleanParagraphField(oGraphics, nX * AscCommon.g_dKoef_pix_to_mm, (nY - nLineHeight) * AscCommon.g_dKoef_pix_to_mm, (nAdaptImageWidth + 2) * AscCommon.g_dKoef_pix_to_mm, (nLineHeight + (nLineHeight >> 1)) * AscCommon.g_dKoef_pix_to_mm);
oGraphics.drawImage(sFullImageSrc, nX * AscCommon.g_dKoef_pix_to_mm, (nY - nAdaptImageHeight * (0.85)) * AscCommon.g_dKoef_pix_to_mm, nAdaptImageWidth * AscCommon.g_dKoef_pix_to_mm, nAdaptImageHeight * AscCommon.g_dKoef_pix_to_mm);
nX += nAdaptImageWidth;
}
this.drawStyleText(oGraphics, oStyleTextOptions, nX, nY, nLineHeight, oTextPr);
}
};
CBulletPreviewDrawerBase.prototype.getFirstLineIndent = function (oLvl, nCustomNumberPosition, nCustomIndentSize, nCustomStopTab)
{
const nSuff = oLvl.GetSuff();
const nNumberPosition = (AscFormat.isRealNumber(nCustomNumberPosition) ? nCustomNumberPosition : oLvl.GetNumberPosition()) || 0;
let nXPositionOfLine;
if (nSuff === Asc.c_oAscNumberingSuff.Tab)
{
const nStopTab = AscFormat.isRealNumber(nCustomStopTab) || nCustomStopTab === null ? nCustomStopTab : oLvl.GetStopTab();
const nIndentSize = (AscFormat.isRealNumber(nCustomIndentSize) ? nCustomIndentSize : oLvl.GetIndentSize()) || 0;
if (AscFormat.isRealNumber(nStopTab))
{
nXPositionOfLine = Math.max(nStopTab, nNumberPosition);
}
else
{
nXPositionOfLine = Math.max(nNumberPosition, nIndentSize);
}
}
else
{
nXPositionOfLine = nNumberPosition;
}
return nXPositionOfLine;
}
CBulletPreviewDrawerBase.prototype.isRtl = function()
{
if (!this.m_oCurrentPara)
this.m_oCurrentPara = this.m_oLogicDocument ? this.m_oLogicDocument.GetCurrentParagraph(true) : null;
return this.m_oCurrentPara ? this.m_oCurrentPara.isRtlDirection() : false;
};
CBulletPreviewDrawerBase.prototype.getFontSizeByLineHeight = function (nLineHeight)
{
return ((2 * nLineHeight * AscCommonExcel.sizePxinPt) >> 0) / 2;
};
CBulletPreviewDrawerBase.prototype.getLvlTextWidth = function (sText, oTextPr)
{
const oParagraph = this.getParagraphWithText(sText, oTextPr);
oParagraph.Reset(0, 0, 1000, 1000, 0, 0, 1);
oParagraph.Recalculate_Page(0);
oParagraph.LineNumbersInfo = null;
return oParagraph.Lines[0].Ranges[0].W * AscCommon.g_dKoef_mm_to_pix;
};
CBulletPreviewDrawerBase.prototype.getHeadingTextInformation = function (oLvl, nTextXPosition, nTextYPosition, oColor)
{
if (!this.m_oLogicDocument) return null;
const oStyles = this.m_oLogicDocument.Get_Styles();
const oStyle = oStyles.Get(oLvl.GetPStyle());
if (oStyle)
{
const sName = oStyle.Get_Name();
const sParagraphText = " " + AscCommon.translateManager.getValue(sName);
return {addingText: sParagraphText, startPositionX: nTextXPosition, startPositionY: nTextYPosition, color: oColor.Copy()};
}
return null;
};
CBulletPreviewDrawerBase.prototype.convertAscToNumberingLvl = function (arrAscLvl)
{
const arrResult = [];
for (let i = 0; i < arrAscLvl.length; i += 1)
{
let oLvl;
if (arrAscLvl[i] instanceof Asc.CAscNumberingLvl)
{
oLvl = new AscCommonWord.CNumberingLvl();
oLvl.FillFromAscNumberingLvl(arrAscLvl[i]);
}
else
{
oLvl = arrAscLvl[i].Copy();
}
arrResult.push(oLvl);
}
return arrResult;
}
CBulletPreviewDrawerBase.prototype.getCanvas = function (sDivId)
{
if (!sDivId) return;
const oDivElement = document.getElementById(sDivId);
const nWidth_px = oDivElement.clientWidth;
const nHeight_px = oDivElement.clientHeight;
let oCanvas = oDivElement.firstChild;
if (!oCanvas)
{
oCanvas = document.createElement('canvas');
oCanvas.style.cssText = "padding:0;margin:0;user-select:none;width:100%;height:100%;";
if (nWidth_px > 0 && nHeight_px > 0)
{
oDivElement.appendChild(oCanvas);
}
}
oCanvas.width = AscCommon.AscBrowser.convertToRetinaValue(nWidth_px, true);
oCanvas.height = AscCommon.AscBrowser.convertToRetinaValue(nHeight_px, true);
return oCanvas;
}
CBulletPreviewDrawerBase.prototype.getGraphics = function (oCanvas)
{
if (!oCanvas) return;
const nHeight_px = oCanvas.clientHeight;
const nWidth_px = oCanvas.clientWidth;
const nRetinaWidth = oCanvas.width;
const nRetinaHeight = oCanvas.height;
const oContext = oCanvas.getContext("2d");
const oGraphics = new AscCommon.CGraphics();
oGraphics.init(oContext,
nRetinaWidth,
nRetinaHeight,
nWidth_px * AscCommon.g_dKoef_pix_to_mm,
nHeight_px * AscCommon.g_dKoef_pix_to_mm);
oGraphics.m_oFontManager = AscCommon.g_fontManager;
oGraphics.SetIntegerGrid(true);
oGraphics.transform(1, 0, 0, 1, 0, 0);
if (this.m_oApi && this.m_oApi.isDarkMode)
{
if(this.m_oApi.getEditorId() === AscCommon.c_oEditorId.Word)
{
oGraphics.setDarkMode();
}
}
oGraphics.b_color1(this.m_oBackgroundColor.r, this.m_oBackgroundColor.g, this.m_oBackgroundColor.b, 255);
oGraphics.rect(0, 0, nWidth_px * AscCommon.g_dKoef_pix_to_mm, nHeight_px * AscCommon.g_dKoef_pix_to_mm);
oGraphics.df();
return oGraphics;
};
CBulletPreviewDrawerBase.prototype.getParagraphWithText = function (sText, oTextPr)
{
const oShape = new AscFormat.CShape();
oShape.createTextBody();
const oParagraph = oShape.txBody.content.GetAllParagraphs()[0];
oParagraph.MoveCursorToStartPos();
oParagraph.Pr = new AscCommonWord.CParaPr();
const oParaRun = new AscCommonWord.ParaRun(oParagraph);
oParaRun.Set_Pr(oTextPr);
oParaRun.AddText(sText);
oParagraph.AddToContent(0, oParaRun);
if (this.isRtl())
oParagraph.SetParagraphBidi(true);
oParagraph.SetParagraphAlign(AscCommon.align_Left);
return oParagraph;
}
CBulletPreviewDrawerBase.prototype.drawTextWithLvlInformation = function(sText, oLvl, nX, nY, nLineHeight, oGraphics, oParagraphTextOptions)
{
const oTextPr = oLvl.GetTextPr().Copy();
const nSuff = oLvl.GetSuff();
const nAlign = oLvl.GetJc();
oTextPr.FontSize = oTextPr.FontSizeCS = oTextPr.FontSize || this.getFontSizeByLineHeight(nLineHeight);
let oParagraph = this.getParagraphWithText(sText, oTextPr);
if (!oParagraph) return null;
oParagraph.Reset(0, 0, 1000, 1000, 0, 0, 1);
oParagraph.Recalculate_Page(0);
oParagraph.LineNumbersInfo = null;
const nNumberingTextWidth = oParagraph.Lines[0].Ranges[0].W * AscCommon.g_dKoef_mm_to_pix;
const nBaseLineOffset = oParagraph.Lines[0].Y;
const nYOffset = nY - ((nBaseLineOffset * AscCommon.g_dKoef_mm_to_pix) >> 0);
let nXOffset = nX;
let isRtl = this.isRtl();
if (isRtl)
{
if (nAlign === AscCommon.align_Left)
nXOffset -= nNumberingTextWidth;
else if (nAlign === AscCommon.align_Center)
nXOffset -= (nNumberingTextWidth >> 1);
}
else
{
if (nAlign === AscCommon.align_Right)
nXOffset -= nNumberingTextWidth;
else if (nAlign === AscCommon.align_Center)
nXOffset -= (nNumberingTextWidth >> 1);
}
let cleanX = nXOffset - 1;
let nBackTextWidth = 0;
if (nNumberingTextWidth !== 0)
{
nBackTextWidth = nNumberingTextWidth + 4; // 4 - чтобы линия никогда не была 'совсем рядом'
if (isRtl)
cleanX -= 4;
if (nSuff === Asc.c_oAscNumberingSuff.Space ||
nSuff === Asc.c_oAscNumberingSuff.None)
{
nBackTextWidth += 4;
if (isRtl)
cleanX -= 4;
}
}
this.cleanParagraphField(oGraphics, cleanX * AscCommon.g_dKoef_pix_to_mm, (nY - nLineHeight) * AscCommon.g_dKoef_pix_to_mm, (nBackTextWidth + 2) * AscCommon.g_dKoef_pix_to_mm, (nLineHeight + (nLineHeight >> 1)) * AscCommon.g_dKoef_pix_to_mm);
this.drawParagraph(oGraphics, oParagraph, nXOffset, nYOffset);
// рисуем текст вместо черты текста
this.drawStyleText(oGraphics, oParagraphTextOptions, isRtl ? nXOffset : nXOffset + nBackTextWidth, nY, nLineHeight, oTextPr);
};
CBulletPreviewDrawerBase.prototype.drawStyleText = function (oGraphics, oParagraphTextOptions, numberingXEnd, nY, nLineHeight, oNumberingTextPr)
{
if (!oParagraphTextOptions)
return;
const isRtl = this.isRtl();
const sParagraphText = oParagraphTextOptions.addingText;
const oHeadingTextPr = new AscCommonWord.CTextPr();
oHeadingTextPr.RFonts.SetAll("Arial");
oHeadingTextPr.FontSize = oHeadingTextPr.FontSizeCS = oNumberingTextPr.FontSize * 0.8;
oHeadingTextPr.Color = oParagraphTextOptions.color.Copy();
const oParagraph = this.getParagraphWithText(sParagraphText, oHeadingTextPr);
if (!oParagraph)
return;
oParagraph.Reset(0, 0, 1000, 1000, 0, 0, 1);
oParagraph.Recalculate_Page(0);
oParagraph.LineNumbersInfo = null;
const nParagraphTextWidth = oParagraph.getRange(0, 0).W * AscCommon.g_dKoef_mm_to_pix;
const nBaseLineOffset = oParagraph.Lines[0].Y;
const nYOffset = nY - ((nBaseLineOffset * AscCommon.g_dKoef_mm_to_pix) >> 0);
const nTextXOffset = isRtl ? Math.min(numberingXEnd, oParagraphTextOptions.startPositionX) - nParagraphTextWidth : Math.max(numberingXEnd, oParagraphTextOptions.startPositionX);
this.cleanParagraphField(oGraphics, nTextXOffset * AscCommon.g_dKoef_pix_to_mm, (nY - nLineHeight) * AscCommon.g_dKoef_pix_to_mm, (nParagraphTextWidth + 2) * AscCommon.g_dKoef_pix_to_mm, (nLineHeight + (nLineHeight >> 1)) * AscCommon.g_dKoef_pix_to_mm);
this.drawParagraph(oGraphics, oParagraph, nTextXOffset, nYOffset);
}
CBulletPreviewDrawerBase.prototype.cleanParagraphField = function (oGraphics, nX, nY, nWidth, nHeight)
{
oGraphics._s();
oGraphics.b_color1(this.m_oBackgroundColor.r, this.m_oBackgroundColor.g, this.m_oBackgroundColor.b, 255);
oGraphics.rect(nX, nY, nWidth, nHeight);
oGraphics.df();
oGraphics._e();
};
CBulletPreviewDrawerBase.prototype.drawParagraph = function (oGraphics, oParagraph, nXOffset, nYOffset)
{
const oApi = this.m_oApi;
oGraphics._s();
oGraphics.save();
oGraphics.SetIntegerGrid(true);
oGraphics.m_oCoordTransform.tx = AscCommon.AscBrowser.convertToRetinaValue(nXOffset, true);
oGraphics.m_oCoordTransform.ty = AscCommon.AscBrowser.convertToRetinaValue(nYOffset, true);
const bOldViewMode = oApi.isViewMode;
const bOldMarks = oApi.ShowParaMarks;
oApi.isViewMode = true;
oApi.ShowParaMarks = false;
oGraphics.transform(1, 0, 0, 1, 0, 0);
oParagraph.Draw(0, oGraphics);
oApi.isViewMode = bOldViewMode;
oApi.ShowParaMarks = bOldMarks;
oGraphics.m_oCoordTransform.tx = 0;
oGraphics.m_oCoordTransform.ty = 0;
oGraphics.transform(1, 0, 0, 1, 0, 0);
oGraphics.restore();
};
CBulletPreviewDrawerBase.prototype.checkEachLvl = function (callback)
{
for (let i = 0; i < this.m_arrNumberingLvl.length; i += 1)
{
if (Array.isArray(this.m_arrNumberingLvl[i]))
{
for (let j = 0; j < this.m_arrNumberingLvl[i].length; j += 1)
{
callback(this.m_arrNumberingLvl[i][j], j, this.m_arrNumberingLvl[i]);
}
}
else
{
callback(this.m_arrNumberingLvl[i], i, this.m_arrNumberingLvl);
}
}
};
CBulletPreviewDrawerBase.prototype.checkFonts = function (fCallback)
{
const oApi = this.m_oApi;
const oFontsDict = {};
const oThis = this;
this.checkEachLvl(function (oLvl) {
const sText = oLvl.GetSymbols();
if (sText)
{
AscFonts.FontPickerByCharacter.checkTextLight(sText);
}
const oTextPr = oLvl.GetTextPr();
oThis.cleanTextPr(oTextPr);
if (oTextPr && oTextPr.RFonts)
{
if (oTextPr.RFonts.Ascii) oFontsDict[oTextPr.RFonts.Ascii.Name] = true;
if (oTextPr.RFonts.EastAsia) oFontsDict[oTextPr.RFonts.EastAsia.Name] = true;
if (oTextPr.RFonts.HAnsi) oFontsDict[oTextPr.RFonts.HAnsi.Name] = true;
if (oTextPr.RFonts.CS) oFontsDict[oTextPr.RFonts.CS.Name] = true;
}
});
const arrFonts = [];
for (let sFamilyName in oFontsDict)
{
arrFonts.push(new AscFonts.CFont(AscFonts.g_fontApplication.GetFontInfoName(sFamilyName)));
}
AscFonts.FontPickerByCharacter.extendFonts(arrFonts);
if (false === AscCommon.g_font_loader.CheckFontsNeedLoading(arrFonts))
{
return fCallback();
}
const oLoader = new AscCommon.CGlobalFontLoader();
oLoader.put_Api(oApi);
oLoader.LoadDocumentFonts2(arrFonts, Asc.c_oAscAsyncActionType.Information, fCallback);
};
CBulletPreviewDrawerBase.prototype.draw = function () {};
CBulletPreviewDrawerBase.prototype.checkFontsAndDraw = function ()
{
const oThis = this;
this.checkFonts(function ()
{
if (oThis.m_oLogicDocument && oThis.m_oLogicDocument.IsDocumentEditor())
{
const bIsOldTrackRevisions = oThis.m_oLogicDocument.GetLocalTrackRevisions();
oThis.m_oLogicDocument.SetTrackRevisions(false);
oThis.draw();
oThis.m_oLogicDocument.SetTrackRevisions(bIsOldTrackRevisions);
}
else
{
oThis.draw();
}
});
};
function CBulletPreviewDrawer(arrLvlInfo, nType)
{
CBulletPreviewDrawerBase.call(this);
this.m_nType = nType;
this.m_nCountOfLines = 3;
this.m_oApi = editor || Asc.editor || window["Asc"]["editor"];
this.m_arrNumberingLvl = arrLvlInfo.map(function (oDrawingInfo) {return oDrawingInfo.arrLvls});
this.m_arrNumberingInfo = arrLvlInfo;
if (this.m_bIsMobile)
{
this.m_nSingleBulletNoneFontSizeCoefficient = 0.21;
this.m_nLvlWithLinesNoneFontSizeCoefficient = 0.21;
this.m_nSingleBulletFontSizeCoefficient = 6 / 17;
}
else
{
this.m_nSingleBulletFontSizeCoefficient = 0.6;
this.m_nSingleBulletNoneFontSizeCoefficient = 0.225;
this.m_nLvlWithLinesNoneFontSizeCoefficient = 0.1375;
}
this.m_nMultiLvlIndentCoefficient = 1 / AscCommon.AscBrowser.retinaPixelRatio;
}
CBulletPreviewDrawer.prototype = Object.create(CBulletPreviewDrawerBase.prototype);
CBulletPreviewDrawer.prototype.constructor = CBulletPreviewDrawer;
CBulletPreviewDrawer.prototype.drawSingleBullet = function (sDivId, arrLvls)
{
const oCanvas = this.getCanvas(sDivId);
if (!oCanvas) return;
const oGraphics = this.getGraphics(oCanvas);
const oLvl = arrLvls[0];
const nHeight_px = oCanvas.clientHeight;
const nWidth_px = oCanvas.clientWidth;
const drawingContent = oLvl.GetDrawingContent([oLvl], 0, undefined, this.m_oLang, false);
if (typeof drawingContent !== "string")
{
const oImage = drawingContent.image;
if (oImage)
{
const oFormatBullet = new AscFormat.CBullet();
oFormatBullet.fillBulletImage(oImage.src);
oFormatBullet.drawSquareImage(sDivId, 0.125);
}
}
else
{
const nMaxFontSize = nHeight_px * this.m_nSingleBulletFontSizeCoefficient;
// для буллетов решено не уменьшать их превью, как и в word
//const oFitInformation = this.getInformationWithFitFontSize(oLvl, nWidth_px * AscCommon.g_dKoef_pix_to_mm, nHeight_px * AscCommon.g_dKoef_pix_to_mm, nMaxFontSize, nMaxFontSize);
//const oFitTextPr = oFitInformation.textPr;
const oTextPr = oLvl.GetTextPr();
oTextPr.FontSize = oTextPr.FontSizeCS = nMaxFontSize;
oLvl.SetJc(AscCommon.align_Left);
const oCalculationPosition = this.getXYForCenterPosition(oLvl, nWidth_px, nHeight_px);
const nX = oCalculationPosition.nX;
const nY = oCalculationPosition.nY;
const nLineHeight = oCalculationPosition.nLineHeight;
const sText = drawingContent;
this.drawTextWithLvlInformation(sText, oLvl, nX, nY, nLineHeight, oGraphics);
}
};
CBulletPreviewDrawer.prototype.getInformationWithFitFontSize = function (oLvl, nMaxWidth, nMaxHeight, nMinFontSize, nMaxFontSize)
{
const sText = oLvl.GetDrawingContent([oLvl], 0, undefined, this.m_oLang, oLvl.IsLegalStyle());
if (typeof sText !== "string") return;
const oNewShape = new AscFormat.CShape();
oNewShape.createTextBody();
oNewShape.extX = nMaxWidth;
oNewShape.extY = nMaxHeight;
oNewShape.contentWidth = oNewShape.extX;
oNewShape.setPaddings({Left: 0, Top: 0, Right: 0, Bottom: 0});
const oParagraph = oNewShape.txBody.content.GetAllParagraphs()[0];
oParagraph.MoveCursorToStartPos();
oParagraph.Pr = new AscCommonWord.CParaPr();
const oParaRun = new AscCommonWord.ParaRun(oParagraph);
const oTextPr = oLvl.GetTextPr().Copy();
oParaRun.Set_Pr(oTextPr);
oParaRun.AddText(sText);
oParagraph.AddToContent(0, oParaRun);
oTextPr.FontSize = nMaxFontSize;
oParagraph.TextPr.SetFontSize(oTextPr.FontSize);
// TODO: add function after merge, add set new font size
let nParagraphWidth = oParagraph.RecalculateMinMaxContentWidth().Max;
if (nParagraphWidth > oNewShape.contentWidth) {
const nNewFontSize = oNewShape.findFitFontSize(nMinFontSize, nMaxFontSize, true);
if (nNewFontSize !== null)
{
oNewShape.setFontSizeInSmartArt(nNewFontSize);
}
}
return oTextPr;
};
CBulletPreviewDrawer.prototype.getWidthHeightGlyphs = function (sText, oTextPr)
{
AscCommon.g_oTextMeasurer.SetTextPr(oTextPr);
const oSumInformation = {Width: 0, rasterOffsetX: 0, Height: 0, Ascent: 0, rasterOffsetY: 0};
let bFirstGlyphSymbol = false;
let nRemoveRightOffset = 0;
for (const oIterator = sText.getUnicodeIterator(); oIterator.check(); oIterator.next())
{
const nValue = oIterator.value();
const nFontSlot = AscWord.GetFontSlotByTextPr(nValue, oTextPr);
AscCommon.g_oTextMeasurer.SetFontSlot(nFontSlot, 1);
const oInfo = AscCommon.g_oTextMeasurer.Measure2Code(nValue);
// в ворде крайние пробелы в превью буллетов прижимаются к глифу, а не к ширине символа
if (!bFirstGlyphSymbol)
{
if (oInfo.WidthG)
{
oSumInformation.rasterOffsetX = oInfo.rasterOffsetX;
const nWidthWithRightOffset = oInfo.Width - oInfo.rasterOffsetX;
oSumInformation.Width += nWidthWithRightOffset;
nRemoveRightOffset = nWidthWithRightOffset - oInfo.WidthG;
bFirstGlyphSymbol = true;
}
else
{
oSumInformation.Width += oInfo.Width;
}
}
else
{
oSumInformation.Width += oInfo.Width;
if (oInfo.WidthG)
{
nRemoveRightOffset = oInfo.Width - oInfo.rasterOffsetX - oInfo.WidthG;
}
}
if (oSumInformation.Ascent < oInfo.Ascent)
{
oSumInformation.Ascent = oInfo.Ascent;
}
if (oSumInformation.Ascent - oSumInformation.Height > oInfo.Ascent - oInfo.Height)
{
oSumInformation.rasterOffsetY = oInfo.rasterOffsetY;
oSumInformation.Height = oSumInformation.Ascent - (oInfo.Ascent - oInfo.Height);
}
}
oSumInformation.Width -= nRemoveRightOffset;
return oSumInformation;
};
CBulletPreviewDrawer.prototype.getXYForCenterPosition = function (oLvl, nWidth, nHeight)
{
// Здесь будем считать позицию отрисовки
const sText = oLvl.GetDrawingContent([oLvl], 0, undefined, this.m_oLang, oLvl.IsLegalStyle());
if (typeof sText !== 'string') return;
const oTextPr = oLvl.GetTextPr().Copy();
const oSumInformation = this.getWidthHeightGlyphs(sText, oTextPr);
const nX = (nWidth >> 1) - (this.isRtl() ? -1 : 1) * Math.round((oSumInformation.Width / 2 + oSumInformation.rasterOffsetX) * AscCommon.g_dKoef_mm_to_pix);
const nY = (nHeight >> 1) + Math.round((oSumInformation.Height / 2 + (oSumInformation.Ascent - oSumInformation.Height + oSumInformation.rasterOffsetY)) * AscCommon.g_dKoef_mm_to_pix);
return {nX: nX, nY: nY, nLineHeight: oSumInformation.Height};
};
CBulletPreviewDrawer.prototype.drawSingleLvlWithLines = function (sDivId, arrLvls)
{
const nCountOfLines = this.m_nCountOfLines;
const oCanvas = this.getCanvas(sDivId);
if (!oCanvas) return;
const oGraphics = this.getGraphics(oCanvas);
oGraphics.p_color(this.m_oSecondaryLineTextColor.r, this.m_oSecondaryLineTextColor.g, this.m_oSecondaryLineTextColor.b, 255);
const oLvl = arrLvls[0];
oLvl.SetJc(AscCommon.align_Left);
const oTextPr = oLvl.GetTextPr();
const nWidth_px = oCanvas.clientWidth;
const nHeight_px = oCanvas.clientHeight;
const oContext = oCanvas.getContext("2d");
oContext.beginPath();
const nOffsetBase = 4;
const nLineWidth = 2;
// считаем расстояние между линиями
const nLineDistance = Math.floor(((nHeight_px - (nOffsetBase << 2)) - nLineWidth * nCountOfLines) / nCountOfLines);
// убираем погрешность в offset
const nOffset = (nHeight_px - (nLineWidth * nCountOfLines + nLineDistance * nCountOfLines)) >> 1;
const nTextBaseOffsetX = nOffset + Math.floor(2.25 * AscCommon.g_dKoef_mm_to_pix);
const isRtl = this.isRtl();
let nY = nOffset + 11;
for (let j = 0; j < nCountOfLines; j += 1)
{
const nYmm = Math.round(nY) * AscCommon.g_dKoef_pix_to_mm;
const nTextBaseXmm = Math.round(nTextBaseOffsetX) * AscCommon.g_dKoef_pix_to_mm;
const nWidthmm = Math.round((nWidth_px - nOffsetBase)) * AscCommon.g_dKoef_pix_to_mm;
const nWidthLinemm = 2 * AscCommon.g_dKoef_pix_to_mm;
oGraphics.drawHorLine(AscCommon.c_oAscLineDrawingRule.Center, nYmm, isRtl ? nOffset * AscCommon.g_dKoef_pix_to_mm : nTextBaseXmm, nWidthmm, nWidthLinemm);
const nTextYx = isRtl ? nWidth_px - nTextBaseOffsetX + Math.floor(3.25 * AscCommon.g_dKoef_mm_to_pix) : nTextBaseOffsetX - Math.floor(3.25 * AscCommon.g_dKoef_mm_to_pix);
const nTextYy = nY + (nLineWidth * 2.5);
const nLineHeight = nLineDistance - 4;
oTextPr.FontSize = this.getFontSizeByLineHeight(nLineHeight);
const drawingContent = oLvl.GetDrawingContent([oLvl], 0, j + 1, this.m_oLang, oLvl.IsLegalStyle());
if (typeof drawingContent !== "string")
{
this.drawImageBulletsWithLine(drawingContent, nTextYx, nTextYy, nLineHeight, oGraphics);
}
else
{
this.drawTextWithLvlInformation(drawingContent, oLvl, nTextYx, nTextYy, nLineHeight, oGraphics);
}
nY += (nLineWidth + nLineDistance);
}
this.cleanParagraphField(oGraphics, (nWidth_px - nOffsetBase) * AscCommon.g_dKoef_pix_to_mm, 0, nWidth_px * AscCommon.g_dKoef_pix_to_mm, nHeight_px * AscCommon.g_dKoef_pix_to_mm);
};
CBulletPreviewDrawer.prototype.drawNoneTextPreview = function (sDivId, arrLvls, nFontSizeCoefficient)
{
const oCanvas = this.getCanvas(sDivId);
if (!oCanvas) return;
const oGraphics = this.getGraphics(oCanvas);
const oLvl = arrLvls[0];
const sText = oLvl.GetDrawingContent([oLvl], 0, undefined, this.m_oLang, false);
if (typeof sText !== 'string') return;
const nHeight_px = oCanvas.clientHeight;
const nWidth_px = oCanvas.clientWidth;
const nMaxFontSize = nWidth_px * nFontSizeCoefficient;
const oFitTextPr = this.getInformationWithFitFontSize(oLvl, nWidth_px * AscCommon.g_dKoef_pix_to_mm, nHeight_px * AscCommon.g_dKoef_pix_to_mm, 5, nMaxFontSize);
oLvl.SetTextPr(oFitTextPr);
const oCalculationPosition = this.getXYForCenterPosition(oLvl, nWidth_px, nHeight_px);
const nX = oCalculationPosition.nX;
const nY = oCalculationPosition.nY;
const nLineHeight = oCalculationPosition.nLineHeight;
this.drawTextWithLvlInformation(sText, oLvl, nX, nY, nLineHeight, oGraphics);
};
CBulletPreviewDrawer.prototype.getHeadingTextInformation = function (oLvl, nTextXPosition, nTextYPosition)
{
return CBulletPreviewDrawerBase.prototype.getHeadingTextInformation.call(this, oLvl, nTextXPosition, nTextYPosition, this.m_oSecondaryTextColor.Copy());
};
CBulletPreviewDrawer.prototype.getMultiLvlAddedOffsetX = function (arrLvls)
{
let nMinNumberPosition = arrLvls[0].GetNumberPosition();
let nMinTextIndent = arrLvls[0].GetIndentSize();
for (let i = 1; i < arrLvls.length; i += 1)
{
const oLvl = arrLvls[i];
const nCurrentNumberPosition = oLvl.GetNumberPosition();
const nCurrentIndentSize = oLvl.GetIndentSize();
if (nCurrentNumberPosition < nMinNumberPosition)
{
nMinNumberPosition = nCurrentNumberPosition;
}
if (nCurrentIndentSize < nMinTextIndent)
{
nMinTextIndent = nCurrentIndentSize;
}
}
return -Math.min(nMinTextIndent, nMinNumberPosition);
};
CBulletPreviewDrawer.prototype.drawMultiLevelBullet = function (sDivId, arrLvls)
{
const nCountOfLines = this.m_nCountOfLines;
const oCanvas = this.getCanvas(sDivId);
if (!oCanvas) return;
const oGraphics = this.getGraphics(oCanvas);
oGraphics.p_color(this.m_oSecondaryLineTextColor.r, this.m_oSecondaryLineTextColor.g, this.m_oSecondaryLineTextColor.b, 255);
const nHeight_px = oCanvas.clientHeight;
const nWidth_px = oCanvas.clientWidth;
const nOffsetBase = 4;
const nLineWidth = 2;
const nLineDistance = Math.floor(((nHeight_px - (nOffsetBase << 2)) - nLineWidth * nCountOfLines) / nCountOfLines);
const nLineHeight = nLineDistance - 4;
const nOffset = (nHeight_px - (nLineWidth * nCountOfLines + nLineDistance * nCountOfLines)) >> 1;
let nY = nOffset + 11;
const nCorrectAddedOffsetX = this.getMultiLvlAddedOffsetX(arrLvls);
const isRtl = this.isRtl();
for (let i = 0; i < nCountOfLines; i += 1)
{
const oLvl = arrLvls[i];
oLvl.SetJc(AscCommon.align_Left);
const oTextPr = oLvl.GetTextPr();
oTextPr.FontSize = this.getFontSizeByLineHeight(nLineHeight);
const nNumberPosition = oLvl.GetNumberPosition() + nCorrectAddedOffsetX;
const nFirstLineIndent = this.getFirstLineIndent(oLvl) + nCorrectAddedOffsetX;
//const nTextYx = nOffsetBase + nNumberPosition * this.m_nMultiLvlIndentCoefficient;
const nTextYy = nY + (nLineWidth * 2.5);
const horlineX = isRtl ? nOffsetBase : nOffsetBase + (nFirstLineIndent * this.m_nMultiLvlIndentCoefficient) << 0;
const horlineR = isRtl ? nWidth_px - (nOffsetBase + (nFirstLineIndent * this.m_nMultiLvlIndentCoefficient) << 0) : nWidth_px - nOffsetBase;
oGraphics.drawHorLine(AscCommon.c_oAscLineDrawingRule.Center, nY * AscCommon.g_dKoef_pix_to_mm, horlineX * AscCommon.g_dKoef_pix_to_mm, horlineR * AscCommon.g_dKoef_pix_to_mm, nLineWidth * AscCommon.g_dKoef_pix_to_mm);
const nTextYx = isRtl ? nWidth_px - nOffsetBase - nNumberPosition * this.m_nMultiLvlIndentCoefficient : nOffsetBase + nNumberPosition * this.m_nMultiLvlIndentCoefficient;
const drawingContent = oLvl.GetDrawingContent(arrLvls, i, 1, this.m_oLang, false);
const oParagraphTextOptions = this.getHeadingTextInformation(oLvl, isRtl ? horlineR : horlineX, nTextYy);
if (typeof drawingContent !== 'string')
{
this.drawImageBulletsWithLine(drawingContent, nTextYx, nTextYy, nLineHeight, oGraphics, oParagraphTextOptions, oTextPr);
}
else
{
this.drawTextWithLvlInformation(drawingContent, oLvl, nTextYx, nTextYy, nLineHeight, oGraphics, oParagraphTextOptions);
}
nY += (nLineWidth + nLineDistance);
}
this.cleanParagraphField(oGraphics, (nWidth_px - nOffsetBase) * AscCommon.g_dKoef_pix_to_mm, 0, nWidth_px * AscCommon.g_dKoef_pix_to_mm, nHeight_px * AscCommon.g_dKoef_pix_to_mm);
};
CBulletPreviewDrawer.prototype.draw = function ()
{
AscFormat.ExecuteNoHistory(function () {
for (let i = 0; i < this.m_arrNumberingInfo.length; i++)
{
const oDrawingInfo = this.m_arrNumberingInfo[i];
const sId = oDrawingInfo.divId;
const arrLvls = oDrawingInfo.arrLvls;
if (!arrLvls || !arrLvls.length)
continue;
if (this.m_nType === 0)
{
if (oDrawingInfo.isRemoving)
{
this.drawNoneTextPreview(sId, arrLvls, this.m_nSingleBulletNoneFontSizeCoefficient);
}
else
{
this.drawSingleBullet(sId, arrLvls);
}
}
else if (this.m_nType === 1)
{
if (oDrawingInfo.isRemoving)
{
this.drawNoneTextPreview(sId, arrLvls, this.m_nLvlWithLinesNoneFontSizeCoefficient);
}
else
{
this.drawSingleLvlWithLines(sId, arrLvls);
}
}
else if (this.m_nType === 2)
{
if (oDrawingInfo.isRemoving)
{
this.drawNoneTextPreview(sId, arrLvls, this.m_nLvlWithLinesNoneFontSizeCoefficient);
}
else
{
this.drawMultiLevelBullet(sId, arrLvls);
}
}
}
}, this, []);
};
function CBulletPreviewDrawerChangeList(arrId, arrAscLvl) {
CBulletPreviewDrawerBase.call(this);
this.m_arrNumberingLvl = this.convertAscToNumberingLvl(arrAscLvl.Lvl);
this.m_arrId = arrId;
}
CBulletPreviewDrawerChangeList.prototype = Object.create(CBulletPreviewDrawerBase.prototype);
CBulletPreviewDrawerChangeList.prototype.constructor = CBulletPreviewDrawerChangeList;
CBulletPreviewDrawerChangeList.prototype.getHeadingTextInformation = function (oLvl, nTextXPosition, nTextYPosition)
{
return CBulletPreviewDrawerBase.prototype.getHeadingTextInformation.call(this, oLvl, nTextXPosition, nTextYPosition, this.m_oSecondaryTextColor.Copy());
};
CBulletPreviewDrawerChangeList.prototype.getScaleCoefficientForMultiLevel = function (arrLvl, nWorkspaceWidth)
{
let nMaxNumberPosition = arrLvl[0].GetNumberPosition();
for (let i = 1; i < arrLvl.length; i += 1)
{
const oLvl = arrLvl[i];
const nNumberPosition = oLvl.GetNumberPosition();
if (nMaxNumberPosition < nNumberPosition)
{
nMaxNumberPosition = nNumberPosition;
}
}
const nNumberPositionScale = nWorkspaceWidth / (nMaxNumberPosition * AscCommon.g_dKoef_mm_to_pix);
const nThresholdScaleCoefficient = 0.3 / AscCommon.AscBrowser.retinaPixelRatio;
if (nNumberPositionScale < nThresholdScaleCoefficient)
{
return nNumberPositionScale;
}
return nThresholdScaleCoefficient;
};
CBulletPreviewDrawerChangeList.prototype.draw = function ()
{
AscFormat.ExecuteNoHistory(function ()
{
const nAmountOfPreview = Math.min(this.m_arrNumberingLvl.length, this.m_arrId.length);
const nOffsetBase = 5;
const nLineWidth = 2;
// посчитаем нужные переменные для одного canvas
let sDivId = this.m_arrId[0];
let oCanvas = this.getCanvas(sDivId);
const nHeight_px = oCanvas.clientHeight;
const nWidth_px = oCanvas.clientWidth;
const nY = (nHeight_px >> 1) - (nLineWidth >> 1);
const nLineHeight = (nHeight_px >> 1);
const nScaleCoefficient = this.getScaleCoefficientForMultiLevel(this.m_arrNumberingLvl, nWidth_px - nOffsetBase * 6);
const isRtl = this.isRtl();
for (let i = 0; i < nAmountOfPreview; ++i)
{
const oLvl = this.m_arrNumberingLvl[i];
oLvl.Jc = AscCommon.align_Left;
const drawingContent = oLvl.GetDrawingContent(this.m_arrNumberingLvl, i, 1, this.m_oLang, oLvl.IsLegalStyle());
sDivId = this.m_arrId[i];
oCanvas = this.getCanvas(sDivId);
if (!oCanvas) return;
const oGraphics = this.getGraphics(oCanvas);
oGraphics.p_color(this.m_oSecondaryLineTextColor.r, this.m_oSecondaryLineTextColor.g, this.m_oSecondaryLineTextColor.b, 255);
const oTextPr = oLvl.GetTextPr();
oTextPr.FontSize = oTextPr.FontSizeCS = this.getFontSizeByLineHeight(nLineHeight);
const nNumberPosition = oLvl.GetNumberPosition();
const nTextYx = isRtl ? nWidth_px - (nOffsetBase + nNumberPosition * AscCommon.g_dKoef_mm_to_pix * nScaleCoefficient): nOffsetBase + nNumberPosition * AscCommon.g_dKoef_mm_to_pix * nScaleCoefficient;
const nTextYy = nY + (nLineWidth << 1);
const horlineX = isRtl ? nOffsetBase : nOffsetBase + nNumberPosition * AscCommon.g_dKoef_mm_to_pix * nScaleCoefficient;
const horlineR = isRtl ? nWidth_px - (nOffsetBase + nNumberPosition * AscCommon.g_dKoef_mm_to_pix * nScaleCoefficient) : nWidth_px - nOffsetBase;
oGraphics.drawHorLine(AscCommon.c_oAscLineDrawingRule.Center, nY * AscCommon.g_dKoef_pix_to_mm, horlineX * AscCommon.g_dKoef_pix_to_mm, horlineR * AscCommon.g_dKoef_pix_to_mm, nLineWidth * AscCommon.g_dKoef_pix_to_mm);
const oParagraphTextOptions = this.getHeadingTextInformation(oLvl, isRtl ? horlineR : horlineX, nTextYy);
if (typeof drawingContent === "string")
{
this.drawTextWithLvlInformation(drawingContent, oLvl, nTextYx, nTextYy, (nHeight_px >> 1), oGraphics, oParagraphTextOptions);
}
else
{
if (drawingContent.image)
{
this.drawImageBulletsWithLine(drawingContent, nTextYx, nTextYy, (nHeight_px >> 1), oGraphics, oParagraphTextOptions, oTextPr);
}
}
this.cleanParagraphField(oGraphics, (nWidth_px - nOffsetBase) * AscCommon.g_dKoef_pix_to_mm, 0, nWidth_px * AscCommon.g_dKoef_pix_to_mm, nHeight_px * AscCommon.g_dKoef_pix_to_mm);
}
}, this, []);
};
function CBulletPreviewDrawerAdvancedOptions(sDivId, props, nLvl, bIsMultiLvlAdvanceOptions)
{
CBulletPreviewDrawerBase.call(this);
this.m_sId = sDivId;
this.m_arrNumberingLvl = this.convertAscToNumberingLvl(props.Lvl);
this.m_nCurrentLvl = nLvl;
this.m_bIsMultiLvl = bIsMultiLvlAdvanceOptions;
this.m_oCanvas = this.getCanvas(this.m_sId);
this.m_oGraphics = this.getGraphics(this.m_oCanvas);
this.m_nScaleIndentsCoefficient = 0.55;
this.m_arrCalcNumberingInfo = null;
this.m_nCalcNumberingLvl = -1;
this.initNumberingInfo();
}
CBulletPreviewDrawerAdvancedOptions.prototype = Object.create(CBulletPreviewDrawerBase.prototype);
CBulletPreviewDrawerAdvancedOptions.prototype.constructor = CBulletPreviewDrawerAdvancedOptions;
CBulletPreviewDrawerAdvancedOptions.prototype.addControlMultiLvl = function ()
{
if (!this.m_bIsMultiLvl || !this.m_oCanvas) return;
const oThis = this;
AscCommon.addMouseEvent(this.m_oCanvas, "down", function(e) {
AscCommon.stopEvent(e);
const nOffsetBase = 10;
const nLineWidth = 4;
const nHeight = oThis.m_oCanvas.clientHeight;
const nLineDistance = Math.floor(((nHeight - (nOffsetBase << 1)) - nLineWidth * 10) / 9);
const nOffset = (nHeight - (nLineWidth * 10 + nLineDistance * 9)) >> 1;
const nCurrentLvl = oThis.m_nCurrentLvl;
let nYPos = e.pageY;
if (!AscFormat.isRealNumber(nYPos))
{
nYPos = e.clientY;
}
nYPos = (nYPos * AscCommon.AscBrowser.zoom);
const oClientRect = AscCommon.UI.getBoundingClientRect(this);
if (AscFormat.isRealNumber(oClientRect.y))
{
nYPos -= oClientRect.y;
}
else if (AscFormat.isRealNumber(oClientRect.top))
{
nYPos -= oClientRect.top;
}
let nChangedCurrentLvl = 8;
let nY = nOffset + 2;
for (let i = 0; i < oThis.m_arrNumberingLvl.length; i++)
{
nY += (nLineWidth + nLineDistance);
if (i === nCurrentLvl)
{
nY += (nLineWidth + nLineDistance);
}
if (nYPos < (nY - ((nLineWidth + nLineDistance) >> 1)))
{
nChangedCurrentLvl = i;
break;
}
}
oThis.m_oApi.sendEvent("asc_onPreviewLevelChange", nChangedCurrentLvl);
});
};
CBulletPreviewDrawerAdvancedOptions.prototype.getHeadingTextInformation = function (oLvl, nTextXPosition, nTextYPosition)
{
return CBulletPreviewDrawerBase.prototype.getHeadingTextInformation.call(this, oLvl, nTextXPosition, nTextYPosition, this.m_oPrimaryTextColor.Copy());
};
CBulletPreviewDrawerAdvancedOptions.prototype.getNumberingValue = function (nNumberIndex, nDrawingLvl, oLvl)
{
if (nDrawingLvl <= this.m_nCalcNumberingLvl && this.m_arrCalcNumberingInfo && AscFormat.isRealNumber(this.m_arrCalcNumberingInfo[nDrawingLvl]) && AscFormat.isRealNumber(this.m_nSourceStart))
{
const nCalcValue = this.m_arrCalcNumberingInfo[nDrawingLvl];
return nCalcValue - this.m_nSourceStart + nNumberIndex;
}
return nNumberIndex;
};
CBulletPreviewDrawerAdvancedOptions.prototype.drawMultiLvlAdvancedOptions = function ()
{
const oCanvas = this.m_oCanvas;
if (!oCanvas) return;
const oGraphics = this.m_oGraphics;
const nHeight_px = oCanvas.clientHeight;
const nWidth_px = oCanvas.clientWidth;
const nOffsetBase = 10;
const nLineWidth = 4;
// считаем расстояние между линиями
const nLineDistance = Math.floor(((nHeight_px - (nOffsetBase << 1)) - nLineWidth * 10) / 9);
// убираем погрешность в offset
const nOffset = (nHeight_px - (nLineWidth * 10 + nLineDistance * 9)) >> 1;
const nCurrentLvl = this.m_nCurrentLvl;
oGraphics.p_color(this.m_oSecondaryLineTextColor.r, this.m_oSecondaryLineTextColor.g, this.m_oSecondaryLineTextColor.b, 255);
const isRtl = this.isRtl();
let nY = nOffset + 2;
for (let i = 0; i < this.m_arrNumberingLvl.length; i += 1)
{
const oLvl = this.m_arrNumberingLvl[i];
const oTextPr = oLvl.GetTextPr();
oTextPr.FontSize = this.getFontSizeByLineHeight(nLineDistance);
const nNumberPosition = oLvl.GetNumberPosition();
let nTextYx = (nOffsetBase + nNumberPosition * AscCommon.g_dKoef_mm_to_pix * this.m_nScaleIndentsCoefficient) >> 0;
const nIndentSize = (nOffsetBase + oLvl.GetIndentSize() * AscCommon.g_dKoef_mm_to_pix * this.m_nScaleIndentsCoefficient) >> 0;
const nTextYy = nY + nLineWidth;
const nOffsetText = nOffsetBase + (this.getFirstLineIndent(oLvl) * AscCommon.g_dKoef_mm_to_pix * this.m_nScaleIndentsCoefficient) >> 0;
if (isRtl)
nTextYx = nWidth_px - nTextYx;
const posX0 = isRtl ? nOffsetBase : nOffsetText;
const posR0 = isRtl ? nWidth_px - nOffsetText : nWidth_px - nOffsetBase;
const posX1 = isRtl ? nOffsetBase : nIndentSize;
const posR1 = isRtl ? nWidth_px - nIndentSize : nWidth_px - nOffsetBase;
if (i === nCurrentLvl)
{
oGraphics.p_color(this.m_oPrimaryTextColor.r, this.m_oPrimaryTextColor.g, this.m_oPrimaryTextColor.b, 255);
oGraphics.drawHorLine(AscCommon.c_oAscLineDrawingRule.Center, nY * AscCommon.g_dKoef_pix_to_mm, posX0 * AscCommon.g_dKoef_pix_to_mm, posR0 * AscCommon.g_dKoef_pix_to_mm, nLineWidth * AscCommon.g_dKoef_pix_to_mm);
nY += (nLineWidth + nLineDistance);
oGraphics.drawHorLine(AscCommon.c_oAscLineDrawingRule.Center, nY * AscCommon.g_dKoef_pix_to_mm, posX1 * AscCommon.g_dKoef_pix_to_mm, posR1 * AscCommon.g_dKoef_pix_to_mm, nLineWidth * AscCommon.g_dKoef_pix_to_mm);
oGraphics.p_color(this.m_oSecondaryLineTextColor.r, this.m_oSecondaryLineTextColor.g, this.m_oSecondaryLineTextColor.b, 255);
}
else
{
oGraphics.drawHorLine(AscCommon.c_oAscLineDrawingRule.Center, nY * AscCommon.g_dKoef_pix_to_mm, posX0 * AscCommon.g_dKoef_pix_to_mm, posR0 * AscCommon.g_dKoef_pix_to_mm, nLineWidth * AscCommon.g_dKoef_pix_to_mm);
}
const oParagraphTextOptions = this.getHeadingTextInformation(oLvl, nOffsetText, nTextYy);
let nNumberIndex = this.getNumberingValue(1, i, oLvl);
const drawingContent = oLvl.GetDrawingContent(this.m_arrNumberingLvl, i, nNumberIndex, this.m_oLang, oLvl.IsLegalStyle());
if (typeof drawingContent === "string")
{
this.drawTextWithLvlInformation(drawingContent, oLvl, nTextYx, nTextYy, nLineDistance, oGraphics, oParagraphTextOptions);
}
else
{
if (drawingContent.image)
{
this.drawImageBulletsWithLine(drawingContent, nTextYx, nTextYy, nLineDistance, oGraphics, oParagraphTextOptions, oTextPr);
}
}
nY += (nLineWidth + nLineDistance);
}
if (isRtl)
this.cleanParagraphField(oGraphics, 0, 0, (nOffsetBase - 1) * AscCommon.g_dKoef_pix_to_mm, nHeight_px * AscCommon.g_dKoef_pix_to_mm);
else
this.cleanParagraphField(oGraphics, (nWidth_px - nOffsetBase + 1) * AscCommon.g_dKoef_pix_to_mm, 0, nOffsetBase * AscCommon.g_dKoef_pix_to_mm, nHeight_px * AscCommon.g_dKoef_pix_to_mm);
};
CBulletPreviewDrawerAdvancedOptions.prototype.getScaleCoefficientForSingleLevel = function (nWorkspaceWidth)
{
const nCurrentLvl = this.m_nCurrentLvl;
const oCurrentLvl = this.m_arrNumberingLvl[nCurrentLvl];
const nNumberPosition = Math.round(oCurrentLvl.GetNumberPosition() * AscCommon.g_dKoef_mm_to_pix);
const nIndentSize = Math.round(oCurrentLvl.GetIndentSize() * AscCommon.g_dKoef_mm_to_pix);
const nTabSize = Math.round(oCurrentLvl.GetStopTab() * AscCommon.g_dKoef_mm_to_pix);
const nNumberPositionScaleCoefficient = nWorkspaceWidth / nNumberPosition;
const nIndentSizeScaleCoefficient = nWorkspaceWidth / nIndentSize;
const nTabSizeScaleCoefficient = nWorkspaceWidth / nTabSize;
const nScaleCoefficient = Math.min(nNumberPositionScaleCoefficient, nIndentSizeScaleCoefficient, nTabSizeScaleCoefficient);
if (nScaleCoefficient < 1)
{
return nScaleCoefficient;
}
return 1;
};
CBulletPreviewDrawerAdvancedOptions.prototype.initNumberingInfo = function ()
{
const oParagraph = this.m_oLogicDocument.GetCurrentParagraph(true);
if (!oParagraph)
return;
const oNumbering = oParagraph.Numbering;
if (oNumbering)
{
this.m_arrCalcNumberingInfo = oNumbering.GetCalculatedNumInfo();
this.m_nCalcNumberingLvl = oNumbering.GetCalculatedNumberingLvl();
const oNum = this.m_oLogicDocument.GetNumbering().GetNum(oNumbering.GetCalculatedNumId());
if (oNum)
{
const oLvl = oNum.GetLvl(this.m_nCalcNumberingLvl);
this.m_nSourceStart = oLvl ? oLvl.GetStart() : null;
}
}
};
CBulletPreviewDrawerAdvancedOptions.prototype.drawSingleLvlAdvancedOptions = function ()
{
const oCanvas = this.m_oCanvas;
if (!oCanvas) return;
const oGraphics = this.m_oGraphics;
const nHeight_px = oCanvas.clientHeight;
const nWidth_px = oCanvas.clientWidth;
const isRtl = this.isRtl();
const nOffsetBase = 10;
const nLineWidth = 4;
const nCurrentLvl = this.m_nCurrentLvl;
const oCurrentLvl = this.m_arrNumberingLvl[nCurrentLvl];
const oTextPr = oCurrentLvl.GetTextPr();
const nLineDistance = (((nHeight_px - (nOffsetBase << 1)) - nLineWidth * 10) / 9) << 0;
oTextPr.FontSize = oTextPr.FontSizeCS = this.getFontSizeByLineHeight(nLineDistance);
let nMaxTextWidth = 0;
for (let i = 0; i < 3; i += 1)
{
const drawingContent = oCurrentLvl.GetDrawingContent(this.m_arrNumberingLvl, nCurrentLvl, i + 1, this.m_oLang, oCurrentLvl.IsLegalStyle());
if (typeof drawingContent === 'string')
{
const nTextWidth = this.getLvlTextWidth(drawingContent, oTextPr);
if (nMaxTextWidth < nTextWidth)
{
nMaxTextWidth = nTextWidth;
}
}
else
{
if (drawingContent.image)
{
const sFullImageSrc = drawingContent.image.src;
const oSizes = AscCommon.getSourceImageSize(sFullImageSrc);
const nImageHeight = oSizes.height;
const nImageWidth = oSizes.width;
nMaxTextWidth = (nImageWidth * nLineDistance / (nImageHeight ? nImageHeight : 1)) * drawingContent.amount;
break;
}
}
}
nMaxTextWidth = nMaxTextWidth >> 0;
const nOffset = (nHeight_px - (nLineWidth * 10 + nLineDistance * 9)) >> 1;
oGraphics.p_color(this.m_oSecondaryLineTextColor.r, this.m_oSecondaryLineTextColor.g, this.m_oSecondaryLineTextColor.b, 255);
let nY = nOffset + 2 + 2 * (nLineWidth + nLineDistance);
const arrTextYy = [];
arrTextYy.push(nY + nLineWidth); nY += 2 * (nLineWidth + nLineDistance);
arrTextYy.push(nY + nLineWidth); nY += 2 * (nLineWidth + nLineDistance);
arrTextYy.push(nY + nLineWidth);
nY = nOffset + 2;
const nRightOffset = nWidth_px - nOffsetBase;
const nYDist = nLineWidth + nLineDistance;
const nLeftOffset2 = nOffsetBase;
const nRightOffset2 = nWidth_px - nOffsetBase;
// Здесь получаем коэффициент, чтобы при открытии всегда видеть отступ текста
const nScaleCoefficient = this.getScaleCoefficientForSingleLevel(nWidth_px - nOffsetBase * 5);
let nNumberPosition = nOffsetBase + ((oCurrentLvl.GetNumberPosition() * AscCommon.g_dKoef_mm_to_pix * nScaleCoefficient) << 0);
let nIndentSize = nOffsetBase + ((oCurrentLvl.GetIndentSize() * AscCommon.g_dKoef_mm_to_pix * nScaleCoefficient) << 0);
const nRawTabSize = oCurrentLvl.GetStopTab();
let nTabSize;
if (AscFormat.isRealNumber(nRawTabSize))
{
nTabSize = nOffsetBase + ((nRawTabSize * AscCommon.g_dKoef_mm_to_pix * nScaleCoefficient) << 0);
}
oGraphics.drawHorLine(AscCommon.c_oAscLineDrawingRule.Center, nY * AscCommon.g_dKoef_pix_to_mm, nLeftOffset2 * AscCommon.g_dKoef_pix_to_mm, nRightOffset2 * AscCommon.g_dKoef_pix_to_mm, nLineWidth * AscCommon.g_dKoef_pix_to_mm);
nY += nYDist;
oGraphics.drawHorLine(AscCommon.c_oAscLineDrawingRule.Center, nY * AscCommon.g_dKoef_pix_to_mm, nLeftOffset2 * AscCommon.g_dKoef_pix_to_mm, nRightOffset2 * AscCommon.g_dKoef_pix_to_mm, nLineWidth * AscCommon.g_dKoef_pix_to_mm);
nY += nYDist;
oGraphics.p_color(this.m_oPrimaryTextColor.r, this.m_oPrimaryTextColor.g, this.m_oPrimaryTextColor.b, 255);
let nTextYx = nNumberPosition;
let nOffsetTextX;
// если при прилегании к правому краю левый край текста упирается в оффсет, то линии текста должны двигаться вправо(это относится ко всем типам прилегания)
if ((nTextYx - nMaxTextWidth) < nLeftOffset2)
{
nTextYx = nLeftOffset2 + nMaxTextWidth;
nIndentSize += (nTextYx - nNumberPosition);
nIndentSize = nIndentSize >> 0;
nOffsetTextX = this.getFirstLineIndent(oCurrentLvl, nTextYx * AscCommon.g_dKoef_pix_to_mm, nIndentSize * AscCommon.g_dKoef_pix_to_mm, AscFormat.isRealNumber(nTabSize) ? (nTabSize + (nTextYx - nNumberPosition)) * AscCommon.g_dKoef_pix_to_mm : null);
const nCurrentAlign = oCurrentLvl.Jc;
oCurrentLvl.Jc = AscCommon.align_Left;
// считаем позицию отдельно, чтобы нумерация по горизонтали начиналась с одного и того же места
if (nCurrentAlign === AscCommon.align_Right)
{
nTextYx -= nMaxTextWidth;
}
else if (nCurrentAlign === AscCommon.align_Center)
{
nTextYx -= nMaxTextWidth >> 1;
}
}
else
{
nOffsetTextX = this.getFirstLineIndent(oCurrentLvl, nTextYx * AscCommon.g_dKoef_pix_to_mm, nIndentSize * AscCommon.g_dKoef_pix_to_mm, AscFormat.isRealNumber(nTabSize) ? nTabSize * AscCommon.g_dKoef_pix_to_mm : null);
}
if (isRtl)
nTextYx = nWidth_px - nTextYx;
const posX0 = isRtl ? nOffsetBase : nOffsetTextX * AscCommon.g_dKoef_mm_to_pix;
const posR0 = isRtl ? nWidth_px - nOffsetTextX * AscCommon.g_dKoef_mm_to_pix : nWidth_px - nOffsetBase;
const posX1 = isRtl ? nOffsetBase : nIndentSize;
const posR1 = isRtl ? nWidth_px - nIndentSize : nWidth_px - nOffsetBase;
for (let i = 0; i < 3; i += 1)
{
oGraphics.drawHorLine(AscCommon.c_oAscLineDrawingRule.Center, nY * AscCommon.g_dKoef_pix_to_mm, posX0 * AscCommon.g_dKoef_pix_to_mm, posR0 * AscCommon.g_dKoef_pix_to_mm, nLineWidth * AscCommon.g_dKoef_pix_to_mm);
nY += nYDist;
oGraphics.drawHorLine(AscCommon.c_oAscLineDrawingRule.Center, nY * AscCommon.g_dKoef_pix_to_mm, posX1 * AscCommon.g_dKoef_pix_to_mm, posR1 * AscCommon.g_dKoef_pix_to_mm, nLineWidth * AscCommon.g_dKoef_pix_to_mm);
nY += nYDist;
}
oGraphics.p_color(this.m_oSecondaryLineTextColor.r, this.m_oSecondaryLineTextColor.g, this.m_oSecondaryLineTextColor.b, 255);
oGraphics.drawHorLine(AscCommon.c_oAscLineDrawingRule.Center, nY * AscCommon.g_dKoef_pix_to_mm, nLeftOffset2 * AscCommon.g_dKoef_pix_to_mm, nRightOffset2 * AscCommon.g_dKoef_pix_to_mm, nLineWidth * AscCommon.g_dKoef_pix_to_mm);
nY += nYDist;
oGraphics.drawHorLine(AscCommon.c_oAscLineDrawingRule.Center, nY * AscCommon.g_dKoef_pix_to_mm, nLeftOffset2 * AscCommon.g_dKoef_pix_to_mm, nRightOffset2 * AscCommon.g_dKoef_pix_to_mm, nLineWidth * AscCommon.g_dKoef_pix_to_mm);
for (let i = 0; i < arrTextYy.length; i += 1)
{
const nNumberIndex = this.getNumberingValue(i + 1, nCurrentLvl, oCurrentLvl);
const drawingContent = oCurrentLvl.GetDrawingContent(this.m_arrNumberingLvl, nCurrentLvl, nNumberIndex, this.m_oLang, oCurrentLvl.IsLegalStyle());
const nTextYy = arrTextYy[i];
if (typeof drawingContent === "string")
{
this.drawTextWithLvlInformation(drawingContent, oCurrentLvl, nTextYx, nTextYy, nLineDistance, oGraphics);
}
else
{
if (drawingContent.image)
{
this.drawImageBulletsWithLine(drawingContent, nTextYx, nTextYy, nLineDistance, oGraphics);
}
}
}
if (isRtl)
this.cleanParagraphField(oGraphics, 0, 0, (nOffsetBase - 1) * AscCommon.g_dKoef_pix_to_mm, nHeight_px * AscCommon.g_dKoef_pix_to_mm);
else
this.cleanParagraphField(oGraphics, (nWidth_px - nOffsetBase + 1) * AscCommon.g_dKoef_pix_to_mm, 0, nOffsetBase * AscCommon.g_dKoef_pix_to_mm, nHeight_px * AscCommon.g_dKoef_pix_to_mm);
};
CBulletPreviewDrawerAdvancedOptions.prototype.draw = function ()
{
AscFormat.ExecuteNoHistory(function ()
{
if (this.m_bIsMultiLvl)
{
this.drawMultiLvlAdvancedOptions();
this.addControlMultiLvl();
}
else
{
this.drawSingleLvlAdvancedOptions();
}
}, this, []);
};
window["AscCommon"] = window["AscCommon"] || {};
window["AscCommon"].CBulletPreviewDrawer = window["AscCommon"]["CBulletPreviewDrawer"] = CBulletPreviewDrawer;
window["AscCommon"].CBulletPreviewDrawerChangeList = window["AscCommon"]["CBulletPreviewDrawerChangeList"] = CBulletPreviewDrawerChangeList;
window["AscCommon"].CBulletPreviewDrawerAdvancedOptions = window["AscCommon"]["CBulletPreviewDrawerAdvancedOptions"] = CBulletPreviewDrawerAdvancedOptions;
})(window);