devexpress-richedit 25.2.8 → 26.1.3

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 (80) 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 +26 -0
  9. package/dist/dx.richedit.d.ts +1 -1
  10. package/dist/dx.richedit.js +6559 -5654
  11. package/dist/dx.richedit.min.js +3 -3
  12. package/dist/pdfkit.js +21908 -22350
  13. package/dist/pdfkit.min.js +1 -1
  14. package/index.d.ts +1 -1
  15. package/index.js +1 -1
  16. package/lib/client/client-rich-edit.d.ts +0 -1
  17. package/lib/client/client-rich-edit.js +4 -27
  18. package/lib/client/default-localization.js +19 -0
  19. package/lib/client/dialogs/alert-dialog.d.ts +1 -1
  20. package/lib/client/dialogs/bookmark-dialog.d.ts +1 -1
  21. package/lib/client/dialogs/delete-table-cells-dialog.d.ts +1 -1
  22. package/lib/client/dialogs/dialog-base.d.ts +1 -1
  23. package/lib/client/dialogs/find-replace-dialog.d.ts +1 -1
  24. package/lib/client/dialogs/finish-and-merge-dialog.d.ts +1 -1
  25. package/lib/client/dialogs/font-dialog.d.ts +1 -1
  26. package/lib/client/dialogs/hyperlink-dialog.d.ts +1 -1
  27. package/lib/client/dialogs/insert-merge-field-dialog.d.ts +1 -1
  28. package/lib/client/dialogs/insert-table-cells-dialog.d.ts +1 -1
  29. package/lib/client/dialogs/insert-table-dialog.d.ts +1 -1
  30. package/lib/client/dialogs/page-setup-dialog.d.ts +1 -1
  31. package/lib/client/dialogs/paragraph-dialog.d.ts +1 -1
  32. package/lib/client/dialogs/split-table-cells-dialog.d.ts +1 -1
  33. package/lib/client/dialogs/tabs-dialog.d.ts +1 -1
  34. package/lib/client/public/rich-edit.js +2 -0
  35. package/lib/common/canvas/canvas-manager.d.ts +1 -1
  36. package/lib/common/canvas/canvas-manager.js +7 -3
  37. package/lib/common/canvas/double-tap-detector.d.ts +10 -0
  38. package/lib/common/canvas/double-tap-detector.js +28 -0
  39. package/lib/common/canvas/renderer-class-names.d.ts +2 -0
  40. package/lib/common/canvas/renderer-class-names.js +2 -0
  41. package/lib/common/canvas/renderes/common/document-renderer.d.ts +20 -7
  42. package/lib/common/canvas/renderes/common/document-renderer.js +236 -47
  43. package/lib/common/canvas/renderes/common/simple-view-renderer.d.ts +3 -1
  44. package/lib/common/canvas/renderes/common/simple-view-renderer.js +35 -2
  45. package/lib/common/canvas/renderes/view-manager.d.ts +3 -0
  46. package/lib/common/canvas/renderes/view-manager.js +34 -7
  47. package/lib/common/commands/command-manager.d.ts +2 -0
  48. package/lib/common/commands/command-manager.js +6 -0
  49. package/lib/common/commands/dialogs/dialog-custom-numbering-list-command.js +1 -1
  50. package/lib/common/commands/layout/switch-view-command.js +2 -1
  51. package/lib/common/commands/selection/go-to-next-word-command.d.ts +3 -4
  52. package/lib/common/commands/selection/go-to-next-word-command.js +2 -9
  53. package/lib/common/commands/selection/go-to-prev-word-command.d.ts +3 -2
  54. package/lib/common/commands/selection/go-to-prev-word-command.js +2 -2
  55. package/lib/common/commands/selection/select-all-document-command.d.ts +2 -0
  56. package/lib/common/commands/selection/select-all-document-command.js +6 -0
  57. package/lib/common/commands/selection/selection-command-base.d.ts +2 -0
  58. package/lib/common/commands/selection/selection-command-base.js +8 -0
  59. package/lib/common/event-manager.js +6 -12
  60. package/lib/common/formats/txt/txt-exporter.js +1 -1
  61. package/lib/common/input-controller.js +2 -0
  62. package/lib/common/interfaces/i-rich-edit-core.d.ts +2 -0
  63. package/lib/common/layout/main-structures/layout-boxes/layout-box.js +1 -1
  64. package/lib/common/layout/main-structures/layout-column.d.ts +1 -0
  65. package/lib/common/layout/main-structures/layout-column.js +3 -0
  66. package/lib/common/layout/selection/layout-selection-items.d.ts +3 -0
  67. package/lib/common/layout/selection/layout-selection-items.js +5 -0
  68. package/lib/common/layout-engine/selection/selection-formatter.js +7 -3
  69. package/lib/common/layout-formatter/box/generator/box-infos-generator.js +8 -4
  70. package/lib/common/model/sub-document.d.ts +18 -0
  71. package/lib/common/model/sub-document.js +71 -22
  72. package/lib/common/rich-edit-core.d.ts +3 -0
  73. package/lib/common/rich-edit-core.js +18 -0
  74. package/lib/common/screen-reader-manager.d.ts +48 -0
  75. package/lib/common/screen-reader-manager.js +326 -0
  76. package/lib/common/string-resources.d.ts +23 -0
  77. package/lib/common/string-resources.js +43 -0
  78. package/lib/common/utils/interval-utils.d.ts +4 -0
  79. package/lib/common/utils/interval-utils.js +25 -0
  80. package/package.json +3 -3
