devexpress-richedit 25.1.2-beta → 25.1.4-build-25191-0102

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/bin/gulpfile.js +1 -1
  2. package/bin/index-custom.js +1 -1
  3. package/bin/localization-builder.js +1 -1
  4. package/bin/nspell-index.js +1 -1
  5. package/bin/nspell.webpack.config.js +1 -1
  6. package/bin/webpack-externals.js +1 -1
  7. package/bin/webpack.config.js +1 -1
  8. package/dist/dx.richedit.css +1 -1
  9. package/dist/dx.richedit.d.ts +1 -2
  10. package/dist/dx.richedit.js +1374 -1304
  11. package/dist/dx.richedit.min.js +2 -2
  12. package/index.d.ts +1 -1
  13. package/index.js +1 -1
  14. package/lib/client/client-rich-edit.js +2 -2
  15. package/lib/client/commands/commands.js +0 -3
  16. package/lib/client/commands/mail-merge-command.js +3 -2
  17. package/lib/client/commands/open-document-command.js +4 -0
  18. package/lib/client/formats/docx/export/exporters/relations/base.js +2 -2
  19. package/lib/client/formats/docx/import/destination/numbering/numberings-destination.js +1 -1
  20. package/lib/client/formats/docx/import/destination/runs/text-destination.js +1 -1
  21. package/lib/client/model-api/character-properties.js +13 -17
  22. package/lib/client/model-api/document.js +2 -0
  23. package/lib/client/model-api/images/image-enums.js +1 -0
  24. package/lib/client/model-api/images/images.js +1 -1
  25. package/lib/client/model-api/table/enums.js +4 -0
  26. package/lib/client/public/commands/enum.d.ts +1 -2
  27. package/lib/client/public/commands/enum.js +1 -1
  28. package/lib/client/public/options.d.ts +1 -0
  29. package/lib/client/public/ribbon/item-ids.js +1 -0
  30. package/lib/client/public/rich-edit.d.ts +5 -5
  31. package/lib/client/ribbon/toolbar-items/index.d.ts +1 -1
  32. package/lib/client/ribbon/toolbar-items/toolbar-item-template-creators/index.d.ts +7 -7
  33. package/lib/client/utils/focus-helper.js +22 -5
  34. package/lib/common/canvas/canvas-manager.js +1 -1
  35. package/lib/common/canvas/canvas-scroll-manager.js +1 -1
  36. package/lib/common/canvas/canvas-size-info.d.ts +1 -0
  37. package/lib/common/canvas/canvas-size-info.js +2 -2
  38. package/lib/common/canvas/renderes/view-manager.js +4 -3
  39. package/lib/common/commands/client-command.d.ts +1 -2
  40. package/lib/common/commands/client-command.js +0 -1
  41. package/lib/common/commands/command-manager.js +0 -2
  42. package/lib/common/commands/dialogs/dialog-layout-options-command.js +0 -3
  43. package/lib/common/commands/document/print-document-on-client-command.d.ts +2 -0
  44. package/lib/common/commands/document/print-document-on-client-command.js +46 -18
  45. package/lib/common/commands/floating-objects/floating-object-drag-drop-change-position-command.js +0 -3
  46. package/lib/common/commands/layout/apply-style-command.d.ts +2 -2
  47. package/lib/common/commands/layout/apply-style-command.js +3 -4
  48. package/lib/common/commands/layout/toggle-show-hidden-symbols-command.js +0 -3
  49. package/lib/common/commands/toc/set-paragraph-level-command.js +1 -1
  50. package/lib/common/formats/html/export/html-export.d.ts +8 -0
  51. package/lib/common/formats/html/export/html-export.js +49 -26
  52. package/lib/common/formats/html/import/containers/runs.d.ts +2 -1
  53. package/lib/common/formats/html/import/containers/runs.js +2 -1
  54. package/lib/common/formats/html/import/html-importer.d.ts +0 -1
  55. package/lib/common/formats/html/import/html-importer.js +2 -3
  56. package/lib/common/formats/html/import/html-model-inserter.js +4 -0
  57. package/lib/common/formats/html/import/importers/list-base.js +2 -1
  58. package/lib/common/formats/rtf/utils/list-level-display-text-helper.js +2 -2
  59. package/lib/common/input-controller.js +2 -2
  60. package/lib/common/layout/document-layout.js +4 -1
  61. package/lib/common/layout/main-structures/layout-row.d.ts +1 -2
  62. package/lib/common/layout/main-structures/layout-row.js +0 -1
  63. package/lib/common/layout-formatter/row/result.js +1 -1
  64. package/lib/common/layout-formatter/row/size-engine/row-formatting-info.d.ts +1 -0
  65. package/lib/common/layout-formatter/row/size-engine/row-formatting-info.js +2 -2
  66. package/lib/common/layout-formatter/row/size-engine/row-sizes-manager.d.ts +2 -0
  67. package/lib/common/layout-formatter/row/size-engine/row-sizes-manager.js +2 -0
  68. package/lib/common/layout-formatter/row/states.js +1 -1
  69. package/lib/common/layout-formatter/row/tab-info.d.ts +2 -1
  70. package/lib/common/layout-formatter/row/tab-info.js +40 -40
  71. package/lib/common/layout-formatter/row/word-holder.js +1 -1
  72. package/lib/common/model/borders/border-info.js +1 -1
  73. package/lib/common/model/caches/images.d.ts +4 -1
  74. package/lib/common/model/caches/images.js +6 -2
  75. package/lib/common/model/character/character-properties.d.ts +1 -1
  76. package/lib/common/model/character/character-properties.js +14 -2
  77. package/lib/common/model/fields/field.d.ts +1 -1
  78. package/lib/common/model/fields/field.js +4 -3
  79. package/lib/common/model/fields/parsers/field-code-parser-doc-variable.d.ts +1 -1
  80. package/lib/common/model/fields/parsers/field-code-parser.d.ts +1 -1
  81. package/lib/common/model/fields/tree-creator.js +1 -1
  82. package/lib/common/model/history/items/character-properties-history-items.d.ts +2 -1
  83. package/lib/common/model/history/items/character-properties-history-items.js +3 -2
  84. package/lib/common/model/manipulators/character-properties-manipulator.js +2 -2
  85. package/lib/common/model/manipulators/i-properties-manipulator.d.ts +1 -1
  86. package/lib/common/model/manipulators/picture-manipulator/picture-manipulator.js +2 -2
  87. package/lib/common/model/options/fonts.d.ts +1 -1
  88. package/lib/common/model/paragraph/paragraph-style.d.ts +1 -0
  89. package/lib/common/model/paragraph/paragraph-style.js +3 -0
  90. package/lib/common/scroll/canvas-states.d.ts +4 -4
  91. package/lib/common/scroll/model-states.d.ts +5 -5
  92. package/lib/common/ui/ruler/controls/ruler.js +3 -7
  93. package/lib/common/ui/ruler/controls/vertical-line.js +2 -1
  94. package/package.json +3 -3
  95. package/lib/client/formats/docx/import/destination/field/field-data-destination.d.ts +0 -0
  96. package/lib/client/formats/docx/import/destination/field/field-data-destination.js +0 -0
  97. package/lib/client/formats/docx/import/destination/field/form-field-destination.d.ts +0 -0
  98. package/lib/client/formats/docx/import/destination/field/form-field-destination.js +0 -0
  99. package/lib/client/formats/docx/import/destination/paragraph-properties/paragraph-mark-run-properties-destination.d.ts +0 -0
  100. package/lib/client/formats/docx/import/destination/paragraph-properties/paragraph-mark-run-properties-destination.js +0 -0
  101. package/lib/common/commands/layout/toggle-allow-zoom-command.d.ts +0 -7
  102. package/lib/common/commands/layout/toggle-allow-zoom-command.js +0 -17
  103. package/lib/common/formats/rtf/import/properties-normalization/tmp.d.ts +0 -0
  104. package/lib/common/formats/rtf/import/properties-normalization/tmp.js +0 -0
  105. package/lib/common/layout-formatter/box/generator/multi-dimension-iterator.d.ts +0 -0
  106. package/lib/common/layout-formatter/box/generator/multi-dimension-iterator.js +0 -0
  107. package/lib/common/layout-formatter/table/layout-row-index-helper.d.ts +0 -0
  108. package/lib/common/layout-formatter/table/layout-row-index-helper.js +0 -0
