334 lines
9.7 KiB
JavaScript
334 lines
9.7 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";
|
|
|
|
// Import
|
|
var g_fontApplication = AscFonts.g_fontApplication;
|
|
|
|
var g_oTableId = AscCommon.g_oTableId;
|
|
var g_oTextMeasurer = AscCommon.g_oTextMeasurer;
|
|
var isRealObject = AscCommon.isRealObject;
|
|
var History = AscCommon.History;
|
|
|
|
var HitInLine = AscFormat.HitInLine;
|
|
var MOVE_DELTA = AscFormat.MOVE_DELTA;
|
|
|
|
var c_oAscRelativeFromH = Asc.c_oAscRelativeFromH;
|
|
var c_oAscRelativeFromV = Asc.c_oAscRelativeFromV;
|
|
var c_oAscSectionBreakType = Asc.c_oAscSectionBreakType;
|
|
|
|
|
|
var nbsp_charcode = 0x00A0;
|
|
|
|
var nbsp_string = String.fromCharCode(0x00A0);
|
|
var sp_string = String.fromCharCode(0x0032);
|
|
|
|
// Suitable Run content for the paragraph simple changes
|
|
var g_oSRCFPSC = [];
|
|
g_oSRCFPSC[para_Text] = 1;
|
|
g_oSRCFPSC[para_Space] = 1;
|
|
g_oSRCFPSC[para_End] = 1;
|
|
g_oSRCFPSC[para_Tab] = 1;
|
|
g_oSRCFPSC[para_Sym] = 1;
|
|
g_oSRCFPSC[para_PageCount] = 1;
|
|
g_oSRCFPSC[para_FieldChar] = 1;
|
|
g_oSRCFPSC[para_InstrText] = 1;
|
|
g_oSRCFPSC[para_Bookmark] = 1;
|
|
|
|
/**
|
|
* Класс представляющий символ(текст) нумерации параграфа
|
|
* @constructor
|
|
* @extends {AscWord.CRunElementBase}
|
|
*/
|
|
function ParaNumbering()
|
|
{
|
|
AscWord.CRunElementBase.call(this);
|
|
|
|
this.Item = null; // Элемент в ране, к которому привязана нумерация
|
|
this.Run = null; // Ран, к которому привязана нумерация
|
|
|
|
this.Line = 0;
|
|
this.Range = 0;
|
|
this.Page = 0;
|
|
|
|
this.Internal = {
|
|
FinalNumInfo : undefined,
|
|
FinalCalcValue : -1,
|
|
FinalNumId : null,
|
|
FinalNumLvl : -1,
|
|
|
|
SourceNumInfo : undefined,
|
|
SourceCalcValue : -1,
|
|
SourceNumId : null,
|
|
SourceNumLvl : -1,
|
|
SourceWidth : 0,
|
|
|
|
Reset : function()
|
|
{
|
|
this.FinalNumInfo = undefined;
|
|
this.FinalCalcValue = -1;
|
|
this.FinalNumId = null;
|
|
this.FinalNumLvl = -1;
|
|
|
|
this.SourceNumInfo = undefined;
|
|
this.SourceCalcValue = -1;
|
|
this.SourceNumId = null;
|
|
this.SourceNumLvl = -1;
|
|
this.SourceWidth = 0;
|
|
}
|
|
};
|
|
}
|
|
ParaNumbering.prototype = Object.create(AscWord.CRunElementBase.prototype);
|
|
ParaNumbering.prototype.constructor = ParaNumbering;
|
|
|
|
ParaNumbering.prototype.Type = para_Numbering;
|
|
ParaNumbering.prototype.Draw = function(X, Y, oContext, oNumbering, oTextPr, oTheme, oPrevNumTextPr, isRtl)
|
|
{
|
|
var _X = X;
|
|
if (this.Internal.SourceNumInfo)
|
|
{
|
|
oNumbering.Draw(this.Internal.SourceNumId,this.Internal.SourceNumLvl, _X, Y, oContext, this.Internal.SourceNumInfo, oPrevNumTextPr ? oPrevNumTextPr : oTextPr, oTheme, isRtl);
|
|
_X += this.Internal.SourceWidth;
|
|
}
|
|
|
|
if (this.Internal.FinalNumInfo)
|
|
{
|
|
oNumbering.Draw(this.Internal.FinalNumId,this.Internal.FinalNumLvl, _X, Y, oContext, this.Internal.FinalNumInfo, oTextPr, oTheme, isRtl);
|
|
}
|
|
};
|
|
ParaNumbering.prototype.Measure = function (oContext, oNumbering, oTextPr, oTheme, oFinalNumInfo, oFinalNumPr, oSourceNumInfo, oSourceNumPr)
|
|
{
|
|
this.Width = 0;
|
|
this.Height = 0;
|
|
this.WidthVisible = 0;
|
|
this.WidthNum = 0;
|
|
this.WidthSuff = 0;
|
|
|
|
this.Internal.Reset();
|
|
|
|
if (!oNumbering)
|
|
{
|
|
return {
|
|
Width : this.Width,
|
|
Height : this.Height,
|
|
WidthVisible : this.WidthVisible
|
|
}
|
|
}
|
|
|
|
var nWidth = 0, nAscent = 0;
|
|
if (oFinalNumInfo && oFinalNumPr && undefined !== oFinalNumInfo[oFinalNumPr.Lvl])
|
|
{
|
|
var oTemp = oNumbering.Measure(oFinalNumPr.NumId, oFinalNumPr.Lvl, oContext, oFinalNumInfo, oTextPr, oTheme);
|
|
|
|
this.Internal.FinalNumInfo = oFinalNumInfo;
|
|
this.Internal.FinalCalcValue = oFinalNumInfo[oFinalNumPr.Lvl];
|
|
this.Internal.FinalNumId = oFinalNumPr.NumId;
|
|
this.Internal.FinalNumLvl = oFinalNumPr.Lvl;
|
|
|
|
nWidth = oTemp.Width;
|
|
nAscent = oTemp.Ascent;
|
|
}
|
|
|
|
if (oSourceNumInfo && oSourceNumPr && undefined !== oSourceNumInfo[oSourceNumPr.Lvl])
|
|
{
|
|
var oTemp = oNumbering.Measure(oSourceNumPr.NumId, oSourceNumPr.Lvl, oContext, oSourceNumInfo, oTextPr, oTheme);
|
|
|
|
this.Internal.SourceNumInfo = oSourceNumInfo;
|
|
this.Internal.SourceCalcValue = oSourceNumInfo[oSourceNumPr.Lvl];
|
|
this.Internal.SourceNumId = oSourceNumPr.NumId;
|
|
this.Internal.SourceNumLvl = oSourceNumPr.Lvl;
|
|
this.Internal.SourceWidth = oTemp.Width;
|
|
nWidth += this.Internal.SourceWidth;
|
|
|
|
if (nAscent < oTemp.Ascent)
|
|
nAscent = oTemp.Ascent;
|
|
}
|
|
|
|
this.Width = nWidth;
|
|
this.WidthVisible = nWidth;
|
|
this.WidthNum = nWidth;
|
|
this.WidthSuff = 0;
|
|
this.Height = nAscent; // Это не вся высота, а только высота над BaseLine
|
|
};
|
|
ParaNumbering.prototype.checkRange = function(range, line)
|
|
{
|
|
return (this.Item
|
|
&& this.Run
|
|
&& range === this.Range
|
|
&& line === this.Line
|
|
);
|
|
};
|
|
ParaNumbering.prototype.CanAddNumbering = function()
|
|
{
|
|
return false;
|
|
};
|
|
ParaNumbering.prototype.Copy = function()
|
|
{
|
|
return new ParaNumbering();
|
|
};
|
|
ParaNumbering.prototype.Write_ToBinary = function(Writer)
|
|
{
|
|
// Long : Type
|
|
Writer.WriteLong(this.Type);
|
|
};
|
|
ParaNumbering.prototype.Read_FromBinary = function(Reader)
|
|
{
|
|
};
|
|
ParaNumbering.prototype.GetCalculatedValue = function()
|
|
{
|
|
return this.Internal.FinalCalcValue;
|
|
};
|
|
ParaNumbering.prototype.GetCalculatedNumInfo = function()
|
|
{
|
|
return this.Internal.FinalNumInfo;
|
|
};
|
|
ParaNumbering.prototype.GetCalculatedNumberingLvl = function()
|
|
{
|
|
return this.Internal.FinalNumLvl;
|
|
};
|
|
ParaNumbering.prototype.GetCalculatedNumId = function()
|
|
{
|
|
return this.Internal.FinalNumId;
|
|
};
|
|
/**
|
|
* Нужно ли отрисовывать исходную нумерацию
|
|
* @returns {boolean}
|
|
*/
|
|
ParaNumbering.prototype.havePrevNumbering = function()
|
|
{
|
|
return !!this.Internal.SourceNumInfo;
|
|
};
|
|
/**
|
|
* Нужно ли отрисовывать финальную нумерацию
|
|
* @returns {boolean}
|
|
*/
|
|
ParaNumbering.prototype.haveFinalNumbering = function()
|
|
{
|
|
return !!this.Internal.FinalNumInfo;
|
|
};
|
|
/**
|
|
* Получаем ширину исходной нумерации
|
|
* @returns {number}
|
|
*/
|
|
ParaNumbering.prototype.getPrevNumWidth = function()
|
|
{
|
|
return this.Internal.SourceWidth;
|
|
};
|
|
/**
|
|
* Get the full width of the numbering element (including prev and final numberings)
|
|
*/
|
|
ParaNumbering.prototype.getNumWidth = function()
|
|
{
|
|
return this.WidthNum;
|
|
};
|
|
/**
|
|
* Get the width of the suffix
|
|
*/
|
|
ParaNumbering.prototype.getSuffWidth = function()
|
|
{
|
|
return this.WidthSuff;
|
|
};
|
|
/**
|
|
* Get visible width of the current numbering element
|
|
* @return {number}
|
|
*/
|
|
ParaNumbering.prototype.getVisibleWidth = function()
|
|
{
|
|
return this.WidthVisible;
|
|
};
|
|
ParaNumbering.prototype.GetFontSlot = function(oTextPr)
|
|
{
|
|
return AscWord.fontslot_Unknown;
|
|
};
|
|
|
|
|
|
/**
|
|
* Класс представляющий символ нумерации у параграфа в презентациях
|
|
* @constructor
|
|
* @extends {AscWord.CRunElementBase}
|
|
*/
|
|
function ParaPresentationNumbering()
|
|
{
|
|
AscWord.CRunElementBase.call(this);
|
|
|
|
// Эти данные заполняются во время пересчета, перед вызовом Measure
|
|
this.Bullet = null;
|
|
this.BulletNum = null;
|
|
}
|
|
ParaPresentationNumbering.prototype = Object.create(AscWord.CRunElementBase.prototype);
|
|
ParaPresentationNumbering.prototype.constructor = ParaPresentationNumbering;
|
|
|
|
ParaPresentationNumbering.prototype.Type = para_PresentationNumbering;
|
|
ParaPresentationNumbering.prototype.Draw = function(X, Y, Context, PDSE)
|
|
{
|
|
this.Bullet.Draw(X, Y, Context, PDSE);
|
|
};
|
|
ParaPresentationNumbering.prototype.Measure = function (Context, FirstTextPr, Theme)
|
|
{
|
|
this.Width = 0;
|
|
this.Height = 0;
|
|
this.WidthVisible = 0;
|
|
|
|
var Temp = this.Bullet.Measure(Context, FirstTextPr, this.BulletNum, Theme);
|
|
|
|
this.Width = Temp.Width;
|
|
this.WidthVisible = Temp.Width;
|
|
};
|
|
ParaPresentationNumbering.prototype.CanAddNumbering = function()
|
|
{
|
|
return false;
|
|
};
|
|
ParaPresentationNumbering.prototype.Copy = function()
|
|
{
|
|
return new ParaPresentationNumbering();
|
|
};
|
|
ParaPresentationNumbering.prototype.Write_ToBinary = function(Writer)
|
|
{
|
|
// Long : Type
|
|
Writer.WriteLong(this.Type);
|
|
};
|
|
ParaPresentationNumbering.prototype.Read_FromBinary = function(Reader)
|
|
{
|
|
};
|
|
ParaPresentationNumbering.prototype.checkRange = function(Range, Line)
|
|
{
|
|
if (null !== this.Item && null !== this.Run && Range === this.Range && Line === this.Line)
|
|
return true;
|
|
|
|
return false;
|
|
};
|
|
ParaPresentationNumbering.prototype.getVisibleWidth = function()
|
|
{
|
|
return this.WidthVisible;
|
|
};
|