823 lines
25 KiB
JavaScript
823 lines
25 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 History = AscCommon.History;
|
||
|
||
/**
|
||
*
|
||
* @param FieldType
|
||
* @param Arguments
|
||
* @param Switches
|
||
* @constructor
|
||
* @extends {CParagraphContentWithParagraphLikeContent}
|
||
*/
|
||
function ParaField(FieldType, Arguments, Switches)
|
||
{
|
||
CParagraphContentWithParagraphLikeContent.call(this);
|
||
|
||
this.Id = AscCommon.g_oIdCounter.Get_NewId();
|
||
|
||
this.Type = para_Field;
|
||
|
||
this.Istruction = null;
|
||
this.FieldType = (undefined === FieldType ? AscWord.fieldtype_UNKNOWN : FieldType);
|
||
this.Arguments = (undefined === Arguments ? [] : Arguments);
|
||
this.Switches = (undefined === Switches ? [] : Switches);
|
||
|
||
this.TemplateContent = this.Content;
|
||
|
||
this.Bounds = {};
|
||
|
||
this.FormFieldName = "";
|
||
this.FormFieldDefaultText = "";
|
||
|
||
// Добавляем данный класс в таблицу Id (обязательно в конце конструктора)
|
||
AscCommon.g_oTableId.Add( this, this.Id );
|
||
}
|
||
|
||
ParaField.prototype = Object.create(CParagraphContentWithParagraphLikeContent.prototype);
|
||
ParaField.prototype.constructor = ParaField;
|
||
|
||
ParaField.prototype.Get_Id = function()
|
||
{
|
||
return this.Id;
|
||
};
|
||
ParaField.prototype.Copy = function(Selected, oPr)
|
||
{
|
||
let newField = CParagraphContentWithParagraphLikeContent.prototype.Copy.apply(this, arguments);
|
||
|
||
if (oPr && oPr.SkipFldSimple)
|
||
{
|
||
let newItems = this.Content.slice();
|
||
this.RemoveAll();
|
||
return newItems;
|
||
}
|
||
else
|
||
{
|
||
// TODO: Сделать функциями с иторией
|
||
newField.FieldType = this.FieldType;
|
||
newField.Arguments = this.Arguments;
|
||
newField.Switches = this.Switches;
|
||
|
||
if (editor)
|
||
editor.WordControl.m_oLogicDocument.Register_Field(newField);
|
||
|
||
return newField;
|
||
}
|
||
};
|
||
ParaField.prototype.GetSelectedElementsInfo = function(Info, ContentPos, Depth)
|
||
{
|
||
Info.SetField(this);
|
||
CParagraphContentWithParagraphLikeContent.prototype.GetSelectedElementsInfo.apply(this, arguments);
|
||
};
|
||
ParaField.prototype.Get_Bounds = function()
|
||
{
|
||
var oParagraph = this.GetParagraph();
|
||
if (!oParagraph)
|
||
return [];
|
||
|
||
var arrBounds = [];
|
||
for (var Place in this.Bounds)
|
||
{
|
||
this.Bounds[Place].PageIndex = oParagraph.GetAbsolutePage(this.Bounds[Place].PageInternal);
|
||
arrBounds.push(this.Bounds[Place]);
|
||
}
|
||
|
||
return arrBounds;
|
||
};
|
||
ParaField.prototype.Add_ToContent = function(Pos, Item, UpdatePosition)
|
||
{
|
||
History.Add(new CChangesParaFieldAddItem(this, Pos, [Item]));
|
||
CParagraphContentWithParagraphLikeContent.prototype.Add_ToContent.apply(this, arguments);
|
||
};
|
||
ParaField.prototype.Remove_FromContent = function(Pos, Count, UpdatePosition)
|
||
{
|
||
if (Count <= 0)
|
||
return;
|
||
|
||
// Получим массив удаляемых элементов
|
||
var DeletedItems = this.Content.slice(Pos, Pos + Count);
|
||
History.Add(new CChangesParaFieldRemoveItem(this, Pos, DeletedItems));
|
||
|
||
CParagraphContentWithParagraphLikeContent.prototype.Remove_FromContent.apply(this, arguments);
|
||
};
|
||
ParaField.prototype.Add = function(Item)
|
||
{
|
||
if (para_Field === Item.Type)
|
||
{
|
||
// Вместо добавления самого элемента добавляем его содержимое
|
||
var Count = Item.Content.length;
|
||
|
||
if (Count > 0)
|
||
{
|
||
var CurPos = this.State.ContentPos;
|
||
var CurItem = this.Content[CurPos];
|
||
|
||
var CurContentPos = new AscWord.CParagraphContentPos();
|
||
CurItem.Get_ParaContentPos(false, false, CurContentPos);
|
||
|
||
var NewItem = CurItem.Split(CurContentPos, 0);
|
||
for (var Index = 0; Index < Count; Index++)
|
||
{
|
||
this.Add_ToContent(CurPos + Index + 1, Item.Content[Index], false);
|
||
}
|
||
this.Add_ToContent(CurPos + Count + 1, NewItem, false);
|
||
this.State.ContentPos = CurPos + Count;
|
||
this.Content[this.State.ContentPos].MoveCursorToEndPos();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CParagraphContentWithParagraphLikeContent.prototype.Add.apply(this, arguments);
|
||
}
|
||
};
|
||
ParaField.prototype.Split = function (ContentPos, Depth)
|
||
{
|
||
// Не даем разделять поле
|
||
return null;
|
||
};
|
||
ParaField.prototype.CanSplit = function()
|
||
{
|
||
return false;
|
||
};
|
||
ParaField.prototype.Recalculate_Range_Spaces = function(PRSA, _CurLine, _CurRange, _CurPage)
|
||
{
|
||
var CurLine = _CurLine - this.StartLine;
|
||
var CurRange = (0 === _CurLine ? _CurRange - this.StartRange : _CurRange);
|
||
|
||
if (0 === CurLine && 0 === CurRange && true !== PRSA.RecalcFast)
|
||
this.Bounds = {};
|
||
|
||
var X0 = PRSA.X;
|
||
var Y0 = PRSA.Y0;
|
||
var Y1 = PRSA.Y1;
|
||
|
||
CParagraphContentWithParagraphLikeContent.prototype.Recalculate_Range_Spaces.apply(this, arguments);
|
||
|
||
var X1 = PRSA.X;
|
||
|
||
this.Bounds[((CurLine << 16) & 0xFFFF0000) | (CurRange & 0x0000FFFF)] = {
|
||
X0 : X0,
|
||
X1 : X1,
|
||
Y0 : Y0,
|
||
Y1 : Y1,
|
||
PageIndex : PRSA.Paragraph.GetAbsolutePage(_CurPage),
|
||
PageInternal : _CurPage
|
||
};
|
||
};
|
||
ParaField.prototype.Draw_HighLights = function(PDSH)
|
||
{
|
||
var X0 = PDSH.X;
|
||
var Y0 = PDSH.Y0;
|
||
var Y1 = PDSH.Y1;
|
||
|
||
CParagraphContentWithParagraphLikeContent.prototype.Draw_HighLights.apply(this, arguments);
|
||
|
||
var X1 = PDSH.X;
|
||
|
||
if (Math.abs(X0 - X1) > 0.001 && (true === PDSH.DrawMMFields || AscWord.fieldtype_FORMTEXT === this.Get_FieldType()))
|
||
{
|
||
PDSH.MMFields.Add(Y0, Y1, X0, X1, 0, 0, 0, 0 );
|
||
}
|
||
};
|
||
ParaField.prototype.Get_LeftPos = function(SearchPos, ContentPos, Depth, UseContentPos)
|
||
{
|
||
if (false === UseContentPos && this.Content.length > 0)
|
||
{
|
||
// При переходе в новый контент встаем в его конец
|
||
var CurPos = this.Content.length - 1;
|
||
this.Content[CurPos].Get_EndPos(false, SearchPos.Pos, Depth + 1);
|
||
SearchPos.Pos.Update(CurPos, Depth);
|
||
SearchPos.Found = true;
|
||
return true;
|
||
}
|
||
|
||
CParagraphContentWithParagraphLikeContent.prototype.Get_LeftPos.call(this, SearchPos, ContentPos, Depth, UseContentPos);
|
||
};
|
||
ParaField.prototype.Get_RightPos = function(SearchPos, ContentPos, Depth, UseContentPos, StepEnd)
|
||
{
|
||
if (false === UseContentPos && this.Content.length > 0)
|
||
{
|
||
// При переходе в новый контент встаем в его начало
|
||
this.Content[0].Get_StartPos(SearchPos.Pos, Depth + 1);
|
||
SearchPos.Pos.Update(0, Depth);
|
||
SearchPos.Found = true;
|
||
return true;
|
||
}
|
||
|
||
CParagraphContentWithParagraphLikeContent.prototype.Get_RightPos.call(this, SearchPos, ContentPos, Depth, UseContentPos, StepEnd);
|
||
};
|
||
ParaField.prototype.Remove = function(nDirection, bOnAddText)
|
||
{
|
||
CParagraphContentWithParagraphLikeContent.prototype.Remove.call(this, nDirection, bOnAddText);
|
||
|
||
if (this.Is_Empty() && !bOnAddText && AscWord.fieldtype_FORMTEXT === this.Get_FieldType() && this.Paragraph && this.Paragraph.LogicDocument && true === this.Paragraph.LogicDocument.IsFillingFormMode())
|
||
{
|
||
var sDefaultText = this.FormFieldDefaultText == "" ? " " : this.FormFieldDefaultText;
|
||
this.SetValue(sDefaultText);
|
||
}
|
||
};
|
||
ParaField.prototype.Shift_Range = function(Dx, Dy, _CurLine, _CurRange, _CurPage)
|
||
{
|
||
CParagraphContentWithParagraphLikeContent.prototype.Shift_Range.call(this, Dx, Dy, _CurLine, _CurRange, _CurPage);
|
||
|
||
var CurLine = _CurLine - this.StartLine;
|
||
var CurRange = ( 0 === CurLine ? _CurRange - this.StartRange : _CurRange );
|
||
|
||
var oRangeBounds = this.Bounds[((CurLine << 16) & 0xFFFF0000) | (CurRange & 0x0000FFFF)];
|
||
if (oRangeBounds)
|
||
{
|
||
oRangeBounds.X0 += Dx;
|
||
oRangeBounds.X1 += Dx;
|
||
oRangeBounds.Y0 += Dy;
|
||
oRangeBounds.Y1 += Dy;
|
||
}
|
||
};
|
||
ParaField.prototype.Get_LeftPos = function(SearchPos, ContentPos, Depth, UseContentPos)
|
||
{
|
||
var bResult = CParagraphContentWithParagraphLikeContent.prototype.Get_LeftPos.call(this, SearchPos, ContentPos, Depth, UseContentPos);
|
||
|
||
if (true !== bResult && this.Paragraph && this.Paragraph.LogicDocument && true === this.Paragraph.LogicDocument.IsFillingFormMode())
|
||
{
|
||
this.Get_StartPos(SearchPos.Pos, Depth);
|
||
SearchPos.Found = true;
|
||
return true;
|
||
}
|
||
|
||
return bResult;
|
||
};
|
||
ParaField.prototype.Get_RightPos = function(SearchPos, ContentPos, Depth, UseContentPos, StepEnd)
|
||
{
|
||
var bResult = CParagraphContentWithParagraphLikeContent.prototype.Get_RightPos.call(this, SearchPos, ContentPos, Depth, UseContentPos, StepEnd);
|
||
|
||
if (true !== bResult && this.Paragraph && this.Paragraph.LogicDocument && true === this.Paragraph.LogicDocument.IsFillingFormMode())
|
||
{
|
||
this.Get_EndPos(false, SearchPos.Pos, Depth);
|
||
SearchPos.Found = true;
|
||
return true;
|
||
}
|
||
|
||
return bResult;
|
||
};
|
||
ParaField.prototype.Get_WordStartPos = function(SearchPos, ContentPos, Depth, UseContentPos)
|
||
{
|
||
CParagraphContentWithParagraphLikeContent.prototype.Get_WordStartPos.call(this, SearchPos, ContentPos, Depth, UseContentPos);
|
||
|
||
if (true !== SearchPos.Found && this.Paragraph && this.Paragraph.LogicDocument && true === this.Paragraph.LogicDocument.IsFillingFormMode())
|
||
{
|
||
this.Get_StartPos(SearchPos.Pos, Depth);
|
||
SearchPos.UpdatePos = true;
|
||
SearchPos.Found = true;
|
||
}
|
||
};
|
||
ParaField.prototype.Get_WordEndPos = function(SearchPos, ContentPos, Depth, UseContentPos, StepEnd)
|
||
{
|
||
CParagraphContentWithParagraphLikeContent.prototype.Get_WordEndPos.call(this, SearchPos, ContentPos, Depth, UseContentPos, StepEnd);
|
||
|
||
if (true !== SearchPos.Found && this.Paragraph && this.Paragraph.LogicDocument && true === this.Paragraph.LogicDocument.IsFillingFormMode())
|
||
{
|
||
this.Get_EndPos(false, SearchPos.Pos, Depth);
|
||
SearchPos.UpdatePos = true;
|
||
SearchPos.Found = true;
|
||
}
|
||
};
|
||
ParaField.prototype.SetCurrent = function(isCurrent)
|
||
{
|
||
};
|
||
ParaField.prototype.IsCurrent = function()
|
||
{
|
||
return false;
|
||
};
|
||
ParaField.prototype.SelectField = function()
|
||
{
|
||
this.SelectThisElement();
|
||
};
|
||
ParaField.prototype.GetAllFields = function(isUseSelection, arrFields)
|
||
{
|
||
arrFields.push(this);
|
||
return CParagraphContentWithParagraphLikeContent.prototype.GetAllFields.apply(this, arguments);
|
||
};
|
||
ParaField.prototype.GetAllSeqFieldsByType = function(sType, aFields)
|
||
{
|
||
if (this.FieldType === AscWord.fieldtype_SEQ
|
||
&& this.Arguments.length
|
||
&& this.Arguments[0].toLowerCase
|
||
&& sType.toLowerCase
|
||
&& this.Arguments[0].toLowerCase() === sType.toLowerCase())
|
||
{
|
||
aFields.push(this);
|
||
}
|
||
};
|
||
//----------------------------------------------------------------------------------------------------------------------
|
||
// Работа с данными поля
|
||
//----------------------------------------------------------------------------------------------------------------------
|
||
ParaField.prototype.Get_Argument = function(Index)
|
||
{
|
||
return this.Arguments[Index];
|
||
};
|
||
ParaField.prototype.Get_FieldType = function()
|
||
{
|
||
return this.FieldType;
|
||
};
|
||
ParaField.prototype.GetFieldType = function()
|
||
{
|
||
return this.FieldType;
|
||
};
|
||
ParaField.prototype.Map_MailMerge = function(_Value)
|
||
{
|
||
// Пока у нас в Value может быть только текст, в будущем планируется, чтобы могли быть картинки.
|
||
var Value = _Value;
|
||
if (undefined === Value || null === Value)
|
||
Value = "";
|
||
|
||
History.TurnOff();
|
||
|
||
var oRun = this.private_GetMappedRun(Value);
|
||
|
||
// Подменяем содержимое поля
|
||
this.Content = [];
|
||
this.Content[0] = oRun;
|
||
|
||
this.MoveCursorToStartPos();
|
||
|
||
History.TurnOn();
|
||
};
|
||
ParaField.prototype.Restore_StandardTemplate = function()
|
||
{
|
||
// В любом случае сначала восстанавливаем исходное содержимое.
|
||
this.Restore_Template();
|
||
|
||
if (AscWord.fieldtype_MERGEFIELD === this.FieldType && true === AscCommon.CollaborativeEditing.Is_SingleUser() && 1 === this.Arguments.length)
|
||
{
|
||
var oRun = this.private_GetMappedRun("«" + this.Arguments[0] + "»");
|
||
this.Remove_FromContent(0, this.Content.length);
|
||
this.Add_ToContent(0, oRun);
|
||
this.MoveCursorToStartPos();
|
||
|
||
this.TemplateContent = this.Content;
|
||
}
|
||
};
|
||
ParaField.prototype.Restore_Template = function()
|
||
{
|
||
// Восстанавливаем содержимое поля.
|
||
this.Content = this.TemplateContent;
|
||
this.MoveCursorToStartPos();
|
||
};
|
||
ParaField.prototype.Is_NeedRestoreTemplate = function()
|
||
{
|
||
if (1 !== this.TemplateContent.length)
|
||
return true;
|
||
|
||
var oRun = this.TemplateContent[0];
|
||
if (AscWord.fieldtype_MERGEFIELD === this.FieldType)
|
||
{
|
||
var sStandardText = "«" + this.Arguments[0] + "»";
|
||
|
||
var oRunText = new CParagraphGetText();
|
||
oRun.Get_Text(oRunText);
|
||
|
||
if (sStandardText === oRunText.Text)
|
||
return false;
|
||
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
};
|
||
ParaField.prototype.Replace_MailMerge = function(_Value)
|
||
{
|
||
// Пока у нас в Value может быть только текст, в будущем планируется, чтобы могли быть картинки.
|
||
var Value = _Value;
|
||
if (undefined === Value || null === Value)
|
||
Value = "";
|
||
|
||
var Paragraph = this.Paragraph;
|
||
|
||
if (!Paragraph)
|
||
return false;
|
||
|
||
// Получим ран, на который мы подменяем поле
|
||
var oRun = this.private_GetMappedRun(Value);
|
||
|
||
// Ищем расположение данного поля в параграфе
|
||
var ParaContentPos = Paragraph.Get_PosByElement(this);
|
||
|
||
if (null === ParaContentPos)
|
||
return false;
|
||
|
||
var Depth = ParaContentPos.GetDepth();
|
||
var FieldPos = ParaContentPos.Get(Depth);
|
||
|
||
if (Depth < 0)
|
||
return false;
|
||
|
||
ParaContentPos.DecreaseDepth(1);
|
||
var FieldContainer = Paragraph.Get_ElementByPos(ParaContentPos);
|
||
if (!FieldContainer || !FieldContainer.Content || FieldContainer.Content[FieldPos] !== this)
|
||
return false;
|
||
|
||
FieldContainer.Remove_FromContent(FieldPos, 1);
|
||
FieldContainer.Add_ToContent(FieldPos, oRun);
|
||
|
||
return true;
|
||
};
|
||
ParaField.prototype.private_GetMappedRun = function(sValue)
|
||
{
|
||
return this.CreateRunWithText(sValue);
|
||
};
|
||
ParaField.prototype.SetFormFieldName = function(sName)
|
||
{
|
||
History.Add(new CChangesParaFieldFormFieldName(this, this.FormFieldName, sName));
|
||
this.FormFieldName = sName;
|
||
};
|
||
ParaField.prototype.GetFormFieldName = function()
|
||
{
|
||
return this.FormFieldName;
|
||
};
|
||
ParaField.prototype.SetFormFieldDefaultText = function(sText)
|
||
{
|
||
History.Add(new CChangesParaFieldFormFieldDefaultText(this, this.FormFieldDefaultText, sText));
|
||
this.FormFieldDefaultText = sText;
|
||
};
|
||
ParaField.prototype.GetValue = function()
|
||
{
|
||
var oText = new CParagraphGetText();
|
||
oText.SetBreakOnNonText(false);
|
||
|
||
this.Get_Text(oText);
|
||
|
||
return oText.Text;
|
||
};
|
||
ParaField.prototype.SetValue = function(sValue)
|
||
{
|
||
this.ReplaceAllWithText(sValue);
|
||
};
|
||
ParaField.prototype.IsFillingForm = function()
|
||
{
|
||
if (AscWord.fieldtype_FORMTEXT === this.Get_FieldType())
|
||
return true;
|
||
|
||
return false;
|
||
};
|
||
ParaField.prototype.FindNextFillingForm = function(isNext, isCurrent, isStart)
|
||
{
|
||
var oParagraph = this.GetParagraph();
|
||
if (!oParagraph)
|
||
return null;
|
||
|
||
var oLogicDocument = oParagraph.GetLogicDocument();
|
||
if (!oLogicDocument)
|
||
return null;
|
||
|
||
if (!this.IsFillingForm() || oLogicDocument.IsFillingOFormMode())
|
||
return CParagraphContentWithParagraphLikeContent.prototype.FindNextFillingForm.apply(this, arguments);
|
||
|
||
if (isCurrent && true === this.IsSelectedAll())
|
||
{
|
||
if (isNext)
|
||
return CParagraphContentWithParagraphLikeContent.prototype.FindNextFillingForm.apply(this, arguments);
|
||
|
||
return null;
|
||
}
|
||
|
||
if (!isCurrent && isNext)
|
||
return this;
|
||
|
||
var oRes = CParagraphContentWithParagraphLikeContent.prototype.FindNextFillingForm.apply(this, arguments);
|
||
if (!oRes && !isNext)
|
||
return this;
|
||
|
||
return null;
|
||
};
|
||
ParaField.prototype.Update = function(isCreateHistoryPoint, isRecalculate)
|
||
{
|
||
if (!this.Paragraph && !this.Paragraph.Parent)
|
||
return;
|
||
|
||
var sReplaceString = null;
|
||
if (this.FieldType === AscWord.fieldtype_SEQ)
|
||
{
|
||
var oInstruction = new CFieldInstructionSEQ();
|
||
oInstruction.ComplexField = this;
|
||
oInstruction.ParentContent = this.Paragraph.Parent;
|
||
oInstruction.Id = this.Arguments[0];
|
||
sReplaceString = oInstruction.GetText();
|
||
}
|
||
else if (this.FieldType === AscWord.fieldtype_STYLEREF)
|
||
{
|
||
var oInstruction = new CFieldInstructionSTYLEREF();
|
||
oInstruction.ComplexField = this;
|
||
oInstruction.ParentContent = this.Paragraph.Parent;
|
||
oInstruction.ParentParagraph = this.Paragraph;
|
||
oInstruction.StyleName = this.Arguments[0];
|
||
sReplaceString = oInstruction.GetText();
|
||
}
|
||
|
||
if (sReplaceString)
|
||
{
|
||
var oRun = this.private_GetMappedRun(sReplaceString);
|
||
this.Remove_FromContent(0, this.Content.length);
|
||
this.Add_ToContent(0, oRun);
|
||
}
|
||
};
|
||
ParaField.prototype.GetInstructionLine = function()
|
||
{
|
||
let Instr = "";
|
||
let name;
|
||
switch (this.FieldType)
|
||
{
|
||
case AscWord.fieldtype_MERGEFIELD :
|
||
{
|
||
name = "MERGEFIELD";
|
||
break;
|
||
}
|
||
case AscWord.fieldtype_PAGE :
|
||
{
|
||
name = "PAGE";
|
||
break;
|
||
}
|
||
case AscWord.fieldtype_NUMPAGES :
|
||
{
|
||
name = "NUMPAGES";
|
||
break;
|
||
}
|
||
case AscWord.fieldtype_FORMTEXT :
|
||
{
|
||
name = "FORMTEXT";
|
||
break;
|
||
}
|
||
case AscWord.fieldtype_TOC :
|
||
{
|
||
name = "TOC";
|
||
break;
|
||
}
|
||
case AscWord.fieldtype_PAGEREF :
|
||
{
|
||
name = "PAGEREF";
|
||
break;
|
||
}
|
||
case AscWord.fieldtype_ASK :
|
||
{
|
||
name = "ASK";
|
||
break;
|
||
}
|
||
case AscWord.fieldtype_REF :
|
||
{
|
||
name = "REF";
|
||
break;
|
||
}
|
||
case AscWord.fieldtype_HYPERLINK :
|
||
{
|
||
name = "HYPERLINK";
|
||
break;
|
||
}
|
||
case AscWord.fieldtype_TIME :
|
||
{
|
||
name = "TIME";
|
||
break;
|
||
}
|
||
case AscWord.fieldtype_DATE :
|
||
{
|
||
name = "DATE";
|
||
break;
|
||
}
|
||
case AscWord.fieldtype_FORMULA :
|
||
{
|
||
name = "FORMULA";
|
||
break;
|
||
}
|
||
case AscWord.fieldtype_SEQ :
|
||
{
|
||
name = "SEQ";
|
||
break;
|
||
}
|
||
case AscWord.fieldtype_STYLEREF :
|
||
{
|
||
name = "STYLEREF";
|
||
break;
|
||
}
|
||
case AscWord.fieldtype_NOTEREF :
|
||
{
|
||
name = "NOTEREF";
|
||
break;
|
||
}
|
||
}
|
||
if (name)
|
||
{
|
||
Instr += name;
|
||
for (let i = 0; i < this.Arguments.length; ++i)
|
||
{
|
||
let argument = this.Arguments[i];
|
||
argument = argument.replace(/(\\|")/g, "\\$1");
|
||
if (-1 != argument.indexOf(' '))
|
||
{
|
||
argument = "\"" + argument + "\"";
|
||
}
|
||
Instr += " " + argument;
|
||
}
|
||
Instr += this.Switches.join(" ")
|
||
}
|
||
return Instr;
|
||
};
|
||
ParaField.prototype.GetInstruction = function()
|
||
{
|
||
let instructionLine = this.GetInstructionLine();
|
||
let parser = new CFieldInstructionParser();
|
||
let instruction = parser.GetInstructionClass(instructionLine);
|
||
instruction.SetInstructionLine(instructionLine);
|
||
return instruction;
|
||
};
|
||
ParaField.prototype.ReplaceWithComplexField = function()
|
||
{
|
||
let oParent = this.GetParent();
|
||
let nPosInParent = this.GetPosInParent(oParent);
|
||
let oParagraph = this.GetParagraph();
|
||
let oLogicDocument = oParagraph ? oParagraph.GetLogicDocument() : null;
|
||
if (!oLogicDocument || !oParent || -1 === nPosInParent)
|
||
return null;
|
||
|
||
let oBeginChar = new ParaFieldChar(fldchartype_Begin, oLogicDocument);
|
||
let oSeparateChar = new ParaFieldChar(fldchartype_Separate, oLogicDocument);
|
||
let oEndChar = new ParaFieldChar(fldchartype_End, oLogicDocument);
|
||
|
||
let sInstruction = this.GetInstructionLine();
|
||
|
||
let oRun = this.CreateRunWithText("");
|
||
oRun.AddToContent(-1, oBeginChar);
|
||
oRun.AddInstrText(sInstruction);
|
||
oRun.AddToContent(-1, oSeparateChar);
|
||
oRun.AddToContent(-1, oEndChar);
|
||
|
||
oParent.RemoveFromContent(nPosInParent, 1);
|
||
oParent.AddToContent(nPosInParent, oRun);
|
||
|
||
oBeginChar.SetRun(oRun);
|
||
oSeparateChar.SetRun(oRun);
|
||
oEndChar.SetRun(oRun);
|
||
|
||
var oComplexField = oBeginChar.GetComplexField();
|
||
oComplexField.SetBeginChar(oBeginChar);
|
||
oComplexField.SetInstructionLine(sInstruction);
|
||
oComplexField.SetSeparateChar(oSeparateChar);
|
||
oComplexField.SetEndChar(oEndChar);
|
||
oComplexField.Update(false);
|
||
return oComplexField;
|
||
};
|
||
ParaField.prototype.GetRunWithPageField = function(paragraph)
|
||
{
|
||
let res = null;
|
||
if (AscWord.fieldtype_PAGENUM == this.FieldType || AscWord.fieldtype_PAGECOUNT == this.FieldType) {
|
||
res = new ParaRun(paragraph);
|
||
let run = this.GetFirstRunNonEmpty();
|
||
let rPr = run && run.Get_FirstTextPr();
|
||
if (rPr) {
|
||
res.Set_Pr(rPr);
|
||
}
|
||
if (AscWord.fieldtype_PAGENUM == this.FieldType) {
|
||
res.AddToContentToEnd(new AscWord.CRunPageNum());
|
||
} else {
|
||
var pageCount = parseInt(this.GetSelectedText(true));
|
||
res.AddToContentToEnd(new AscWord.CRunPagesCount(isNaN(pageCount) ? undefined : pageCount));
|
||
}
|
||
}
|
||
return res;
|
||
}
|
||
ParaField.prototype.IsValid = function()
|
||
{
|
||
return true;
|
||
};
|
||
ParaField.prototype.CheckType = function(type)
|
||
{
|
||
return this.FieldType === type;
|
||
};
|
||
ParaField.prototype.IsAddin = function()
|
||
{
|
||
return this.CheckType(AscWord.fieldtype_ADDIN);
|
||
};
|
||
ParaField.prototype.IsFormCheckBox = function()
|
||
{
|
||
return this.CheckType(AscWord.fieldtype_FORMCHECKBOX);
|
||
};
|
||
//----------------------------------------------------------------------------------------------------------------------
|
||
// Функции совместного редактирования
|
||
//----------------------------------------------------------------------------------------------------------------------
|
||
ParaField.prototype.Write_ToBinary2 = function(Writer)
|
||
{
|
||
Writer.WriteLong(AscDFH.historyitem_type_Field);
|
||
|
||
// String : Id
|
||
// Long : FieldType
|
||
// Long : Количество аргументов
|
||
// Array of Strings : массив аргументов
|
||
// Long : Количество переключателей
|
||
// Array of Strings : массив переключателей
|
||
// Long : Количество элементов
|
||
// Array of Strings : массив с Id элементов
|
||
|
||
Writer.WriteString2(this.Id);
|
||
Writer.WriteLong(this.FieldType);
|
||
|
||
var ArgsCount = this.Arguments.length;
|
||
Writer.WriteLong(ArgsCount);
|
||
for (var Index = 0; Index < ArgsCount; Index++)
|
||
Writer.WriteString2(this.Arguments[Index]);
|
||
|
||
var SwitchesCount = this.Switches.length;
|
||
Writer.WriteLong(SwitchesCount);
|
||
for (var Index = 0; Index < SwitchesCount; Index++)
|
||
Writer.WriteString2(this.Switches[Index]);
|
||
|
||
var Count = this.Content.length;
|
||
Writer.WriteLong(Count);
|
||
for (var Index = 0; Index < Count; Index++)
|
||
Writer.WriteString2(this.Content[Index].Get_Id());
|
||
};
|
||
ParaField.prototype.Read_FromBinary2 = function(Reader)
|
||
{
|
||
// String : Id
|
||
// Long : FieldType
|
||
// Long : Количество аргументов
|
||
// Array of Strings : массив аргументов
|
||
// Long : Количество переключателей
|
||
// Array of Strings : массив переключателей
|
||
// Long : Количество элементов
|
||
// Array of Strings : массив с Id элементов
|
||
|
||
this.Id = Reader.GetString2();
|
||
this.FieldType = Reader.GetLong();
|
||
|
||
var Count = Reader.GetLong();
|
||
this.Arguments = [];
|
||
for (var Index = 0; Index < Count; Index++)
|
||
this.Arguments.push(Reader.GetString2());
|
||
|
||
Count = Reader.GetLong();
|
||
this.Switches = [];
|
||
for (var Index = 0; Index < Count; Index++)
|
||
this.Switches.push(Reader.GetString2());
|
||
|
||
Count = Reader.GetLong();
|
||
this.Content = [];
|
||
for (var Index = 0; Index < Count; Index++)
|
||
{
|
||
var Element = AscCommon.g_oTableId.Get_ById(Reader.GetString2());
|
||
if (null !== Element)
|
||
this.Content.push(Element);
|
||
}
|
||
|
||
this.TemplateContent = this.Content;
|
||
|
||
if (editor)
|
||
editor.WordControl.m_oLogicDocument.Register_Field(this);
|
||
};
|
||
//----------------------------------------------------------------------------------------------------------------------
|
||
ParaField.prototype.IsStopCursorOnEntryExit = function()
|
||
{
|
||
return true;
|
||
};
|
||
ParaField.prototype.CheckSpelling = function(oCollector, nDepth)
|
||
{
|
||
if (oCollector.IsExceedLimit())
|
||
return;
|
||
|
||
oCollector.FlushWord();
|
||
};
|
||
//--------------------------------------------------------export----------------------------------------------------
|
||
window['AscCommonWord'] = window['AscCommonWord'] || {};
|
||
window['AscCommonWord'].ParaField = ParaField;
|
||
|
||
window['AscWord'].CSimpleField = ParaField;
|
||
window['AscWord'].FldSimple = ParaField;
|