Files
DocumentServer-v-9.2.0/sdkjs/word/Editor/SelectedContent.js
Yajbir Singh f1b860b25c
Some checks failed
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

1311 lines
40 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* (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)
{
const FLAG_MATH = 0x0001;
const FLAG_SHAPE = 0x0002;
const FLAG_TABLE = 0x0004;
const FLAG_NOT_PARAGRAPH = 0x0008; // Есть не параграф в массиве
/**
* Класс, используемый для вставки или переноса содержимого внутри документа
* @constructor
*/
function CSelectedContent()
{
this.Elements = [];
this.Flags = 0;
this.DrawingObjects = [];
this.Comments = [];
this.CommentsMarks = {};
this.Maths = [];
this.PermRangeMarks = [];
this.LogicDocument = null;
this.NewCommentsGuid = false;
this.SaveNumberingValues = false;
this.CopyComments = true;
this.MoveDrawing = false; // Только для переноса автофигур
this.ForceInline = false;
this.CursorInLastRun = false; // TODO: Данный флаг не работает для формул и неинлайновой вставки
this.InsertOptions = {
Table : Asc.c_oSpecialPasteProps.overwriteCells
};
// Опции для отслеживания переноса
this.TrackRevisions = false;
this.MoveTrackId = null;
this.MoveTrackRuns = [];
this.HaveMovedParts = false;
this.LastSection = null;
this.AnchorPos = null;
this.Select = true;
this.ParaAnchorPos = null;
this.Run = null;
this.PasteHelper = null;
this.IsPresentationContent = false;
}
CSelectedContent.prototype.Reset = function()
{
this.Elements = [];
this.Flags = 0;
this.DrawingObjects = [];
this.Comments = [];
this.Maths = [];
this.PermRangeMarks = [];
this.MoveDrawing = false;
};
CSelectedContent.prototype.Add = function(oElement)
{
this.Elements.push(oElement);
};
CSelectedContent.prototype.GetContentArray = function()
{
let content = [];
for (let i = 0, count = this.Elements.length; i < count; ++i)
{
content.push(this.Elements[i].Element);
}
return content;
};
CSelectedContent.prototype.EndCollect = function(oLogicDocument)
{
this.private_CollectObjects();
this.private_CheckComments(oLogicDocument);
this.private_CheckTrackMove(oLogicDocument);
this.private_CheckPermRangeMarks(oLogicDocument);
};
CSelectedContent.prototype.SetNewCommentsGuid = function(isNew)
{
this.NewCommentsGuid = isNew;
};
CSelectedContent.prototype.SetMoveDrawing = function(isMoveDrawing)
{
this.MoveDrawing = isMoveDrawing;
};
CSelectedContent.prototype.IsMoveDrawing = function()
{
return this.MoveDrawing;
};
CSelectedContent.prototype.SetCopyComments = function(isCopy)
{
this.CopyComments = isCopy;
};
CSelectedContent.prototype.CanConvertToMath = function()
{
// Проверка возможности конвертации имеющегося контента в контент для вставки в формулу
// Если формулы уже имеются, то ничего не конвертируем
return !(this.Flags & FLAG_NOT_PARAGRAPH);
};
CSelectedContent.prototype.ForceInlineInsert = function(isForce)
{
this.ForceInline = undefined === isForce ? true : !!isForce;
};
CSelectedContent.prototype.HaveShape = function()
{
return !!(this.Flags & FLAG_SHAPE);
};
CSelectedContent.prototype.HaveMath = function()
{
return !!(this.Flags & FLAG_MATH);
};
CSelectedContent.prototype.HaveTable = function()
{
return !!(this.Flags & FLAG_TABLE);
};
CSelectedContent.prototype.CanInsert = function(oAnchorPos)
{
if (this.Elements.length <= 0)
return false;
let oParagraph = oAnchorPos.Paragraph;
var oDocContent = oParagraph.GetParent();
if (!oDocContent)
return false;
// Автофигуры не вставляем в другие автофигуры, сноски и концевые сноски
// Единственное исключение, если вставка происходит картинки в картиночное поле (для замены картинки)
let oParentShape = oDocContent.Is_DrawingShape(true);
if (((oParentShape && !oParentShape.isForm()) || true === oDocContent.IsFootnote()) && true === this.HaveShape())
return false;
// В заголовки диаграмм не вставляем формулы
if(this.HaveMath())
{
if(oParagraph.bFromDocument === false)
{
let oDrawing = oDocContent.Is_DrawingShape(true);
if(oDrawing)
{
let nDrawingType = null;
if(oDrawing.getObjectType)
{
nDrawingType = oDrawing.getObjectType();
}
if(nDrawingType !== AscDFH.historyitem_type_Shape)
{
return false;
}
}
}
}
if (oParagraph.bFromDocument === false && (this.DrawingObjects.length > 0 || this.HaveTable()))
return false;
let oParaAnchorPos = oParagraph.Get_ParaNearestPos(oAnchorPos);
if (!oParaAnchorPos || oParaAnchorPos.Classes.length < 2)
return false;
let oRun = oParaAnchorPos.Classes[oParaAnchorPos.Classes.length - 1];
if (!oRun || !(oRun instanceof AscCommonWord.ParaRun))
return false;
// Пока автофигуры не поддерживаются внутри формул, запрещаем их туда всталять
if (oRun.IsMathRun() && this.IsMoveDrawing())
return false;
return (oRun.IsMathRun() ? this.CanConvertToMath() : true);
};
CSelectedContent.prototype.Insert = function(oAnchorPos, isSelect)
{
if (!this.CanInsert(oAnchorPos))
return false;
let oParagraph = oAnchorPos.Paragraph;
let oDocContent = oParagraph.GetParent();
let oLogicDocument = oParagraph.GetLogicDocument();
this.LogicDocument = oLogicDocument; // Может быть не задан (например при вставке в формулу в таблицах)
this.IsPresentationContent = !oParagraph.bFromDocument;
this.PrepareObjectsForInsert();
this.private_CheckContentBeforePaste(oAnchorPos, oDocContent);
let oParaAnchorPos = oParagraph.Get_ParaNearestPos(oAnchorPos);
let oRun = oParaAnchorPos.Classes[oParaAnchorPos.Classes.length - 1];
this.ParaAnchorPos = oParaAnchorPos;
this.Select = isSelect;
this.Run = oRun;
this.AnchorPos = oAnchorPos;
this.Select = !!isSelect;
this.PasteHelper = oRun ? oRun.GetParagraph() : null;
let isLocalTrack = false;
if (oLogicDocument && oLogicDocument.IsDocumentEditor())
{
isLocalTrack = oLogicDocument.GetLocalTrackRevisions();
oLogicDocument.SetLocalTrackRevisions(false);
}
if (this.private_IsBlockLevelSdtPlaceholder())
{
this.private_InsertToBlockLevelSdtWithPlaceholder();
}
else if (oRun.IsMathRun())
{
this.private_InsertToMathRun();
}
else if (oRun.GetParentPictureContentControl())
{
this.private_InsertToPictureCC();
}
else if (oRun.GetParentForm())
{
this.private_InsertToForm();
}
else if (this.private_IsInlineInsert())
{
this.private_InsertInline();
}
else if (this.private_IsOverwriteTableCells())
{
this.private_OverwriteTableCells();
}
else
{
this.private_InsertCommon();
}
this.CheckTemporaryContentControl();
if (false !== isLocalTrack)
oLogicDocument.SetLocalTrackRevisions(isLocalTrack);
if (window.g_asc_plugins)
{
let aAllOleObjects = [];
let aAllOleObjectsData = [];
for(let nDrawing = 0; nDrawing < this.DrawingObjects.length; ++nDrawing)
{
this.DrawingObjects[nDrawing].GetAllOleObjects(null, aAllOleObjects);
}
for(let nOle = 0; nOle < aAllOleObjects.length; ++nOle)
{
aAllOleObjectsData.push(aAllOleObjects[nOle].getDataObject())
}
window.g_asc_plugins.onPluginEvent("onInsertOleObjects", aAllOleObjectsData);
}
return true;
};
CSelectedContent.prototype.ReplaceContent = function(oDocContent, isSelect)
{
if (this.Elements.length <= 0)
return;
oDocContent.ClearContent(false);
for (let nPos = 0, nCount = this.Elements.length; nPos < nCount; ++nPos)
{
let oElement = this.Elements[nPos].Element;
oDocContent.AddToContent(nPos, oElement);
}
if (true === isSelect)
{
oDocContent.SelectAll();
}
else
{
oDocContent.RemoveSelection();
oDocContent.MoveCursorToEndPos();
}
oDocContent.SetThisElementCurrent();
};
CSelectedContent.prototype.GetPasteHelperElement = function()
{
return this.PasteHelper;
};
CSelectedContent.prototype.PrepareObjectsForInsert = function()
{
let oLogicDocument = this.LogicDocument;
if (oLogicDocument && oLogicDocument.IsDocumentEditor())
{
if (this.NewCommentsGuid)
this.private_CreateNewCommentsGuid();
this.private_CopyDocPartNames();
if (this.CopyComments)
this.private_CopyComments();
}
};
CSelectedContent.prototype.SetInsertOptionForTable = function(nType)
{
this.InsertOptions.Table = nType;
};
/**
* Converts current content to ParaMath if it possible. Doesn't change current SelectedContent
* @returns {?AscCommonWord.ParaMath}
* */
CSelectedContent.prototype.ConvertToMath = function()
{
if (!this.CanConvertToMath())
return null;
var oParaMath = new AscCommonWord.ParaMath();
oParaMath.Root.Remove_FromContent(0, oParaMath.Root.GetElementsCount());
for (let nParaIndex = 0, nParasCount = this.Elements.length; nParaIndex < nParasCount; ++nParaIndex)
{
let oParagraph = this.Elements[nParaIndex].Element;
if (!oParagraph.IsParagraph())
continue;
for (var nInParaPos = 0; nInParaPos < oParagraph.GetElementsCount(); ++nInParaPos)
{
var oElement = oParagraph.Content[nInParaPos];
let nType = oElement.GetType();
if (para_Run === nType)
{
oParaMath.Push(oElement.ToMathRun());
}
else if (para_Math === nType)
{
oParaMath.Concat(oElement);
}
}
}
oParaMath.Root.Correct_Content(true);
return oParaMath;
};
/**
* Устанавливаем, что сейчас происходит перенос во время рецензирования
* @param {boolean} isTrackRevision
* @param {string} sMoveId
*/
CSelectedContent.prototype.SetMoveTrack = function(isTrackRevision, sMoveId)
{
this.TrackRevisions = isTrackRevision;
this.MoveTrackId = sMoveId;
};
/**
* Проверяем собираем ли содержимое для переноса в рецензировании
* @returns {boolean}
*/
CSelectedContent.prototype.IsMoveTrack = function()
{
return this.MoveTrackId !== null;
};
/**
* @returns {boolean}
*/
CSelectedContent.prototype.IsTrackRevisions = function()
{
return this.TrackRevisions;
};
/**
* Добавляем ран, который участвует в переносе
* @param {ParaRun} oRun
*/
CSelectedContent.prototype.AddRunForMoveTrack = function(oRun)
{
this.MoveTrackRuns.push(oRun);
};
/**
* Устанавливаем есть ли в содержимом текст перенесенный во время рецензирования
* @param {boolean} isHave
*/
CSelectedContent.prototype.SetMovedParts = function(isHave)
{
this.HaveMovedParts = isHave;
};
/**
* Запрашиваем, есть ли перенесенная во время рецензирования часть
* @returns {boolean}
*/
CSelectedContent.prototype.IsHaveMovedParts = function()
{
return this.HaveMovedParts;
};
/**
* Запоминаем секцию, на которой закончилось выделение (если оно было в основной части документа)
* @param {AscWord.SectPr} oSectPr
*/
CSelectedContent.prototype.SetLastSection = function(oSectPr)
{
this.LastSection = oSectPr;
};
/**
* Получаем секцию, на которой закончилось выделение
* @returns {null | AscWord.SectPr}
*/
CSelectedContent.prototype.GetLastSection = function()
{
return this.LastSection;
};
/**
* Сохранять значения нумерации
* @param {boolean} isSave
*/
CSelectedContent.prototype.SetSaveNumberingValues = function(isSave)
{
this.SaveNumberingValues = isSave;
};
/**
* Заппрашиваем, нужно ли сохранять расчитанные значения нумерации
* @returns {boolean}
*/
CSelectedContent.prototype.IsSaveNumberingValues = function()
{
return this.SaveNumberingValues;
};
/**
* По умолчанию мы выводим курсор за пределы вставленных элементов, с данным флагом мы оставляем его
* внутри последнего рана
* NB: Данный флаг работает только для инлайновой вставки, и не в формулу
*/
CSelectedContent.prototype.PlaceCursorInLastInsertedRun = function(isInLast)
{
this.CursorInLastRun = undefined === isInLast ? true : !!isInLast;
};
/**
* Конвертируем элементы в один элемент с простым текстом
*/
CSelectedContent.prototype.ConvertToText = function()
{
var oParagraph = this.private_CreateParagraph();
var sText = "";
for (var nIndex = 0, nCount = this.Elements.length; nIndex < nCount; ++nIndex)
{
var oElement = this.Elements[nIndex].Element;
if (oElement.IsParagraph())
sText += oElement.GetText({ParaSeparator : ""});
}
var oRun = new ParaRun(oParagraph, null);
oRun.AddText(sText);
oParagraph.AddToContent(0, oRun);
this.Elements.length = 0;
this.Elements.push(new CSelectedElement(oParagraph, false));
};
CSelectedContent.prototype.GetText = function(oPr)
{
let text = "";
if (1 === this.Elements.length
&& this.Elements[0].Element.IsParagraph()
&& this.Elements[0].Element.IsEmpty({SkipDrawing: true}))
{
let drawings = this.Elements[0].Element.GetAllDrawingObjects();
let graphicObj = 1 === drawings.length ? drawings[0].GraphicObj : null;
let docContent = graphicObj ? graphicObj.getDocContent() : null;
if (docContent)
text = docContent.GetText(oPr);
}
else
{
for (var nIndex = 0, nCount = this.Elements.length; nIndex < nCount; ++nIndex)
{
var oElement = this.Elements[nIndex].Element;
if (oElement.IsParagraph() || oElement.IsTable() || oElement.IsBlockLevelSdt())
text += oElement.GetText(oPr);
}
}
return text;
};
CSelectedContent.prototype.ConvertToPresentation = function(Parent)
{
let Elements = this.Elements.slice(0);
this.Elements.length = 0;
for (let nIndex = 0, nCount = Elements.length; nIndex < nCount; ++nIndex)
{
let oSelectedElement = Elements[nIndex];
var oElement = oSelectedElement.Element;
if (oElement.IsParagraph())
{
this.Elements.push(new CSelectedElement(AscFormat.ConvertParagraphToPPTX(oElement, Parent.DrawingDocument, Parent, true, false), oSelectedElement.SelectedAll))
}
}
};
CSelectedContent.prototype.ConvertToInline = function()
{
var oParagraph = this.private_CreateParagraph();
for (var nIndex = 0, nCount = this.Elements.length; nIndex < nCount; ++nIndex)
{
var oElement = this.Elements[nIndex].Element;
if (oElement.IsParagraph())
oParagraph.ConcatContent(oElement.Content);
}
this.Elements.length = 0;
this.Elements.push(new CSelectedElement(oParagraph, false));
};
//----------------- Private Area -----------------------------------------------------------------------------------
CSelectedContent.prototype.private_CollectObjects = function()
{
for (let nPos = 0, nCount = this.Elements.length; nPos < nCount; ++nPos)
{
let oElement = this.Elements[nPos].Element;
oElement.Set_DocumentPrev(0 === nPos ? null : this.Elements[nPos - 1].Element);
oElement.Set_DocumentNext(nPos === nCount - 1 ? null : this.Elements[nPos + 1].Element);
oElement.ProcessComplexFields();
let arrParagraphs = oElement.GetAllParagraphs();
for (let nParaIndex = 0, nParasCount = arrParagraphs.length; nParaIndex < nParasCount; ++nParaIndex)
{
let oParagraph = arrParagraphs[nParaIndex];
oParagraph.GetAllDrawingObjects(this.DrawingObjects);
oParagraph.GetAllComments(this.Comments);
oParagraph.GetAllMaths(this.Maths);
oParagraph.GetAllPermRangeMarks(this.PermRangeMarks);
}
if (oElement.IsParagraph() && nCount > 1)
oElement.CorrectContent();
if (oElement.IsTable())
this.Flags |= FLAG_TABLE;
if (!oElement.IsParagraph())
this.Flags |= FLAG_NOT_PARAGRAPH;
oElement.MoveCursorToEndPos(false);
}
if (this.Maths.length)
this.Flags |= FLAG_MATH;
for (let nPos = 0, nCount = this.DrawingObjects.length; nPos < nCount; ++nPos)
{
let oDrawing = this.DrawingObjects[nPos];
if (oDrawing.IsShape() || oDrawing.IsGroup())
{
this.Flags |= FLAG_SHAPE;
break;
}
}
};
CSelectedContent.prototype.private_CheckComments = function(oLogicDocument)
{
if (!(oLogicDocument instanceof AscCommonWord.CDocument))
return;
var mCommentsMarks = {};
for (var nIndex = 0, nCount = this.Comments.length; nIndex < nCount; ++nIndex)
{
var oMark = this.Comments[nIndex].Comment;
var sId = oMark.GetCommentId();
if (!mCommentsMarks[sId])
mCommentsMarks[sId] = {};
if (oMark.IsCommentStart())
mCommentsMarks[sId].Start = oMark;
else
mCommentsMarks[sId].End = oMark;
}
// Пробегаемся по найденным комментариям и удаляем те, у которых нет начала или конца
var oCommentsManager = oLogicDocument.GetCommentsManager();
for (var sId in mCommentsMarks)
{
var oEntry = mCommentsMarks[sId];
var oParagraph = null;
if (!oEntry.Start && oEntry.End)
oParagraph = oEntry.End.GetParagraph();
else if (oEntry.Start && !oEntry.End)
oParagraph = oEntry.Start.GetParagraph();
var oComment = oCommentsManager.GetById(sId);
if ((!oEntry.Start && !oEntry.End) || !oComment)
delete mCommentsMarks[sId];
else
oEntry.Comment = oComment;
if (oParagraph)
{
var bOldValue = oParagraph.DeleteCommentOnRemove;
oParagraph.DeleteCommentOnRemove = false;
oParagraph.RemoveCommentMarks(sId);
oParagraph.DeleteCommentOnRemove = bOldValue;
delete mCommentsMarks[sId];
}
}
this.CommentsMarks = mCommentsMarks;
};
CSelectedContent.prototype.private_CheckTrackMove = function(oLogicDocument)
{
if (this.Elements.length <= 0 || !oLogicDocument || !oLogicDocument.TrackMoveId)
return;
var isCanMove = !this.IsHaveMovedParts();
for (var nIndex = 0, nCount = this.Elements.length; nIndex < nCount; ++nIndex)
{
if (!this.Elements[nIndex].Element.IsParagraph())
{
isCanMove = false;
break;
}
}
if (oLogicDocument.TrackMoveRelocation)
isCanMove = true;
if (isCanMove)
{
if (oLogicDocument.TrackMoveRelocation)
{
var oMarks = oLogicDocument.GetTrackRevisionsManager().GetMoveMarks(oLogicDocument.TrackMoveId);
if (oMarks)
{
oMarks.To.Start.RemoveThisMarkFromDocument();
oMarks.To.End.RemoveThisMarkFromDocument();
}
}
var oStartElement = this.Elements[0].Element;
var oEndElement = this.Elements[this.Elements.length - 1].Element;
var oStartParagraph = oStartElement.GetFirstParagraph();
var oEndParagraph = oEndElement.GetLastParagraph();
oStartParagraph.AddToContent(0, new CParaRevisionMove(true, false, oLogicDocument.TrackMoveId));
if (oEndParagraph !== oEndElement || this.Elements[this.Elements.length - 1].SelectedAll)
{
var oEndRun = oEndParagraph.GetParaEndRun();
oEndRun.AddAfterParaEnd(new AscWord.CRunRevisionMove(false, false, oLogicDocument.TrackMoveId));
var oInfo = new AscWord.ReviewInfo();
oInfo.Update();
oInfo.SetMove(Asc.c_oAscRevisionsMove.MoveTo);
oEndRun.SetReviewTypeWithInfo(reviewtype_Add, oInfo, false);
}
else
{
oEndParagraph.AddToContent(oEndParagraph.GetElementsCount(), new CParaRevisionMove(false, false, oLogicDocument.TrackMoveId));
}
for (var nIndex = 0, nCount = this.MoveTrackRuns.length; nIndex < nCount; ++nIndex)
{
var oRun = this.MoveTrackRuns[nIndex];
var oInfo = new AscWord.ReviewInfo();
oInfo.Update();
oInfo.SetMove(Asc.c_oAscRevisionsMove.MoveTo);
oRun.SetReviewTypeWithInfo(reviewtype_Add, oInfo);
}
}
else
{
oLogicDocument.TrackMoveId = null;
}
};
CSelectedContent.prototype.private_CheckPermRangeMarks = function(logicDocument)
{
// TODO: Пока мы удаляем все метки. В будущем надо сделать, что если скопированы начало и конец, то мы
// приписываем им новый id диапазона, а если скопировано только начала или конец, то удаляем такие метки
for (let markIndex = 0, markCount = this.PermRangeMarks.length; markIndex < markCount; ++markIndex)
{
let mark = this.PermRangeMarks[markIndex];
mark.removeMark();
}
};
CSelectedContent.prototype.private_CreateNewCommentsGuid = function()
{
let oManager = this.LogicDocument.GetCommentsManager();
for (var Index = 0; Index < this.Comments.length; Index++)
{
var comment = oManager.GetById(this.Comments[Index].Comment.CommentId);
if (comment)
{
comment.CreateNewCommentsGuid();
}
}
};
CSelectedContent.prototype.private_CopyDocPartNames = function()
{
var arrCC = [];
for (var nIndex = 0, nCount = this.Elements.length; nIndex < nCount; ++nIndex)
{
this.Elements[nIndex].Element.GetAllContentControls(arrCC);
}
var oGlossaryDocument = this.LogicDocument.GetGlossaryDocument();
for (var nIndex = 0, nCount = arrCC.length; nIndex < nCount; ++nIndex)
{
var oCC = arrCC[nIndex];
var sPlaceHolderName = oCC.GetPlaceholder();
if (sPlaceHolderName)
{
var oDocPart = oGlossaryDocument.GetDocPartByName(sPlaceHolderName);
if (!oDocPart || oGlossaryDocument.IsDefaultDocPart(oDocPart))
continue;
var sNewName = oGlossaryDocument.GetNewName();
oGlossaryDocument.AddDocPart(oDocPart.Copy(sNewName));
oCC.SetPlaceholder(sNewName);
}
}
};
CSelectedContent.prototype.private_CopyComments = function()
{
let oLogicDocument = this.LogicDocument;
var oCommentsManager = this.LogicDocument.GetCommentsManager();
for (let sId in this.CommentsMarks)
{
let oEntry = this.CommentsMarks[sId];
var oNewComment = oEntry.Comment.Copy();
oCommentsManager.Add(oNewComment);
var sNewId = oNewComment.GetId();
oLogicDocument.GetApi().sync_AddComment(sNewId, oNewComment.GetData());
oEntry.Start.SetCommentId(sNewId);
oEntry.End.SetCommentId(sNewId);
oNewComment.SetRangeStart(oEntry.Start.GetId());
oNewComment.SetRangeEnd(oEntry.End.GetId());
}
};
/**
* Проверяем содержимое, которые мы вставляем, в зависимости от места куда оно вставляется
* @param oAnchorPos {NearestPos}
* @param oDocContent {AscCommonWord.CDocumentContent}
*/
CSelectedContent.prototype.private_CheckContentBeforePaste = function(oAnchorPos, oDocContent)
{
var oParagraph = oAnchorPos.Paragraph;
// Если мы вставляем в специальный контент контрол, тогда производим простую вставку текста
var oParaState = oParagraph.SaveSelectionState();
oParagraph.RemoveSelection();
oParagraph.Set_ParaContentPos(oAnchorPos.ContentPos, false, -1, -1, false);
var arrContentControls = oParagraph.GetSelectedContentControls();
oParagraph.LoadSelectionState(oParaState);
for (var nIndex = 0, nCount = arrContentControls.length; nIndex < nCount; ++nIndex)
{
if (arrContentControls[nIndex].IsComboBox() || arrContentControls[nIndex].IsDropDownList())
{
this.ConvertToText();
break;
}
}
if (this.IsPresentationContent)
this.ConvertToPresentation(oDocContent);
if (this.ForceInline)
this.ConvertToInline();
};
CSelectedContent.prototype.private_AdjustSizeForInlineDrawing = function()
{
if (this.MoveDrawing)
return;
if (1 === this.DrawingObjects.length && 1 === this.Elements.length)
{
let oParaDrawing = this.DrawingObjects[0];
if (oParaDrawing.IsInline())
{
let oElement = this.Elements[0].Element;
if (oElement.IsParagraph())
{
let isAdditionalContent = oElement.CheckRunContent(function(oRun)
{
for (let nPos = 0, nCount = oRun.GetElementsCount(); nPos < nCount; ++nPos)
{
let oItem = oRun.GetElement(nPos);
if (oItem && !oItem.IsParaEnd() && !oItem.IsDrawing())
return true;
}
return false;
});
if (!isAdditionalContent)
oParaDrawing.CheckFitToColumn();
}
}
}
};
CSelectedContent.prototype.private_CheckInsertSignatures = function()
{
var aDrawings = this.DrawingObjects;
var nDrawing, oDrawing, oSp;
var sLastSignatureId = null;
for (nDrawing = 0; nDrawing < aDrawings.length; ++nDrawing)
{
oDrawing = aDrawings[nDrawing];
oSp = oDrawing.GraphicObj;
if (oSp && oSp.signatureLine)
{
oSp.setSignature(oSp.signatureLine);
sLastSignatureId = oSp.signatureLine.id;
}
}
if (sLastSignatureId)
{
editor.sendEvent("asc_onAddSignature", sLastSignatureId);
}
};
CSelectedContent.prototype.private_IsInlineInsert = function()
{
return (1 === this.Elements.length && !this.Elements[0].SelectedAll && this.Elements[0].Element.IsParagraph() && (!this.Elements[0].Element.IsEmpty() || this.ForceInline));
};
CSelectedContent.prototype.private_IsOverwriteTableCells = function()
{
let oParagraph = this.Run.GetParagraph();
if (!oParagraph)
return false;
let nDstIndex = oParagraph.GetIndex();
let oDocContent = oParagraph.GetParent();
if (!oDocContent || oParagraph !== oDocContent.GetElement(nDstIndex))
return false;
return (Asc.c_oSpecialPasteProps.overwriteCells === this.InsertOptions.Table
&& 1 === this.Elements.length
&& this.Elements[0].Element.IsTable()
&& oDocContent.GetParent() instanceof AscWord.CTableCell);
};
CSelectedContent.prototype.private_InsertToMathRun = function()
{
let oParaAnchorPos = this.ParaAnchorPos;
let oMathContent = oParaAnchorPos.Classes[oParaAnchorPos.Classes.length - 2];
let nInMathContentPos = oParaAnchorPos.NearPos.ContentPos.Data[oParaAnchorPos.Classes.length - 2];
let paraMath = oMathContent.ParaMath;
let insertMath = this.ConvertToMath();
let paragraph = paraMath ? paraMath.GetParagraph() : null;
if (!insertMath || !paraMath || !paragraph)
return;
if (paraMath.GetParent() instanceof AscWord.CInlineLevelSdt && paraMath.GetParent().IsContentControlEquation())
{
let contentControl = paraMath.GetParent();
paraMath = contentControl.ReplacePlaceholderEquation();
contentControl.RemoveContentControlWrapper();
oMathContent = paraMath.Root;
oMathContent.AddToContent(0, new AscWord.CRun(paragraph, true));
oMathContent.InsertMathContent(insertMath.Root, 0, this.Select);
}
else
{
let oRun = oParaAnchorPos.Classes[oParaAnchorPos.Classes.length - 1];
let oNewRun = oRun.Split(oParaAnchorPos.NearPos.ContentPos, oParaAnchorPos.Classes.length - 1);
oMathContent.AddToContent(nInMathContentPos + 1, oNewRun);
oMathContent.InsertMathContent(insertMath.Root, nInMathContentPos + 1, this.Select);
}
};
CSelectedContent.prototype.private_InsertToPictureCC = function()
{
let oPictureCC = this.Run.GetParentPictureContentControl()
var oSrcPicture = null;
for (var nIndex = 0, nCount = this.DrawingObjects.length; nIndex < nCount; ++nIndex)
{
if (this.DrawingObjects[nIndex].IsPicture())
{
oSrcPicture = this.DrawingObjects[nIndex].GraphicObj.copy();
break;
}
}
var arrParaDrawings = oPictureCC.GetAllDrawingObjects();
if (arrParaDrawings.length > 0 && oSrcPicture)
{
oPictureCC.SetShowingPlcHdr(false);
oSrcPicture.setParent(arrParaDrawings[0]);
arrParaDrawings[0].Set_GraphicObject(oSrcPicture);
if (oPictureCC.IsPictureForm())
oPictureCC.UpdatePictureFormLayout();
let oLogicDocument = this.LogicDocument;
if (oLogicDocument)
{
oLogicDocument.DrawingObjects.resetSelection();
oLogicDocument.RemoveSelection();
oPictureCC.SelectContentControl();
if (oLogicDocument.IsDocumentEditor() && arrParaDrawings[0].IsPicture())
oLogicDocument.OnChangeForm(oPictureCC);
}
}
};
CSelectedContent.prototype.private_InsertToForm = function()
{
let oParaAnchorPos = this.ParaAnchorPos;
let oRun = this.Run;
let oForm = oRun.GetParentForm();
let nInLastClassPos = oParaAnchorPos.NearPos.ContentPos.Data[oParaAnchorPos.Classes.length - 1];
if (oForm.IsComplexForm())
{
this.ConvertToInline();
return this.private_InsertInline();
}
if ((!oForm.IsTextForm() && !oForm.IsComboBox() && !oForm.IsDatePicker()))
return;
let newLineSep = "";
if (oForm.IsMultiLineForm() || (oForm.IsTextForm() && !oForm.IsFixedForm()))
newLineSep = "\n";
let sInsertedText = this.GetText({
ParaSeparator : newLineSep,
TableCellSeparator : newLineSep,
TableRowSeparator : newLineSep,
NewLineSeparator : newLineSep
});
if (sInsertedText
&& sInsertedText.length
&& newLineSep
&& sInsertedText[sInsertedText.length - 1] === newLineSep)
{
sInsertedText = sInsertedText.slice(0, -1);
}
if (!sInsertedText || !sInsertedText.length)
return;
var isPlaceHolder = oRun.GetParentForm().IsPlaceHolder();
if (isPlaceHolder && oRun.GetParent() instanceof CInlineLevelSdt)
{
var oInlineLeveLSdt = oRun.GetParent();
oInlineLeveLSdt.ReplacePlaceHolderWithContent();
oRun = oInlineLeveLSdt.GetElement(0);
nInLastClassPos = 0;
}
let nInRunStartPos = nInLastClassPos;
oRun.State.ContentPos = nInLastClassPos;
oRun.AddText(sInsertedText, nInLastClassPos);
let nInRunEndPos = oRun.State.ContentPos;
let nLastClassLen = oRun.GetElementsCount();
nInRunStartPos = Math.min(nLastClassLen, Math.min(nInRunStartPos, nInRunEndPos));
nInRunEndPos = Math.min(nLastClassLen, nInRunEndPos);
if (this.Select)
{
oRun.Selection.Use = true;
oRun.Selection.StartPos = nInRunStartPos;
oRun.Selection.EndPos = nInRunEndPos;
oRun.State.ContentPos = nInRunEndPos;
oRun.SelectThisElement(1, true);
}
else
{
oRun.SetThisElementCurrent();
oRun.State.ContentPos = nInRunEndPos;
}
};
CSelectedContent.prototype.private_InsertInline = function()
{
let oParaAnchorPos = this.ParaAnchorPos;
let runParent = this.Run.GetParent();
let inlineSdt = runParent && runParent instanceof CInlineLevelSdt ? runParent : null;
if (inlineSdt && inlineSdt.IsPlaceHolder())
{
if (inlineSdt.IsContentControlTemporary())
{
let oResult = inlineSdt.RemoveContentControlWrapper();
let oSdtParent = oResult.Parent;
let oSdtPos = oResult.Pos;
let oSdtCount = oResult.Count;
if (!oSdtParent
|| oParaAnchorPos.Classes.length < 3
|| oParaAnchorPos.Classes[oParaAnchorPos.Classes.length - 2] !== inlineSdt
|| oParaAnchorPos.Classes[oParaAnchorPos.Classes.length - 3] !== oSdtParent)
return;
let oRun = new ParaRun(undefined, false);
oRun.SetPr(inlineSdt.GetDefaultTextPr().Copy());
oSdtParent.RemoveFromContent(oSdtPos, oSdtCount);
oSdtParent.AddToContent(oSdtPos, oRun);
oParaAnchorPos.Classes.length--;
oParaAnchorPos.Classes[oParaAnchorPos.Classes.length - 1] = oRun;
oParaAnchorPos.NearPos.ContentPos.Update(oSdtPos, oParaAnchorPos.Classes.length - 2);
oParaAnchorPos.NearPos.ContentPos.Update(0, oParaAnchorPos.Classes.length - 1);
}
else
{
inlineSdt.ReplacePlaceHolderWithContent();
oParaAnchorPos.Classes[oParaAnchorPos.Classes.length - 1] = inlineSdt.GetElement(0);
oParaAnchorPos.NearPos.ContentPos.Update(0, oParaAnchorPos.Classes.length - 2);
oParaAnchorPos.NearPos.ContentPos.Update(0, oParaAnchorPos.Classes.length - 1);
}
inlineSdt = null;
}
let oRun = oParaAnchorPos.Classes[oParaAnchorPos.Classes.length - 1];
let oNewRun = oRun.Split(oParaAnchorPos.NearPos.ContentPos, oParaAnchorPos.Classes.length - 1);
let oParent = oParaAnchorPos.Classes[oParaAnchorPos.Classes.length - 2];
let nInParentPos = oParaAnchorPos.NearPos.ContentPos.Data[oParaAnchorPos.Classes.length - 2];
oParent.AddToContent(nInParentPos + 1, oNewRun);
let oParagraph = this.Elements[0].Element;
let nElementsCount = oParagraph.Content.length - 1; // Последний ран с para_End не добавляем
let isSelect = this.Select && !this.MoveDrawing;
for (let nPos = 0; nPos < nElementsCount; ++nPos)
{
let oItem = oParagraph.GetElement(nPos);
oParent.AddToContent(nInParentPos + 1 + nPos, oItem);
if (isSelect)
oItem.SelectAll();
else
oItem.RemoveSelection();
}
if (this.MoveDrawing)
{
}
else if (isSelect)
{
oParent.Selection.Use = true;
oParent.Selection.StartPos = nInParentPos + 1;
oParent.Selection.EndPos = nInParentPos + 1 + nElementsCount - 1;
oParent.SelectThisElement(1, true);
}
else
{
oParent.RemoveSelection();
oParent.SetThisElementCurrent();
if (this.CursorInLastRun)
{
oParent.SetCurrentPos(nInParentPos + nElementsCount);
oParent.GetElement(nInParentPos + nElementsCount).MoveCursorToEndPos();
}
else
{
oParent.SetCurrentPos(nInParentPos + 1 + nElementsCount);
oParent.GetElement(nInParentPos + nElementsCount).MoveCursorToStartPos();
}
}
if (oParent.CorrectContent)
oParent.CorrectContent();
if (this.LogicDocument && this.LogicDocument.IsDocumentEditor())
this.private_AdjustSizeForInlineDrawing();
if (inlineSdt && inlineSdt.IsContentControlTemporary())
inlineSdt.RemoveContentControlWrapper()
this.private_CheckInsertSignatures();
};
CSelectedContent.prototype.private_OverwriteTableCells = function()
{
let oTableCell = this.Run.GetParagraph().GetParent().GetParent();
return oTableCell.InsertTableContent(this.Elements[0].Element);
};
CSelectedContent.prototype.private_InsertCommon = function()
{
let oParagraph = this.Run.GetParagraph();
if (!oParagraph)
return;
let nDstIndex = oParagraph.GetIndex();
let oDocContent = oParagraph.GetParent();
if (!oDocContent || oParagraph !== oDocContent.GetElement(nDstIndex))
return;
oParagraph.RemoveSelection();
oParagraph.MoveCursorToAnchorPos(this.AnchorPos);
let oParagraphS, oParagraphE, nInsertPos;
if (oParagraph.IsCursorAtBegin())
{
oParagraphS = null;
oParagraphE = oParagraph;
nInsertPos = nDstIndex;
}
else
{
oParagraphS = oParagraph;
oParagraphE = new AscWord.Paragraph(undefined, this.IsPresentationContent);
oParagraphS.Split(oParagraphE);
oDocContent.AddToContent(nDstIndex + 1, oParagraphE);
nInsertPos = nDstIndex + 1;
}
let nSelectionStart = nInsertPos;
let nStartPos = 0;
if (oParagraphS
&& this.Elements[0].Element.IsParagraph()
&& -1 !== oParagraphS.GetIndex())
{
let nParagraphSPos = oParagraphS.GetIndex();
let oInsertParagraph = this.Elements[0].Element;
oInsertParagraph.ConcatBefore(oParagraphS, this.Select ? 1 : 0);
oDocContent.AddToContent(nParagraphSPos, oInsertParagraph);
oDocContent.RemoveFromContent(nParagraphSPos + 1, 1);
nSelectionStart = nParagraphSPos;
nStartPos++;
oParagraphS = oInsertParagraph;
}
let nEndPos = this.Elements.length - 1;
let isConcatE = false;
if (oParagraphE
&& this.Elements.length > 1
&& this.Elements[nEndPos].Element.IsParagraph()
&& !this.Elements[nEndPos].SelectedAll)
{
oParagraphE.ConcatBefore(this.Elements[nEndPos].Element, this.Select ? -1 : 0);
nEndPos--;
isConcatE = true;
}
else
{
oParagraphE.MoveCursorToStartPos();
}
for (let nPos = nStartPos; nPos <= nEndPos; ++nPos)
{
let oElement = this.Elements[nPos].Element;
oDocContent.AddToContent(nInsertPos++, oElement);
if (this.Select)
{
oElement.SelectAll(1);
}
else
{
oElement.RemoveSelection();
oElement.MoveCursorToEndPos();
}
}
let nSelectionEnd = isConcatE ? oParagraphE.GetIndex() : nInsertPos - 1;
if (this.Select)
{
oDocContent.Selection.Use = true;
oDocContent.Selection.StartPos = nSelectionStart;
oDocContent.Selection.EndPos = nSelectionEnd;
oDocContent.CurPos.ContentPos = nSelectionEnd;
oDocContent.SetThisElementCurrent();
}
else
{
if (oParagraphS && oParagraphS !== oParagraphE)
{
oParagraphS.RemoveSelection();
oParagraphS.MoveCursorToEndPos();
}
oParagraphE.RemoveSelection();
oDocContent.CurPos.ContentPos = nInsertPos;
oDocContent.SetThisElementCurrent();
}
this.private_CheckInsertSignatures();
if (isConcatE && oParagraphE)
this.PasteHelper = oParagraphE;
else
this.PasteHelper = this.Elements[this.Elements.length - 1].Element;
};
CSelectedContent.prototype.private_GetDrawingDocument = function()
{
let _editor = editor;
if (!_editor && Asc && Asc.editor)
_editor = Asc.editor;
if (!_editor)
return null;
return _editor.getDrawingDocument();
};
CSelectedContent.prototype.private_CreateParagraph = function()
{
return new AscWord.Paragraph(undefined, this.IsPresentationContent);
};
CSelectedContent.prototype.private_IsBlockLevelSdtPlaceholder = function()
{
let paragraph = this.Run.GetParagraph();
if (!paragraph)
return false;
let paraIndex = paragraph.GetIndex();
let docContent = paragraph.GetParent();
if (!docContent
|| paragraph !== docContent.GetElement(paraIndex)
|| !docContent.IsBlockLevelSdtContent())
return false;
let blockSdt = docContent.GetParent();
return (blockSdt.IsPlaceHolder() || blockSdt.IsEmpty());
};
CSelectedContent.prototype.private_InsertToBlockLevelSdtWithPlaceholder = function()
{
let blockSdt = this.Run.GetParagraph().GetParent().GetParent();
blockSdt.ReplacePlaceHolderWithContent();
let docContent = blockSdt.GetContent();
this.ReplaceContent(docContent, true);
};
CSelectedContent.prototype.CheckTemporaryContentControl = function()
{
let paragraph = this.Run.GetParagraph();
if (!paragraph)
return;
let paraIndex = paragraph.GetIndex();
let docContent = paragraph.GetParent();
if (!docContent
|| paragraph !== docContent.GetElement(paraIndex)
|| !docContent.IsBlockLevelSdtContent())
return;
let blockSdt = docContent.GetParent();
if (blockSdt.IsContentControlTemporary())
blockSdt.RemoveContentControlWrapper();
};
/**
* @param oElement
* @param isSelectedAll
* @constructor
*/
function CSelectedElement(oElement, isSelectedAll)
{
this.Element = oElement;
this.SelectedAll = isSelectedAll;
}
//--------------------------------------------------------export----------------------------------------------------
window['AscCommonWord'] = window['AscCommonWord'] || {};
window['AscCommonWord'].CSelectedContent = CSelectedContent;
window['AscCommonWord'].CSelectedElement = CSelectedElement;
})(window);