package/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * DevExpress WebRichEdit (index.d.ts)
3
- * Version: 25.2.8
3
+ * Version: 26.1.3
4
4
  * Copyright (c) 2012 - 2026 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.2.8
3
+ * Version: 26.1.3
4
4
  * Copyright (c) 2012 - 2026 Developer Express Inc. ALL RIGHTS RESERVED
5
5
  * License: https://www.devexpress.com/Support/EULAs",
6
6
  */
@@ -94,7 +94,6 @@ export declare class ClientRichEdit implements IControlOwner {
94
94
  private initBars;
95
95
  initRibbon(ribbon: Ribbon, fonts: FontsSettings): void;
96
96
  private initDialogManager;
97
- private getStringResources;
98
97
  private initLosingChangesWatcher;
99
98
  private attachEvents;
100
99
  private canUseResizeObserver;
@@ -1,11 +1,9 @@
1
- import { formatMessage } from 'devextreme/localization';
2
1
  import { currentTheme } from 'devextreme/viz/themes';
3
2
  import { RichEditClientCommand } from '../common/commands/client-command';
4
3
  import { DocumentInfo } from '../common/rich-edit-core';
5
4
  import { IsModified } from '../common/model/json/enums/json-top-level-enums';
6
5
  import { RichOptions } from '../common/model/options/rich-options';
7
6
  import { StylesManager } from '../common/model/styles-manager';
8
- import { StringResources } from '../common/string-resources';
9
7
  import { Browser } from '@devexpress/utils/lib/browser';
10
8
  import { DomEventHandlersHolder } from '@devexpress/utils/lib/class/event-handlers-holder';
11
9
  import { DomUtils } from '@devexpress/utils/lib/utils/dom';
@@ -33,6 +31,7 @@ import { FullScreenHelper } from './ui/full-screen-helper';
33
31
  import config from 'devextreme/core/config';
34
32
  import { SizeUtils } from '../common/utils/size-utils';
35
33
  import { DocumentCapability } from '../common/model/options/control';
34
+ import { getStringResources } from '../common/string-resources';
36
35
  export class ClientRichEdit {
37
36
  get clientQuickSearchPanel() {
38
37
  if (!this._clientQuickSearchPanel)
@@ -61,8 +60,8 @@ export class ClientRichEdit {
61
60
  this.rawDataSource = settings.rawDataSource;
62
61
  this.contextMenuSettings = settings.contextMenuSettings;
63
62
  this.fullScreenHelper = new FullScreenHelper(element);
64
- if ("eyJsaWNlbnNlS2V5IjoiTENQdjFTSFFbZUxha0d5IVM+S20tPl8rLSFKZWllNyw5KDxTNCVKITxTK3RbOishNiU+OUI3aTkxIT5lQiFfbWI+YnQhPj46MWVfNEw2Snl2PlEtbix5ZWlaajM4Pk5SeSU8dEgoTGF2OW8rVjNuRXpWZWM4Nyt0dixSZTMlPiFMJVksUyxfLWs6PCtFWmptJFM8KzcoJS0kOjFtdElRLEs3ZVJYN2UrOVZuLCUhS21rZW4tViFMUW1rJSE2MiUhRzI8KS1wUSk7NjwtQGFRdDZwS0ZFNjdARiVpUkA5ano8MnAhOj4lLSlwZ0BAIVE0NjJiLXYyJWQpSTwtQGFRZEBwZ0BAIVE0QDJfQEYhUWQ6SXAhQEk8NClhS3o8SV95QEliUnZJPC0pOU5YPD5RNDo+UTh2SWJSKTlqejshakw7OWp5Rkk3eUZJN3lGSTlsbCJ9")
65
- config(JSON.parse(atob("eyJsaWNlbnNlS2V5IjoiTENQdjFTSFFbZUxha0d5IVM+S20tPl8rLSFKZWllNyw5KDxTNCVKITxTK3RbOishNiU+OUI3aTkxIT5lQiFfbWI+YnQhPj46MWVfNEw2Snl2PlEtbix5ZWlaajM4Pk5SeSU8dEgoTGF2OW8rVjNuRXpWZWM4Nyt0dixSZTMlPiFMJVksUyxfLWs6PCtFWmptJFM8KzcoJS0kOjFtdElRLEs3ZVJYN2UrOVZuLCUhS21rZW4tViFMUW1rJSE2MiUhRzI8KS1wUSk7NjwtQGFRdDZwS0ZFNjdARiVpUkA5ano8MnAhOj4lLSlwZ0BAIVE0NjJiLXYyJWQpSTwtQGFRZEBwZ0BAIVE0QDJfQEYhUWQ6SXAhQEk8NClhS3o8SV95QEliUnZJPC0pOU5YPD5RNDo+UTh2SWJSKTlqejshakw7OWp5Rkk3eUZJN3lGSTlsbCJ9")));
63
+ if ("eyJsaWNlbnNlS2V5IjoiTENQdjE+eWUzLGp0LWNfVmZwK2Q0Y3BGOyhqbWQyPjl5PjdEOGNqWG9JeSUxN2JSZz5SPG4zYis3JUhkTDpRZVFaUUZKN2I6SiU8WHlWaSFvMlJjejllUjlJb2RZIW8peSw8ZXooN2E2JSVMMSgrVmRJPHktU29TIWVZKUo3UlMzKCtkejpRVnQhUVMhZUwtYUdMcm9waWROSWlSUjpvPDEsbmFlKExtZ0dMNEtwZWQ6Pkh0LTNlUW1rJSk7cEtGITY8ISk2JUZRJWUrPHBRZCk+Sy1AMnAhJD5qei1TUTgtMmlYOz4lWDwycEBAIVE0QDJfQEYhUWQ6SXAhQEk8NClhS0BAIVE0QDJfQEYhUWQ6SXAhQEk8NClhS3o8SV95QEliUnZJPC0pOU5YPD5RNDo+UTh2SWJSKTlqejshakw7OWp5Rkk3eUZJN3lGSSV5NjlRWHYyJSE6cGItJEliUik5akA2MnAhKTIlWHYyJSE6MmktdkklISk+akw8MjdAOjlLOXZhakBGMjdAQElfQDY5UWQkYVE0Oj5RNDpHX0BAOVFkdjY8IUY2PGRGSTd5Rkk3eUZJN0xsIn0=")
64
+ config(JSON.parse(atob("eyJsaWNlbnNlS2V5IjoiTENQdjE+eWUzLGp0LWNfVmZwK2Q0Y3BGOyhqbWQyPjl5PjdEOGNqWG9JeSUxN2JSZz5SPG4zYis3JUhkTDpRZVFaUUZKN2I6SiU8WHlWaSFvMlJjejllUjlJb2RZIW8peSw8ZXooN2E2JSVMMSgrVmRJPHktU29TIWVZKUo3UlMzKCtkejpRVnQhUVMhZUwtYUdMcm9waWROSWlSUjpvPDEsbmFlKExtZ0dMNEtwZWQ6Pkh0LTNlUW1rJSk7cEtGITY8ISk2JUZRJWUrPHBRZCk+Sy1AMnAhJD5qei1TUTgtMmlYOz4lWDwycEBAIVE0QDJfQEYhUWQ6SXAhQEk8NClhS0BAIVE0QDJfQEYhUWQ6SXAhQEk8NClhS3o8SV95QEliUnZJPC0pOU5YPD5RNDo+UTh2SWJSKTlqejshakw7OWp5Rkk3eUZJN3lGSSV5NjlRWHYyJSE6cGItJEliUik5akA2MnAhKTIlWHYyJSE6MmktdkklISk+akw8MjdAOjlLOXZhakBGMjdAQElfQDY5UWQkYVE0Oj5RNDpHX0BAOVFkdjY8IUY2PGRGSTd5Rkk3eUZJN0xsIn0=")));
66
65
  this.prepareElement(element, settings);
67
66
  this.initDefaultFontsAndStyles();
68
67
  this.initBars(settings.ribbon, settings.fonts);
@@ -168,7 +167,7 @@ export class ClientRichEdit {
168
167
  options.spellChecker = settings.spellCheck;
169
168
  options.nonce = settings.nonce;
170
169
  options.control.allowZoom = settings.view.allowZoom ? DocumentCapability.Enabled : DocumentCapability.Disabled;
171
- this.core = new ClientRichEditCore(this, this.name, this.element, Math.random().toString(), settings.readOnly, this.barHolder, settings.unit, this.rulerSettings, options, settings.view, this.getStringResources());
170
+ this.core = new ClientRichEditCore(this, this.name, this.element, Math.random().toString(), settings.readOnly, this.barHolder, settings.unit, this.rulerSettings, options, settings.view, getStringResources());
172
171
  }
173
172
  initCore() {
174
173
  const documentInfo = new DocumentInfo("", false);
@@ -264,28 +263,6 @@ export class ClientRichEdit {
264
263
  initDialogManager() {
265
264
  this.dialogManager = new DialogManager(this.element, this.core);
266
265
  }
267
- getStringResources() {
268
- const sr = new StringResources();
269
- sr.headerFooter.evenPageFooter = formatMessage('XtraRichEditStringId.Caption_EvenPageFooter');
270
- sr.headerFooter.evenPageHeader = formatMessage('XtraRichEditStringId.Caption_EvenPageHeader');
271
- sr.headerFooter.firstPageFooter = formatMessage('XtraRichEditStringId.Caption_FirstPageFooter');
272
- sr.headerFooter.firstPageHeader = formatMessage('XtraRichEditStringId.Caption_FirstPageHeader');
273
- sr.headerFooter.footer = formatMessage('XtraRichEditStringId.Caption_PageFooter');
274
- sr.headerFooter.header = formatMessage('XtraRichEditStringId.Caption_PageHeader');
275
- sr.headerFooter.oddPageFooter = formatMessage('XtraRichEditStringId.Caption_OddPageFooter');
276
- sr.headerFooter.oddPageHeader = formatMessage('XtraRichEditStringId.Caption_OddPageHeader');
277
- sr.headerFooter.sameAsPrevious = formatMessage('XtraRichEditStringId.Caption_SameAsPrevious');
278
- sr.seqCaptionPrefixes.figurePrefix = formatMessage('XtraRichEditStringId.Caption_CaptionPrefixFigure');
279
- sr.seqCaptionPrefixes.tablePrefix = formatMessage('XtraRichEditStringId.Caption_CaptionPrefixTable');
280
- sr.seqCaptionPrefixes.equationPrefix = formatMessage('XtraRichEditStringId.Caption_CaptionPrefixEquation');
281
- sr.commonLabels.noTocEntriesFound = formatMessage('XtraRichEditStringId.Msg_NoTocEntriesFound');
282
- sr.commonLabels.clickToFollowHyperlink = formatMessage('XtraRichEditStringId.Msg_ClickToFollowHyperlink');
283
- sr.commonLabels.currentDocumentHyperlinkTooltip = formatMessage('XtraRichEditStringId.Caption_CurrentDocumentHyperlinkTooltip');
284
- sr.quickSearchPanel.of = formatMessage('ASPxRichEditStringId.FindReplace_Of');
285
- sr.quickSearchPanel.items = formatMessage('ASPxRichEditStringId.FindReplace_Items');
286
- sr.quickSearchPanel.noMatches = formatMessage('ASPxRichEditStringId.FindReplace_NoMatches');
287
- return sr;
288
- }
289
266
  initLosingChangesWatcher(settings) {
290
267
  this.losingChangesWatcher = new LosingChangesWatcher(settings.enabled ?
291
268
  () => this.core.getModifiedState() == IsModified.True :
@@ -2221,6 +2221,25 @@ export function loadDefaultMessages() {
2221
2221
  "ASPxRichEditStringId.Download_RichTextFormat": "Rich Text Format (*.rtf)",
2222
2222
  "ASPxRichEditStringId.Download_PlainText": "Plain Text (*.txt)",
2223
2223
  "ASPxRichEditStringId.Download_Html": "Html Document (*.html, *.htm)",
2224
+ "AspNetCoreRichEditStringId.InTableAnnouncement": "table with {0} rows and {1} columns",
2225
+ "AspNetCoreRichEditStringId.OutOfTableAnnouncement": "out of table",
2226
+ "AspNetCoreRichEditStringId.TableRowAnnouncement": "row {0}",
2227
+ "AspNetCoreRichEditStringId.TableColumnAnnouncement": "column {0}",
2228
+ "AspNetCoreRichEditStringId.SelectAllAnnouncement": "select all",
2229
+ "AspNetCoreRichEditStringId.TextSelectedAnnouncement": "{0} selected",
2230
+ "AspNetCoreRichEditStringId.TextUnselectedAnnouncement": "{0} unselected",
2231
+ "AspNetCoreRichEditStringId.PictureAnnouncement": "graphic {0}",
2232
+ "AspNetCoreRichEditStringId.PageAnnouncement": "page {0}",
2233
+ "AspNetCoreRichEditStringId.SpaceAnnouncement": "space",
2234
+ "AspNetCoreRichEditStringId.BulletAnnouncement": "bullet",
2235
+ "AspNetCoreRichEditStringId.ListItemAnnouncement": "list item level {0} {1}",
2236
+ "AspNetCoreRichEditStringId.TabAnnouncement": "tab",
2237
+ "AspNetCoreRichEditStringId.CarriageReturnAnnouncement": "carriage return",
2238
+ "AspNetCoreRichEditStringId.LineBreakAnnouncement": "line break",
2239
+ "AspNetCoreRichEditStringId.LinkAnnouncement": "link",
2240
+ "AspNetCoreRichEditStringId.OutOfLinkAnnouncement": "out of link",
2241
+ "AspNetCoreRichEditStringId.BlankAnnouncement": "blank",
2242
+ "AspNetCoreRichEditStringId.PageBreakAnnouncement": "page break",
2224
2243
  }
2225
2244
  });
2226
2245
  }
@@ -1,4 +1,4 @@
1
- import { Options as dxFormOptions } from 'devextreme/ui/form';
1
+ import { Properties as dxFormOptions } from 'devextreme/ui/form';
2
2
  import { dxPopupToolbarItem } from 'devextreme/ui/popup';
3
3
  import { AlertMessageDialogParameters } from '../../common/commands/dialogs/dialog-alert-message-command';
4
4
  import { DialogBase } from './dialog-base';
@@ -1,4 +1,4 @@
1
- import { Options as dxFormOptions } from 'devextreme/ui/form';
1
+ import { Properties as dxFormOptions } from 'devextreme/ui/form';
2
2
  import { dxPopupToolbarItem } from 'devextreme/ui/popup';
3
3
  import { BookmarkDialogInfo, BookmarksDialogParameters } from '../../common/commands/dialogs/dialog-bookmarks-command';
4
4
  import { DialogBase } from './dialog-base';
@@ -1,4 +1,4 @@
1
- import { Options as dxFormOptions } from 'devextreme/ui/form';
1
+ import { Properties as dxFormOptions } from 'devextreme/ui/form';
2
2
  import { TableCellsDialogParameters } from '../../common/commands/dialogs/dialog-insert-table-cells-command';
3
3
  import { DialogBase } from './dialog-base';
4
4
  export declare class DeleteTableCellsDialog extends DialogBase<TableCellsDialogParameters> {
@@ -1,4 +1,4 @@
1
- import dxForm, { Options as dxFormOptions } from 'devextreme/ui/form';
1
+ import dxForm, { Properties as dxFormOptions } from 'devextreme/ui/form';
2
2
  import dxPopup, { dxPopupToolbarItem } from 'devextreme/ui/popup';
3
3
  import { DialogParametersBase } from '../../common/commands/dialogs/show-dialog-command-base';
4
4
  import { RichEditCore } from '../../common/rich-edit-core';
@@ -1,4 +1,4 @@
1
- import { Options as dxFormOptions } from 'devextreme/ui/form';
1
+ import { Properties as dxFormOptions } from 'devextreme/ui/form';
2
2
  import { dxPopupToolbarItem } from 'devextreme/ui/popup';
3
3
  import { FindReplaceDialogParameters } from '../../common/commands/dialogs/dialog-find-replace-command';
4
4
  import { ISearchResetListener } from '../../common/ui/search-manager';
@@ -1,4 +1,4 @@
1
- import { Options as dxFormOptions } from 'devextreme/ui/form';
1
+ import { Properties as dxFormOptions } from 'devextreme/ui/form';
2
2
  import { FinishAndMergeDialogParameters } from '../../common/commands/dialogs/dialog-finish-and-merge-command';
3
3
  import { DialogBase } from './dialog-base';
4
4
  export declare class FinishAndMergeDialog extends DialogBase<FinishAndMergeDialogParameters> {
@@ -1,4 +1,4 @@
1
- import { Options as dxFormOptions } from 'devextreme/ui/form';
1
+ import { Properties as dxFormOptions } from 'devextreme/ui/form';
2
2
  import { FontDialogParameters } from '../../common/commands/dialogs/dialog-font-command';
3
3
  import { DialogBase } from './dialog-base';
4
4
  export declare class FontDialog extends DialogBase<FontDialogParameters> {
@@ -1,4 +1,4 @@
1
- import { Options as dxFormOptions } from 'devextreme/ui/form';
1
+ import { Properties as dxFormOptions } from 'devextreme/ui/form';
2
2
  import { DialogHyperlinkParameters } from '../../common/commands/dialogs/dialog-hyperlink-command';
3
3
  import { DialogBase } from './dialog-base';
4
4
  export declare class HyperlinkDialog extends DialogBase<DialogHyperlinkParameters> {
@@ -1,4 +1,4 @@
1
- import { Options as dxFormOptions } from 'devextreme/ui/form';
1
+ import { Properties as dxFormOptions } from 'devextreme/ui/form';
2
2
  import { dxPopupToolbarItem } from 'devextreme/ui/popup';
3
3
  import { InsertMergeFieldDialogParameters } from '../../common/commands/dialogs/dialog-insert-merge-field-command';
4
4
  import { DialogBase } from './dialog-base';
@@ -1,4 +1,4 @@
1
- import { Options as dxFormOptions } from 'devextreme/ui/form';
1
+ import { Properties as dxFormOptions } from 'devextreme/ui/form';
2
2
  import { TableCellsDialogParameters } from '../../common/commands/dialogs/dialog-insert-table-cells-command';
3
3
  import { DialogBase } from './dialog-base';
4
4
  export declare class InsertTableCellsDialog extends DialogBase<TableCellsDialogParameters> {
@@ -1,4 +1,4 @@
1
- import { Options as dxFormOptions } from 'devextreme/ui/form';
1
+ import { Properties as dxFormOptions } from 'devextreme/ui/form';
2
2
  import { InsertTableDialogParameters } from '../../common/commands/dialogs/dialog-insert-table-command';
3
3
  import { DialogBase } from './dialog-base';
4
4
  export declare class InsertTableDialog extends DialogBase<InsertTableDialogParameters> {
@@ -1,4 +1,4 @@
1
- import { Options as dxFormOptions } from 'devextreme/ui/form';
1
+ import { Properties as dxFormOptions } from 'devextreme/ui/form';
2
2
  import { PageSetupDialogParameters } from '../../common/commands/dialogs/dialog-page-setup-command';
3
3
  import { DialogBase } from './dialog-base';
4
4
  export declare class PageSetupDialog extends DialogBase<PageSetupDialogParameters> {
@@ -1,4 +1,4 @@
1
- import { Options as dxFormOptions } from 'devextreme/ui/form';
1
+ import { Properties as dxFormOptions } from 'devextreme/ui/form';
2
2
  import { dxPopupToolbarItem } from 'devextreme/ui/popup';
3
3
  import { ParagraphDialogParameters } from '../../common/commands/dialogs/dialog-paragraph-properties-command';
4
4
  import { DialogBase } from './dialog-base';
@@ -1,4 +1,4 @@
1
- import { Options as dxFormOptions } from 'devextreme/ui/form';
1
+ import { Properties as dxFormOptions } from 'devextreme/ui/form';
2
2
  import { SplitTableCellsDialogParameters } from '../../common/commands/dialogs/dialog-split-table-cells-command';
3
3
  import { DialogBase } from './dialog-base';
4
4
  export declare class SplitTableCellsDialog extends DialogBase<SplitTableCellsDialogParameters> {
@@ -1,4 +1,4 @@
1
- import { Options as dxFormOptions } from 'devextreme/ui/form';
1
+ import { Properties as dxFormOptions } from 'devextreme/ui/form';
2
2
  import { dxPopupToolbarItem } from 'devextreme/ui/popup';
3
3
  import { DialogTabsParameters } from '../../common/commands/dialogs/dialog-tabs-command';
4
4
  import { DialogBase } from './dialog-base';
@@ -159,6 +159,8 @@ class RichEditPublic {
159
159
  return this._native.core.innerClientProperties.viewsSettings.viewType;
160
160
  }
161
161
  set viewType(type) {
162
+ if (typeof console !== 'undefined' && console.log)
163
+ console.log(`[RichEdit] ${new Date().toISOString()} PublicAPI.set viewType`, { to: type, stack: new Error().stack });
162
164
  const command = this._native.core.commandManager.getCommand(RichEditClientCommand.ChangeViewType);
163
165
  command.execute(true, type);
164
166
  }
@@ -12,7 +12,7 @@ export declare class CanvasManager extends BatchUpdatableObject {
12
12
  private scrollIntervalID;
13
13
  private lastMousePosition;
14
14
  private canvasPosition;
15
- private doubleTapStartDate;
15
+ private doubleTapDetector;
16
16
  private pointer;
17
17
  private blockNotPointerEvents;
18
18
  private lastPointerPosition;
@@ -10,6 +10,7 @@ import { PopupUtils } from '@devexpress/utils/lib/utils/popup';
10
10
  import { RichMouseEvent } from '../event-manager';
11
11
  import { MouseEventSource } from '../mouse-handler/mouse-event-source';
12
12
  import { CursorPointer } from '../mouse-handler/mouse-handler/mouse-handler';
13
+ import { DoubleTapDetector } from './double-tap-detector';
13
14
  import { ResizeBoxListener } from './listeners/resize-box-listener';
14
15
  import { SimpleViewCanvasSizeManager } from './renderes/common/document-renderer';
15
16
  import { SizeUtils } from '../utils/size-utils';
@@ -19,6 +20,8 @@ const CSSCLASS_FOCUSED = "dxreInFocus";
19
20
  const AUTOSCROLL_AREA_SIZE = 10;
20
21
  const AUTOSCROLL_STEP = 10;
21
22
  const MSTOUCH_MOVE_SENSITIVITY = 5;
23
+ const DOUBLE_TAP_MAX_DISTANCE = 20;
24
+ const DOUBLE_TAP_MAX_INTERVAL = 600;
22
25
  export class CanvasManager extends BatchUpdatableObject {
23
26
  get sizes() { return this.viewManager.sizes; }
24
27
  get scroll() { return this.viewManager.scroll; }
@@ -27,6 +30,7 @@ export class CanvasManager extends BatchUpdatableObject {
27
30
  super();
28
31
  this.lastMousePosition = { x: -1, y: -1 };
29
32
  this.canvasPosition = { x: -1, y: -1 };
33
+ this.doubleTapDetector = new DoubleTapDetector(DOUBLE_TAP_MAX_DISTANCE, DOUBLE_TAP_MAX_INTERVAL);
30
34
  this.pointer = CursorPointer.Auto;
31
35
  this.blockNotPointerEvents = false;
32
36
  this.lastPointerPosition = { x: -1, y: -1 };
@@ -137,12 +141,12 @@ export class CanvasManager extends BatchUpdatableObject {
137
141
  onCanvasTouchStartInternal(evt) {
138
142
  this.saveMousePosition(evt);
139
143
  let richMouseEvent = new RichMouseEvent(evt, this.getLayoutPoint(evt, true), CanvasManager.getMouseEventSource(EvtUtils.getEventSource(evt)), this.scroll.lastScrollTop, this.scroll.lastScrollLeft);
140
- if (this.doubleTapStartDate && ((new Date()) - this.doubleTapStartDate) < 600) {
141
- this.doubleTapStartDate = null;
144
+ const evtX = EvtUtils.getEventX(evt);
145
+ const evtY = EvtUtils.getEventY(evt);
146
+ if (this.doubleTapDetector.isDoubleTap(evtX, evtY)) {
142
147
  this.onCanvasDoubleTap(richMouseEvent);
143
148
  }
144
149
  else {
145
- this.doubleTapStartDate = new Date();
146
150
  this.eventManager.onTouchStart(richMouseEvent);
147
151
  }
148
152
  }
@@ -0,0 +1,10 @@
1
+ export declare class DoubleTapDetector {
2
+ private readonly maxDistance;
3
+ private readonly maxInterval;
4
+ private lastTime;
5
+ private lastX;
6
+ private lastY;
7
+ constructor(maxDistance: number, maxInterval: number);
8
+ isDoubleTap(x: number, y: number): boolean;
9
+ reset(): void;
10
+ }
@@ -0,0 +1,28 @@
1
+ export class DoubleTapDetector {
2
+ constructor(maxDistance, maxInterval) {
3
+ this.maxDistance = maxDistance;
4
+ this.maxInterval = maxInterval;
5
+ this.lastTime = null;
6
+ this.lastX = -1;
7
+ this.lastY = -1;
8
+ }
9
+ isDoubleTap(x, y) {
10
+ const now = Date.now();
11
+ const result = this.lastTime !== null &&
12
+ (now - this.lastTime) < this.maxInterval &&
13
+ Math.abs(x - this.lastX) <= this.maxDistance &&
14
+ Math.abs(y - this.lastY) <= this.maxDistance;
15
+ if (result) {
16
+ this.reset();
17
+ }
18
+ else {
19
+ this.lastTime = now;
20
+ this.lastX = x;
21
+ this.lastY = y;
22
+ }
23
+ return result;
24
+ }
25
+ reset() {
26
+ this.lastTime = null;
27
+ }
28
+ }
@@ -37,6 +37,7 @@ export declare const RendererClassNames: {
37
37
  FIELD_BOX_LEVEL3: string;
38
38
  BOX_SPACE: string;
39
39
  BOX: string;
40
+ BOX_SELECTED: string;
40
41
  HIDDEN_BOX: string;
41
42
  PICTURE: string;
42
43
  START_BOOKMARK: string;
@@ -46,6 +47,7 @@ export declare const RendererClassNames: {
46
47
  SELECTION_MISSPELLED: string;
47
48
  SELECTION_SEARCH: string;
48
49
  SELECTION_ROW: string;
50
+ SELECTION_PICTURE_ROW: string;
49
51
  SELECTION_CURSOR: string;
50
52
  SELECTION_FLOATING_OBJECTS: string;
51
53
  ANCHOR: string;
@@ -37,6 +37,7 @@ export const RendererClassNames = {
37
37
  FIELD_BOX_LEVEL3: "dxreFieldBoxLevel3",
38
38
  BOX_SPACE: "dxreBoxSpace",
39
39
  BOX: "dxreBox",
40
+ BOX_SELECTED: "dxreBoxSelected",
40
41
  HIDDEN_BOX: "dxreHiddenBox",
41
42
  PICTURE: "dxrePic",
42
43
  START_BOOKMARK: "dxreStartBookmark",
@@ -46,6 +47,7 @@ export const RendererClassNames = {
46
47
  SELECTION_MISSPELLED: "dxreSelMisspelled",
47
48
  SELECTION_SEARCH: "dxreSelSearch",
48
49
  SELECTION_ROW: "dxreSelRow",
50
+ SELECTION_PICTURE_ROW: "dxreSelRowPic",
49
51
  SELECTION_CURSOR: "dxreSelCursor",
50
52
  SELECTION_FLOATING_OBJECTS: "dxreSelFloatingObjects",
51
53
  ANCHOR: "dxreAnchor",
@@ -22,6 +22,7 @@ import { CacheImageInfo as existingInfo } from '../../../model/caches/images';
22
22
  import { Shape } from '../../../model/shapes/shape';
23
23
  import { Rectangle } from '@devexpress/utils/lib/geometry/rectangle';
24
24
  import { Size } from '@devexpress/utils/lib/geometry/size';
25
+ import { FixedInterval } from '@devexpress/utils/lib/intervals/fixed';
25
26
  import { CanvasManager } from '../../canvas-manager';
26
27
  import { ViewManager } from '../view-manager';
27
28
  import { IRichEditControl } from '../../../interfaces/i-rich-edit-core';
@@ -45,14 +46,20 @@ export declare class SimpleViewCanvasSizeManager implements IModelChangesListene
45
46
  }
46
47
  export declare abstract class DocumentRenderer implements IPictureRenderer {
47
48
  protected viewManager: ViewManager;
49
+ protected isForcedColorsModeActive: boolean;
50
+ private selectionSegmentBoxesCache;
51
+ protected isSelectionChangeCacheEnabled: boolean;
48
52
  private get cache();
49
53
  constructor(viewManager: ViewManager);
50
54
  onViewTypeChanged(): void;
51
55
  applyPageChange(layoutPage: LayoutPage, pageChange: PageChange): void;
56
+ updateSelectedIntervalsPageChanges(layoutPage: LayoutPage, pageIndex: number, intervals?: FixedInterval[], isMain?: boolean): void;
57
+ private addSelectedPageAreaChange;
58
+ private findIntersectingLayoutElement;
52
59
  protected applyAnchorPictureChange(cache: DocumentRendererPageCache, layoutPage: LayoutPage, ancPicChange: AnchoredPictureChange): void;
53
60
  protected applyMainPageAreaChange(pageCache: DocumentRendererPageCache, layoutPage: LayoutPage, pageAreaChange: PageAreaChange): void;
54
61
  protected applyOtherPageAreaChange(cache: DocumentRendererPageCache, layoutPage: LayoutPage, pageAreaChange: PageAreaChange): void;
55
- protected applyColumnChange(pageAreaElement: Node, layoutPageArea: LayoutPageArea, columnChange: ColumnChange, level: number): void;
62
+ protected applyColumnChange(pageAreaElement: Node, layoutPageArea: LayoutPageArea, columnChange: ColumnChange, level: number, pageAreaModelOffset: number): void;
56
63
  static applyChange(topLevelNode: Node, change: LayoutChangeBase, getContainer: GetSomeCanvasElementContainer, getRenderedElement: () => HTMLElement): void;
57
64
  getPageRender(layoutPageIndex: number, layoutPage: LayoutPage): HTMLElement;
58
65
  renderPage(layoutPage: LayoutPage, layoutPageIndex: number, renderInnerContent: boolean): void;
@@ -65,11 +72,17 @@ export declare abstract class DocumentRenderer implements IPictureRenderer {
65
72
  protected renderPageContent(page: LayoutPage, pageIndex: number): void;
66
73
  protected static updatePageColor(pageElement: HTMLElement, newColor: number): void;
67
74
  protected static getPageAreaClassname(area: LayoutPageArea): string;
68
- protected renderPageArea(renderLevelCalculator: RenderLevelCalculator, pageCache: DocumentRendererPageCache, area: LayoutPageArea, textBox: LayoutAnchoredTextBox, renderContent?: boolean): HTMLElement;
69
- protected renderColumn(column: LayoutColumn, level: number, _isMainPageArea: boolean): HTMLElement;
70
- renderRow(row: LayoutRow, level: number): HTMLElement;
75
+ protected renderPageArea(renderLevelCalculator: RenderLevelCalculator, pageCache: DocumentRendererPageCache, area: LayoutPageArea, textBox: LayoutAnchoredTextBox, pageStartPosition?: number): HTMLElement;
76
+ protected renderColumn(column: LayoutColumn, level: number, pageAreaModelOffset: number, _isMainPageArea: boolean): HTMLElement;
77
+ renderRow(row: LayoutRow, level: number, columnModelOffset?: number): HTMLElement;
71
78
  private boxHasNormalScriptedUnderline;
72
- protected renderBox(row: LayoutRow, box: LayoutBox, level: number, skipUnderlineAndStrikeout: boolean, skipUnderlineScript?: boolean): BoxRenderResult;
79
+ protected renderBox(row: LayoutRow, box: LayoutBox, level: number, skipUnderlineAndStrikeout: boolean, rowModelOffset: number, skipUnderlineScript?: boolean): BoxRenderResult;
80
+ updateForcedColorsModeState(): boolean;
81
+ private renderSingleBox;
82
+ private getSelectedIntervalsForBox;
83
+ private getSelectionSegmentBoxes;
84
+ private getOrCreateSelectionSegmentBox;
85
+ private createSelectionSegmentBox;
73
86
  private renderVerticalAlignContainer;
74
87
  private renderColorContainer;
75
88
  private renderStrikeoutContainer;
@@ -129,8 +142,8 @@ export declare class DocumentRendererPageCache {
129
142
  protected init(): void;
130
143
  }
131
144
  export declare class BoxRenderResult {
132
- html: string | DocumentFragment;
145
+ html: DocumentFragment;
133
146
  increaseRowHeight: boolean;
134
- constructor(html: string | DocumentFragment, increaseRowHeight: boolean);
147
+ constructor(html: DocumentFragment, increaseRowHeight: boolean);
135
148
  toString(): string;
136
149
  }