Files
sdkjs-forms/api.js
Ilya Kirillov ea7e3c0f02 Fix bug #70332
Convert drawing to inline form when adding picture content control
2025-05-05 16:55:41 +03:00

736 lines
22 KiB
JavaScript
Raw 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
*
*/
var AscOForm = {};
window["AscOForm"] = window.AscOForm = AscOForm;
(function(window, document) {
window['Asc']['Addons'] = window['Asc']['Addons'] || {};
window['Asc']['Addons']['forms'] = true; // register addon
window['Asc']['asc_docs_api'].prototype['asc_AddContentControlCheckBox'] = window['Asc']['asc_docs_api'].prototype.asc_AddContentControlCheckBox = function(oPr, oFormPr, oCommonPr)
{
var oLogicDocument = this.private_GetLogicDocument();
if (!oLogicDocument)
return;
CheckCurrentSelection(oLogicDocument);
if (oPr && oFormPr)
{
if (oPr.GroupKey)
{
oPr.CheckedSymbol = 0x25C9;
oPr.UncheckedSymbol = 0x25CB;
}
else
{
oPr.CheckedSymbol = 0x2611;
oPr.UncheckedSymbol = 0x2610;
}
oPr.CheckedFont = "Segoe UI Symbol";
oPr.UncheckedFont = "Segoe UI Symbol";
}
var nCheckedSymbol = oPr && oPr.CheckedSymbol ? oPr.CheckedSymbol : Asc.c_oAscSdtCheckBoxDefaults.CheckedSymbol;
var nUncheckedSymbol = oPr && oPr.UncheckedSymbol ? oPr.UncheckedSymbol : Asc.c_oAscSdtCheckBoxDefaults.UncheckedSymbol;
var sCheckedFont = oPr && oPr.CheckedFont ? oPr.CheckedFont : Asc.c_oAscSdtCheckBoxDefaults.CheckedFont;
var sUncheckedFont = oPr && oPr.UncheckedFont ? oPr && oPr.UncheckedFont : Asc.c_oAscSdtCheckBoxDefaults.UncheckedFont;
var isLoadFonts = false;
if (!AscCommon.IsAscFontSupport(sCheckedFont, nCheckedSymbol))
{
isLoadFonts = true;
AscFonts.FontPickerByCharacter.getFontBySymbol(nCheckedSymbol);
}
if (!AscCommon.IsAscFontSupport(sUncheckedFont, nUncheckedSymbol))
{
isLoadFonts = true;
AscFonts.FontPickerByCharacter.getFontBySymbol(nUncheckedSymbol);
}
function private_ApplyPrToCheckBox(oCC)
{
if (!oCC)
return;
if (oFormPr)
{
private_ApplyFormPr(oCC, oFormPr, oLogicDocument);
if (oPr && oPr.GroupKey)
private_CheckRadioButtonChoice(oCC, oLogicDocument, oPr.GroupKey);
else
private_CheckFormKey(oCC, oLogicDocument);
}
if (oCommonPr)
oCC.SetContentControlPr(oCommonPr);
}
function private_PerformAddCheckBox()
{
if (oLogicDocument.IsTextSelectionUse())
{
let arrSelectedParagraphs = oLogicDocument.GetSelectedParagraphs();
// Select entire paragraphs so that after the action all added checkboxes are included in the selection
let nSelectDirection = oLogicDocument.GetSelectDirection();
for (let nIndex = 0, nCount = arrSelectedParagraphs.length; nIndex < nCount; ++nIndex)
{
arrSelectedParagraphs[nIndex].SelectAll(nSelectDirection);
}
let oState = oLogicDocument.SaveDocumentState(false);
if (arrSelectedParagraphs.length > 0
&& !oLogicDocument.IsSelectionLocked(AscCommon.changestype_None, {
Type : AscCommon.changestype_2_ElementsArray_and_Type,
Elements : arrSelectedParagraphs,
CheckType : AscCommon.changestype_Paragraph_Content
}))
{
oLogicDocument.StartAction(AscDFH.historydescription_Document_AddContentControlCheckBox);
oLogicDocument.RemoveSelection();
for (let nIndex = 0, nCount = arrSelectedParagraphs.length; nIndex < nCount; ++nIndex)
{
let oCC = arrSelectedParagraphs[nIndex].AddCheckBoxToStartPos(oPr);
private_ApplyPrToCheckBox(oCC);
}
oLogicDocument.LoadDocumentState(oState);
oLogicDocument.UpdateInterface();
oLogicDocument.Recalculate();
oLogicDocument.FinalizeAction();
}
else
{
oLogicDocument.LoadDocumentState(oState);
}
}
else
{
oLogicDocument.RemoveTextSelection();
if (!oLogicDocument.IsSelectionLocked(AscCommon.changestype_Paragraph_Content))
{
oLogicDocument.StartAction(AscDFH.historydescription_Document_AddContentControlCheckBox);
var oCC = oLogicDocument.AddContentControlCheckBox(oPr);
private_ApplyPrToCheckBox(oCC);
oLogicDocument.UpdateInterface();
oLogicDocument.Recalculate();
oLogicDocument.FinalizeAction();
}
}
}
if (isLoadFonts)
{
var oFonts = {};
oFonts[sCheckedFont] = true;
oFonts[sUncheckedFont] = true;
AscCommon.Check_LoadingDataBeforePrepaste(this, oFonts, {}, private_PerformAddCheckBox);
}
else
{
private_PerformAddCheckBox();
}
};
window['Asc']['asc_docs_api'].prototype['asc_AddContentControlPicture'] = window['Asc']['asc_docs_api'].prototype.asc_AddContentControlPicture = function(oFormPr, oCommonPr, isSignature)
{
var oLogicDocument = this.private_GetLogicDocument();
if (!oLogicDocument)
return;
CheckCurrentSelection(oLogicDocument);
oLogicDocument.RemoveTextSelection();
if (!oLogicDocument.IsSelectionLocked(AscCommon.changestype_Paragraph_Content))
{
oLogicDocument.StartAction(AscDFH.historydescription_Document_AddContentControlPicture);
// 150x32pt for Signature
let w = isSignature ? 150 / 72 * 25.4 : undefined;
let h = isSignature ? 32 / 72 * 25.4 : undefined;
var oCC = oLogicDocument.AddContentControlPicture(w, h);
// MSWord can't open files with anchored picture content controls (70332)
if (oCC && !oFormPr)
{
let allDrawings = oCC.GetAllDrawingObjects();
for (let i = 0; i < allDrawings.length; ++i)
{
allDrawings[i].MakeInline();
}
}
let oFormParaDrawing = null;
if (oCC && oFormPr)
{
oCC.SetFormPr(oFormPr);
oCC.UpdatePlaceHolderTextPrForForm();
let pictPr = new AscCommon.CSdtPictureFormPr();
if (isSignature)
{
pictPr.SetSignature(true);
let glossary = oLogicDocument.GetGlossaryDocument();
if (glossary)
oCC.SetPlaceholder(glossary.GetDefaultPlaceholderSignatureOformDocPartId());
}
oCC.SetPictureFormPr(pictPr);
private_CheckFormKey(oCC, oLogicDocument);
oLogicDocument.Recalculate(true);
oFormParaDrawing = oCC.ConvertFormToFixed();
var aDrawings = oCC.GetAllDrawingObjects();
for(var nDrawing = 0; nDrawing < aDrawings.length; ++nDrawing)
{
var oDrawing = aDrawings[nDrawing];
var oGraphic = oDrawing.GraphicObj;
if(oGraphic && oGraphic.getObjectType() === AscDFH.historyitem_type_ImageShape)
{
var oSpPr = oGraphic.spPr;
if(oSpPr)
{
if(oSpPr.Fill)
{
oSpPr.setFill(null);
}
if(oSpPr.ln)
{
oSpPr.setLn(null);
}
if(oSpPr.geometry)
{
oSpPr.setGeometry(null);
}
var oXfrm = oSpPr.xfrm;
if(oXfrm)
{
if(!AscFormat.fApproxEqual(oXfrm.rot, 0.0))
{
oXfrm.setRot(0);
}
if(oXfrm.flipH)
{
oXfrm.setFlipH(false);
}
if(oXfrm.flipH)
{
oXfrm.setFlipH(false);
}
if(oXfrm.flipV)
{
oXfrm.setFlipV(false);
}
}
}
}
}
if (!oCC.IsPlaceHolder())
{
oLogicDocument.Recalculate(true);
oCC.UpdatePictureFormLayout();
}
else
{
oCC.ReplaceContentWithPlaceHolder();
oCC.ApplyPicturePr(true);
}
}
if (oCC && oCommonPr)
oCC.SetContentControlPr(oCommonPr);
oLogicDocument.UpdateInterface();
oLogicDocument.Recalculate();
if(oFormParaDrawing)
{
let oFormShape = oFormParaDrawing.GraphicObj;
if(oFormShape)
{
oFormShape.Set_CurrentElement(true, null, true);
}
}
oLogicDocument.FinalizeAction();
}
};
window['Asc']['asc_docs_api'].prototype['asc_AddContentControlSignature'] = window['Asc']['asc_docs_api'].prototype.asc_AddContentControlSignature = function(oFormPr, oCommonPr)
{
return this.asc_AddContentControlPicture(oFormPr, oCommonPr, true);
};
window['Asc']['asc_docs_api'].prototype['asc_AddContentControlList'] = window['Asc']['asc_docs_api'].prototype.asc_AddContentControlList = function(isComboBox, oPr, oFormPr, oCommonPr)
{
var oLogicDocument = this.private_GetLogicDocument();
if (!oLogicDocument)
return;
CheckCurrentSelection(oLogicDocument);
oLogicDocument.RemoveTextSelection();
if (!oLogicDocument.IsSelectionLocked(AscCommon.changestype_Paragraph_Content))
{
oLogicDocument.StartAction(AscDFH.historydescription_Document_AddContentControlList);
var oCC;
if (isComboBox)
oCC = oLogicDocument.AddContentControlComboBox(oPr);
else
oCC = oLogicDocument.AddContentControlDropDownList(oPr);
if (oCC && oFormPr)
{
private_ApplyFormPr(oCC, oFormPr, oLogicDocument);
oCC.UpdatePlaceHolderTextPrForForm();
private_CheckFormKey(oCC, oLogicDocument);
}
if (oCC && oCommonPr)
oCC.SetContentControlPr(oCommonPr);
oLogicDocument.Recalculate();
oLogicDocument.UpdateInterface();
oLogicDocument.UpdateSelection();
oLogicDocument.FinalizeAction();
}
};
window['Asc']['asc_docs_api'].prototype['asc_AddContentControlDatePicker'] = window['Asc']['asc_docs_api'].prototype.asc_AddContentControlDatePicker = function(oPr, oCommonPr)
{
var oLogicDocument = this.private_GetLogicDocument();
if (!oLogicDocument)
return;
CheckCurrentSelection(oLogicDocument);
oLogicDocument.RemoveTextSelection();
if (!oLogicDocument.IsSelectionLocked(AscCommon.changestype_Paragraph_Content))
{
oLogicDocument.StartAction(AscDFH.historydescription_Document_AddContentControlList);
let dateTimePr = null;
let formPr = null;
let ccPr = null;
// Пока для совместимости со старым форматом оставляем, чтобы настройки могли приходить по старому (oPr, oCommonPr)
// но в будущем надо перейти на новый вариант contentPr (AscCommon.CContentControlPr)
if (oPr && (oPr instanceof AscCommon.CContentControlPr))
{
dateTimePr = oPr.DateTimePr;
ccPr = oPr;
formPr = oPr.FormPr;
}
else if (oPr && (oPr instanceof AscWord.CSdtDatePickerPr))
{
dateTimePr = oPr;
ccPr = oCommonPr ? oCommonPr : null;
}
var oCC = oLogicDocument.AddContentControlDatePicker(dateTimePr);
if (oCC && ccPr)
oCC.SetContentControlPr(ccPr);
if (oCC && formPr)
{
private_ApplyFormPr(oCC, formPr, oLogicDocument);
private_CheckFormKey(oCC, oLogicDocument);
}
oLogicDocument.Recalculate();
oLogicDocument.UpdateInterface();
oLogicDocument.UpdateSelection();
oLogicDocument.FinalizeAction();
}
};
window['Asc']['asc_docs_api'].prototype['asc_AddContentControlTextForm'] = window['Asc']['asc_docs_api'].prototype.asc_AddContentControlTextForm = function(contentControlPr)
{
var oLogicDocument = this.private_GetLogicDocument();
if (!oLogicDocument)
return;
CheckCurrentSelection(oLogicDocument);
let textFormPr = contentControlPr ? contentControlPr.TextFormPr : null;
let formPr = contentControlPr ? contentControlPr.FormPr : null;
let placeholderText = contentControlPr ? contentControlPr.PlaceholderText : "";
if (!oLogicDocument.IsSelectionLocked(AscCommon.changestype_Paragraph_Content))
{
oLogicDocument.StartAction(AscDFH.historydescription_Document_AddContentControlTextForm);
var oCC = oLogicDocument.AddContentControlTextForm(textFormPr);
if (oCC)
{
if (placeholderText)
oCC.SetPlaceholderText(placeholderText);
if (formPr)
{
private_ApplyFormPr(oCC, formPr, oLogicDocument);
oCC.UpdatePlaceHolderTextPrForForm();
private_CheckFormKey(oCC, oLogicDocument);
}
}
oLogicDocument.UpdateInterface();
oLogicDocument.Recalculate();
oLogicDocument.FinalizeAction();
}
};
window['Asc']['asc_docs_api'].prototype['asc_AddComplexForm'] = window['Asc']['asc_docs_api'].prototype.asc_AddComplexForm = function(json, formPr)
{
let logicDocument = this.private_GetLogicDocument();
if (!logicDocument)
return;
CheckCurrentSelection(logicDocument, true);
function AddComplexForm()
{
if (!logicDocument.IsSelectionLocked(AscCommon.changestype_Paragraph_Content))
{
logicDocument.StartAction(AscDFH.historydescription_Document_AddComplexForm);
let complexForm = logicDocument.AddComplexForm(new AscWord.CSdtComplexFormPr(), formPr);
private_CheckFormKey(complexForm, logicDocument);
if (json)
AscWord.JsonToForm(json, complexForm);
logicDocument.UpdateInterface();
logicDocument.Recalculate();
logicDocument.FinalizeAction();
}
}
if (json)
{
AscFonts.FontPickerByCharacter.checkText(AscWord.GetUnicodesFromJsonToForm(), this, function() {
AddComplexForm();
}, true);
}
else
{
AddComplexForm();
}
};
window['Asc']['asc_docs_api'].prototype['asc_GetCurrentComplexForm'] = window['Asc']['asc_docs_api'].prototype.asc_GetCurrentComplexForm = function()
{
let logicDocument = this.private_GetLogicDocument();
if (!logicDocument)
return null;
let form = logicDocument.GetContentControl();
if (!form || !form.IsForm())
return null;
let mainForm = form.GetMainForm();
return (mainForm.IsComplexForm() ? mainForm : null);
};
window['Asc']['asc_docs_api'].prototype['asc_ConvertFormToJson'] = window['Asc']['asc_docs_api'].prototype.asc_ConvertFormToJson = function(form)
{
let logicDocument = this.private_GetLogicDocument();
if (!logicDocument)
return null;
if (typeof (form) === "string")
form = AscCommon.g_oTableId.Get_ById(form);
if (!form || !(form instanceof AscWord.CInlineLevelSdt) || !form.IsForm())
return null;
return AscWord.FormToJson(form);
};
window['Asc']['asc_docs_api'].prototype['asc_SetFormValue'] = window['Asc']['asc_docs_api'].prototype.asc_SetFormValue = function(value, formId)
{
let logicDocument = this.private_GetLogicDocument();
if (!logicDocument)
return;
let form = logicDocument.GetContentControl(formId);
if (!form || !form.IsForm())
return;
return this.private_SetFormValue(form.GetId(), value);
};
window['Asc']['asc_docs_api'].prototype['asc_GetFormValue'] = window['Asc']['asc_docs_api'].prototype.asc_GetFormValue = function(formId)
{
let logicDocument = this.private_GetLogicDocument();
if (!logicDocument)
return "";
let form = logicDocument.GetContentControl(formId);
if (!form || !form.IsForm())
return "";
if (form.IsPictureForm())
return "";
else if (form.IsCheckBox())
return form.IsCheckBoxChecked();
else if (form.IsPlaceHolder())
return "";
return form.GetInnerText();
};
window['Asc']['asc_docs_api'].prototype.private_SetFormValue = function(internalId, value)
{
let oLogicDocument = this.private_GetLogicDocument();
if (!AscCommon.g_oTableId
|| !oLogicDocument
|| !oLogicDocument.IsDocumentEditor())
return;
let oForm = AscCommon.g_oTableId.GetClass(internalId);
if (!oForm
|| !(oForm instanceof AscWord.CInlineLevelSdt)
|| !oForm.IsForm())
return;
// При проверке лока внутри параграфа мы ориентируемся на выделение внутри этого параграфа
// поэтому нужно выделить форму
let state = oLogicDocument.SaveDocumentState();
oForm.SelectContentControl();
let oParagraph = oForm.GetParagraph();
oForm.SkipFillingFormModeCheck(true);
oForm.SkipSpecialContentControlLock(true);
if (!oParagraph
|| oLogicDocument.IsSelectionLocked(AscCommon.changestype_None, {
Type : AscCommon.changestype_2_ElementsArray_and_Type,
Elements : [oParagraph],
CheckType : AscCommon.changestype_Paragraph_Content
}, true, oLogicDocument.IsFillingFormMode()))
{
oLogicDocument.LoadDocumentState(state);
oForm.SkipFillingFormModeCheck(false);
oForm.SkipSpecialContentControlLock(false);
return;
}
oLogicDocument.LoadDocumentState(state);
oForm.SkipFillingFormModeCheck(false);
oForm.SkipSpecialContentControlLock(false);
oLogicDocument.StartAction(AscDFH.historydescription_Document_FillFormInPlugin);
let isClear = false;
if (null === value)
{
isClear = true;
}
else if (oForm.IsTextForm() || oForm.IsComboBox())
{
let sValue = AscBuilder.GetStringParameter(value, "");
if (!sValue)
isClear = true;
else
oForm.SetInnerText(sValue);
}
else if (oForm.IsDropDownList())
{
let sValue = AscBuilder.GetStringParameter(value, "");
let oPr = oForm.GetDropDownListPr();
let nIndex = oPr.FindByText(sValue);
if (-1 !== nIndex)
oForm.SelectListItem(oPr.GetItemValue(nIndex));
else
isClear = true;
}
else if (oForm.IsCheckBox())
{
let isChecked = value === "true" ? true : value === "false" ? false : AscBuilder.GetBoolParameter(value, null);
if (null !== isChecked)
oForm.SetCheckBoxChecked(isChecked);
else
isClear = true;
}
else if (oForm.IsPictureForm())
{
let sValue = AscBuilder.GetStringParameter(value, "");
if (!sValue)
return;
let oImg;
let allDrawings = oForm.GetAllDrawingObjects();
for (let nDrawing = 0; nDrawing < allDrawings.length; ++nDrawing)
{
if (allDrawings[nDrawing].IsPicture())
{
oImg = allDrawings[nDrawing].GraphicObj;
break;
}
}
if (oImg)
{
oForm.SetShowingPlcHdr(false);
oImg.setBlipFill(AscFormat.CreateBlipFillRasterImageId(sValue));
}
else
{
isClear = true;
}
}
else if (oForm.IsDatePicker())
{
let sValue = AscBuilder.GetStringParameter(value, "");
if (!sValue)
isClear = true;
else
oForm.SetInnerText(sValue);
// TODO: Надо FullDate попытаться выставить по заданному значение. Сейчас мы всегда сбрасываем на текущую дату
let datePickerPr = oForm.GetDatePickerPr().Copy();
datePickerPr.SetFullDate(null);
oForm.SetDatePickerPr(datePickerPr);
}
if (isClear)
oForm.ClearContentControlExt();
oLogicDocument.OnChangeForm(oForm);
oLogicDocument.Recalculate();
oLogicDocument.UpdateTracks();
oLogicDocument.UpdateInterface();
oLogicDocument.FinalizeAction();
};
function private_CheckFormKey(form, logicDocument)
{
if (!form || !form.IsForm() || !logicDocument)
return;
let key = form.GetFormKey();
if (key && "" !== key.trim())
return;
let formManager = logicDocument.GetFormsManager();
let keyGenerator = formManager.GetKeyGenerator();
let formPr = form.GetFormPr().Copy();
if (!formPr)
return;
key = keyGenerator.GetNewKey(form);
formPr.SetKey(key);
form.SetFormPr(formPr);
}
function private_CheckRadioButtonChoice(form, logicDocument, groupKey)
{
if (!form || !form.IsForm() || !logicDocument)
return;
let choice = form.GetFormKey();
if (choice && "" !== choice.trim())
return;
let formManager = logicDocument.GetFormsManager();
let keyGenerator = formManager.GetKeyGenerator();
let formPr = form.GetFormPr().Copy();
if (!formPr)
return;
choice = keyGenerator.GetNewChoiceByGroupKey(groupKey);
formPr.SetKey(choice);
form.SetFormPr(formPr);
}
function private_ApplyFormPr(form, formPr, logicDocument)
{
if (!form || !formPr)
return;
form.SetFormPr(formPr.Copy());
if (!form.IsMainForm() && form.GetMainForm().GetFormRole() !== formPr.GetRole())
form.SetFormRole(form.GetMainForm().GetFormRole());
let docPartId = form.GetPlaceholder();
let glossary = logicDocument.GetGlossaryDocument();
if ((form.IsTextForm()
|| form.IsDropDownList()
|| form.IsComboBox()
|| form.IsDatePicker())
&&
(docPartId === glossary.GetDefaultPlaceholderTextDocPartId()
|| docPartId === glossary.GetDefaultPlaceholderListDocPartId()
|| docPartId === glossary.GetDefaultPlaceholderDateTimeDocPartId()))
{
if (docPartId === glossary.GetDefaultPlaceholderTextDocPartId())
form.SetPlaceholder(glossary.GetDefaultPlaceholderTextOformDocPartId());
else if (docPartId === glossary.GetDefaultPlaceholderListDocPartId())
form.SetPlaceholder(glossary.GetDefaultPlaceholderListOformDocPartId());
else if (docPartId === glossary.GetDefaultPlaceholderDateTimeDocPartId())
form.SetPlaceholder(glossary.GetDefaultPlaceholderDateTimeOformDocPartId());
if (form.IsPlaceHolder())
form.private_FillPlaceholderContent();
}
let paragraph = form.GetParagraph();
if (form.IsMainForm() && formPr.GetFixed() && (!paragraph || !paragraph.GetParentShape()))
{
logicDocument.Recalculate(true);
let drawing = form.ConvertFormToFixed();
if (drawing)
drawing.SelectAsDrawing();
}
}
function CheckCurrentSelection(logicDocument, isComplex)
{
let form = logicDocument.GetContentControl();
if (!form || !form.IsForm() || (form.IsComplexForm() && !isComplex))
return;
if (isComplex)
form = form.GetMainForm();
form.MoveCursorOutsideForm(false);
}
})(window, window.document);