package/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * DevExpress WebRichEdit (index.d.ts)
3
- * Version: 25.1.2
3
+ * Version: 25.1.4
4
4
  * Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
5
5
  * License: https://www.devexpress.com/Support/EULAs
6
6
  */
package/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * DevExpress WebRichEdit (index.js)
3
- * Version: 25.1.2
3
+ * Version: 25.1.4
4
4
  * Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
5
5
  * License: https://www.devexpress.com/Support/EULAs
6
6
  */
@@ -62,8 +62,8 @@ export class ClientRichEdit {
62
62
  this.rawDataSource = settings.rawDataSource;
63
63
  this.contextMenuSettings = settings.contextMenuSettings;
64
64
  this.fullScreenHelper = new FullScreenHelper(element);
65
- if ("eyJsaWNlbnNlS2V5IjoiZXdvZ0lDSm1iM0p0WVhRaU9pQXhMQW9nSUNKcGJuUmxjbTVoYkZWellXZGxTV1FpT2lBaVJWTTBSVlk0YmxKaVpYVk9OVGRWVEdSbFlVeHhZeUlLZlE9PS5MN1o0YXlNMTRnUWtScExSaEt6MGZSMDU5d1E5cWhhMi9ESThnRG83SEJxbFM2L1BMNVRtTmRrTVRzMmdUL3oyUFVQZDgyZGRMM0dsbjZiQUM0aXB4cUI0Y1ozT1FkZjhVc1pmMm9TOCs5SnliZGdCS1diYnFseXdEMUVFbkwwNmV0eWdtQT09In0=")
66
- config(JSON.parse(atob("eyJsaWNlbnNlS2V5IjoiZXdvZ0lDSm1iM0p0WVhRaU9pQXhMQW9nSUNKcGJuUmxjbTVoYkZWellXZGxTV1FpT2lBaVJWTTBSVlk0YmxKaVpYVk9OVGRWVEdSbFlVeHhZeUlLZlE9PS5MN1o0YXlNMTRnUWtScExSaEt6MGZSMDU5d1E5cWhhMi9ESThnRG83SEJxbFM2L1BMNVRtTmRrTVRzMmdUL3oyUFVQZDgyZGRMM0dsbjZiQUM0aXB4cUI0Y1ozT1FkZjhVc1pmMm9TOCs5SnliZGdCS1diYnFseXdEMUVFbkwwNmV0eWdtQT09In0=")));
65
+ if ("eyJsaWNlbnNlS2V5IjoiZXdvZ0lDSm1iM0p0WVhRaU9pQXhMQW9nSUNKcGJuUmxjbTVoYkZWellXZGxTV1FpT2lBaVZqSlJjRkZ0U2xaWVYzazJUbVY0YTNFNVdHczVieUlLZlE9PS5EMTNKeDFkWmJlWFE0bGVWQ05XZnk5U2FLeWFHbmxMOE1xYkF2YzloQ3FVZTlBajJWYzJUS2RaU01RR05xVkVkSjMrTWZQKzQrQTBqMFhCSGxEczdEV2xpWFlNK01EMEVCaEJVQ0JTVzVmeWRGSzhyOGpEMDRzV2ZKYS9CTDRFTGdLOWZpZz09In0=")
66
+ config(JSON.parse(atob("eyJsaWNlbnNlS2V5IjoiZXdvZ0lDSm1iM0p0WVhRaU9pQXhMQW9nSUNKcGJuUmxjbTVoYkZWellXZGxTV1FpT2lBaVZqSlJjRkZ0U2xaWVYzazJUbVY0YTNFNVdHczVieUlLZlE9PS5EMTNKeDFkWmJlWFE0bGVWQ05XZnk5U2FLeWFHbmxMOE1xYkF2YzloQ3FVZTlBajJWYzJUS2RaU01RR05xVkVkSjMrTWZQKzQrQTBqMFhCSGxEczdEV2xpWFlNK01EMEVCaEJVQ0JTVzVmeWRGSzhyOGpEMDRzV2ZKYS9CTDRFTGdLOWZpZz09In0=")));
67
67
  this.prepareElement(element, settings);
68
68
  this.initDefaultFontsAndStyles();
69
69
  this.initBars(settings.ribbon, settings.fonts);
@@ -441,9 +441,6 @@ export function executeApiCommandCore(commandManager, commandId, parameter) {
441
441
  break;
442
442
  }
443
443
  ;
444
- case ViewTabCommandId.ToggleAllowZoom:
445
- parameter = undefined;
446
- break;
447
444
  case HeaderAndFooterTabCommandId.GoToPageHeader:
448
445
  parameter = undefined;
449
446
  break;
@@ -8,7 +8,6 @@ import { InsertParagraphManipulatorParams } from '../../common/model/manipulator
8
8
  import { RangeCopy } from '../../common/model/manipulators/range/create-range-copy-operation';
9
9
  import { InsertTextManipulatorParams } from '../../common/model/manipulators/text-manipulator/insert-text-manipulator-params';
10
10
  import { ControlOptions, DocumentCapability } from '../../common/model/options/control';
11
- import { RichUtils } from '../../common/model/rich-utils';
12
11
  import { RunType } from '../../common/model/runs/run-type';
13
12
  import { SectionStartType } from '../../common/model/section/enums';
14
13
  import { SubDocumentIntervals, SubDocumentPosition } from '../../common/model/sub-document';
@@ -125,8 +124,10 @@ export class MailMergeCommand extends CommandBase {
125
124
  replaceMergeFieldsInSubDocument(modelManager, record, lastProcessedPositionInMainSubDocument, subDoc) {
126
125
  const processField = (parser) => {
127
126
  if (parser instanceof FieldCodeParserMailMerge) {
127
+ parser.update(null);
128
128
  const fieldName = parser.getMergeFieldName();
129
- return RichUtils.replaceParagraphEndCharsWithLineBreak(this.getResultByFieldName(record, fieldName));
129
+ const simpleText = this.getResultByFieldName(record, fieldName);
130
+ return parser.getFormattedResult(simpleText);
130
131
  }
131
132
  return null;
132
133
  };
@@ -71,6 +71,8 @@ export class OpenDocumentCommand extends CommandBase {
71
71
  return false;
72
72
  this.beforeOpen();
73
73
  core.activeDocumentImporter.importFromFile(file, this.control.modelManager.richOptions, (documentModel, formatImagesImporter) => {
74
+ if (core.isDisposed)
75
+ return;
74
76
  core.activeDocumentImporter = null;
75
77
  this.openCore(fileName, format, documentModel, formatImagesImporter, extension);
76
78
  if (!this.suppressUpdateFields)
@@ -78,6 +80,8 @@ export class OpenDocumentCommand extends CommandBase {
78
80
  if (callback)
79
81
  callback(true, null);
80
82
  }, (reason) => {
83
+ if (core.isDisposed)
84
+ return;
81
85
  core.activeDocumentImporter = null;
82
86
  this.control.loadingPanelManager.loadingPanel.setVisible(false);
83
87
  NewDocumentCommand.newDocumentInner.call(this);
@@ -21,9 +21,9 @@ export class RelationsBaseExporter extends ExporterBaseWithRootElement {
21
21
  urlEncodeAsciiSpecialSymbols(url) {
22
22
  if (url) {
23
23
  if (url.indexOf(' ') >= 0)
24
- url = url.replace(' ', '%20');
24
+ url = url.replace(/ /g, '%20');
25
25
  if (url.indexOf('\'') >= 0)
26
- url = url.replace("\'", '%27');
26
+ url = url.replace(/'/g, '%27');
27
27
  }
28
28
  return url;
29
29
  }
@@ -438,7 +438,7 @@ export class ListLevelFormatStringDestination extends ListLevelElementDestinatio
438
438
  }
439
439
  convertFormatString(value) {
440
440
  const regex = new RegExp(/%\d/);
441
- let result = value.replace('{', '{{').replace('}', '}}');
441
+ let result = value.replace(/{/g, '{{').replace(/}/g, '}}');
442
442
  let match = result.match(regex);
443
443
  if (match) {
444
444
  do {
@@ -16,6 +16,6 @@ export class TextDestination extends ElementDestination {
16
16
  return true;
17
17
  }
18
18
  replaceLineBreakOnSpace(text) {
19
- return text.replace('\n', ' ');
19
+ return text.replace(/\n/g, ' ');
20
20
  }
21
21
  }
@@ -40,7 +40,7 @@ export function convertToCharacterPropertiesApi(properties, colorProvider) {
40
40
  return value;
41
41
  }
42
42
  export function convertFromCharacterPropertiesApi(properties, fontInfoCache, parameterIndex, setRestAsUndefined, propsCoreTemplate) {
43
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
43
+ var _a, _b, _c, _d, _e, _f, _g, _h;
44
44
  properties = ApiParametersChecker.check(properties, parameterIndex, false, [
45
45
  ApiParametersChecker.objectDescriptor('properties', 'CharacterProperties', (val) => val)
46
46
  ]);
@@ -60,31 +60,27 @@ export function convertFromCharacterPropertiesApi(properties, fontInfoCache, par
60
60
  propsCoreTemplate.fontItalic = (_d = ApiParametersChecker.check(properties.italic, parameterIndex, true, [
61
61
  ApiParametersChecker.booleanDescriptor('properties.italic', (val) => val)
62
62
  ])) !== null && _d !== void 0 ? _d : propsCoreTemplate.fontItalic;
63
- propsCoreTemplate.fontInfo = (_e = ApiParametersChecker.check(properties.fontName, parameterIndex, true, [
64
- ApiParametersChecker.stringDescriptor('properties.fontName', (val) => {
65
- const fontInfo = fontInfoCache.getItemByName(val);
66
- if (!fontInfo)
67
- throw Error('Unknown font name');
68
- return fontInfo;
69
- }, false)
70
- ])) !== null && _e !== void 0 ? _e : propsCoreTemplate.fontInfo;
71
- propsCoreTemplate.fontSize = (_f = ApiParametersChecker.check(properties.size, parameterIndex, true, [
63
+ const fontInfo = ApiParametersChecker.check(properties.fontName, parameterIndex, true, [
64
+ ApiParametersChecker.stringDescriptor('properties.fontName', (value) => fontInfoCache.getItemByName(value), false)
65
+ ]);
66
+ propsCoreTemplate.fontInfo = fontInfo === undefined ? propsCoreTemplate.fontInfo : fontInfo !== null && fontInfo !== void 0 ? fontInfo : fontInfoCache.addFont(properties.fontName, properties.fontName);
67
+ propsCoreTemplate.fontSize = (_e = ApiParametersChecker.check(properties.size, parameterIndex, true, [
72
68
  ApiParametersChecker.numberDescriptor('properties.size', (val) => val, 0, 601)
73
- ])) !== null && _f !== void 0 ? _f : propsCoreTemplate.fontSize;
74
- propsCoreTemplate.hidden = (_g = ApiParametersChecker.check(properties.hidden, parameterIndex, true, [
69
+ ])) !== null && _e !== void 0 ? _e : propsCoreTemplate.fontSize;
70
+ propsCoreTemplate.hidden = (_f = ApiParametersChecker.check(properties.hidden, parameterIndex, true, [
75
71
  ApiParametersChecker.booleanDescriptor('properties.hidden', (val) => val)
76
- ])) !== null && _g !== void 0 ? _g : propsCoreTemplate.hidden;
72
+ ])) !== null && _f !== void 0 ? _f : propsCoreTemplate.hidden;
77
73
  const shadigInfoColor = ApiParametersChecker.check(properties.backColor, parameterIndex, true, ModelParametersChecker.colorDescriptors('properties.backColor'));
78
74
  propsCoreTemplate.shadingInfo = shadigInfoColor === undefined ? propsCoreTemplate.shadingInfo :
79
75
  ShadingInfo.createByColor(ColorModelInfo.makeByColor(shadigInfoColor));
80
- propsCoreTemplate.script = (_h = ApiParametersChecker.check(properties.script, parameterIndex, true, [
76
+ propsCoreTemplate.script = (_g = ApiParametersChecker.check(properties.script, parameterIndex, true, [
81
77
  ApiParametersChecker.enumDescriptor('properties.script', (val) => val, CharacterPropertiesScriptApi, 'CharacterPropertiesScript')
82
- ])) !== null && _h !== void 0 ? _h : propsCoreTemplate.script;
78
+ ])) !== null && _g !== void 0 ? _g : propsCoreTemplate.script;
83
79
  const underlineColor = ApiParametersChecker.check(properties.underlineColor, parameterIndex, true, ModelParametersChecker.colorDescriptors('properties.underlineColor'));
84
80
  propsCoreTemplate.underlineColor = underlineColor === undefined ? propsCoreTemplate.underlineColor : ColorModelInfo.makeByColor(underlineColor);
85
- propsCoreTemplate.underlineWordsOnly = (_j = ApiParametersChecker.check(properties.underlineWordsOnly, parameterIndex, true, [
81
+ propsCoreTemplate.underlineWordsOnly = (_h = ApiParametersChecker.check(properties.underlineWordsOnly, parameterIndex, true, [
86
82
  ApiParametersChecker.booleanDescriptor('properties.underlineWordsOnly', (val) => val)
87
- ])) !== null && _j !== void 0 ? _j : propsCoreTemplate.underlineWordsOnly;
83
+ ])) !== null && _h !== void 0 ? _h : propsCoreTemplate.underlineWordsOnly;
88
84
  const strikeout = ApiParametersChecker.check(properties.strikeout, parameterIndex, true, [
89
85
  ApiParametersChecker.booleanDescriptor('properties.strikeout', (val) => val)
90
86
  ]);
@@ -7,6 +7,7 @@ import { HyperlinkCollection } from './collections/hyperlink-collection';
7
7
  import { ListCollection } from './collections/numbered-list-collection';
8
8
  import { SectionCollection } from './collections/section-collection';
9
9
  import { SubDocumentCollection as SubDocumentCollection } from './collections/sub-documents-collection';
10
+ import { FontCorrector } from '../../common/model/creator/font-corrector';
10
11
  export class RichEditDocumentApi {
11
12
  constructor(processor) {
12
13
  this._processor = processor;
@@ -105,6 +106,7 @@ export class RichEditDocumentApi {
105
106
  this._processor.modelManager.model.defaultCharacterProperties =
106
107
  this._processor.modelManager.model.cache.maskedCharacterPropertiesCache.getItem(propertiesCore);
107
108
  NumberMapUtils.forEach(this._processor.modelManager.model.subDocuments, (sd) => sd.resetMergedFormattingCache(ResetFormattingCacheType.All));
109
+ new FontCorrector(this._processor.modelManager.modelManipulator, this._processor.modelManager.model, this._processor.modelManager.richOptions.fonts).correct();
108
110
  this._processor.layoutFormatterManager.restartManager.restartAllLayout();
109
111
  this._processor.endUpdate();
110
112
  }
@@ -1,3 +1,4 @@
1
+ import { AnchorObjectVerticalPositionAlignment } from '../../../common/model/floating-objects/enums';
1
2
  export var FloatingObjectHorizontalPositionTypeApi;
2
3
  (function (FloatingObjectHorizontalPositionTypeApi) {
3
4
  FloatingObjectHorizontalPositionTypeApi[FloatingObjectHorizontalPositionTypeApi["Aligned"] = 0] = "Aligned";
@@ -197,7 +197,7 @@ export class ImagesApi {
197
197
  applyVerticalPosition(verticalPosition, anchorInfo);
198
198
  const anchorPictureInfo = new AnchorPictureInfo(new PictureSize(true, 0, cacheInfo, new Size(100, 100)), shape, anchorInfo, new NonVisualDrawingObjectInfo(), new NonVisualDrawingObjectInfo());
199
199
  anchorPictureInfo.containerProperties.description = options.description;
200
- this._processor.modelManager.modelManipulator.picture.insertAnchoredPictureViaHistory(new SubDocumentPosition(this._subDocument, position), inputPos.charPropsBundle, anchorPictureInfo, new ImageLoadingOptions(false, size ? new Size(size.width, size.height) : undefined, (_picInterval, _cacheInfo) => setTimeout(() => {
200
+ this._processor.modelManager.modelManipulator.picture.insertAnchoredPictureViaHistory(new SubDocumentPosition(this._subDocument, position), inputPos.charPropsBundle, anchorPictureInfo, ImageLoadingOptions.initByActualSize(size ? new Size(size.width, size.height) : undefined, (_picInterval, _cacheInfo) => setTimeout(() => {
201
201
  callback(getFloatingImageApiFromRun(this._processor, this._subDocument, this._subDocument.getRunAndIndexesByPosition(position)));
202
202
  }, 0)));
203
203
  this._processor.endUpdate();
@@ -1,3 +1,7 @@
1
+ import { ParagraphAlignment } from '../../../common/model/paragraph/paragraph-properties';
2
+ import { BorderLineStyle } from '../../../common/model/borders/enums';
3
+ import { TableCellVerticalAlignment } from '../../../common/model/tables/secondary-structures/table-base-structures';
4
+ import { TableHeightUnitType, TableWidthUnitType } from '../../../common/model/tables/secondary-structures/table-units';
1
5
  export var BorderLineStyleApi;
2
6
  (function (BorderLineStyleApi) {
3
7
  BorderLineStyleApi[BorderLineStyleApi["Nil"] = -1] = "Nil";
@@ -150,8 +150,7 @@ export declare enum ViewTabCommandId {
150
150
  SwitchToPrintLayout = 406,
151
151
  ToggleShowHorizontalRuler = 94,
152
152
  ToggleFullScreen = 98,
153
- ChangeZoomLevel = 460,
154
- ToggleAllowZoom = 461
153
+ ChangeZoomLevel = 460
155
154
  }
156
155
  export declare enum HeaderAndFooterTabCommandId {
157
156
  GoToPageHeader = 227,
@@ -1,3 +1,4 @@
1
+ import { RichEditClientCommand as Command } from '../../../common/commands/client-command';
1
2
  export var FileTabCommandId;
2
3
  (function (FileTabCommandId) {
3
4
  FileTabCommandId[FileTabCommandId["CreateDocument"] = 412] = "CreateDocument";
@@ -158,7 +159,6 @@ export var ViewTabCommandId;
158
159
  ViewTabCommandId[ViewTabCommandId["ToggleShowHorizontalRuler"] = 94] = "ToggleShowHorizontalRuler";
159
160
  ViewTabCommandId[ViewTabCommandId["ToggleFullScreen"] = 98] = "ToggleFullScreen";
160
161
  ViewTabCommandId[ViewTabCommandId["ChangeZoomLevel"] = 460] = "ChangeZoomLevel";
161
- ViewTabCommandId[ViewTabCommandId["ToggleAllowZoom"] = 461] = "ToggleAllowZoom";
162
162
  })(ViewTabCommandId || (ViewTabCommandId = {}));
163
163
  export var HeaderAndFooterTabCommandId;
164
164
  (function (HeaderAndFooterTabCommandId) {
@@ -158,6 +158,7 @@ export interface IRichEditFontsSettings {
158
158
  export interface IFontSettings {
159
159
  name: string;
160
160
  fontFamily: string;
161
+ useGoogleFonts?: boolean;
161
162
  italicFontUri?: string;
162
163
  boldFontUri?: string;
163
164
  boldItalicFontUri?: string;
@@ -1,3 +1,4 @@
1
+ import { RichEditClientCommand as Command } from '../../../common/commands/client-command';
1
2
  export var FileTabItemId;
2
3
  (function (FileTabItemId) {
3
4
  FileTabItemId[FileTabItemId["CreateNewDocument"] = 412] = "CreateNewDocument";
@@ -118,20 +118,20 @@ declare enum PrintModeApi {
118
118
  Html = 1,
119
119
  Pdf = 2
120
120
  }
121
- export { CharacterPropertiesApi as CharacterProperties, CharacterPropertiesScriptApi as CharacterPropertiesScript, ICharacterProperties } from '../model-api/character-properties';
121
+ export { CharacterPropertiesApi as CharacterProperties, CharacterPropertiesScriptApi as CharacterPropertiesScript, type ICharacterProperties } from '../model-api/character-properties';
122
122
  export { HyperlinkInfoApi as HyperlinkInfo } from '../model-api/field';
123
123
  export { IntervalApi as Interval } from '../model-api/interval';
124
124
  export { ListTypeApi as ListType, ListLevelNumberAlignmentApi as ListLevelNumberAlignment, ListLevelFormatApi as ListLevelFormat } from '../model-api/lists/enums';
125
125
  export { ListLevelSettingsApi as ListLevelSettings } from '../model-api/lists/list-level-settings';
126
126
  export { ListApi as List } from '../model-api/lists/lists';
127
- export { ParagraphAlignmentApi as ParagraphAlignment, ParagraphLineSpacingTypeApi as ParagraphLineSpacingType, ParagraphFirstLineIndentApi as ParagraphFirstLineIndent, ParagraphPropertiesApi as ParagraphProperties, ParagraphApi as Paragraph, IParagraphProperties } from '../model-api/paragraph';
128
- export { MarginsApi as Margins, SizeApi as Size, IMargins, } from '../model-api/size';
127
+ export { ParagraphAlignmentApi as ParagraphAlignment, ParagraphLineSpacingTypeApi as ParagraphLineSpacingType, ParagraphFirstLineIndentApi as ParagraphFirstLineIndent, ParagraphPropertiesApi as ParagraphProperties, ParagraphApi as Paragraph, type IParagraphProperties } from '../model-api/paragraph';
128
+ export { MarginsApi as Margins, SizeApi as Size, type IMargins, } from '../model-api/size';
129
129
  export { SubDocumentTypeApi as SubDocumentType, HeaderFooterTypeApi as HeaderFooterType, SectionBreakTypeApi as SectionBreakType, SubDocumentApi as SubDocument } from '../model-api/sub-document';
130
130
  export { BookmarkApi as Bookmark } from '../model-api/bookmark';
131
131
  export { BookmarkClientApi as BookmarkBase } from '../api/bookmark';
132
132
  export { PaperSizeApi as PaperSize } from '../model-api/section';
133
133
  export { TableApi as Table } from '../model-api/table/table';
134
- export { TableBordersBaseApi as TableBordersBase, TableBordersApi as TableBorders, TableCellBordersApi as TableCellBorders, TableBorderApi as TableBorder, ITableBorders, ITableCellBorders, } from '../model-api/table/table-borders';
134
+ export { TableBordersBaseApi as TableBordersBase, TableBordersApi as TableBorders, TableCellBordersApi as TableCellBorders, TableBorderApi as TableBorder, type ITableBorders, type ITableCellBorders, } from '../model-api/table/table-borders';
135
135
  export { TableStyleOptionsApi as TableStyleOptions } from '../model-api/table/table-style-options';
136
136
  export { TableWidthTypeApi as TableWidthType, TableContentVerticalAlignmentApi as TableContentVerticalAlignment, TableContentHorizontalAlignmentApi as TableContentHorizontalAlignment, TableRowHeightTypeApi as TableRowHeightType, BorderLineStyleApi as BorderLineStyle, } from '../model-api/table/enums';
137
137
  export { SectionApi as Section } from '../model-api/section';
@@ -175,7 +175,7 @@ export { TableLayoutTabCommandId };
175
175
  export { FloatingObjectsFormatTabCommandId };
176
176
  export { ContextMenuCommandId };
177
177
  export { WrapTypeApi as WrapType, WrapSideApi as WrapSide, FloatingObjectHorizontalAlignmentApi as FloatingObjectHorizontalAlignment, FloatingObjectHorizontalAnchorElementApi as FloatingObjectHorizontalAnchorElement, FloatingObjectHorizontalPositionTypeApi as FloatingObjectHorizontalPositionType, FloatingObjectVerticalAnchorElementApi as FloatingObjectVerticalAnchorElement, FloatingObjectVerticalAlignmentApi as FloatingObjectVerticalAlignment, FloatingObjectVerticalPositionTypeApi as FloatingObjectVerticalPositionType } from '../model-api/images/image-enums';
178
- export { HorizontalAbsolutePositionApi as HorizontalAbsolutePosition, HorizontalAlignedPositionApi as HorizontalAlignedPosition, HorizontalRelativePositionApi as HorizontalRelativePosition, VerticalAbsolutePositionApi as VerticalAbsolutePosition, VerticalAlignedPositionApi as VerticalAlignedPosition, VerticalRelativePositionApi as VerticalRelativePosition, IFloatingObjectDistanceApi as IFloatingObjectDistance, IHorizontalAlignedPositionApi as IHorizontalAlignedPosition, IHorizontalAbsolutePositionApi as IHorizontalAbsolutePosition, IHorizontalRelativePositionApi as IHorizontalRelativePosition, IVerticalAlignedPositionApi as IVerticalAlignedPosition, IVerticalAbsolutePositionApi as IVerticalAbsolutePosition, IVerticalRelativePositionApi as IVerticalRelativePosition, IInsertedFloatingImageOptionsApi as IInsertedFloatingImageOptions, IInsertedInlineImageOptionsApi as IInsertedInlineImageOptions, } from '../model-api/images/image-interfaces';
178
+ export { HorizontalAbsolutePositionApi as HorizontalAbsolutePosition, HorizontalAlignedPositionApi as HorizontalAlignedPosition, HorizontalRelativePositionApi as HorizontalRelativePosition, VerticalAbsolutePositionApi as VerticalAbsolutePosition, VerticalAlignedPositionApi as VerticalAlignedPosition, VerticalRelativePositionApi as VerticalRelativePosition, type IFloatingObjectDistanceApi as IFloatingObjectDistance, type IHorizontalAlignedPositionApi as IHorizontalAlignedPosition, type IHorizontalAbsolutePositionApi as IHorizontalAbsolutePosition, type IHorizontalRelativePositionApi as IHorizontalRelativePosition, type IVerticalAlignedPositionApi as IVerticalAlignedPosition, type IVerticalAbsolutePositionApi as IVerticalAbsolutePosition, type IVerticalRelativePositionApi as IVerticalRelativePosition, type IInsertedFloatingImageOptionsApi as IInsertedFloatingImageOptions, type IInsertedInlineImageOptionsApi as IInsertedInlineImageOptions, } from '../model-api/images/image-interfaces';
179
179
  export { FloatingImageApi as FloatingImage } from '../model-api/images/floating-image';
180
180
  export { InlineImageApi as InlineImage } from '../model-api/images/inline-image';
181
181
  export { ImageApi as Image } from '../model-api/images/image';
@@ -4,7 +4,7 @@ export { ToolbarMenuItem } from './toolbar-menu-item';
4
4
  export { ToolbarSelectBoxItem } from './toolbar-select-box-item';
5
5
  export { ToolbarSeparatorItem } from './toolbar-separator-item';
6
6
  export { ToolbarItemBase } from './toolbar-item-base';
7
- export { InteractiveItemOptions, ToolbarInteractiveItem } from './toolbar-interactive-item';
7
+ export { type InteractiveItemOptions, ToolbarInteractiveItem } from './toolbar-interactive-item';
8
8
  export { ToolbarSubMenuItem } from './toolbar-sub-menu-item';
9
9
  export { ToolbarColorBoxItem } from './toolbar-color-box-item';
10
10
  export { ToolbarNumberBoxItem } from './toolbar-number-box-item';
@@ -1,8 +1,8 @@
1
- export { ButtonToolbarItemTemplateCreator, IButtonToolbarItemTemplateCreatorOptions } from './button-toolbar-item-template-creator';
2
- export { ButtonGroupToolbarItemTemplateCreator, IButtonGroupToolbarItemTemplateCreatorOptions } from './button-group-toolbar-item-template-creator';
3
- export { MenuToolbarItemTemplateCreator, IMenuToolbarItemTemplateCreatorOptions } from './menu-toolbar-item-template-creator';
4
- export { SelectBoxToolbarItemTemplateCreator, ISelectBoxToolbarItemTemplateCreatorOptions } from './select-box-toolbar-item-template-creator';
1
+ export { ButtonToolbarItemTemplateCreator, type IButtonToolbarItemTemplateCreatorOptions } from './button-toolbar-item-template-creator';
2
+ export { ButtonGroupToolbarItemTemplateCreator, type IButtonGroupToolbarItemTemplateCreatorOptions } from './button-group-toolbar-item-template-creator';
3
+ export { MenuToolbarItemTemplateCreator, type IMenuToolbarItemTemplateCreatorOptions } from './menu-toolbar-item-template-creator';
4
+ export { SelectBoxToolbarItemTemplateCreator, type ISelectBoxToolbarItemTemplateCreatorOptions } from './select-box-toolbar-item-template-creator';
5
5
  export { SeparatorToolbarItemTemplateCreator } from './separator-toolbar-item-template-creator';
6
- export { NumberBoxToolbarItemTemplateCreator, INumberBoxToolbarItemTemplateCreatorOptions } from './number-box-toolbar-item-template-creator';
7
- export { ColorBoxToolbarItemTemplateCreator, IColorBoxToolbarItemTemplateCreatorOptions } from './color-box-toolbar-item-template-creator';
8
- export { IToolbarItemTemplateCreator } from './base-types';
6
+ export { NumberBoxToolbarItemTemplateCreator, type INumberBoxToolbarItemTemplateCreatorOptions } from './number-box-toolbar-item-template-creator';
7
+ export { ColorBoxToolbarItemTemplateCreator, type IColorBoxToolbarItemTemplateCreatorOptions } from './color-box-toolbar-item-template-creator';
8
+ export { type IToolbarItemTemplateCreator } from './base-types';
@@ -1,3 +1,4 @@
1
+ var _a;
1
2
  export class FocusHelper {
2
3
  static preventFocusOnClick(element) {
3
4
  return new FocusBlocker(element);
@@ -10,23 +11,24 @@ class FocusBlocker {
10
11
  this.addEventListeners(target);
11
12
  }
12
13
  addEventListeners(element) {
13
- element.addEventListener("pointerdown", this.onPointerDownBinded);
14
+ element.addEventListener("mousedown", this.onPointerDownBinded);
14
15
  }
15
16
  removeEventListeners(element) {
16
- element.removeEventListener("pointerdown", this.onPointerDownBinded);
17
+ element.removeEventListener("mousedown", this.onPointerDownBinded);
17
18
  }
18
19
  onPointerDown(event) {
19
20
  for (const element of event.composedPath()) {
20
- if (!(element instanceof HTMLElement))
21
- continue;
22
21
  if (element === this.target) {
23
22
  event.preventDefault();
24
23
  break;
25
24
  }
26
- if (!this.target.contains(element) || element.tabIndex > -1)
25
+ if (element instanceof Element && this.isFocusableElement(element))
27
26
  break;
28
27
  }
29
28
  }
29
+ isFocusableElement(element) {
30
+ return element.matches(FocusBlocker.focusableSelector);
31
+ }
30
32
  dispose() {
31
33
  if (this.target) {
32
34
  this.removeEventListeners(this.target);
@@ -34,3 +36,18 @@ class FocusBlocker {
34
36
  }
35
37
  }
36
38
  }
39
+ _a = FocusBlocker;
40
+ FocusBlocker.focusableSelectors = [
41
+ 'a[href]',
42
+ 'area[href]',
43
+ 'input',
44
+ 'select',
45
+ 'textarea',
46
+ 'button',
47
+ 'iframe',
48
+ 'object',
49
+ 'embed',
50
+ '[tabindex]:not([tabindex="-1"])',
51
+ '[contenteditable]:not([contenteditable="false"])'
52
+ ];
53
+ FocusBlocker.focusableSelector = _a.focusableSelectors.join(',');
@@ -254,7 +254,7 @@ export class CanvasManager extends BatchUpdatableObject {
254
254
  const canvasX = MixedSize.fromUI(DomUtils.getAbsolutePositionX(canvas));
255
255
  const canvasY = MixedSize.fromUI(DomUtils.getAbsolutePositionY(canvas));
256
256
  const offsetY = MixedSize.fromUI(canvas.scrollTop).addSize(clientY).subtractSize(canvasY).useScale(scaleY);
257
- const pageIndex = this.viewManager.layout.findPageIndexByOffsetY(offsetY.LayoutSize, this.sizes);
257
+ const pageIndex = this.viewManager.layout.findPageIndexByOffsetY(offsetY.LayoutSize * scaleY, this.sizes);
258
258
  const visibleAreaWidth = MixedSize.fromUI(this.sizes.getVisibleAreaWidth(false));
259
259
  const visibleAreaHeight = MixedSize.fromUI(this.sizes.getVisibleAreaHeight(false));
260
260
  if (checkScroll) {
@@ -69,7 +69,7 @@ export class CanvasScrollManager {
69
69
  height.clear().addLayoutSize(position.page.height);
70
70
  if (relativePosition === RelativePosition.Bottom)
71
71
  y.subtractUISize(this.sizes.getVisibleAreaHeight(false));
72
- y.addUISize(canvasState.getVerticalOffset(this.sizes));
72
+ y.addLayoutSize(canvasState.getVerticalOffset(this.sizes));
73
73
  if (relativePosition === RelativePosition.Inside) {
74
74
  let scrollTop = this.canvas.scrollTop;
75
75
  const scrollVisibleAreaHeight = this.sizes.getVisibleAreaHeight(false);
@@ -15,6 +15,7 @@ export declare class CanvasSizeInfo implements IControlHeightProvider {
15
15
  isInitialized(): boolean;
16
16
  initialize(page: HTMLElement, canvas: HTMLDivElement): void;
17
17
  getPageOffsetY(layoutPage: LayoutPage): number;
18
+ get zoomLevel(): number;
18
19
  private setVisibleAreaSize;
19
20
  getVisibleAreaWidth(includeScrollBars: boolean): number;
20
21
  getVisibleAreaHeight(includeScrollBars: boolean): number;
@@ -22,9 +22,9 @@ export class CanvasSizeInfo {
22
22
  this.setVisibleAreaSize(SizeUtils.getClientWidth(canvas), SizeUtils.getClientHeight(canvas));
23
23
  }
24
24
  getPageOffsetY(layoutPage) {
25
- const pageOffsetY = layoutPage.y + (this.topSpacing + layoutPage.index * this.betweenPageSpacing);
26
- return pageOffsetY * this.zoomLevelHolder.zoomLevel;
25
+ return layoutPage.y + (this.topSpacing + layoutPage.index * this.betweenPageSpacing);
27
26
  }
27
+ get zoomLevel() { return this.zoomLevelHolder.zoomLevel; }
28
28
  setVisibleAreaSize(width, height) {
29
29
  this.visibleAreaSize.width = width;
30
30
  this.visibleAreaSize.height = height;
@@ -28,6 +28,7 @@ import { ControlOptions, DocumentCapability } from '../../model/options/control'
28
28
  import { RichEditClientCommand } from '../../commands/client-command';
29
29
  import { ZoomLevelChange } from '../../model/changes/model/zoom-level';
30
30
  import { ModelChangeType } from '../../model/changes/enums';
31
+ import { MixedSize } from '../../../common/utils/mixed-size';
31
32
  export class ViewManager {
32
33
  get renderer() { return this.renderers[this.innerClientProperties.viewsSettings.viewType]; }
33
34
  get printLayoutRenderer() { return this.renderers[ViewType.PrintLayout]; }
@@ -113,9 +114,9 @@ export class ViewManager {
113
114
  const pageInfo = layoutSelection.selectionInfo.pageInfos[pageIndex];
114
115
  const item = pageInfo.oldItems[0];
115
116
  const layoutPage = this.layout.pages[pageIndex];
116
- const x = layoutPage.x + this.cache[pageIndex].page.offsetLeft + item.x;
117
- const y = this.sizes.getPageOffsetY(layoutPage) + item.y;
118
- this.inputController.setPosition(x, y);
117
+ const x = MixedSize.fromLayout(layoutPage.x + this.cache[pageIndex].page.offsetLeft + item.x).useScale(this.zoomLevel);
118
+ const y = MixedSize.fromLayout(this.sizes.getPageOffsetY(layoutPage) + item.y).useScale(this.zoomLevel);
119
+ this.inputController.setPosition(x.UISize, y.UISize);
119
120
  }
120
121
  }
121
122
  NotifySearchSelectionLayoutChanged() {
@@ -420,6 +420,5 @@ export declare enum RichEditClientCommand {
420
420
  NoSpellingSuggestions = 457,
421
421
  GetHtml = 458,
422
422
  CreateEmptyIfField = 459,
423
- ChangeZoomLevel = 460,
424
- ToggleAllowZoom = 461
423
+ ChangeZoomLevel = 460
425
424
  }
@@ -422,5 +422,4 @@ export var RichEditClientCommand;
422
422
  RichEditClientCommand[RichEditClientCommand["GetHtml"] = 458] = "GetHtml";
423
423
  RichEditClientCommand[RichEditClientCommand["CreateEmptyIfField"] = 459] = "CreateEmptyIfField";
424
424
  RichEditClientCommand[RichEditClientCommand["ChangeZoomLevel"] = 460] = "ChangeZoomLevel";
425
- RichEditClientCommand[RichEditClientCommand["ToggleAllowZoom"] = 461] = "ToggleAllowZoom";
426
425
  })(RichEditClientCommand || (RichEditClientCommand = {}));
@@ -67,7 +67,6 @@ import { GoToNextHeaderFooterCommand, GoToPreviousHeaderFooterCommand } from './
67
67
  import { InsertFooterCommand, InsertHeaderCommand } from './header-footer/insert-header-footer-commands';
68
68
  import { LinkHeaderFooterToPreviousCommand } from './header-footer/link-header-footer-commands';
69
69
  import { ApplyStyleCommand } from './layout/apply-style-command';
70
- import { ToggleAllowZoomCommand } from './layout/toggle-allow-zoom-command';
71
70
  import { ChangeZoomLevelCommand } from './layout/change-zoom-level-command';
72
71
  import { ClearFormattingCommand } from './layout/clear-formatting-command';
73
72
  import { ChangeViewTypeCommand, SwitchToPrintLayoutViewCommand, SwitchToSimpleViewCommand } from './layout/switch-view-command';
@@ -558,7 +557,6 @@ export class CommandManager {
558
557
  this.createCommand(control, RichEditClientCommand.SwitchToSimpleView, SwitchToSimpleViewCommand);
559
558
  this.createCommand(control, RichEditClientCommand.SwitchToPrintLayoutView, SwitchToPrintLayoutViewCommand);
560
559
  this.createCommand(control, RichEditClientCommand.ChangeZoomLevel, ChangeZoomLevelCommand);
561
- this.createCommand(control, RichEditClientCommand.ToggleAllowZoom, ToggleAllowZoomCommand);
562
560
  this.createCommand(control, RichEditClientCommand.ShowErrorLoadPictureMessage, ShowLoadPictureErrorDialogCommand);
563
561
  this.assingCommand(RichEditClientCommand.PrintDocumentOnClient, new PrintDocumentOnClient(control, printNonce));
564
562
  }
@@ -58,7 +58,6 @@ export class DialogLayoutOptionsCommand extends ShowDialogCommandBase {
58
58
  let run = subDocument.getRunByPosition(position);
59
59
  let modelManipulator = this.modelManipulator;
60
60
  let anchorInfoManipulator = modelManipulator.floatingObject.anchorInfo;
61
- const topInfo = this.control.viewManager.canvasManager.getScrollTopInfo();
62
61
  let history = this.history;
63
62
  history.beginTransaction();
64
63
  let changed = false;
@@ -224,8 +223,6 @@ export class DialogLayoutOptionsCommand extends ShowDialogCommandBase {
224
223
  changed = true;
225
224
  }
226
225
  history.endTransaction();
227
- if (topInfo)
228
- this.selection.scrollManager.setScroll(new ScrollState().byScrollInfo.setPageInfo(topInfo));
229
226
  return changed;
230
227
  }
231
228
  getDialogName() {
@@ -13,6 +13,8 @@ export declare class PrintDocumentOnClient extends CommandBase<SimpleCommandStat
13
13
  executeCore(_state: SimpleCommandState, options: CommandSimpleOptions<PrintMode | PrintingSettings | undefined>): boolean;
14
14
  private printCore;
15
15
  private generatePrintDocument;
16
+ private getGoogleFonts;
17
+ private createGoogleFontStyleLink;
16
18
  private generatePrintContent;
17
19
  private createZIndexStyles;
18
20
  }
@@ -80,8 +80,18 @@ export class PrintDocumentOnClient extends CommandBase {
80
80
  return true;
81
81
  }
82
82
  printCore(htmlPrinting, printWindow, closePrintDialogWithHtmlPreview, needSwitchViewType, needToggleHiddenSymbols) {
83
- if (htmlPrinting)
84
- this.generatePrintDocument(printWindow, closePrintDialogWithHtmlPreview);
83
+ if (htmlPrinting) {
84
+ this.generatePrintDocument(printWindow.document);
85
+ printWindow.focus();
86
+ const interval = setInterval(() => {
87
+ if (printWindow.document.readyState == 'complete') {
88
+ printWindow.print();
89
+ if (closePrintDialogWithHtmlPreview && !Browser.AndroidMobilePlatform)
90
+ printWindow.close();
91
+ clearInterval(interval);
92
+ }
93
+ }, 100);
94
+ }
85
95
  else {
86
96
  pdfExport(this.control, (blob, _stream) => {
87
97
  if (window.navigator.msSaveOrOpenBlob && !Browser.Edge)
@@ -96,12 +106,27 @@ export class PrintDocumentOnClient extends CommandBase {
96
106
  this.control.commandManager.getCommand(RichEditClientCommand.ToggleShowWhitespace).execute(this.control.commandManager.isPublicApiCall);
97
107
  this.control.commandManager.isPrintingProcessing = false;
98
108
  }
99
- generatePrintDocument(printWindow, closePrintDialogWithHtmlPreview) {
109
+ generatePrintDocument(document) {
100
110
  const height = this.control.layout.pages[0].height;
101
111
  const width = this.control.layout.pages[0].width;
102
- let printWindowContent = `<!DOCTYPE html>
103
- <html moznomarginboxes mozdisallowselectionprint>
112
+ let fontLink = "";
113
+ let divsToLoadFonts = "";
114
+ const googleFonts = this.getGoogleFonts();
115
+ if (googleFonts.length > 0) {
116
+ fontLink = this.createGoogleFontStyleLink(googleFonts);
117
+ divsToLoadFonts = googleFonts.reduce((prev, curr) => {
118
+ const fontStyles = [`font-family:${curr}`, 'font-weight:bold', 'font-style:italic'];
119
+ const result = [];
120
+ for (let i = 1; i <= fontStyles.length; i++)
121
+ result.push(`<div style="font-size:1pt;position:absolute;top:-1000px;${fontStyles.slice(0, i).join(';')}">${curr}</div>`);
122
+ return prev ? [prev, ...result].join('\n') : result.join('\n');
123
+ }, null);
124
+ }
125
+ document.documentElement.innerHTML =
126
+ `<!DOCTYPE html>
127
+ <html moznomarginboxes mozdisallowselectionprint>
104
128
  <head>
129
+ ${fontLink}
105
130
  <style ${this._nonce ? `nonce="${this._nonce}"` : ''}>
106
131
  html, body {
107
132
  margin: 0;
@@ -120,22 +145,25 @@ export class PrintDocumentOnClient extends CommandBase {
120
145
  </style>
121
146
  </head>
122
147
  <body>
148
+ ${divsToLoadFonts}
123
149
  </body>
124
- </html>`;
125
- printWindow.document.write(printWindowContent);
126
- printWindow.document.close();
150
+ </html>`;
127
151
  this.generatePrintContent().forEach((child) => {
128
- printWindow.document.body.appendChild(child);
152
+ document.body.appendChild(child);
129
153
  });
130
- printWindow.focus();
131
- const interval = setInterval(() => {
132
- if (printWindow.document.readyState == 'complete') {
133
- printWindow.print();
134
- if (closePrintDialogWithHtmlPreview && !Browser.AndroidMobilePlatform)
135
- printWindow.close();
136
- clearInterval(interval);
137
- }
138
- }, 100);
154
+ }
155
+ getGoogleFonts() {
156
+ return this.control.modelManager.richOptions.fonts.fonts.reduce((res, f) => {
157
+ if (f.useGoogleFonts)
158
+ res.push(f.fontFamily);
159
+ return res;
160
+ }, []);
161
+ }
162
+ createGoogleFontStyleLink(fontFamilies) {
163
+ const url = new URL('https://fonts.googleapis.com/css');
164
+ url.searchParams.append('family', fontFamilies.join('|'));
165
+ url.searchParams.append('display', 'auto');
166
+ return `<link href="${url.toString()}" rel="stylesheet" />`;
139
167
  }
140
168
  generatePrintContent() {
141
169
  const layout = this.control.layout;