@hailin-zheng/editor-core 1.0.10 → 1.0.14
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.
- package/lib/doc-ruler.d.ts +51 -0
- package/lib/doc-ruler.js +313 -0
- package/lib/doc-ruler.js.map +1 -0
- package/lib/framework/common-util.d.ts +63 -0
- package/lib/framework/common-util.js +178 -0
- package/lib/framework/common-util.js.map +1 -0
- package/lib/framework/document-change.d.ts +265 -0
- package/lib/framework/document-change.js +1342 -0
- package/lib/framework/document-change.js.map +1 -0
- package/lib/framework/document-combine.d.ts +24 -0
- package/lib/framework/document-combine.js +40 -0
- package/lib/framework/document-combine.js.map +1 -0
- package/lib/framework/document-comment.d.ts +46 -0
- package/lib/framework/document-comment.js +148 -0
- package/lib/framework/document-comment.js.map +1 -0
- package/lib/framework/document-context.d.ts +149 -0
- package/lib/framework/document-context.js +330 -0
- package/lib/framework/document-context.js.map +1 -0
- package/lib/framework/document-eval-func.d.ts +18 -0
- package/lib/framework/document-eval-func.js +48 -0
- package/lib/framework/document-eval-func.js.map +1 -0
- package/lib/framework/document-event.d.ts +213 -0
- package/lib/framework/document-event.js +1054 -0
- package/lib/framework/document-event.js.map +1 -0
- package/lib/framework/document-history.d.ts +26 -0
- package/lib/framework/document-history.js +65 -0
- package/lib/framework/document-history.js.map +1 -0
- package/lib/framework/document-images-loader.d.ts +16 -0
- package/lib/framework/document-images-loader.js +66 -0
- package/lib/framework/document-images-loader.js.map +1 -0
- package/lib/framework/document-input-cursor.d.ts +78 -0
- package/lib/framework/document-input-cursor.js +239 -0
- package/lib/framework/document-input-cursor.js.map +1 -0
- package/lib/framework/document-paint.d.ts +34 -0
- package/lib/framework/document-paint.js +103 -0
- package/lib/framework/document-paint.js.map +1 -0
- package/lib/framework/document-print-offscreen.d.ts +38 -0
- package/lib/framework/document-print-offscreen.js +128 -0
- package/lib/framework/document-print-offscreen.js.map +1 -0
- package/lib/framework/document-print.d.ts +60 -0
- package/lib/framework/document-print.js +203 -0
- package/lib/framework/document-print.js.map +1 -0
- package/lib/framework/document-segmenter.d.ts +2 -0
- package/lib/framework/document-segmenter.js +106 -0
- package/lib/framework/document-segmenter.js.map +1 -0
- package/lib/framework/document-selection.d.ts +89 -0
- package/lib/framework/document-selection.js +358 -0
- package/lib/framework/document-selection.js.map +1 -0
- package/lib/framework/document-template.d.ts +4 -0
- package/lib/framework/document-template.js +20 -0
- package/lib/framework/document-template.js.map +1 -0
- package/lib/framework/document-textline-mode.d.ts +7 -0
- package/lib/framework/document-textline-mode.js +30 -0
- package/lib/framework/document-textline-mode.js.map +1 -0
- package/lib/framework/element-define.d.ts +319 -0
- package/lib/framework/element-define.js +579 -0
- package/lib/framework/element-define.js.map +1 -0
- package/lib/framework/element-event-define.d.ts +98 -0
- package/lib/framework/element-event-define.js +108 -0
- package/lib/framework/element-event-define.js.map +1 -0
- package/lib/framework/element-measure.d.ts +97 -0
- package/lib/framework/element-measure.js +551 -0
- package/lib/framework/element-measure.js.map +1 -0
- package/lib/framework/element-paint.d.ts +42 -0
- package/lib/framework/element-paint.js +170 -0
- package/lib/framework/element-paint.js.map +1 -0
- package/lib/framework/element-props.d.ts +301 -0
- package/lib/framework/element-props.js +809 -0
- package/lib/framework/element-props.js.map +1 -0
- package/lib/framework/element-reader.d.ts +19 -0
- package/lib/framework/element-reader.js +151 -0
- package/lib/framework/element-reader.js.map +1 -0
- package/lib/framework/element-render-cut.d.ts +55 -0
- package/lib/framework/element-render-cut.js +449 -0
- package/lib/framework/element-render-cut.js.map +1 -0
- package/lib/framework/element-serialize.d.ts +30 -0
- package/lib/framework/element-serialize.js +113 -0
- package/lib/framework/element-serialize.js.map +1 -0
- package/lib/framework/element-util.d.ts +369 -0
- package/lib/framework/element-util.js +1463 -0
- package/lib/framework/element-util.js.map +1 -0
- package/lib/framework/impl/checkbox/checkbox-impl.d.ts +24 -0
- package/lib/framework/impl/checkbox/checkbox-impl.js +64 -0
- package/lib/framework/impl/checkbox/checkbox-impl.js.map +1 -0
- package/lib/framework/impl/comments/comment-content-impl.d.ts +40 -0
- package/lib/framework/impl/comments/comment-content-impl.js +105 -0
- package/lib/framework/impl/comments/comment-content-impl.js.map +1 -0
- package/lib/framework/impl/comments/comment-element-impl.d.ts +21 -0
- package/lib/framework/impl/comments/comment-element-impl.js +62 -0
- package/lib/framework/impl/comments/comment-element-impl.js.map +1 -0
- package/lib/framework/impl/comments/comments-container-impl.d.ts +22 -0
- package/lib/framework/impl/comments/comments-container-impl.js +62 -0
- package/lib/framework/impl/comments/comments-container-impl.js.map +1 -0
- package/lib/framework/impl/comments/comments-util.d.ts +12 -0
- package/lib/framework/impl/comments/comments-util.js +67 -0
- package/lib/framework/impl/comments/comments-util.js.map +1 -0
- package/lib/framework/impl/comments/validate-msg-impl.d.ts +21 -0
- package/lib/framework/impl/comments/validate-msg-impl.js +83 -0
- package/lib/framework/impl/comments/validate-msg-impl.js.map +1 -0
- package/lib/framework/impl/data-element/data-decorate-impl.d.ts +30 -0
- package/lib/framework/impl/data-element/data-decorate-impl.js +91 -0
- package/lib/framework/impl/data-element/data-decorate-impl.js.map +1 -0
- package/lib/framework/impl/data-element/data-element-barcode.d.ts +31 -0
- package/lib/framework/impl/data-element/data-element-barcode.js +115 -0
- package/lib/framework/impl/data-element/data-element-barcode.js.map +1 -0
- package/lib/framework/impl/data-element/data-element-base-impl.d.ts +68 -0
- package/lib/framework/impl/data-element/data-element-base-impl.js +205 -0
- package/lib/framework/impl/data-element/data-element-base-impl.js.map +1 -0
- package/lib/framework/impl/data-element/data-element-check-impl.d.ts +35 -0
- package/lib/framework/impl/data-element/data-element-check-impl.js +133 -0
- package/lib/framework/impl/data-element/data-element-check-impl.js.map +1 -0
- package/lib/framework/impl/data-element/data-element-date-impl.d.ts +23 -0
- package/lib/framework/impl/data-element/data-element-date-impl.js +111 -0
- package/lib/framework/impl/data-element/data-element-date-impl.js.map +1 -0
- package/lib/framework/impl/data-element/data-element-group-impl.d.ts +23 -0
- package/lib/framework/impl/data-element/data-element-group-impl.js +130 -0
- package/lib/framework/impl/data-element/data-element-group-impl.js.map +1 -0
- package/lib/framework/impl/data-element/data-element-image-impl.d.ts +30 -0
- package/lib/framework/impl/data-element/data-element-image-impl.js +137 -0
- package/lib/framework/impl/data-element/data-element-image-impl.js.map +1 -0
- package/lib/framework/impl/data-element/data-element-list-impl.d.ts +22 -0
- package/lib/framework/impl/data-element/data-element-list-impl.js +131 -0
- package/lib/framework/impl/data-element/data-element-list-impl.js.map +1 -0
- package/lib/framework/impl/data-element/data-element-text-impl.d.ts +23 -0
- package/lib/framework/impl/data-element/data-element-text-impl.js +103 -0
- package/lib/framework/impl/data-element/data-element-text-impl.js.map +1 -0
- package/lib/framework/impl/decorate/fill-null-space-imple.d.ts +21 -0
- package/lib/framework/impl/decorate/fill-null-space-imple.js +43 -0
- package/lib/framework/impl/decorate/fill-null-space-imple.js.map +1 -0
- package/lib/framework/impl/document/doc-body-impl.d.ts +27 -0
- package/lib/framework/impl/document/doc-body-impl.js +79 -0
- package/lib/framework/impl/document/doc-body-impl.js.map +1 -0
- package/lib/framework/impl/document/doc-body-part-impl.d.ts +30 -0
- package/lib/framework/impl/document/doc-body-part-impl.js +94 -0
- package/lib/framework/impl/document/doc-body-part-impl.js.map +1 -0
- package/lib/framework/impl/document/doc-container-impl.d.ts +16 -0
- package/lib/framework/impl/document/doc-container-impl.js +21 -0
- package/lib/framework/impl/document/doc-container-impl.js.map +1 -0
- package/lib/framework/impl/document/doc-footer-impl.d.ts +26 -0
- package/lib/framework/impl/document/doc-footer-impl.js +77 -0
- package/lib/framework/impl/document/doc-footer-impl.js.map +1 -0
- package/lib/framework/impl/document/doc-header-impl.d.ts +26 -0
- package/lib/framework/impl/document/doc-header-impl.js +83 -0
- package/lib/framework/impl/document/doc-header-impl.js.map +1 -0
- package/lib/framework/impl/document/doc-impl.d.ts +61 -0
- package/lib/framework/impl/document/doc-impl.js +209 -0
- package/lib/framework/impl/document/doc-impl.js.map +1 -0
- package/lib/framework/impl/media-formula/menstrual-history.d.ts +35 -0
- package/lib/framework/impl/media-formula/menstrual-history.js +153 -0
- package/lib/framework/impl/media-formula/menstrual-history.js.map +1 -0
- package/lib/framework/impl/paragraph/p-impl.d.ts +45 -0
- package/lib/framework/impl/paragraph/p-impl.js +156 -0
- package/lib/framework/impl/paragraph/p-impl.js.map +1 -0
- package/lib/framework/impl/picture/image-impl.d.ts +31 -0
- package/lib/framework/impl/picture/image-impl.js +124 -0
- package/lib/framework/impl/picture/image-impl.js.map +1 -0
- package/lib/framework/impl/radio/radio-impl.d.ts +22 -0
- package/lib/framework/impl/radio/radio-impl.js +72 -0
- package/lib/framework/impl/radio/radio-impl.js.map +1 -0
- package/lib/framework/impl/symbol/br-symbol-impl.d.ts +22 -0
- package/lib/framework/impl/symbol/br-symbol-impl.js +54 -0
- package/lib/framework/impl/symbol/br-symbol-impl.js.map +1 -0
- package/lib/framework/impl/symbol/p-symbol-impl.d.ts +19 -0
- package/lib/framework/impl/symbol/p-symbol-impl.js +54 -0
- package/lib/framework/impl/symbol/p-symbol-impl.js.map +1 -0
- package/lib/framework/impl/table/table-cell-impl.d.ts +37 -0
- package/lib/framework/impl/table/table-cell-impl.js +145 -0
- package/lib/framework/impl/table/table-cell-impl.js.map +1 -0
- package/lib/framework/impl/table/table-impl.d.ts +55 -0
- package/lib/framework/impl/table/table-impl.js +363 -0
- package/lib/framework/impl/table/table-impl.js.map +1 -0
- package/lib/framework/impl/table/table-row-impl.d.ts +26 -0
- package/lib/framework/impl/table/table-row-impl.js +75 -0
- package/lib/framework/impl/table/table-row-impl.js.map +1 -0
- package/lib/framework/impl/table/table-split-cell-patch.d.ts +20 -0
- package/lib/framework/impl/table/table-split-cell-patch.js +89 -0
- package/lib/framework/impl/table/table-split-cell-patch.js.map +1 -0
- package/lib/framework/impl/table/table-split-cell.d.ts +90 -0
- package/lib/framework/impl/table/table-split-cell.js +464 -0
- package/lib/framework/impl/table/table-split-cell.js.map +1 -0
- package/lib/framework/impl/table/table-util.d.ts +150 -0
- package/lib/framework/impl/table/table-util.js +678 -0
- package/lib/framework/impl/table/table-util.js.map +1 -0
- package/lib/framework/impl/text/text-impl.d.ts +32 -0
- package/lib/framework/impl/text/text-impl.js +149 -0
- package/lib/framework/impl/text/text-impl.js.map +1 -0
- package/lib/framework/impl/text/track-run-impl.d.ts +27 -0
- package/lib/framework/impl/text/track-run-impl.js +112 -0
- package/lib/framework/impl/text/track-run-impl.js.map +1 -0
- package/lib/framework/notify.d.ts +13 -0
- package/lib/framework/notify.js +116 -0
- package/lib/framework/notify.js.map +1 -0
- package/lib/framework/range-util.d.ts +40 -0
- package/lib/framework/range-util.js +312 -0
- package/lib/framework/range-util.js.map +1 -0
- package/lib/framework/render-context.d.ts +91 -0
- package/lib/framework/render-context.js +384 -0
- package/lib/framework/render-context.js.map +1 -0
- package/lib/framework/render-define.d.ts +109 -0
- package/lib/framework/render-define.js +195 -0
- package/lib/framework/render-define.js.map +1 -0
- package/lib/framework/selection-overlays.d.ts +30 -0
- package/lib/framework/selection-overlays.js +124 -0
- package/lib/framework/selection-overlays.js.map +1 -0
- package/lib/texteditor.d.ts +318 -0
- package/lib/texteditor.js +913 -0
- package/lib/texteditor.js.map +1 -0
- package/lib/util/subject.d.ts +34 -0
- package/lib/util/subject.js +88 -0
- package/lib/util/subject.js.map +1 -0
- package/{src/med_editor/util/table-bind.ts → lib/util/table-bind.d.ts} +2 -3
- package/lib/util/table-bind.js +6 -0
- package/lib/util/table-bind.js.map +1 -0
- package/package.json +2 -2
- package/src/med_editor/doc-ruler.ts +0 -340
- package/src/med_editor/framework/common-util.ts +0 -200
- package/src/med_editor/framework/document-change.ts +0 -1391
- package/src/med_editor/framework/document-combine.ts +0 -44
- package/src/med_editor/framework/document-comment.ts +0 -163
- package/src/med_editor/framework/document-context.ts +0 -410
- package/src/med_editor/framework/document-eval-func.ts +0 -53
- package/src/med_editor/framework/document-event.ts +0 -1082
- package/src/med_editor/framework/document-history.ts +0 -76
- package/src/med_editor/framework/document-images-loader.ts +0 -74
- package/src/med_editor/framework/document-input-cursor.ts +0 -244
- package/src/med_editor/framework/document-paint.ts +0 -110
- package/src/med_editor/framework/document-print-offscreen.ts +0 -134
- package/src/med_editor/framework/document-print.ts +0 -219
- package/src/med_editor/framework/document-segmenter.ts +0 -211
- package/src/med_editor/framework/document-selection.ts +0 -389
- package/src/med_editor/framework/document-template.ts +0 -20
- package/src/med_editor/framework/document-textline-mode.ts +0 -34
- package/src/med_editor/framework/element-define.ts +0 -674
- package/src/med_editor/framework/element-event-define.ts +0 -141
- package/src/med_editor/framework/element-measure.ts +0 -573
- package/src/med_editor/framework/element-paint.ts +0 -176
- package/src/med_editor/framework/element-props.ts +0 -938
- package/src/med_editor/framework/element-reader.ts +0 -159
- package/src/med_editor/framework/element-render-cut.ts +0 -456
- package/src/med_editor/framework/element-serialize.ts +0 -126
- package/src/med_editor/framework/element-util.ts +0 -1564
- package/src/med_editor/framework/impl/checkbox/checkbox-impl.ts +0 -71
- package/src/med_editor/framework/impl/comments/comment-content-impl.ts +0 -119
- package/src/med_editor/framework/impl/comments/comment-element-impl.ts +0 -65
- package/src/med_editor/framework/impl/comments/comments-container-impl.ts +0 -68
- package/src/med_editor/framework/impl/comments/comments-util.ts +0 -84
- package/src/med_editor/framework/impl/comments/validate-msg-impl.ts +0 -94
- package/src/med_editor/framework/impl/data-element/data-decorate-impl.ts +0 -95
- package/src/med_editor/framework/impl/data-element/data-element-barcode.ts +0 -127
- package/src/med_editor/framework/impl/data-element/data-element-base-impl.ts +0 -234
- package/src/med_editor/framework/impl/data-element/data-element-check-impl.ts +0 -146
- package/src/med_editor/framework/impl/data-element/data-element-date-impl.ts +0 -128
- package/src/med_editor/framework/impl/data-element/data-element-group-impl.ts +0 -150
- package/src/med_editor/framework/impl/data-element/data-element-image-impl.ts +0 -147
- package/src/med_editor/framework/impl/data-element/data-element-list-impl.ts +0 -142
- package/src/med_editor/framework/impl/data-element/data-element-text-impl.ts +0 -117
- package/src/med_editor/framework/impl/decorate/fill-null-space-imple.ts +0 -48
- package/src/med_editor/framework/impl/document/doc-body-impl.ts +0 -95
- package/src/med_editor/framework/impl/document/doc-body-part-impl.ts +0 -104
- package/src/med_editor/framework/impl/document/doc-container-impl.ts +0 -24
- package/src/med_editor/framework/impl/document/doc-footer-impl.ts +0 -88
- package/src/med_editor/framework/impl/document/doc-header-impl.ts +0 -100
- package/src/med_editor/framework/impl/document/doc-impl.ts +0 -226
- package/src/med_editor/framework/impl/media-formula/menstrual-history.ts +0 -175
- package/src/med_editor/framework/impl/paragraph/p-impl.ts +0 -190
- package/src/med_editor/framework/impl/picture/image-impl.ts +0 -136
- package/src/med_editor/framework/impl/radio/radio-impl.ts +0 -79
- package/src/med_editor/framework/impl/symbol/br-symbol-impl.ts +0 -60
- package/src/med_editor/framework/impl/symbol/p-symbol-impl.ts +0 -57
- package/src/med_editor/framework/impl/table/table-cell-impl.ts +0 -156
- package/src/med_editor/framework/impl/table/table-impl.ts +0 -401
- package/src/med_editor/framework/impl/table/table-row-impl.ts +0 -83
- package/src/med_editor/framework/impl/table/table-split-cell-patch.ts +0 -98
- package/src/med_editor/framework/impl/table/table-split-cell.ts +0 -475
- package/src/med_editor/framework/impl/table/table-util.ts +0 -716
- package/src/med_editor/framework/impl/text/text-impl.ts +0 -163
- package/src/med_editor/framework/impl/text/track-run-impl.ts +0 -135
- package/src/med_editor/framework/notify.ts +0 -130
- package/src/med_editor/framework/range-util.ts +0 -321
- package/src/med_editor/framework/render-context.ts +0 -431
- package/src/med_editor/framework/render-define.ts +0 -224
- package/src/med_editor/framework/selection-overlays.ts +0 -133
- package/src/med_editor/texteditor.ts +0 -1010
- package/src/med_editor/util/subject.ts +0 -118
- package/src/med_editor//345/205/245/351/231/242/350/256/260/345/275/225.json +0 -3573
- package/src/med_editor//345/205/245/351/231/242/350/256/260/345/275/225/346/265/213/350/257/225.json +0 -3573
- package/src/med_editor//345/205/245/351/231/242/350/256/260/345/275/225/346/265/213/350/257/225bug.json +0 -315
- package/src/med_editor//345/205/245/351/231/242/350/256/260/345/275/225/346/265/213/350/257/225/346/211/271/346/263/250.json +0 -122
- package/src/med_editor//345/205/245/351/231/242/350/256/260/345/275/225/346/265/213/350/257/225/346/226/207/346/241/243/351/252/214/350/257/201.json +0 -3599
- package/src/med_editor//345/205/245/351/231/242/350/256/260/345/275/225/346/265/213/350/257/225/351/225/277/346/226/207/346/234/254.json +0 -24586
- package/src/med_editor//345/220/210/345/271/266/347/227/205/347/250/213/345/275/225.json +0 -2874
- package/src/med_editor//346/211/213/346/234/257/350/256/260/345/275/225.json +0 -341
- package/src/med_editor//346/231/256/351/200/232doc/347/261/273/346/226/207/346/241/243.json +0 -2201
- package/src/med_editor//346/243/200/351/252/214/347/224/263/350/257/267/345/215/225.json +0 -1069
- package/src/med_editor//347/227/205/347/250/213/345/275/225//345/206/205/351/225/234/344/270/213/346/262/273/347/226/227/350/256/260/345/275/225.json +0 -125
- package/src/med_editor//347/227/205/347/250/213/345/275/225//345/220/210/345/271/266/347/227/205/347/250/213/345/275/225/346/250/241/346/235/277.json +0 -86
- package/src/med_editor//347/227/205/347/250/213/345/275/225//346/227/245/345/270/270/347/227/205/347/250/213/350/256/260/345/275/225.json +0 -115
- package/src/med_editor//347/227/205/347/250/213/345/275/225//346/237/245/346/210/277/350/256/260/345/275/2251.json +0 -108
- package/src/med_editor//347/227/205/347/250/213/345/275/225//351/246/226/346/254/241/344/270/212/347/272/247/345/214/273/345/270/210/346/237/245/346/210/277/350/256/260/345/275/225.json +0 -272
- package/src/med_editor//351/225/277/346/234/237/345/214/273/345/230/261/345/215/225.json +0 -1070
@@ -0,0 +1,1463 @@
|
|
1
|
+
import { nanoid } from "nanoid";
|
2
|
+
import { BranchElement, LeafElement, Rect } from "./element-define";
|
3
|
+
import { TextProps } from "./element-props";
|
4
|
+
import { CommsContainerElement } from "./impl/comments/comments-container-impl";
|
5
|
+
import { DataElementInlineGroup } from "./impl/data-element/data-element-base-impl";
|
6
|
+
import { DocumentBodyElement } from "./impl/document/doc-body-impl";
|
7
|
+
import { DocumentFooterElement } from "./impl/document/doc-footer-impl";
|
8
|
+
import { DocumentHeaderElement } from "./impl/document/doc-header-impl";
|
9
|
+
import { DocumentRenderObject } from "./impl/document/doc-impl";
|
10
|
+
import { ParagraphElement, ParagraphLineRectRenderObject, ParagraphRenderObject } from "./impl/paragraph/p-impl";
|
11
|
+
import { PSymbolElement } from "./impl/symbol/p-symbol-impl";
|
12
|
+
import { TableCellElement } from "./impl/table/table-cell-impl";
|
13
|
+
import { TableRenderObject } from "./impl/table/table-impl";
|
14
|
+
import { TableRowRenderObject } from "./impl/table/table-row-impl";
|
15
|
+
import { TextGroupElement, TextGroupRenderObject } from "./impl/text/text-impl";
|
16
|
+
import { TrackRunElement } from "./impl/text/track-run-impl";
|
17
|
+
import { BranchRenderObject, LeafRenderObject } from "./render-define";
|
18
|
+
export class ElementUtil {
|
19
|
+
static setCanvasProps(canvas, ctx, viewOptions, scale = 1) {
|
20
|
+
// if (canvas instanceof OffscreenCanvas) {
|
21
|
+
// this.setOffscreenCanvas(canvas, ctx as OffscreenCanvasRenderingContext2D, viewOptions, scale);
|
22
|
+
// return
|
23
|
+
// }
|
24
|
+
const { width, height } = viewOptions;
|
25
|
+
let dpr = window.devicePixelRatio || 1;
|
26
|
+
if (scale > 1) {
|
27
|
+
dpr *= scale;
|
28
|
+
}
|
29
|
+
dpr = Math.ceil(dpr);
|
30
|
+
const scaleWidth = Math.floor(width * dpr) / dpr;
|
31
|
+
const scaleHeight = Math.floor(height * dpr) / dpr;
|
32
|
+
canvas.style.width = scaleWidth + 'px';
|
33
|
+
canvas.style.height = scaleHeight + 'px';
|
34
|
+
canvas.width = scaleWidth * dpr;
|
35
|
+
canvas.height = scaleHeight * dpr;
|
36
|
+
ctx.scale(dpr, dpr);
|
37
|
+
}
|
38
|
+
// static setOffscreenCanvas(canvas: OffscreenCanvas, ctx: OffscreenCanvasRenderingContext2D, viewOptions: { width: number, height: number }, scale: number = 1): void {
|
39
|
+
// const { width, height } = viewOptions;
|
40
|
+
// let dpr = window.devicePixelRatio || 1;
|
41
|
+
// if (scale > 1) {
|
42
|
+
// dpr *= scale;
|
43
|
+
// }
|
44
|
+
// dpr = Math.ceil(dpr);
|
45
|
+
// const scaleWidth = Math.floor(width * dpr) / dpr;
|
46
|
+
// const scaleHeight = Math.floor(height * dpr) / dpr;
|
47
|
+
// canvas.width = scaleWidth * dpr;
|
48
|
+
// canvas.height = scaleHeight * dpr;
|
49
|
+
// ctx.scale(dpr, dpr);
|
50
|
+
// }
|
51
|
+
static getDprNumber(val, scale = 1) {
|
52
|
+
let dpr = window.devicePixelRatio || 1;
|
53
|
+
if (scale > 1) {
|
54
|
+
dpr *= scale;
|
55
|
+
}
|
56
|
+
dpr = Math.ceil(dpr);
|
57
|
+
return Math.floor(val * dpr) / dpr;
|
58
|
+
}
|
59
|
+
static readTextProps(dest, props, options) {
|
60
|
+
if (!props) {
|
61
|
+
return this.createTextProps(dest, options);
|
62
|
+
}
|
63
|
+
const textProps = dest ?? new TextProps();
|
64
|
+
textProps.color = props.color || options.defaultColor;
|
65
|
+
textProps.fontName = props.fontName || options.defaultFontName;
|
66
|
+
textProps.fontSize = props.fontSize || options.defaultFontSize;
|
67
|
+
textProps.border = props.border;
|
68
|
+
if (props.fontWeight) {
|
69
|
+
textProps.fontWeight = props.fontWeight;
|
70
|
+
}
|
71
|
+
if (props.fontStyle) {
|
72
|
+
textProps.fontStyle = props.fontStyle;
|
73
|
+
}
|
74
|
+
if (props.underline) {
|
75
|
+
textProps.underline = props.underline;
|
76
|
+
}
|
77
|
+
if (props.linethrough) {
|
78
|
+
textProps.linethrough = props.linethrough;
|
79
|
+
}
|
80
|
+
if (props.overline) {
|
81
|
+
textProps.overline = props.overline;
|
82
|
+
}
|
83
|
+
if (props.background) {
|
84
|
+
textProps.background = props.background;
|
85
|
+
}
|
86
|
+
if (props.letterSpace) {
|
87
|
+
textProps.letterSpace = props.letterSpace;
|
88
|
+
}
|
89
|
+
if (props.vertAlign) {
|
90
|
+
textProps.vertAlign = props.vertAlign;
|
91
|
+
}
|
92
|
+
return textProps;
|
93
|
+
}
|
94
|
+
static readEleBaseProps(dest, props) {
|
95
|
+
dest.id = props.id ?? nanoid(5);
|
96
|
+
dest.name = props.name;
|
97
|
+
dest.caption = props.caption;
|
98
|
+
dest.editable = props.editable ?? true;
|
99
|
+
dest.fieldName = props.fieldName;
|
100
|
+
dest.minLength = props.minLength;
|
101
|
+
dest.printable = props.printable ?? true;
|
102
|
+
dest.required = props.required;
|
103
|
+
dest.secretBrowse = props.secretBrowse;
|
104
|
+
dest.deleteable = props.deleteable;
|
105
|
+
dest.underline = props.underline;
|
106
|
+
dest.type = props.type;
|
107
|
+
return dest;
|
108
|
+
}
|
109
|
+
/**
|
110
|
+
* 获取内容区域最大高度
|
111
|
+
* @param render
|
112
|
+
* @param renderHeight
|
113
|
+
* @returns
|
114
|
+
*/
|
115
|
+
static innerRectMaxHeight(render, renderHeight) {
|
116
|
+
const { padding } = render;
|
117
|
+
return renderHeight - padding.top - padding.bottom;
|
118
|
+
}
|
119
|
+
/**
|
120
|
+
* 根据内框内容高度,更新外框框体高度
|
121
|
+
* @param render
|
122
|
+
* @param innerRect
|
123
|
+
*/
|
124
|
+
static updateRenderHeightByInnerRect(render, innerRect) {
|
125
|
+
const { padding, margin } = render;
|
126
|
+
//外层容器高度等于内容高度+外边距+内边距
|
127
|
+
render.rect.height = innerRect.height + margin.top + margin.bottom + padding.top + padding.bottom;
|
128
|
+
}
|
129
|
+
/**
|
130
|
+
* 设置块级元素限制尺寸
|
131
|
+
* @param render
|
132
|
+
* @param parentLimitRect
|
133
|
+
*/
|
134
|
+
static setBlockElementLimitSize(render, parentLimitRect) {
|
135
|
+
render.rect.x = parentLimitRect.x;
|
136
|
+
render.rect.y = parentLimitRect.y + parentLimitRect.height;
|
137
|
+
render.rect.width = parentLimitRect.maxWidth ?? 0;
|
138
|
+
render.rect.maxWidth = parentLimitRect.maxWidth;
|
139
|
+
if (parentLimitRect.maxHeight) {
|
140
|
+
render.rect.maxHeight = parentLimitRect.maxHeight - parentLimitRect.height;
|
141
|
+
}
|
142
|
+
}
|
143
|
+
/**
|
144
|
+
* 克隆框体
|
145
|
+
* @param rect
|
146
|
+
* @returns
|
147
|
+
*/
|
148
|
+
static cloneRect(rect) {
|
149
|
+
const cloneRect = new Rect();
|
150
|
+
cloneRect.x = rect.x;
|
151
|
+
cloneRect.y = rect.y;
|
152
|
+
cloneRect.width = rect.width;
|
153
|
+
cloneRect.height = rect.height;
|
154
|
+
cloneRect.maxHeight = rect.maxHeight;
|
155
|
+
cloneRect.maxWidth = rect.maxWidth;
|
156
|
+
return cloneRect;
|
157
|
+
}
|
158
|
+
/**
|
159
|
+
* 重新限定子元素以及当前高度值,并返回内边框内容高度
|
160
|
+
* @param render
|
161
|
+
* @param resetX 测量段落外框时,内框不需要重置x,因为内框已经存在对齐
|
162
|
+
* @returns
|
163
|
+
*/
|
164
|
+
static remeasure(render, resetX = true) {
|
165
|
+
if (render.rect.width === 0) {
|
166
|
+
return -1;
|
167
|
+
}
|
168
|
+
if (render instanceof TableRowRenderObject) {
|
169
|
+
return this.remeasureTableRow(render);
|
170
|
+
}
|
171
|
+
if (render instanceof TableRenderObject) {
|
172
|
+
this.remeasureTableMerge(render);
|
173
|
+
}
|
174
|
+
const innerRect = render.getInnnerRect();
|
175
|
+
for (let i = 0; i < render.length; i++) {
|
176
|
+
const line = render.getChild(i);
|
177
|
+
if (resetX) {
|
178
|
+
line.rect.x = innerRect.x;
|
179
|
+
}
|
180
|
+
line.rect.y = innerRect.height + innerRect.y + line.margin.top;
|
181
|
+
line.rect.maxWidth = innerRect.maxWidth;
|
182
|
+
innerRect.height += line.rect.height + line.margin.top + line.margin.bottom;
|
183
|
+
}
|
184
|
+
render.updateRenderHeight(innerRect);
|
185
|
+
return innerRect.height;
|
186
|
+
}
|
187
|
+
static remeasureTableRow(rowRender, foreceColIndex = -1) {
|
188
|
+
const rowEle = rowRender.element;
|
189
|
+
const rowMinHeight = rowEle.props.minHeight > 19 ? rowEle.props.minHeight : 19;
|
190
|
+
let maxCellheight = rowMinHeight;
|
191
|
+
//限制行最小高度
|
192
|
+
maxCellheight = maxCellheight < 19 ? 19 : maxCellheight;
|
193
|
+
//获取行内非纵向合并单元格的最高单元格高度
|
194
|
+
for (let i = 0; i < rowRender.length; i++) {
|
195
|
+
const cellRender = rowRender.getChild(i);
|
196
|
+
const { vMerge } = cellRender.element.props;
|
197
|
+
if (cellRender.rect.height > maxCellheight && (vMerge !== 'restart' || i === foreceColIndex)) {
|
198
|
+
maxCellheight = cellRender.rect.height;
|
199
|
+
}
|
200
|
+
}
|
201
|
+
//循环设置单元格高度为行内最大单元格高度
|
202
|
+
for (let i = 0; i < rowRender.length; i++) {
|
203
|
+
const cellRender = rowRender.getChild(i);
|
204
|
+
const cellElement = cellRender.element;
|
205
|
+
const { vMerge } = cellElement.props;
|
206
|
+
if ((vMerge !== 'restart' || i === foreceColIndex) || cellRender.rect.height < maxCellheight) {
|
207
|
+
cellRender.rect.height = maxCellheight;
|
208
|
+
}
|
209
|
+
//处理单元格内容纵向居中
|
210
|
+
this.measureCellVAlign(cellRender);
|
211
|
+
}
|
212
|
+
//设置行高
|
213
|
+
rowRender.updateRenderHeight(maxCellheight);
|
214
|
+
return maxCellheight;
|
215
|
+
}
|
216
|
+
/**
|
217
|
+
* 获取表格行绘制元素的内容高度,用于缩放行高度时,获取最小内容高度,缩放的高度不能小于内容最小高度
|
218
|
+
*/
|
219
|
+
static getTableRowRenderContentHeight(rowRender) {
|
220
|
+
const rowEle = rowRender.element;
|
221
|
+
let maxCellheight = 19;
|
222
|
+
//限制行最小高度
|
223
|
+
//获取行内非纵向合并单元格的最高单元格高度
|
224
|
+
for (let i = 0; i < rowRender.length; i++) {
|
225
|
+
const cellRender = rowRender.getChild(i);
|
226
|
+
const cellContentHeight = this.getTableCellRenderContentHeight(cellRender);
|
227
|
+
const { vMerge } = cellRender.element.props;
|
228
|
+
if (cellContentHeight > maxCellheight && vMerge !== 'restart') {
|
229
|
+
maxCellheight = cellContentHeight;
|
230
|
+
}
|
231
|
+
}
|
232
|
+
return maxCellheight;
|
233
|
+
}
|
234
|
+
/**
|
235
|
+
* 获取单元格内容高度
|
236
|
+
* 单元格暂不处理上下margin、padding
|
237
|
+
* @param cellRender
|
238
|
+
* @returns
|
239
|
+
*/
|
240
|
+
static getTableCellRenderContentHeight(cellRender) {
|
241
|
+
let contentHeight = 0;
|
242
|
+
for (let i = 0; i < cellRender.length; i++) {
|
243
|
+
contentHeight += cellRender.getChild(i).rect.height;
|
244
|
+
}
|
245
|
+
return contentHeight;
|
246
|
+
}
|
247
|
+
/**
|
248
|
+
* 处理单元格内容纵向对齐
|
249
|
+
* @param render
|
250
|
+
*/
|
251
|
+
static measureCellVAlign(render) {
|
252
|
+
const tcElement = render.element;
|
253
|
+
const { vAlign } = tcElement.props;
|
254
|
+
if (!vAlign || vAlign === 'top') {
|
255
|
+
return;
|
256
|
+
}
|
257
|
+
let sumHeight = 0;
|
258
|
+
for (let i = 0; i < render.length; i++) {
|
259
|
+
sumHeight += render.getChild(i).rect.height;
|
260
|
+
}
|
261
|
+
let spaceHeight = 0;
|
262
|
+
spaceHeight = vAlign === 'middle' ? Math.floor((render.rect.height - sumHeight) / 2) : vAlign === 'bottom' ? render.rect.height - sumHeight : 0;
|
263
|
+
if (spaceHeight <= 0) {
|
264
|
+
return;
|
265
|
+
}
|
266
|
+
let y = spaceHeight;
|
267
|
+
for (let i = 0; i < render.length; i++) {
|
268
|
+
render.getChild(i).rect.y = y;
|
269
|
+
y += render.getChild(i).rect.height;
|
270
|
+
}
|
271
|
+
}
|
272
|
+
/**
|
273
|
+
* 重新测量合并单元格高度
|
274
|
+
* @param tbRender
|
275
|
+
* @returns
|
276
|
+
*/
|
277
|
+
static remeasureTableMerge(tbRender) {
|
278
|
+
//是否需要重新计算,主要解决:之前合并计算的列,可能会被后面合并计算的列所影响,需要再次重新计算测量
|
279
|
+
let needReCalc = false;
|
280
|
+
for (let i = 0; i < tbRender.length; i++) {
|
281
|
+
const row = tbRender.getChild(i);
|
282
|
+
for (let j = 0; j < row.length; j++) {
|
283
|
+
const cellRender = row.getChild(j);
|
284
|
+
const ele = cellRender.element;
|
285
|
+
const { vMerge } = ele.props;
|
286
|
+
if (vMerge === 'restart') {
|
287
|
+
const eleIndex = ele.getIndex();
|
288
|
+
const continueRows = this.getContinueVMergeRenderRows(tbRender, i, eleIndex);
|
289
|
+
if (!continueRows.length) {
|
290
|
+
//向下不存在合并的单元格,当前合并的单元格是被cut过来的,并且当前单元格高度高于行内高度需要remeasure当前行
|
291
|
+
if (cellRender.rect.height > row.rect.height) {
|
292
|
+
this.remeasureTableRow(row, j);
|
293
|
+
needReCalc = true;
|
294
|
+
}
|
295
|
+
continue;
|
296
|
+
}
|
297
|
+
const continueCellHeight = continueRows.reduce((prev, curr) => prev + curr.rect.height, 0);
|
298
|
+
const overflowHeight = cellRender.rect.height - row.rect.height - continueCellHeight;
|
299
|
+
//溢出的高度加到最后一个合并单元格中
|
300
|
+
if (overflowHeight > 0) {
|
301
|
+
const lastRow = continueRows[continueRows.length - 1];
|
302
|
+
lastRow.rect.height += overflowHeight;
|
303
|
+
this.resizeCellToFillRow(lastRow);
|
304
|
+
needReCalc = true;
|
305
|
+
}
|
306
|
+
else {
|
307
|
+
cellRender.rect.height = row.rect.height + continueCellHeight;
|
308
|
+
}
|
309
|
+
}
|
310
|
+
}
|
311
|
+
}
|
312
|
+
if (needReCalc) {
|
313
|
+
this.remeasureTableMerge(tbRender);
|
314
|
+
return;
|
315
|
+
}
|
316
|
+
}
|
317
|
+
/**
|
318
|
+
* 获取向下纵向合并的行
|
319
|
+
* @param render
|
320
|
+
* @param rowIndex
|
321
|
+
* @param colIndex
|
322
|
+
* @returns
|
323
|
+
*/
|
324
|
+
static getContinueVMergeRenderRows(render, rowIndex, colIndex) {
|
325
|
+
const rows = [];
|
326
|
+
for (let i = rowIndex + 1; i < render.length; i++) {
|
327
|
+
const rowRender = render.getChild(i);
|
328
|
+
const rowEle = rowRender.element;
|
329
|
+
const ele = rowEle.getChild(colIndex);
|
330
|
+
const { vMerge } = ele.props;
|
331
|
+
if (vMerge !== 'continue') {
|
332
|
+
break;
|
333
|
+
}
|
334
|
+
rows.push(rowRender);
|
335
|
+
}
|
336
|
+
return rows;
|
337
|
+
}
|
338
|
+
/**
|
339
|
+
* 根据横向当前被合并的单元格
|
340
|
+
* @param tb
|
341
|
+
* @param rowIndex
|
342
|
+
* @param colIndex
|
343
|
+
*/
|
344
|
+
static getHorizontalRestartCellIndex(tb, rowIndex, colIndex) {
|
345
|
+
const row = tb.getChild(rowIndex);
|
346
|
+
for (let i = colIndex - 1; i >= 0; i--) {
|
347
|
+
const cell = row.getChild(i);
|
348
|
+
if (cell.props.hMerge === 'restart') {
|
349
|
+
return i;
|
350
|
+
}
|
351
|
+
}
|
352
|
+
throw new Error('未找到主合并单元格');
|
353
|
+
}
|
354
|
+
/**
|
355
|
+
* 根据横向当前被合并的单元格
|
356
|
+
* @param tb
|
357
|
+
* @param rowIndex
|
358
|
+
* @param colIndex
|
359
|
+
*/
|
360
|
+
static getVerticalRestartCellIndex(tb, rowIndex, colIndex) {
|
361
|
+
for (let i = rowIndex - 1; i >= 0; i--) {
|
362
|
+
const row = tb.getChild(i);
|
363
|
+
const cell = row.getChild(colIndex);
|
364
|
+
if (cell.props.vMerge === 'restart') {
|
365
|
+
return i;
|
366
|
+
}
|
367
|
+
}
|
368
|
+
throw new Error('未找到横向当前被合并的单元格');
|
369
|
+
}
|
370
|
+
/**
|
371
|
+
* 获取合并单元格主单元格
|
372
|
+
* @param tb
|
373
|
+
* @param rowIndex
|
374
|
+
* @param colIndex
|
375
|
+
* @returns
|
376
|
+
*/
|
377
|
+
static getRestartCellPosition(tb, rowIndex, colIndex) {
|
378
|
+
const row = tb.getChild(rowIndex);
|
379
|
+
const cell = row.getChild(colIndex);
|
380
|
+
if (cell.props.hMerge === 'continue') {
|
381
|
+
const restartCellIndex = this.getHorizontalRestartCellIndex(tb, rowIndex, colIndex);
|
382
|
+
return this.getRestartCellPosition(tb, rowIndex, restartCellIndex);
|
383
|
+
}
|
384
|
+
if (cell.props.vMerge === 'continue') {
|
385
|
+
const restartRowIndex = this.getVerticalRestartCellIndex(tb, rowIndex, colIndex);
|
386
|
+
return this.getRestartCellPosition(tb, restartRowIndex, colIndex);
|
387
|
+
}
|
388
|
+
return { rowIndex, colIndex };
|
389
|
+
}
|
390
|
+
/**
|
391
|
+
* 调整单元格高度填满整个行的高度
|
392
|
+
*/
|
393
|
+
static resizeCellToFillRow(row) {
|
394
|
+
for (let i = 0; i < row.length; i++) {
|
395
|
+
const cell = row.getChild(i);
|
396
|
+
cell.rect.height = row.rect.height;
|
397
|
+
}
|
398
|
+
}
|
399
|
+
/**
|
400
|
+
* 获取元素的全局索引位置
|
401
|
+
* @param control
|
402
|
+
* @returns
|
403
|
+
*/
|
404
|
+
static getControlIndex(control) {
|
405
|
+
const parent = control.parent;
|
406
|
+
if (parent) {
|
407
|
+
const index = control.getIndex();
|
408
|
+
let counter = 1;
|
409
|
+
for (let i = 0; i < index; i++) {
|
410
|
+
const child = parent.getChild(i);
|
411
|
+
counter += child.getSelfLength();
|
412
|
+
}
|
413
|
+
return counter + this.getControlIndex(parent);
|
414
|
+
}
|
415
|
+
else {
|
416
|
+
return 0;
|
417
|
+
}
|
418
|
+
}
|
419
|
+
/**
|
420
|
+
* 根据全局索引位置获取元素
|
421
|
+
* @param control
|
422
|
+
* @param counter
|
423
|
+
* @returns
|
424
|
+
*/
|
425
|
+
static getControlByIndex(control, counter) {
|
426
|
+
counter.currIndex++;
|
427
|
+
if (counter.currIndex === counter.index) {
|
428
|
+
return control;
|
429
|
+
}
|
430
|
+
if (control instanceof LeafElement) {
|
431
|
+
return null;
|
432
|
+
}
|
433
|
+
else if (control instanceof BranchElement) {
|
434
|
+
for (let i = 0; i < control.length; i++) {
|
435
|
+
const res = this.getControlByIndex(control.getChild(i), counter);
|
436
|
+
if (res) {
|
437
|
+
return res;
|
438
|
+
}
|
439
|
+
}
|
440
|
+
}
|
441
|
+
return null;
|
442
|
+
}
|
443
|
+
/**
|
444
|
+
* 获取同级紧挨前方的兄弟元素
|
445
|
+
* @param element
|
446
|
+
* @returns
|
447
|
+
*/
|
448
|
+
static getPrevSiblingElement(element) {
|
449
|
+
const parent = element.parent;
|
450
|
+
if (!parent) {
|
451
|
+
return null;
|
452
|
+
}
|
453
|
+
if (parent) {
|
454
|
+
const index = parent.getChildIndex(element);
|
455
|
+
if (index > 0) {
|
456
|
+
return parent.getChild(index - 1);
|
457
|
+
}
|
458
|
+
}
|
459
|
+
return null;
|
460
|
+
}
|
461
|
+
/**
|
462
|
+
* 获取同级紧挨下方的元素
|
463
|
+
* @param element
|
464
|
+
* @returns
|
465
|
+
*/
|
466
|
+
static getNextSiblingElement(element) {
|
467
|
+
const parent = element.parent;
|
468
|
+
if (!parent) {
|
469
|
+
return null;
|
470
|
+
}
|
471
|
+
if (parent) {
|
472
|
+
const index = parent.getChildIndex(element);
|
473
|
+
if (index < parent.length - 1) {
|
474
|
+
return parent.getChild(index + 1);
|
475
|
+
}
|
476
|
+
}
|
477
|
+
return null;
|
478
|
+
}
|
479
|
+
static getNextSiblingTrackElement(element, type, userId) {
|
480
|
+
const nextSiblingEle = this.getNextSiblingElement(element);
|
481
|
+
if (nextSiblingEle instanceof TrackRunElement) {
|
482
|
+
if (nextSiblingEle.type === type && nextSiblingEle.props.userId === userId) {
|
483
|
+
return nextSiblingEle;
|
484
|
+
}
|
485
|
+
}
|
486
|
+
return null;
|
487
|
+
}
|
488
|
+
static getPrevSiblingTrackElement(element, type, userId) {
|
489
|
+
const prevSiblingEle = this.getPrevSiblingElement(element);
|
490
|
+
if (prevSiblingEle instanceof TrackRunElement) {
|
491
|
+
if (prevSiblingEle.type === type && prevSiblingEle.props.userId === userId) {
|
492
|
+
return prevSiblingEle;
|
493
|
+
}
|
494
|
+
}
|
495
|
+
return null;
|
496
|
+
}
|
497
|
+
/**
|
498
|
+
* 根据默认配置创建长文本
|
499
|
+
* @param viewOptions
|
500
|
+
* @returns
|
501
|
+
*/
|
502
|
+
static getNewTextGroup(textProps) {
|
503
|
+
const text = new TextGroupElement();
|
504
|
+
textProps.clone(text.props);
|
505
|
+
return text;
|
506
|
+
}
|
507
|
+
static createTextProps(dest, viewOptions) {
|
508
|
+
const textProps = dest ?? new TextProps();
|
509
|
+
textProps.fontSize = viewOptions.defaultFontSize;
|
510
|
+
textProps.fontName = viewOptions.defaultFontName;
|
511
|
+
textProps.color = viewOptions.defaultColor;
|
512
|
+
return textProps;
|
513
|
+
}
|
514
|
+
/**
|
515
|
+
* 获取容器内的最小渲染元素集合
|
516
|
+
* @param parPos
|
517
|
+
* @param array
|
518
|
+
*/
|
519
|
+
static getAvailHitLeafRenderObjects(render, parPos) {
|
520
|
+
if (!this.checkAvailHitRender(render)) {
|
521
|
+
return [];
|
522
|
+
}
|
523
|
+
const renderObjectRect = {
|
524
|
+
x: parPos.x + render.rect.x,
|
525
|
+
y: parPos.y + render.rect.y,
|
526
|
+
width: render.rect.width,
|
527
|
+
height: render.rect.height,
|
528
|
+
maxWidth: 0,
|
529
|
+
maxHeight: 0
|
530
|
+
};
|
531
|
+
const array = [];
|
532
|
+
if (render instanceof BranchRenderObject) {
|
533
|
+
for (let i = 0; i < render.length; i++) {
|
534
|
+
const child = render.getChild(i);
|
535
|
+
array.push(...this.getAvailHitLeafRenderObjects(child, { x: renderObjectRect.x, y: renderObjectRect.y }));
|
536
|
+
}
|
537
|
+
}
|
538
|
+
else if (render instanceof LeafRenderObject) {
|
539
|
+
array.push({ render: render, rect: renderObjectRect });
|
540
|
+
}
|
541
|
+
else {
|
542
|
+
throw new Error('未实现');
|
543
|
+
}
|
544
|
+
return array;
|
545
|
+
}
|
546
|
+
/**
|
547
|
+
* 获取容器内的最小渲染元素集合
|
548
|
+
* @param parPos
|
549
|
+
* @param array
|
550
|
+
*/
|
551
|
+
static getAvailHitRenderObjects(render, parPos) {
|
552
|
+
if (!this.checkAvailHitRender(render)) {
|
553
|
+
return [];
|
554
|
+
}
|
555
|
+
const renderObjectRect = this.getRenderObjectAbsoluteRect(render, parPos);
|
556
|
+
const array = [];
|
557
|
+
if (render instanceof BranchRenderObject) {
|
558
|
+
for (let i = 0; i < render.length; i++) {
|
559
|
+
const child = render.getChild(i);
|
560
|
+
if (this.checkAvailHitRender(child)) {
|
561
|
+
array.push({ render: child, rect: this.getRenderObjectAbsoluteRect(child, renderObjectRect) });
|
562
|
+
}
|
563
|
+
}
|
564
|
+
}
|
565
|
+
else if (render instanceof LeafRenderObject) {
|
566
|
+
array.push({ render: render, rect: renderObjectRect });
|
567
|
+
}
|
568
|
+
else {
|
569
|
+
throw new Error('未实现');
|
570
|
+
}
|
571
|
+
return array;
|
572
|
+
}
|
573
|
+
/**
|
574
|
+
* 获取绘制元素的绝对位置框
|
575
|
+
*/
|
576
|
+
static getRenderObjectAbsoluteRect(render, parPos) {
|
577
|
+
const renderObjectRect = {
|
578
|
+
x: parPos.x + render.rect.x,
|
579
|
+
y: parPos.y + render.rect.y,
|
580
|
+
width: render.rect.width,
|
581
|
+
height: render.rect.height,
|
582
|
+
maxWidth: 0,
|
583
|
+
maxHeight: 0
|
584
|
+
};
|
585
|
+
return renderObjectRect;
|
586
|
+
}
|
587
|
+
/**
|
588
|
+
* 检查当前绘制元素是否属于有效点击元素
|
589
|
+
*/
|
590
|
+
static checkAvailHitRender(render) {
|
591
|
+
if (render.element && render.element.disableClick) {
|
592
|
+
return false;
|
593
|
+
}
|
594
|
+
if (render instanceof TableRowRenderObject) {
|
595
|
+
const rowEle = render.element;
|
596
|
+
if (rowEle.props.headerRow) {
|
597
|
+
return rowEle.paintRenders.indexOf(render) === 0;
|
598
|
+
}
|
599
|
+
}
|
600
|
+
return !render.disableClick;
|
601
|
+
}
|
602
|
+
/**
|
603
|
+
* 验证点击可操作性
|
604
|
+
* 主要限制页眉页脚的编辑模式
|
605
|
+
*/
|
606
|
+
static verifyHitable(sourceElement) {
|
607
|
+
if (!sourceElement) {
|
608
|
+
return false;
|
609
|
+
}
|
610
|
+
const parents = ElementUtil.getParentElements(sourceElement);
|
611
|
+
for (let i = parents.length - 1; i >= 0; i--) {
|
612
|
+
const child = parents[i];
|
613
|
+
if (child.disableClick) {
|
614
|
+
return false;
|
615
|
+
}
|
616
|
+
}
|
617
|
+
return true;
|
618
|
+
}
|
619
|
+
/**
|
620
|
+
* 获取一个点到一个矩形最短的距离
|
621
|
+
* @param rect
|
622
|
+
* @param p
|
623
|
+
* @returns
|
624
|
+
*/
|
625
|
+
static getDistanceToRect(rect, p) {
|
626
|
+
const lines = [];
|
627
|
+
lines.push({
|
628
|
+
f: {
|
629
|
+
x: rect.x,
|
630
|
+
y: rect.y
|
631
|
+
},
|
632
|
+
s: {
|
633
|
+
x: rect.x + rect.width,
|
634
|
+
y: rect.y
|
635
|
+
}
|
636
|
+
}, {
|
637
|
+
f: {
|
638
|
+
x: rect.x,
|
639
|
+
y: rect.y
|
640
|
+
},
|
641
|
+
s: {
|
642
|
+
x: rect.x,
|
643
|
+
y: rect.y + rect.height
|
644
|
+
}
|
645
|
+
}, {
|
646
|
+
f: {
|
647
|
+
x: rect.x,
|
648
|
+
y: rect.y + rect.height
|
649
|
+
},
|
650
|
+
s: {
|
651
|
+
x: rect.x + rect.width,
|
652
|
+
y: rect.y + rect.height
|
653
|
+
}
|
654
|
+
}, {
|
655
|
+
f: {
|
656
|
+
x: rect.x + rect.width,
|
657
|
+
y: rect.y
|
658
|
+
},
|
659
|
+
s: {
|
660
|
+
x: rect.x + rect.width,
|
661
|
+
y: rect.y + rect.height
|
662
|
+
}
|
663
|
+
});
|
664
|
+
const distances = lines.map(item => this.minDistance(item.f, item.s, p));
|
665
|
+
return Math.min(...distances);
|
666
|
+
}
|
667
|
+
static minDistance(A, B, E) {
|
668
|
+
const AB = { x: B.x - A.x, y: B.y - A.y };
|
669
|
+
const BE = { x: E.x - B.x, y: E.y - B.y };
|
670
|
+
const AE = { x: E.x - A.x, y: E.y - A.y };
|
671
|
+
const AB_BE = (AB.x * BE.x + AB.y * BE.y);
|
672
|
+
const AB_AE = (AB.x * AE.x + AB.y * AE.y);
|
673
|
+
let reqAns = 0;
|
674
|
+
if (AB_BE > 0) {
|
675
|
+
const y = E.y - B.y;
|
676
|
+
const x = E.x - B.x;
|
677
|
+
reqAns = Math.sqrt(x * x + y * y);
|
678
|
+
}
|
679
|
+
else if (AB_AE < 0) {
|
680
|
+
const y = E.y - A.y;
|
681
|
+
const x = E.x - A.x;
|
682
|
+
reqAns = Math.sqrt(x * x + y * y);
|
683
|
+
}
|
684
|
+
else {
|
685
|
+
const x1 = AB.x;
|
686
|
+
const y1 = AB.y;
|
687
|
+
const x2 = AE.x;
|
688
|
+
const y2 = AE.y;
|
689
|
+
const mod = Math.sqrt(x1 * x1 + y1 * y1);
|
690
|
+
reqAns = Math.abs(x1 * y2 - y1 * x2) / mod;
|
691
|
+
}
|
692
|
+
return reqAns;
|
693
|
+
}
|
694
|
+
/**
|
695
|
+
* 获取父级层级渲染对象
|
696
|
+
* @param render
|
697
|
+
* @returns
|
698
|
+
*/
|
699
|
+
static getParentRenders(render) {
|
700
|
+
if (render) {
|
701
|
+
return [render, ...this.getParentRenders(render.parent)];
|
702
|
+
}
|
703
|
+
else {
|
704
|
+
return [];
|
705
|
+
}
|
706
|
+
}
|
707
|
+
static getRenderMapElements(render) {
|
708
|
+
const renders = this.getParentRenders(render);
|
709
|
+
return renders.map(render => render.element).filter(ele => ele);
|
710
|
+
}
|
711
|
+
static getParentRender(child, parentType) {
|
712
|
+
if (!child) {
|
713
|
+
return null;
|
714
|
+
}
|
715
|
+
if (child instanceof parentType) {
|
716
|
+
return child;
|
717
|
+
}
|
718
|
+
else {
|
719
|
+
return this.getParentRender(child.parent, parentType);
|
720
|
+
}
|
721
|
+
}
|
722
|
+
static getParentRenderByPredicate(child, predicate) {
|
723
|
+
if (!child) {
|
724
|
+
return null;
|
725
|
+
}
|
726
|
+
if (predicate(child)) {
|
727
|
+
return child;
|
728
|
+
}
|
729
|
+
else {
|
730
|
+
return this.getParentRenderByPredicate(child.parent, predicate);
|
731
|
+
}
|
732
|
+
}
|
733
|
+
/**
|
734
|
+
* 获取父级层级元素对象
|
735
|
+
* @param element
|
736
|
+
* @returns
|
737
|
+
*/
|
738
|
+
static getParentElements(element) {
|
739
|
+
if (element) {
|
740
|
+
return [element, ...this.getParentElements(element.parent)];
|
741
|
+
}
|
742
|
+
else {
|
743
|
+
return [];
|
744
|
+
}
|
745
|
+
}
|
746
|
+
/**
|
747
|
+
* 获取最后一个子元素
|
748
|
+
* @param element
|
749
|
+
* @returns
|
750
|
+
*/
|
751
|
+
static getLastLeafElement(element, predicate = null) {
|
752
|
+
if (element instanceof LeafElement && (!predicate || predicate(element))) {
|
753
|
+
return element;
|
754
|
+
}
|
755
|
+
else if (element instanceof BranchElement) {
|
756
|
+
for (let i = element.length - 1; i >= 0; i--) {
|
757
|
+
const res = this.getLastLeafElement(element.getChild(i), predicate);
|
758
|
+
if (res) {
|
759
|
+
return res;
|
760
|
+
}
|
761
|
+
}
|
762
|
+
return null;
|
763
|
+
}
|
764
|
+
return null;
|
765
|
+
}
|
766
|
+
/**
|
767
|
+
* 获取第一个子元素
|
768
|
+
* @param element
|
769
|
+
* @returns
|
770
|
+
*/
|
771
|
+
static getFirstLeafElement(element) {
|
772
|
+
if (element instanceof LeafElement) {
|
773
|
+
return element;
|
774
|
+
}
|
775
|
+
else if (element instanceof BranchElement) {
|
776
|
+
for (let i = 0; i < element.length; i++) {
|
777
|
+
const res = this.getFirstLeafElement(element.getChild(i));
|
778
|
+
if (res) {
|
779
|
+
return res;
|
780
|
+
}
|
781
|
+
}
|
782
|
+
return null;
|
783
|
+
}
|
784
|
+
return null;
|
785
|
+
}
|
786
|
+
/**
|
787
|
+
* 校验两个元素是否在同一个段落中
|
788
|
+
* @param element1
|
789
|
+
* @param element2
|
790
|
+
*/
|
791
|
+
static isInSameParagraph(element1, element2) {
|
792
|
+
const par1 = this.getParentByType(element1, ParagraphElement);
|
793
|
+
const par2 = this.getParentByType(element2, ParagraphElement);
|
794
|
+
return par1 === par2;
|
795
|
+
}
|
796
|
+
static getBorderCursor(borderType) {
|
797
|
+
switch (borderType) {
|
798
|
+
case 'none':
|
799
|
+
return 'text';
|
800
|
+
case 'top':
|
801
|
+
return 'row-resize';
|
802
|
+
case 'left':
|
803
|
+
return 'col-resize';
|
804
|
+
case 'right':
|
805
|
+
return 'col-resize';
|
806
|
+
case 'bottom':
|
807
|
+
return 'row-resize';
|
808
|
+
case 'left-middle':
|
809
|
+
case 'right-middle':
|
810
|
+
return 'w-resize';
|
811
|
+
case 'top-middle':
|
812
|
+
case 'bottom-middle':
|
813
|
+
return 's-resize';
|
814
|
+
case 'left-top':
|
815
|
+
case 'right-bottom':
|
816
|
+
return 'se-resize';
|
817
|
+
case 'right-top':
|
818
|
+
case 'left-bottom':
|
819
|
+
return 'ne-resize';
|
820
|
+
default:
|
821
|
+
return 'text';
|
822
|
+
}
|
823
|
+
}
|
824
|
+
static getParentByType(child, parentType) {
|
825
|
+
if (!child) {
|
826
|
+
return null;
|
827
|
+
}
|
828
|
+
if (child instanceof parentType) {
|
829
|
+
return child;
|
830
|
+
}
|
831
|
+
else {
|
832
|
+
return this.getParentByType(child.parent, parentType);
|
833
|
+
}
|
834
|
+
}
|
835
|
+
static getParent(child, predicate) {
|
836
|
+
if (!child) {
|
837
|
+
return null;
|
838
|
+
}
|
839
|
+
if (predicate(child)) {
|
840
|
+
return child;
|
841
|
+
}
|
842
|
+
else {
|
843
|
+
return this.getParent(child.parent, predicate);
|
844
|
+
}
|
845
|
+
}
|
846
|
+
/**
|
847
|
+
* 修正段落内容
|
848
|
+
* @returns
|
849
|
+
*/
|
850
|
+
static fixParagraphContent(control) {
|
851
|
+
//如果最后一个元素不是段落符号,则补足
|
852
|
+
if (!(control.getChild(control.length - 1) instanceof PSymbolElement)) {
|
853
|
+
control.addChild(new PSymbolElement());
|
854
|
+
}
|
855
|
+
const items = [];
|
856
|
+
for (let i = 0; i < control.length - 1; i++) {
|
857
|
+
const child = control.getChild(i);
|
858
|
+
if (child instanceof PSymbolElement) {
|
859
|
+
items.push(child);
|
860
|
+
}
|
861
|
+
}
|
862
|
+
items.forEach(item => {
|
863
|
+
control.removeChild(item);
|
864
|
+
});
|
865
|
+
}
|
866
|
+
/**
|
867
|
+
* 修正块级容器内容
|
868
|
+
* @param control
|
869
|
+
*/
|
870
|
+
static fixBlockContainer(control) {
|
871
|
+
if (control.length === 0) {
|
872
|
+
if (control instanceof TableCellElement && (control.props.vMerge === 'continue' || control.props.hMerge === 'continue')) {
|
873
|
+
return;
|
874
|
+
}
|
875
|
+
if (control.noFillEmpty) {
|
876
|
+
return;
|
877
|
+
}
|
878
|
+
control.addChild(new ParagraphElement());
|
879
|
+
}
|
880
|
+
}
|
881
|
+
/**
|
882
|
+
* 获取绘制元素相对于整个画布的绝对位置
|
883
|
+
* 整个画布绘制的时候不一定从x=0,y=0时绘制的,下拉滚动时,上面从负y坐标开始绘制
|
884
|
+
* 如果计算某个元素相对画布的左上角的绝对坐标位置,需要childPos的y值减去translateY
|
885
|
+
* @param render
|
886
|
+
* @param refPos 参照位置
|
887
|
+
* @returns
|
888
|
+
*/
|
889
|
+
static getRenderAbsolutePaintPos(render, refPos = null) {
|
890
|
+
refPos = refPos ?? { x: 0, y: 0 };
|
891
|
+
const currPos = { x: render.rect.x + refPos.x, y: render.rect.y + refPos.y };
|
892
|
+
if (!render.parent) {
|
893
|
+
return currPos;
|
894
|
+
}
|
895
|
+
return this.getRenderAbsolutePaintPos(render.parent, currPos);
|
896
|
+
}
|
897
|
+
static getRenderAbsolutePaintRect(render, childPos = null) {
|
898
|
+
const pos = this.getRenderAbsolutePaintPos(render, childPos);
|
899
|
+
return { ...pos, width: render.rect.width, height: render.rect.height, maxWidth: 0, maxHeight: 0 };
|
900
|
+
}
|
901
|
+
/**
|
902
|
+
* 获取选中区域的开始区域
|
903
|
+
* @param range
|
904
|
+
* @returns
|
905
|
+
*/
|
906
|
+
static getFirstSelectedRange(range) {
|
907
|
+
if (range.selectedChildren.length === 0 || range.target instanceof TextGroupElement) {
|
908
|
+
return range;
|
909
|
+
}
|
910
|
+
else {
|
911
|
+
return this.getFirstSelectedRange(range.selectedChildren[0]);
|
912
|
+
}
|
913
|
+
}
|
914
|
+
/**
|
915
|
+
* 获取选中区域的开始区域
|
916
|
+
* @param range \
|
917
|
+
* @returns
|
918
|
+
*/
|
919
|
+
static getLastSelectedRange(range) {
|
920
|
+
if (range.selectedChildren.length === 0 || range.target instanceof TextGroupElement) {
|
921
|
+
return range;
|
922
|
+
}
|
923
|
+
else {
|
924
|
+
return this.getLastSelectedRange(range.selectedChildren[range.selectedChildren.length - 1]);
|
925
|
+
}
|
926
|
+
}
|
927
|
+
/**
|
928
|
+
* 克隆选区内容
|
929
|
+
* @param range
|
930
|
+
* @param isDelete
|
931
|
+
* @returns
|
932
|
+
*/
|
933
|
+
static cloneRange(range, isDelete, cloneMode = 'clone') {
|
934
|
+
const { target, isFullSelected, startOffset, endOffset, selectedChildren } = range;
|
935
|
+
if (isFullSelected) {
|
936
|
+
//修饰元素不能复制 审阅标记、数据元NullText
|
937
|
+
if (cloneMode === 'copy' && target.isDecorate) {
|
938
|
+
return null;
|
939
|
+
}
|
940
|
+
const clone = cloneMode === 'source' ? target : target.clone(true);
|
941
|
+
if (isDelete) {
|
942
|
+
target.remove();
|
943
|
+
}
|
944
|
+
return clone;
|
945
|
+
}
|
946
|
+
else {
|
947
|
+
if (target instanceof LeafElement) {
|
948
|
+
if (target instanceof TextGroupElement && startOffset !== endOffset) {
|
949
|
+
if (isDelete) {
|
950
|
+
const copyTarget = target.spliceText(startOffset, endOffset, true);
|
951
|
+
if (target.text.length === 0) {
|
952
|
+
target.remove();
|
953
|
+
}
|
954
|
+
return copyTarget;
|
955
|
+
}
|
956
|
+
else {
|
957
|
+
const copyTarget = target.spliceText(startOffset, endOffset, false);
|
958
|
+
return copyTarget;
|
959
|
+
}
|
960
|
+
}
|
961
|
+
return null;
|
962
|
+
}
|
963
|
+
else if (target instanceof BranchElement) {
|
964
|
+
const array = [];
|
965
|
+
for (let i = 0; i < selectedChildren.length; i++) {
|
966
|
+
const copyChild = this.cloneRange(selectedChildren[i], isDelete, cloneMode);
|
967
|
+
if (copyChild) {
|
968
|
+
array.push(copyChild);
|
969
|
+
}
|
970
|
+
}
|
971
|
+
if (!array.length) {
|
972
|
+
return null;
|
973
|
+
}
|
974
|
+
else {
|
975
|
+
const copyTarget = target.clone(false);
|
976
|
+
array.forEach(item => {
|
977
|
+
copyTarget.addChild(item);
|
978
|
+
});
|
979
|
+
return copyTarget;
|
980
|
+
}
|
981
|
+
}
|
982
|
+
}
|
983
|
+
return null;
|
984
|
+
}
|
985
|
+
/**
|
986
|
+
* 获取所有的子级元素
|
987
|
+
* @param branchEle
|
988
|
+
* @returns
|
989
|
+
*/
|
990
|
+
static getChildrenElements(branchEle) {
|
991
|
+
const array = [];
|
992
|
+
for (let i = 0; i < branchEle.length; i++) {
|
993
|
+
array.push(branchEle.getChild(i));
|
994
|
+
}
|
995
|
+
return array;
|
996
|
+
}
|
997
|
+
/**
|
998
|
+
* 递归向前寻找最近的元素
|
999
|
+
* @param currElement
|
1000
|
+
* @param inPara 是否在同一段落中寻找
|
1001
|
+
* @param forCursor 查找结果是否用于光标定位
|
1002
|
+
* @returns
|
1003
|
+
*/
|
1004
|
+
static getRecursionPrevSiblingElement(currElement, inPara = false, forCursor = false) {
|
1005
|
+
const parent = currElement?.parent;
|
1006
|
+
//删除留痕块的measureRender在不显示留痕模式下,不生成render
|
1007
|
+
if (!currElement || !parent || (!currElement.measureRender && !(currElement instanceof TrackRunElement))) {
|
1008
|
+
return null;
|
1009
|
+
}
|
1010
|
+
//如果当前数据元不可编辑,则直接跳过
|
1011
|
+
if (parent instanceof DataElementInlineGroup && !parent.props.editable) {
|
1012
|
+
return this.getRecursionPrevSiblingElement(parent, inPara, forCursor);
|
1013
|
+
}
|
1014
|
+
if (forCursor && parent.disableClick) {
|
1015
|
+
return this.getRecursionPrevSiblingElement(parent, inPara, forCursor);
|
1016
|
+
}
|
1017
|
+
const index = parent.getChildIndex(currElement);
|
1018
|
+
if (!index) {
|
1019
|
+
if (inPara && parent.type === 'p') {
|
1020
|
+
return null;
|
1021
|
+
}
|
1022
|
+
return this.getRecursionPrevSiblingElement(parent, inPara, forCursor);
|
1023
|
+
}
|
1024
|
+
else {
|
1025
|
+
let prevElement = null;
|
1026
|
+
for (let i = index - 1; i >= 0; i--) {
|
1027
|
+
prevElement = parent.getChild(i);
|
1028
|
+
if (prevElement && !prevElement.disableClick) {
|
1029
|
+
break;
|
1030
|
+
}
|
1031
|
+
}
|
1032
|
+
if (!prevElement || prevElement.disableClick) {
|
1033
|
+
return this.getRecursionPrevSiblingElement(parent, inPara, forCursor);
|
1034
|
+
}
|
1035
|
+
const lastLeafElement = ElementUtil.getLastLeafElement(prevElement);
|
1036
|
+
//用于光标定位
|
1037
|
+
if (forCursor && lastLeafElement && lastLeafElement.disableClick) {
|
1038
|
+
return this.getRecursionPrevSiblingElement(lastLeafElement, inPara, forCursor);
|
1039
|
+
}
|
1040
|
+
if (lastLeafElement) {
|
1041
|
+
return lastLeafElement;
|
1042
|
+
}
|
1043
|
+
else {
|
1044
|
+
return this.getRecursionPrevSiblingElement(prevElement.parent, inPara, forCursor);
|
1045
|
+
}
|
1046
|
+
}
|
1047
|
+
}
|
1048
|
+
/**
|
1049
|
+
* 循环向前寻找可定位的数据元
|
1050
|
+
* @param currElement
|
1051
|
+
*/
|
1052
|
+
static getPrevDataElement(ctx, currElement) {
|
1053
|
+
const dataEle = ctx.getCurrentCtx(currElement).getControlInstanceList().filter(item => item instanceof DataElementInlineGroup);
|
1054
|
+
const index = dataEle.indexOf(currElement);
|
1055
|
+
if (index > 0) {
|
1056
|
+
for (let i = index - 1; i >= 0; i--) {
|
1057
|
+
if (!dataEle[i].disableClick && dataEle[i].props.editable) {
|
1058
|
+
return dataEle[i];
|
1059
|
+
}
|
1060
|
+
}
|
1061
|
+
}
|
1062
|
+
return null;
|
1063
|
+
}
|
1064
|
+
// /**
|
1065
|
+
// * 递归向前寻找最近的可点击元素
|
1066
|
+
// */
|
1067
|
+
// static getRecursionPrevSiblingElementForHit(currElement: Element | null): LeafElement | null {
|
1068
|
+
// let ele: LeafElement | null = null;
|
1069
|
+
// do {
|
1070
|
+
// ele = this.getRecursionPrevSiblingElement(currElement);
|
1071
|
+
// } while (ele && ele.disableClick)
|
1072
|
+
// return ele;
|
1073
|
+
// }
|
1074
|
+
// /**
|
1075
|
+
// * 在同一段落中,递归向前寻找最近的元素
|
1076
|
+
// */
|
1077
|
+
// static getRecursionPrevSiblingElementInPara(currElement: Element | null): LeafElement | null {
|
1078
|
+
// const parent = currElement?.parent;
|
1079
|
+
// if (!currElement || !parent) {
|
1080
|
+
// return null;
|
1081
|
+
// }
|
1082
|
+
// const index = parent.getChildIndex(currElement);
|
1083
|
+
// if (!index) {
|
1084
|
+
// if (parent.type === 'p') {
|
1085
|
+
// return null;
|
1086
|
+
// }
|
1087
|
+
// return this.getRecursionPrevSiblingElementInPara(parent);
|
1088
|
+
// } else {
|
1089
|
+
// const prevElement = parent.getChild(index - 1);
|
1090
|
+
// const lastLeafElement = ElementUtil.getLastLeafElement(prevElement);
|
1091
|
+
// if (lastLeafElement) {
|
1092
|
+
// return lastLeafElement;
|
1093
|
+
// } else {
|
1094
|
+
// return this.getRecursionPrevSiblingElementInPara(prevElement?.parent);
|
1095
|
+
// }
|
1096
|
+
// }
|
1097
|
+
// }
|
1098
|
+
// /**
|
1099
|
+
// * 在同一段落中,递归向前寻找最近的可点击元素
|
1100
|
+
// */
|
1101
|
+
// static getRecursionPrevSiblingElementInParaForHit(currElement: Element | null): LeafElement | null {
|
1102
|
+
// let ele: LeafElement | null = null;
|
1103
|
+
// do {
|
1104
|
+
// ele = this.getRecursionPrevSiblingElementInPara(currElement);
|
1105
|
+
// } while (ele && ele.disableClick)
|
1106
|
+
// return ele;
|
1107
|
+
// }
|
1108
|
+
/**
|
1109
|
+
* 递归向后寻找最近的元素
|
1110
|
+
*/
|
1111
|
+
static getRecursionNextSiblingElement(currElement, inPara = false, forCursor = false) {
|
1112
|
+
const parent = currElement?.parent;
|
1113
|
+
if (!currElement || !parent || !currElement.measureRender) {
|
1114
|
+
return null;
|
1115
|
+
}
|
1116
|
+
//如果当前数据元不可编辑,则直接跳过
|
1117
|
+
if (parent instanceof DataElementInlineGroup && !parent.props.editable) {
|
1118
|
+
return this.getRecursionNextSiblingElement(parent, inPara, forCursor);
|
1119
|
+
}
|
1120
|
+
if (forCursor && parent.disableClick) {
|
1121
|
+
return this.getRecursionNextSiblingElement(parent, inPara, forCursor);
|
1122
|
+
}
|
1123
|
+
const index = parent.getChildIndex(currElement);
|
1124
|
+
if (index === parent.length - 1) {
|
1125
|
+
if (inPara && parent.type === 'p') {
|
1126
|
+
return null;
|
1127
|
+
}
|
1128
|
+
return this.getRecursionNextSiblingElement(parent, inPara, forCursor);
|
1129
|
+
}
|
1130
|
+
else {
|
1131
|
+
let nextElement = null;
|
1132
|
+
for (let i = index + 1; i < parent.length; i++) {
|
1133
|
+
nextElement = parent.getChild(i);
|
1134
|
+
if (nextElement && !nextElement.disableClick) {
|
1135
|
+
break;
|
1136
|
+
}
|
1137
|
+
}
|
1138
|
+
if (!nextElement || nextElement.disableClick) {
|
1139
|
+
return this.getRecursionNextSiblingElement(parent, inPara, forCursor);
|
1140
|
+
}
|
1141
|
+
const lastLeafElement = ElementUtil.getFirstLeafElement(nextElement);
|
1142
|
+
//用于光标定位
|
1143
|
+
if (forCursor && lastLeafElement && lastLeafElement.disableClick) {
|
1144
|
+
return this.getRecursionNextSiblingElement(lastLeafElement, inPara, forCursor);
|
1145
|
+
}
|
1146
|
+
if (lastLeafElement) {
|
1147
|
+
return lastLeafElement;
|
1148
|
+
}
|
1149
|
+
else {
|
1150
|
+
return this.getRecursionNextSiblingElement(nextElement.parent, inPara, forCursor);
|
1151
|
+
}
|
1152
|
+
}
|
1153
|
+
}
|
1154
|
+
// /**
|
1155
|
+
// * 在同一段落中,递归向后寻找最近的元素
|
1156
|
+
// */
|
1157
|
+
// static getRecursionNextSiblingElementInPara(currElement: Element | null): LeafElement | null {
|
1158
|
+
// const parent = currElement?.parent;
|
1159
|
+
// if (!currElement || !parent) {
|
1160
|
+
// return null;
|
1161
|
+
// }
|
1162
|
+
// const index = parent.getChildIndex(currElement);
|
1163
|
+
// if (index === parent.length - 1) {
|
1164
|
+
// if (parent.type === 'p') {
|
1165
|
+
// return null;
|
1166
|
+
// }
|
1167
|
+
// return this.getRecursionNextSiblingElementInPara(parent);
|
1168
|
+
// } else {
|
1169
|
+
// const nextElement = parent.getChild(index + 1);
|
1170
|
+
// const lastLeafElement = ElementUtil.getFirstLeafElement(nextElement);
|
1171
|
+
// if (lastLeafElement) {
|
1172
|
+
// return lastLeafElement;
|
1173
|
+
// } else {
|
1174
|
+
// return this.getRecursionNextSiblingElementInPara(nextElement.parent);
|
1175
|
+
// }
|
1176
|
+
// }
|
1177
|
+
// }
|
1178
|
+
// /**
|
1179
|
+
// * 在同一段落中,递归向后寻找最近的可点击元素
|
1180
|
+
// */
|
1181
|
+
// static getRecursionNextSiblingElementInParaForHit(currElement: Element | null): LeafElement | null {
|
1182
|
+
// let ele: LeafElement | null = null;
|
1183
|
+
// do {
|
1184
|
+
// ele = this.getRecursionNextSiblingElementInPara(currElement);
|
1185
|
+
// } while (ele && ele.disableClick)
|
1186
|
+
// return ele;
|
1187
|
+
// }
|
1188
|
+
// /**
|
1189
|
+
// * 在同一段落中,递归向后寻找最近的可点击元素
|
1190
|
+
// */
|
1191
|
+
// static getRecursionNextSiblingElementForHit(currElement: Element | null): LeafElement | null {
|
1192
|
+
// let ele: LeafElement | null = null;
|
1193
|
+
// do {
|
1194
|
+
// ele = this.getRecursionNextSiblingElement(currElement);
|
1195
|
+
// } while (ele && ele.disableClick)
|
1196
|
+
// return ele;
|
1197
|
+
// }
|
1198
|
+
/**
|
1199
|
+
* 获取行内最大渲染单元格高度,主要处理纵向合并单元格问题
|
1200
|
+
* @param row
|
1201
|
+
* @returns
|
1202
|
+
*/
|
1203
|
+
static getRowMaxCellHeight(row) {
|
1204
|
+
let maxHeight = 0;
|
1205
|
+
for (let i = 0; i < row.length; i++) {
|
1206
|
+
if (row.getChild(i).rect.height > maxHeight) {
|
1207
|
+
maxHeight = row.getChild(i).rect.height;
|
1208
|
+
}
|
1209
|
+
}
|
1210
|
+
return maxHeight;
|
1211
|
+
}
|
1212
|
+
/**
|
1213
|
+
* 校验是否为空内容
|
1214
|
+
* @param ele
|
1215
|
+
*/
|
1216
|
+
static checkEmptyContent(ele) {
|
1217
|
+
if (ele.length === 1) {
|
1218
|
+
const firstRender = ele.getChild(0);
|
1219
|
+
if (firstRender instanceof ParagraphRenderObject) {
|
1220
|
+
if ((firstRender.element).length === 1) {
|
1221
|
+
return true;
|
1222
|
+
}
|
1223
|
+
}
|
1224
|
+
}
|
1225
|
+
return false;
|
1226
|
+
}
|
1227
|
+
/**
|
1228
|
+
* 测量行内编组元素
|
1229
|
+
* @param render
|
1230
|
+
*/
|
1231
|
+
static remeasureInlineGroupRender(render) {
|
1232
|
+
let x = 0;
|
1233
|
+
let maxHeight = 0;
|
1234
|
+
for (let i = 0; i < render.length; i++) {
|
1235
|
+
const item = render.getChild(i);
|
1236
|
+
item.rect.x = x;
|
1237
|
+
if (item.rect.height > maxHeight) {
|
1238
|
+
maxHeight = item.rect.height;
|
1239
|
+
}
|
1240
|
+
x += item.rect.width;
|
1241
|
+
}
|
1242
|
+
for (let i = 0; i < render.length; i++) {
|
1243
|
+
const item = render.getChild(i);
|
1244
|
+
item.rect.y = maxHeight - item.rect.height;
|
1245
|
+
}
|
1246
|
+
render.rect.width = x;
|
1247
|
+
render.rect.height = maxHeight;
|
1248
|
+
}
|
1249
|
+
static getParaLinePos(childRender, childRenderPos) {
|
1250
|
+
const parent = childRender.parent;
|
1251
|
+
const rect = ElementUtil.cloneRect(parent.rect);
|
1252
|
+
rect.x = childRenderPos.x - childRender.rect.x;
|
1253
|
+
rect.y = childRenderPos.y - childRender.rect.y;
|
1254
|
+
if (parent instanceof ParagraphLineRectRenderObject) {
|
1255
|
+
return rect;
|
1256
|
+
}
|
1257
|
+
else {
|
1258
|
+
return this.getParaLinePos(parent, rect);
|
1259
|
+
}
|
1260
|
+
}
|
1261
|
+
static getParentRenderPos(parentRender, childRender, childRenderPos) {
|
1262
|
+
const parent = childRender.parent;
|
1263
|
+
const rect = ElementUtil.cloneRect(parent.rect);
|
1264
|
+
rect.x = childRenderPos.x - childRender.rect.x;
|
1265
|
+
rect.y = childRenderPos.y - childRender.rect.y;
|
1266
|
+
if (parent === parentRender) {
|
1267
|
+
return rect;
|
1268
|
+
}
|
1269
|
+
else {
|
1270
|
+
return this.getParentRenderPos(parentRender, parent, rect);
|
1271
|
+
}
|
1272
|
+
}
|
1273
|
+
/**
|
1274
|
+
* 获取绘制元素所在的区域
|
1275
|
+
*/
|
1276
|
+
static getRenderObjectRegion(render) {
|
1277
|
+
if (!render) {
|
1278
|
+
return undefined;
|
1279
|
+
}
|
1280
|
+
if (render.element) {
|
1281
|
+
return this.getElementRegion(render.element);
|
1282
|
+
}
|
1283
|
+
return this.getRenderObjectRegion(render.parent);
|
1284
|
+
}
|
1285
|
+
/**
|
1286
|
+
* 获取文档元素所在的区域
|
1287
|
+
* @param element
|
1288
|
+
* @returns
|
1289
|
+
*/
|
1290
|
+
static getElementRegion(element) {
|
1291
|
+
const regionTarget = this.getElementRegionTarget(element);
|
1292
|
+
return regionTarget?.type;
|
1293
|
+
}
|
1294
|
+
static getElementRegionTarget(element) {
|
1295
|
+
if (!element) {
|
1296
|
+
return null;
|
1297
|
+
}
|
1298
|
+
if (element instanceof DocumentBodyElement) {
|
1299
|
+
return { type: 'body', target: element };
|
1300
|
+
}
|
1301
|
+
if (element instanceof DocumentFooterElement) {
|
1302
|
+
return { type: 'footer', target: element };
|
1303
|
+
}
|
1304
|
+
if (element instanceof DocumentHeaderElement) {
|
1305
|
+
return { type: 'header', target: element };
|
1306
|
+
}
|
1307
|
+
if (element instanceof CommsContainerElement) {
|
1308
|
+
return { type: 'review', target: element };
|
1309
|
+
}
|
1310
|
+
return this.getElementRegionTarget(element.parent);
|
1311
|
+
}
|
1312
|
+
/**
|
1313
|
+
* 根据坐标系统偏移位获取所在的文本偏移位置
|
1314
|
+
* @param textRender
|
1315
|
+
* @param x
|
1316
|
+
* @returns
|
1317
|
+
*/
|
1318
|
+
static getTextRenderOffset(textRender, x) {
|
1319
|
+
const ele = textRender.element;
|
1320
|
+
const docRender = ElementUtil.getParentRender(textRender, DocumentRenderObject);
|
1321
|
+
if (!docRender) {
|
1322
|
+
throw new Error('docRender is null');
|
1323
|
+
}
|
1324
|
+
const elePaintRenders = ele.paintRenders.filter(item => ElementUtil.getParentRender(item, DocumentRenderObject) === docRender);
|
1325
|
+
let count = 0;
|
1326
|
+
for (let i = 0; i < elePaintRenders.length; i++) {
|
1327
|
+
const render = elePaintRenders[i];
|
1328
|
+
if (render !== textRender) {
|
1329
|
+
count += render.textMeasures.length;
|
1330
|
+
}
|
1331
|
+
else {
|
1332
|
+
let horX = 0;
|
1333
|
+
for (let j = 0; j < render.textMeasures.length; j++) {
|
1334
|
+
if (horX + render.textMeasures[j].actualSize >= x) {
|
1335
|
+
if (horX + Math.floor(render.textMeasures[j].actualSize / 2) > x) {
|
1336
|
+
if (j === 0 && i > 0) {
|
1337
|
+
j += 0.5;
|
1338
|
+
}
|
1339
|
+
}
|
1340
|
+
else {
|
1341
|
+
j += 1;
|
1342
|
+
}
|
1343
|
+
return j + count;
|
1344
|
+
}
|
1345
|
+
horX += render.textMeasures[j].actualSize;
|
1346
|
+
}
|
1347
|
+
return count + render.textMeasures.length;
|
1348
|
+
}
|
1349
|
+
}
|
1350
|
+
throw new Error('未找到当前文本元素的光标偏移量');
|
1351
|
+
}
|
1352
|
+
static getHitRenderOffset(render, x) {
|
1353
|
+
if (render instanceof TextGroupRenderObject) {
|
1354
|
+
return this.getTextRenderOffset(render, x);
|
1355
|
+
}
|
1356
|
+
else {
|
1357
|
+
if (render.element && render.element.type === 'psym') {
|
1358
|
+
return 0;
|
1359
|
+
}
|
1360
|
+
return (render.rect.width / 2) >= x ? 0 : 1;
|
1361
|
+
}
|
1362
|
+
}
|
1363
|
+
static getTextRenderHorX(currRender, startOffset, endOffset) {
|
1364
|
+
const textEle = currRender.element;
|
1365
|
+
let endX = 0;
|
1366
|
+
let startX = 0;
|
1367
|
+
let count = 0;
|
1368
|
+
for (let i = 0; i < textEle.paintRenders.length; i++) {
|
1369
|
+
const paintRender = textEle.paintRenders[i];
|
1370
|
+
if (paintRender !== currRender) {
|
1371
|
+
count += paintRender.textMeasures.length;
|
1372
|
+
}
|
1373
|
+
else {
|
1374
|
+
if (count + paintRender.textMeasures.length < startOffset) {
|
1375
|
+
continue;
|
1376
|
+
}
|
1377
|
+
if (count > endOffset) {
|
1378
|
+
continue;
|
1379
|
+
}
|
1380
|
+
for (let j = 0; j < paintRender.textMeasures.length; j++) {
|
1381
|
+
if (endOffset === count + j) {
|
1382
|
+
break;
|
1383
|
+
}
|
1384
|
+
if (count + j === startOffset) {
|
1385
|
+
startX = endX;
|
1386
|
+
}
|
1387
|
+
endX += paintRender.textMeasures[j].actualSize;
|
1388
|
+
}
|
1389
|
+
}
|
1390
|
+
}
|
1391
|
+
return { startX, endX };
|
1392
|
+
}
|
1393
|
+
/**
|
1394
|
+
* 获取一个元素结尾偏移量
|
1395
|
+
* 文本以字符长度进行确定
|
1396
|
+
* @param ele
|
1397
|
+
* @returns
|
1398
|
+
*/
|
1399
|
+
static getElementEndOffset(ele) {
|
1400
|
+
if (ele instanceof TextGroupElement) {
|
1401
|
+
return ele.textMeasures.length;
|
1402
|
+
}
|
1403
|
+
return 1;
|
1404
|
+
}
|
1405
|
+
/**
|
1406
|
+
* 判断当前偏移量是否是最终偏移量
|
1407
|
+
* @param ele
|
1408
|
+
* @param offset
|
1409
|
+
*/
|
1410
|
+
static isElementEndOffset(ele, offset) {
|
1411
|
+
return this.getElementEndOffset(ele) === offset;
|
1412
|
+
}
|
1413
|
+
/**
|
1414
|
+
* 获取直接子节点的所有渲染元素
|
1415
|
+
* @param ele
|
1416
|
+
* @returns
|
1417
|
+
*/
|
1418
|
+
static getChildRenders(ele) {
|
1419
|
+
const items = [];
|
1420
|
+
for (let i = 0; i < ele.length; i++) {
|
1421
|
+
items.push(ele.getChild(i));
|
1422
|
+
}
|
1423
|
+
return items;
|
1424
|
+
}
|
1425
|
+
/**
|
1426
|
+
* 获取当前单元格内所有的段落行
|
1427
|
+
* @param cell
|
1428
|
+
* @returns
|
1429
|
+
*/
|
1430
|
+
static getCellParaLines(cell) {
|
1431
|
+
const items = [];
|
1432
|
+
for (let i = 0; i < cell.length; i++) {
|
1433
|
+
const para = cell.getChild(i);
|
1434
|
+
for (let j = 0; j < para.length; j++) {
|
1435
|
+
items.push(para.getChild(j));
|
1436
|
+
}
|
1437
|
+
}
|
1438
|
+
return items;
|
1439
|
+
}
|
1440
|
+
static getRandomColor(seed) {
|
1441
|
+
let letters = '0123456789ABCDEF';
|
1442
|
+
let color = '#';
|
1443
|
+
for (let i = 0; i < 6; i++) {
|
1444
|
+
color += letters[Math.floor(this.getSeedRandom(seed) * 16)];
|
1445
|
+
}
|
1446
|
+
return color;
|
1447
|
+
}
|
1448
|
+
static getSeedRandom(seed) {
|
1449
|
+
return Number("0." + Math.sin(seed * Math.random()).toString().substr(6));
|
1450
|
+
}
|
1451
|
+
static findChildRender(render, predicate) {
|
1452
|
+
for (let i = 0; i < render.length; i++) {
|
1453
|
+
if (predicate(render.getChild(i))) {
|
1454
|
+
return render.getChild(i);
|
1455
|
+
}
|
1456
|
+
}
|
1457
|
+
return null;
|
1458
|
+
}
|
1459
|
+
static getDataElement(ele) {
|
1460
|
+
return this.getParent(ele, item => item instanceof DataElementInlineGroup);
|
1461
|
+
}
|
1462
|
+
}
|
1463
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudC11dGlsLmpzIiwic291cmNlUm9vdCI6ImxpYi8iLCJzb3VyY2VzIjpbImZyYW1ld29yay9lbGVtZW50LXV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVoQyxPQUFPLEVBRUgsYUFBYSxFQUViLFdBQVcsRUFFWCxJQUFJLEVBR1AsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQixPQUFPLEVBQW9CLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxzQkFBc0IsRUFBQyxNQUFNLDRDQUE0QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSw2QkFBNkIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQXlCLE1BQU0sOEJBQThCLENBQUM7QUFDdkYsT0FBTyxFQUFnQixpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzFFLE9BQU8sRUFBbUIsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNoRixPQUFPLEVBQUUsZUFBZSxFQUFvQixNQUFNLDRCQUE0QixDQUFDO0FBQy9FLE9BQU8s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LENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUUvQyxNQUFNLEVBQUUsR0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRWhELE1BQU0sRUFBRSxHQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFFL0MsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFMUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRWYsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1lBQ1gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQixNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUNyQzthQUFNLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtZQUNsQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMs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
|