@hailin-zheng/editor-core 1.0.6 → 1.0.9
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/package.json +2 -2
- package/{lib/doc-ruler.js → src/med_editor/doc-ruler.ts} +101 -74
- package/src/med_editor/framework/common-util.ts +200 -0
- package/{lib/framework/document-change.js → src/med_editor/framework/document-change.ts} +308 -259
- package/{lib/framework/document-combine.js → src/med_editor/framework/document-combine.ts} +15 -11
- package/{lib/framework/document-comment.js → src/med_editor/framework/document-comment.ts} +52 -37
- package/{lib/framework/document-context.js → src/med_editor/framework/document-context.ts} +181 -101
- package/{lib/framework/document-eval-func.js → src/med_editor/framework/document-eval-func.ts} +16 -11
- package/{lib/framework/document-event.js → src/med_editor/framework/document-event.ts} +244 -216
- package/{lib/framework/document-history.js → src/med_editor/framework/document-history.ts} +25 -14
- package/{lib/framework/document-images-loader.js → src/med_editor/framework/document-images-loader.ts} +25 -17
- package/{lib/framework/document-input-cursor.js → src/med_editor/framework/document-input-cursor.ts} +76 -71
- package/{lib/framework/document-paint.js → src/med_editor/framework/document-paint.ts} +35 -28
- package/{lib/framework/document-print-offscreen.js → src/med_editor/framework/document-print-offscreen.ts} +25 -19
- package/{lib/framework/document-print.js → src/med_editor/framework/document-print.ts} +57 -41
- package/src/med_editor/framework/document-segmenter.ts +211 -0
- package/{lib/framework/document-selection.js → src/med_editor/framework/document-selection.ts} +116 -85
- package/{lib/framework/document-template.js → src/med_editor/framework/document-template.ts} +3 -3
- package/src/med_editor/framework/document-textline-mode.ts +34 -0
- package/{lib/framework/element-define.js → src/med_editor/framework/element-define.ts} +301 -206
- package/src/med_editor/framework/element-event-define.ts +141 -0
- package/{lib/framework/element-measure.js → src/med_editor/framework/element-measure.ts} +143 -121
- package/{lib/framework/element-paint.js → src/med_editor/framework/element-paint.ts} +44 -38
- package/{lib/framework/element-props.js → src/med_editor/framework/element-props.ts} +331 -202
- package/{lib/framework/element-reader.js → src/med_editor/framework/element-reader.ts} +39 -31
- package/{lib/framework/element-render-cut.js → src/med_editor/framework/element-render-cut.ts} +113 -106
- package/{lib/framework/element-serialize.js → src/med_editor/framework/element-serialize.ts} +37 -24
- package/{lib/framework/element-util.js → src/med_editor/framework/element-util.ts} +317 -216
- package/{lib/framework/impl/checkbox/checkbox-impl.js → src/med_editor/framework/impl/checkbox/checkbox-impl.ts} +27 -20
- package/{lib/framework/impl/comments/comment-content-impl.js → src/med_editor/framework/impl/comments/comment-content-impl.ts} +45 -31
- package/{lib/framework/impl/comments/comment-element-impl.js → src/med_editor/framework/impl/comments/comment-element-impl.ts} +23 -20
- package/{lib/framework/impl/comments/comments-container-impl.js → src/med_editor/framework/impl/comments/comments-container-impl.ts} +22 -16
- package/{lib/framework/impl/comments/comments-util.js → src/med_editor/framework/impl/comments/comments-util.ts} +34 -17
- package/{lib/framework/impl/comments/validate-msg-impl.js → src/med_editor/framework/impl/comments/validate-msg-impl.ts} +28 -17
- package/{lib/framework/impl/data-element/data-decorate-impl.js → src/med_editor/framework/impl/data-element/data-decorate-impl.ts} +26 -22
- package/{lib/framework/impl/data-element/data-element-barcode.js → src/med_editor/framework/impl/data-element/data-element-barcode.ts} +41 -29
- package/{lib/framework/impl/data-element/data-element-base-impl.js → src/med_editor/framework/impl/data-element/data-element-base-impl.ts} +73 -44
- package/{lib/framework/impl/data-element/data-element-check-impl.js → src/med_editor/framework/impl/data-element/data-element-check-impl.ts} +48 -35
- package/{lib/framework/impl/data-element/data-element-date-impl.js → src/med_editor/framework/impl/data-element/data-element-date-impl.ts} +41 -24
- package/{lib/framework/impl/data-element/data-element-group-impl.js → src/med_editor/framework/impl/data-element/data-element-group-impl.ts} +52 -32
- package/{lib/framework/impl/data-element/data-element-image-impl.js → src/med_editor/framework/impl/data-element/data-element-image-impl.ts} +38 -28
- package/{lib/framework/impl/data-element/data-element-list-impl.js → src/med_editor/framework/impl/data-element/data-element-list-impl.ts} +42 -31
- package/{lib/framework/impl/data-element/data-element-text-impl.js → src/med_editor/framework/impl/data-element/data-element-text-impl.ts} +36 -22
- package/{lib/framework/impl/decorate/fill-null-space-imple.js → src/med_editor/framework/impl/decorate/fill-null-space-imple.ts} +15 -10
- package/{lib/framework/impl/document/doc-body-impl.js → src/med_editor/framework/impl/document/doc-body-impl.ts} +32 -16
- package/{lib/framework/impl/document/doc-body-part-impl.js → src/med_editor/framework/impl/document/doc-body-part-impl.ts} +27 -17
- package/src/med_editor/framework/impl/document/doc-container-impl.ts +24 -0
- package/{lib/framework/impl/document/doc-footer-impl.js → src/med_editor/framework/impl/document/doc-footer-impl.ts} +30 -19
- package/{lib/framework/impl/document/doc-header-impl.js → src/med_editor/framework/impl/document/doc-header-impl.ts} +34 -17
- package/{lib/framework/impl/document/doc-impl.js → src/med_editor/framework/impl/document/doc-impl.ts} +62 -45
- package/{lib/framework/impl/media-formula/menstrual-history.js → src/med_editor/framework/impl/media-formula/menstrual-history.ts} +58 -36
- package/{lib/framework/impl/paragraph/p-impl.js → src/med_editor/framework/impl/paragraph/p-impl.ts} +64 -30
- package/{lib/framework/impl/picture/image-impl.js → src/med_editor/framework/impl/picture/image-impl.ts} +37 -25
- package/{lib/framework/impl/radio/radio-impl.js → src/med_editor/framework/impl/radio/radio-impl.ts} +28 -21
- package/{lib/framework/impl/symbol/br-symbol-impl.js → src/med_editor/framework/impl/symbol/br-symbol-impl.ts} +21 -15
- package/{lib/framework/impl/symbol/p-symbol-impl.js → src/med_editor/framework/impl/symbol/p-symbol-impl.ts} +15 -12
- package/{lib/framework/impl/table/table-cell-impl.js → src/med_editor/framework/impl/table/table-cell-impl.ts} +41 -30
- package/{lib/framework/impl/table/table-impl.js → src/med_editor/framework/impl/table/table-impl.ts} +122 -84
- package/{lib/framework/impl/table/table-row-impl.js → src/med_editor/framework/impl/table/table-row-impl.ts} +26 -18
- package/{lib/framework/impl/table/table-split-cell-patch.js → src/med_editor/framework/impl/table/table-split-cell-patch.ts} +31 -22
- package/{lib/framework/impl/table/table-split-cell.js → src/med_editor/framework/impl/table/table-split-cell.ts} +105 -94
- package/{lib/framework/impl/table/table-util.js → src/med_editor/framework/impl/table/table-util.ts} +197 -159
- package/{lib/framework/impl/text/text-impl.js → src/med_editor/framework/impl/text/text-impl.ts} +49 -35
- package/{lib/framework/impl/text/track-run-impl.js → src/med_editor/framework/impl/text/track-run-impl.ts} +53 -30
- package/{lib/framework/notify.js → src/med_editor/framework/notify.ts} +50 -36
- package/{lib/framework/range-util.js → src/med_editor/framework/range-util.ts} +80 -71
- package/{lib/framework/render-context.js → src/med_editor/framework/render-context.ts} +111 -64
- package/{lib/framework/render-define.js → src/med_editor/framework/render-define.ts} +90 -61
- package/{lib/framework/selection-overlays.js → src/med_editor/framework/selection-overlays.ts} +25 -16
- package/{lib/texteditor.js → src/med_editor/texteditor.ts} +288 -191
- package/src/med_editor/util/subject.ts +118 -0
- package/{lib/util/table-bind.js → src/med_editor/util/table-bind.ts} +2 -2
- package/src/med_editor//345/205/245/351/231/242/350/256/260/345/275/225.json +3573 -0
- package/src/med_editor//345/205/245/351/231/242/350/256/260/345/275/225/346/265/213/350/257/225.json +3573 -0
- package/src/med_editor//345/205/245/351/231/242/350/256/260/345/275/225/346/265/213/350/257/225bug.json +315 -0
- 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 +122 -0
- 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 +3599 -0
- 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 +24586 -0
- package/src/med_editor//345/220/210/345/271/266/347/227/205/347/250/213/345/275/225.json +2874 -0
- package/src/med_editor//346/211/213/346/234/257/350/256/260/345/275/225.json +341 -0
- package/src/med_editor//346/231/256/351/200/232doc/347/261/273/346/226/207/346/241/243.json +2201 -0
- package/src/med_editor//346/243/200/351/252/214/347/224/263/350/257/267/345/215/225.json +1069 -0
- 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 +125 -0
- 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 +86 -0
- 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 +115 -0
- 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 +108 -0
- 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 +272 -0
- package/src/med_editor//351/225/277/346/234/237/345/214/273/345/230/261/345/215/225.json +1070 -0
- package/lib/doc-ruler.d.ts +0 -51
- package/lib/doc-ruler.js.map +0 -1
- package/lib/framework/common-util.d.ts +0 -63
- package/lib/framework/common-util.js +0 -178
- package/lib/framework/common-util.js.map +0 -1
- package/lib/framework/document-change.d.ts +0 -265
- package/lib/framework/document-change.js.map +0 -1
- package/lib/framework/document-combine.d.ts +0 -24
- package/lib/framework/document-combine.js.map +0 -1
- package/lib/framework/document-comment.d.ts +0 -46
- package/lib/framework/document-comment.js.map +0 -1
- package/lib/framework/document-context.d.ts +0 -149
- package/lib/framework/document-context.js.map +0 -1
- package/lib/framework/document-eval-func.d.ts +0 -18
- package/lib/framework/document-eval-func.js.map +0 -1
- package/lib/framework/document-event.d.ts +0 -213
- package/lib/framework/document-event.js.map +0 -1
- package/lib/framework/document-history.d.ts +0 -26
- package/lib/framework/document-history.js.map +0 -1
- package/lib/framework/document-images-loader.d.ts +0 -16
- package/lib/framework/document-images-loader.js.map +0 -1
- package/lib/framework/document-input-cursor.d.ts +0 -78
- package/lib/framework/document-input-cursor.js.map +0 -1
- package/lib/framework/document-paint.d.ts +0 -34
- package/lib/framework/document-paint.js.map +0 -1
- package/lib/framework/document-print-offscreen.d.ts +0 -38
- package/lib/framework/document-print-offscreen.js.map +0 -1
- package/lib/framework/document-print.d.ts +0 -60
- package/lib/framework/document-print.js.map +0 -1
- package/lib/framework/document-segmenter.d.ts +0 -2
- package/lib/framework/document-segmenter.js +0 -106
- package/lib/framework/document-segmenter.js.map +0 -1
- package/lib/framework/document-selection.d.ts +0 -89
- package/lib/framework/document-selection.js.map +0 -1
- package/lib/framework/document-template.d.ts +0 -4
- package/lib/framework/document-template.js.map +0 -1
- package/lib/framework/document-textline-mode.d.ts +0 -7
- package/lib/framework/document-textline-mode.js +0 -30
- package/lib/framework/document-textline-mode.js.map +0 -1
- package/lib/framework/element-define.d.ts +0 -319
- package/lib/framework/element-define.js.map +0 -1
- package/lib/framework/element-event-define.d.ts +0 -99
- package/lib/framework/element-event-define.js +0 -108
- package/lib/framework/element-event-define.js.map +0 -1
- package/lib/framework/element-measure.d.ts +0 -97
- package/lib/framework/element-measure.js.map +0 -1
- package/lib/framework/element-paint.d.ts +0 -42
- package/lib/framework/element-paint.js.map +0 -1
- package/lib/framework/element-props.d.ts +0 -301
- package/lib/framework/element-props.js.map +0 -1
- package/lib/framework/element-reader.d.ts +0 -19
- package/lib/framework/element-reader.js.map +0 -1
- package/lib/framework/element-render-cut.d.ts +0 -55
- package/lib/framework/element-render-cut.js.map +0 -1
- package/lib/framework/element-serialize.d.ts +0 -30
- package/lib/framework/element-serialize.js.map +0 -1
- package/lib/framework/element-util.d.ts +0 -369
- package/lib/framework/element-util.js.map +0 -1
- package/lib/framework/impl/checkbox/checkbox-impl.d.ts +0 -24
- package/lib/framework/impl/checkbox/checkbox-impl.js.map +0 -1
- package/lib/framework/impl/comments/comment-content-impl.d.ts +0 -40
- package/lib/framework/impl/comments/comment-content-impl.js.map +0 -1
- package/lib/framework/impl/comments/comment-element-impl.d.ts +0 -21
- package/lib/framework/impl/comments/comment-element-impl.js.map +0 -1
- package/lib/framework/impl/comments/comments-container-impl.d.ts +0 -22
- package/lib/framework/impl/comments/comments-container-impl.js.map +0 -1
- package/lib/framework/impl/comments/comments-util.d.ts +0 -12
- package/lib/framework/impl/comments/comments-util.js.map +0 -1
- package/lib/framework/impl/comments/validate-msg-impl.d.ts +0 -21
- package/lib/framework/impl/comments/validate-msg-impl.js.map +0 -1
- package/lib/framework/impl/data-element/data-decorate-impl.d.ts +0 -30
- package/lib/framework/impl/data-element/data-decorate-impl.js.map +0 -1
- package/lib/framework/impl/data-element/data-element-barcode.d.ts +0 -31
- package/lib/framework/impl/data-element/data-element-barcode.js.map +0 -1
- package/lib/framework/impl/data-element/data-element-base-impl.d.ts +0 -68
- package/lib/framework/impl/data-element/data-element-base-impl.js.map +0 -1
- package/lib/framework/impl/data-element/data-element-check-impl.d.ts +0 -35
- package/lib/framework/impl/data-element/data-element-check-impl.js.map +0 -1
- package/lib/framework/impl/data-element/data-element-date-impl.d.ts +0 -23
- package/lib/framework/impl/data-element/data-element-date-impl.js.map +0 -1
- package/lib/framework/impl/data-element/data-element-group-impl.d.ts +0 -23
- package/lib/framework/impl/data-element/data-element-group-impl.js.map +0 -1
- package/lib/framework/impl/data-element/data-element-image-impl.d.ts +0 -30
- package/lib/framework/impl/data-element/data-element-image-impl.js.map +0 -1
- package/lib/framework/impl/data-element/data-element-list-impl.d.ts +0 -22
- package/lib/framework/impl/data-element/data-element-list-impl.js.map +0 -1
- package/lib/framework/impl/data-element/data-element-text-impl.d.ts +0 -23
- package/lib/framework/impl/data-element/data-element-text-impl.js.map +0 -1
- package/lib/framework/impl/decorate/fill-null-space-imple.d.ts +0 -21
- package/lib/framework/impl/decorate/fill-null-space-imple.js.map +0 -1
- package/lib/framework/impl/document/doc-body-impl.d.ts +0 -27
- package/lib/framework/impl/document/doc-body-impl.js.map +0 -1
- package/lib/framework/impl/document/doc-body-part-impl.d.ts +0 -30
- package/lib/framework/impl/document/doc-body-part-impl.js.map +0 -1
- package/lib/framework/impl/document/doc-container-impl.d.ts +0 -16
- package/lib/framework/impl/document/doc-container-impl.js +0 -21
- package/lib/framework/impl/document/doc-container-impl.js.map +0 -1
- package/lib/framework/impl/document/doc-footer-impl.d.ts +0 -26
- package/lib/framework/impl/document/doc-footer-impl.js.map +0 -1
- package/lib/framework/impl/document/doc-header-impl.d.ts +0 -26
- package/lib/framework/impl/document/doc-header-impl.js.map +0 -1
- package/lib/framework/impl/document/doc-impl.d.ts +0 -61
- package/lib/framework/impl/document/doc-impl.js.map +0 -1
- package/lib/framework/impl/media-formula/menstrual-history.d.ts +0 -35
- package/lib/framework/impl/media-formula/menstrual-history.js.map +0 -1
- package/lib/framework/impl/paragraph/p-impl.d.ts +0 -45
- package/lib/framework/impl/paragraph/p-impl.js.map +0 -1
- package/lib/framework/impl/picture/image-impl.d.ts +0 -31
- package/lib/framework/impl/picture/image-impl.js.map +0 -1
- package/lib/framework/impl/radio/radio-impl.d.ts +0 -22
- package/lib/framework/impl/radio/radio-impl.js.map +0 -1
- package/lib/framework/impl/symbol/br-symbol-impl.d.ts +0 -22
- package/lib/framework/impl/symbol/br-symbol-impl.js.map +0 -1
- package/lib/framework/impl/symbol/p-symbol-impl.d.ts +0 -19
- package/lib/framework/impl/symbol/p-symbol-impl.js.map +0 -1
- package/lib/framework/impl/table/table-cell-impl.d.ts +0 -37
- package/lib/framework/impl/table/table-cell-impl.js.map +0 -1
- package/lib/framework/impl/table/table-impl.d.ts +0 -55
- package/lib/framework/impl/table/table-impl.js.map +0 -1
- package/lib/framework/impl/table/table-row-impl.d.ts +0 -26
- package/lib/framework/impl/table/table-row-impl.js.map +0 -1
- package/lib/framework/impl/table/table-split-cell-patch.d.ts +0 -20
- package/lib/framework/impl/table/table-split-cell-patch.js.map +0 -1
- package/lib/framework/impl/table/table-split-cell.d.ts +0 -90
- package/lib/framework/impl/table/table-split-cell.js.map +0 -1
- package/lib/framework/impl/table/table-util.d.ts +0 -150
- package/lib/framework/impl/table/table-util.js.map +0 -1
- package/lib/framework/impl/text/text-impl.d.ts +0 -32
- package/lib/framework/impl/text/text-impl.js.map +0 -1
- package/lib/framework/impl/text/track-run-impl.d.ts +0 -27
- package/lib/framework/impl/text/track-run-impl.js.map +0 -1
- package/lib/framework/notify.d.ts +0 -13
- package/lib/framework/notify.js.map +0 -1
- package/lib/framework/range-util.d.ts +0 -40
- package/lib/framework/range-util.js.map +0 -1
- package/lib/framework/render-context.d.ts +0 -91
- package/lib/framework/render-context.js.map +0 -1
- package/lib/framework/render-define.d.ts +0 -109
- package/lib/framework/render-define.js.map +0 -1
- package/lib/framework/selection-overlays.d.ts +0 -30
- package/lib/framework/selection-overlays.js.map +0 -1
- package/lib/texteditor.d.ts +0 -318
- package/lib/texteditor.js.map +0 -1
- package/lib/util/subject.d.ts +0 -34
- package/lib/util/subject.js +0 -88
- package/lib/util/subject.js.map +0 -1
- package/lib/util/table-bind.d.ts +0 -5
- package/lib/util/table-bind.js.map +0 -1
@@ -1,91 +1,91 @@
|
|
1
1
|
import { CommonUtil } from "./common-util";
|
2
|
-
import { fromEvent, Subject } from "rxjs";
|
3
|
-
import {
|
4
|
-
import {
|
5
|
-
import {
|
2
|
+
import { fromEvent, Subject, Subscription } from "rxjs";
|
3
|
+
import { DocumentPaint } from "./document-paint";
|
4
|
+
import { SelectionRange, SelectionState } from "./document-selection";
|
5
|
+
import { LeafElement, Rect, Element, Position, ViewOptions, ResizeLeafRenderObject, DocMode } from "./element-define";
|
6
|
+
import { DropElementEvent, ElementEvent, EventStage, EventTypes, GetTrackTipsEvent, GotCursorEvent, HitEventInfo, HitRegion, ITrackTips, LostCursorEvent, MousedownElementEvent, MouseElementEvent } from "./element-event-define";
|
6
7
|
import { ElementUtil } from "./element-util";
|
8
|
+
import { DocumentRenderObject } from "./impl/document/doc-impl";
|
7
9
|
import { PictureElement } from "./impl/picture/image-impl";
|
8
10
|
import { BreakElement } from "./impl/symbol/br-symbol-impl";
|
9
11
|
import { PSymbolElement } from "./impl/symbol/p-symbol-impl";
|
10
12
|
import { TableCellElement, TableCellRenderObject } from "./impl/table/table-cell-impl";
|
11
|
-
import {
|
12
|
-
import {
|
13
|
+
import { TableElement } from "./impl/table/table-impl";
|
14
|
+
import { TableRowElement, TableRowRenderObject } from "./impl/table/table-row-impl";
|
15
|
+
import { BorderType, BranchRenderObject, CursorType, LeafRenderObject, RenderObject } from "./render-define";
|
16
|
+
import { EditorContext } from "./document-context";
|
13
17
|
import { ParagraphLineRectRenderObject } from "./impl/paragraph/p-impl";
|
14
18
|
import { TextGroupElement } from "./impl/text/text-impl";
|
15
19
|
import { DocumentHeaderRenderObject } from "./impl/document/doc-header-impl";
|
16
20
|
import { DocumentFooterRenderObject } from "./impl/document/doc-footer-impl";
|
17
21
|
import { debounceTime } from "rxjs/operators";
|
22
|
+
interface EdgeRenderInfo { renderElement: Element, relativePos: Position, mousedown: boolean, mousedownPos?: Position, border: BorderType }
|
18
23
|
/**
|
19
24
|
* 事件系统
|
20
25
|
*/
|
21
26
|
export class DocumentEvent {
|
22
|
-
|
23
|
-
documentPaint;
|
24
|
-
viewOptions;
|
25
|
-
selectionState;
|
26
|
-
docCtx;
|
27
|
-
ismousedown;
|
27
|
+
private ismousedown!: boolean;
|
28
28
|
//开始点击时的元素信息
|
29
|
-
startHitInfo;
|
29
|
+
startHitInfo!: HitEventInfo | null;
|
30
30
|
//当前位置点击的元素信息
|
31
|
-
endHitInfo;
|
31
|
+
endHitInfo!: HitEventInfo | null;
|
32
32
|
//当前定位的焦点元素,例如图片等
|
33
|
-
focusedElement;
|
34
|
-
focusedRect;
|
33
|
+
focusedElement!: LeafElement | null;
|
34
|
+
focusedRect!: Rect | null;
|
35
35
|
//当前光标所在的元素
|
36
|
-
currentMouseoverRender;
|
37
|
-
hitInfoChanged = new Subject();
|
38
|
-
clickEvent = new Subject();
|
39
|
-
dblClickEvent = new Subject();
|
40
|
-
changeCursor = new Subject();
|
41
|
-
contextMenu = new Subject();
|
42
|
-
trackTipsChanged = new Subject();
|
36
|
+
currentMouseoverRender!: { render: RenderObject, absoluteRenderRect: Rect } | null;
|
37
|
+
hitInfoChanged: Subject<{ startHitInfo: HitEventInfo, endHitInfo: HitEventInfo }> = new Subject();
|
38
|
+
clickEvent: Subject<MouseEvent> = new Subject();
|
39
|
+
dblClickEvent: Subject<MouseEvent> = new Subject();
|
40
|
+
changeCursor: Subject<CursorType> = new Subject();
|
41
|
+
contextMenu: Subject<MouseEvent> = new Subject();
|
42
|
+
trackTipsChanged: Subject<{ pos: Position, tips: ITrackTips }> = new Subject();
|
43
43
|
//光标处于边框的绘制元素
|
44
|
-
edgeRenderInfo;
|
44
|
+
edgeRenderInfo!: EdgeRenderInfo | null;
|
45
45
|
//当前鼠标所在的page-position
|
46
|
-
currentPos;
|
46
|
+
currentPos!: Position;
|
47
47
|
//鼠标按下的位置
|
48
|
-
mousedownPos;
|
49
|
-
subs = [];
|
50
|
-
|
51
|
-
|
52
|
-
this.documentPaint = documentPaint;
|
53
|
-
this.viewOptions = viewOptions;
|
54
|
-
this.selectionState = selectionState;
|
55
|
-
this.docCtx = docCtx;
|
48
|
+
mousedownPos!: Position;
|
49
|
+
subs: Array<Subscription> = [];
|
50
|
+
|
51
|
+
constructor(private canvas: HTMLCanvasElement, private documentPaint: DocumentPaint, private viewOptions: ViewOptions, private selectionState: SelectionState, private docCtx: EditorContext) {
|
56
52
|
this.bindEvent();
|
57
53
|
}
|
58
|
-
|
59
|
-
|
54
|
+
|
55
|
+
private bindEvent(): void {
|
56
|
+
this.addSubEvent(fromEvent<MouseEvent>(this.canvas, 'mousedown').subscribe((evt) => {
|
60
57
|
this.mousedown(evt);
|
61
58
|
}));
|
62
|
-
this.addSubEvent(fromEvent(this.canvas, 'mouseup').subscribe((evt) => {
|
59
|
+
this.addSubEvent(fromEvent<MouseEvent>(this.canvas, 'mouseup').subscribe((evt) => {
|
63
60
|
this.mouseup(evt);
|
64
61
|
}));
|
65
|
-
this.addSubEvent(fromEvent(this.canvas, 'click').subscribe((evt) => {
|
62
|
+
this.addSubEvent(fromEvent<MouseEvent>(this.canvas, 'click').subscribe((evt) => {
|
66
63
|
this.mouseClickHandle(evt);
|
67
64
|
}));
|
68
|
-
this.addSubEvent(fromEvent(this.canvas, 'contextmenu').subscribe((evt) => {
|
65
|
+
this.addSubEvent(fromEvent<MouseEvent>(this.canvas, 'contextmenu').subscribe((evt) => {
|
69
66
|
this.contextMenu.next(evt);
|
70
67
|
}));
|
71
|
-
this.addSubEvent(fromEvent(this.canvas, 'mousemove').subscribe((evt) => {
|
68
|
+
this.addSubEvent(fromEvent<MouseEvent>(this.canvas, 'mousemove').subscribe((evt) => {
|
72
69
|
this.mousemove(evt);
|
73
70
|
}));
|
74
|
-
this.addSubEvent(fromEvent(this.canvas, 'mousemove').pipe(debounceTime(500)).subscribe((evt) => {
|
71
|
+
this.addSubEvent(fromEvent<MouseEvent>(this.canvas, 'mousemove').pipe(debounceTime(500)).subscribe((evt) => {
|
75
72
|
this.getTips();
|
76
73
|
}));
|
77
|
-
this.addSubEvent(fromEvent(this.canvas, 'dblclick').subscribe((evt) => {
|
74
|
+
this.addSubEvent(fromEvent<MouseEvent>(this.canvas, 'dblclick').subscribe((evt) => {
|
78
75
|
this.mouseDblClickHandle(evt);
|
79
76
|
}));
|
80
77
|
}
|
81
|
-
|
78
|
+
|
79
|
+
addSubEvent(sub: Subscription): void {
|
82
80
|
this.subs.push(sub);
|
83
81
|
}
|
84
|
-
|
82
|
+
|
83
|
+
clearSubEvent(): void {
|
85
84
|
this.subs.forEach(item => item.unsubscribe());
|
86
85
|
this.subs.length = 0;
|
87
86
|
}
|
88
|
-
|
87
|
+
|
88
|
+
clear(): void {
|
89
89
|
this.selectionState.clear();
|
90
90
|
this.startHitInfo = null;
|
91
91
|
this.endHitInfo = null;
|
@@ -94,7 +94,8 @@ export class DocumentEvent {
|
|
94
94
|
this.currentMouseoverRender = null;
|
95
95
|
this.edgeRenderInfo = null;
|
96
96
|
}
|
97
|
-
|
97
|
+
|
98
|
+
private mousedown(evt: MouseEvent): void {
|
98
99
|
const docEvent = new MouseElementEvent(this.docCtx);
|
99
100
|
docEvent.globalX = evt.offsetX;
|
100
101
|
docEvent.globalY = evt.offsetY;
|
@@ -104,7 +105,8 @@ export class DocumentEvent {
|
|
104
105
|
this.mousedownPos = { x: evt.offsetX, y: evt.offsetY };
|
105
106
|
this.mousedownHandle(docEvent);
|
106
107
|
}
|
107
|
-
|
108
|
+
|
109
|
+
private mouseup(evt: MouseEvent): void {
|
108
110
|
const docEvent = new MouseElementEvent(this.docCtx);
|
109
111
|
docEvent.globalX = evt.offsetX;
|
110
112
|
docEvent.globalY = evt.offsetY;
|
@@ -113,7 +115,8 @@ export class DocumentEvent {
|
|
113
115
|
this.ismousedown = false;
|
114
116
|
this.edgeRenderInfo = null;
|
115
117
|
}
|
116
|
-
|
118
|
+
|
119
|
+
private mousemove(evt: MouseEvent): void {
|
117
120
|
const docEvent = new MouseElementEvent(this.docCtx);
|
118
121
|
docEvent.globalX = evt.offsetX;
|
119
122
|
docEvent.globalY = evt.offsetY;
|
@@ -124,12 +127,13 @@ export class DocumentEvent {
|
|
124
127
|
}
|
125
128
|
this.mousemoveHandle(docEvent);
|
126
129
|
}
|
127
|
-
|
130
|
+
|
131
|
+
private prevTrackInfo: boolean = false;
|
128
132
|
/**
|
129
133
|
* 显示提示信息
|
130
134
|
* 显示留痕提示信息等
|
131
135
|
*/
|
132
|
-
getTips() {
|
136
|
+
private getTips(): void {
|
133
137
|
if (!this.currentMouseoverRender) {
|
134
138
|
return;
|
135
139
|
}
|
@@ -143,8 +147,7 @@ export class DocumentEvent {
|
|
143
147
|
if (event.trackTips) {
|
144
148
|
this.trackTipsChanged.next({ pos: { ...this.currentPos }, tips: event.trackTips });
|
145
149
|
this.prevTrackInfo = true;
|
146
|
-
}
|
147
|
-
else {
|
150
|
+
} else {
|
148
151
|
if (!this.prevTrackInfo) {
|
149
152
|
return;
|
150
153
|
}
|
@@ -152,10 +155,12 @@ export class DocumentEvent {
|
|
152
155
|
this.prevTrackInfo = false;
|
153
156
|
}
|
154
157
|
}
|
158
|
+
|
159
|
+
|
155
160
|
/**
|
156
161
|
* 滚动视图的时候,需要手动触发mousemove
|
157
162
|
*/
|
158
|
-
onScrollView() {
|
163
|
+
onScrollView(): void {
|
159
164
|
if (!this.currentPos) {
|
160
165
|
return;
|
161
166
|
}
|
@@ -164,12 +169,13 @@ export class DocumentEvent {
|
|
164
169
|
docEvent.globalY = this.currentPos.y;
|
165
170
|
this.mousemoveHandle(docEvent);
|
166
171
|
}
|
172
|
+
|
167
173
|
/**
|
168
174
|
* 处理鼠标按下事件
|
169
|
-
* @param evt
|
170
|
-
* @returns
|
175
|
+
* @param evt
|
176
|
+
* @returns
|
171
177
|
*/
|
172
|
-
mousedownHandle(evt) {
|
178
|
+
private mousedownHandle(evt: MouseElementEvent): void {
|
173
179
|
//点击右键时,存在选区,直接返回
|
174
180
|
if (evt.buttons === 2 && this.startHitInfo && !this.selectionState.collapsed) {
|
175
181
|
return;
|
@@ -191,8 +197,7 @@ export class DocumentEvent {
|
|
191
197
|
const mousedownEvent = new MousedownElementEvent(this.docCtx);
|
192
198
|
mousedownEvent.source = startElement;
|
193
199
|
DocumentEvent.invokeEvent('ElementMousedown', startElement, mousedownEvent, 'All', this.docCtx);
|
194
|
-
}
|
195
|
-
else {
|
200
|
+
} else {
|
196
201
|
this.clearHitInfo();
|
197
202
|
}
|
198
203
|
if (this.edgeRenderInfo) {
|
@@ -200,13 +205,14 @@ export class DocumentEvent {
|
|
200
205
|
this.edgeRenderInfo.mousedownPos = this.currentPos;
|
201
206
|
this.clearHitInfo();
|
202
207
|
}
|
203
|
-
this.hitInfoChanged.next({ startHitInfo: this.startHitInfo, endHitInfo: this.endHitInfo });
|
208
|
+
this.hitInfoChanged.next({ startHitInfo: this.startHitInfo as HitEventInfo, endHitInfo: this.endHitInfo as HitEventInfo });
|
204
209
|
this.selectionState.startHitInfo = this.startHitInfo;
|
205
210
|
}
|
211
|
+
|
206
212
|
/**
|
207
213
|
* 设置元素焦点状态
|
208
214
|
*/
|
209
|
-
switchElementFocus() {
|
215
|
+
private switchElementFocus(): void {
|
210
216
|
if (!this.startHitInfo) {
|
211
217
|
return;
|
212
218
|
}
|
@@ -218,20 +224,22 @@ export class DocumentEvent {
|
|
218
224
|
}
|
219
225
|
if (startElement && startElement.focusable) {
|
220
226
|
startElement.isFocused = true;
|
221
|
-
this.focusedElement = startElement;
|
227
|
+
this.focusedElement = startElement as LeafElement;
|
222
228
|
this.focusedRect = ElementUtil.getRenderAbsolutePaintRect(this.startHitInfo.render);
|
223
229
|
}
|
224
230
|
}
|
225
|
-
|
231
|
+
|
232
|
+
clearHitInfo(): void {
|
226
233
|
this.startHitInfo = null;
|
227
234
|
this.endHitInfo = null;
|
228
235
|
}
|
236
|
+
|
229
237
|
/**
|
230
238
|
* 获取当前鼠标所在位置的元素信息
|
231
|
-
* @param evt
|
232
|
-
* @returns
|
239
|
+
* @param evt
|
240
|
+
* @returns
|
233
241
|
*/
|
234
|
-
getHitInfo(evt) {
|
242
|
+
private getHitInfo(evt: MouseElementEvent): HitEventInfo | null {
|
235
243
|
const hitDocInfo = this.getHitDocPage(evt);
|
236
244
|
if (!hitDocInfo) {
|
237
245
|
return null;
|
@@ -240,11 +248,12 @@ export class DocumentEvent {
|
|
240
248
|
//设置文档页中的相对位置
|
241
249
|
evt.pageX = hitPagePos.x;
|
242
250
|
evt.pageY = hitPagePos.y;
|
251
|
+
|
243
252
|
const hitInfo = this.getHitLeafRender(docRender, { x: -docRender.rect.x, y: -docRender.rect.y }, { x: evt.pageX, y: evt.pageY });
|
244
253
|
if (!hitInfo) {
|
245
254
|
return null;
|
246
255
|
}
|
247
|
-
const element = hitInfo.render.element;
|
256
|
+
const element = hitInfo.render.element as LeafElement;
|
248
257
|
return {
|
249
258
|
hitDocIndex: docIndex,
|
250
259
|
offset: hitInfo.offset,
|
@@ -256,7 +265,8 @@ export class DocumentEvent {
|
|
256
265
|
startRegion: ElementUtil.getRenderObjectRegion(hitInfo.render)
|
257
266
|
};
|
258
267
|
}
|
259
|
-
|
268
|
+
|
269
|
+
private getMouseoverRenderInfo(evt: MouseElementEvent): { render: RenderObject, absoluteRenderRect: Rect } | null {
|
260
270
|
const hitDocInfo = this.getHitDocPage(evt);
|
261
271
|
if (!hitDocInfo) {
|
262
272
|
return null;
|
@@ -270,15 +280,16 @@ export class DocumentEvent {
|
|
270
280
|
const mouseoverInfo = this.getHitLeafRender(docRender, { x: -docRender.rect.x, y: -docRender.rect.y }, { x: evt.pageX, y: evt.pageY });
|
271
281
|
return mouseoverInfo;
|
272
282
|
}
|
283
|
+
|
273
284
|
/**
|
274
285
|
* 鼠标移动事件
|
275
286
|
* 主要处理选区改变
|
276
287
|
*/
|
277
|
-
mousemoveHandle(evt) {
|
288
|
+
private mousemoveHandle(evt: MouseElementEvent): void {
|
278
289
|
//console.time('mousemove计时')
|
279
|
-
let edgeRenderInfo = null;
|
280
|
-
const mousePos = { x: evt.globalX, y: evt.globalY };
|
281
|
-
let cursorType = 'text';
|
290
|
+
let edgeRenderInfo: null | typeof this.edgeRenderInfo = null;
|
291
|
+
const mousePos: Position = { x: evt.globalX, y: evt.globalY };
|
292
|
+
let cursorType: CursorType = 'text';
|
282
293
|
this.currentPos = mousePos;
|
283
294
|
if (this.ismousedown && this.startHitInfo) {
|
284
295
|
this.endHitInfo = this.getHitInfo(evt);
|
@@ -291,27 +302,26 @@ export class DocumentEvent {
|
|
291
302
|
this.currentMouseoverRender = currMouseoverRenderInfo;
|
292
303
|
//当前有元素有焦点时,需要首先判断当前位置是否在焦点元素上
|
293
304
|
//如果单元格中包含图片等可缩放的元素,并且元素的大小超过单元格,则当前图片的某一部分就无法缩放
|
294
|
-
if (!this.ismousedown && this.focusedElement && this.focusedRect && this.focusedElement['resizeable']) {
|
295
|
-
const relativePos = { x: mousePos.x - this.focusedRect.x, y: mousePos.y - this.focusedRect.y };
|
305
|
+
if (!this.ismousedown && this.focusedElement && this.focusedRect && (<any>this.focusedElement)['resizeable']) {
|
306
|
+
const relativePos: Position = { x: mousePos.x - this.focusedRect.x, y: mousePos.y - this.focusedRect.y };
|
296
307
|
const isInCellBorder = CommonUtil.isInPictureResizePoint(this.focusedRect, relativePos, 4);
|
297
308
|
if (isInCellBorder) {
|
298
309
|
cursorType = ElementUtil.getBorderCursor(isInCellBorder.borderType);
|
299
310
|
if (isInCellBorder?.borderType === 'none') {
|
300
311
|
edgeRenderInfo = null;
|
301
|
-
}
|
302
|
-
else {
|
312
|
+
} else {
|
303
313
|
edgeRenderInfo = { renderElement: this.focusedElement, relativePos, mousedown: false, border: isInCellBorder.borderType };
|
304
314
|
}
|
305
315
|
}
|
306
|
-
}
|
316
|
+
}//当前鼠标不处于mousedown并且鼠标位于单元格边界时,获取边界信息
|
307
317
|
else if (!this.ismousedown && this.isInCellRenderObject(this.currentMouseoverRender?.render)) {
|
308
|
-
const cellRender = ElementUtil.getParentRender(this.currentMouseoverRender?.render, TableCellRenderObject);
|
318
|
+
const cellRender = ElementUtil.getParentRender(this.currentMouseoverRender?.render as RenderObject, TableCellRenderObject) as TableCellRenderObject;
|
309
319
|
//const cellRender = this.currentMouseoverRender?.render as TableCellRenderObject;
|
310
320
|
//const { render: { renderPosition: { x: rx, y: ry } } } = this.currentMouseoverRender;
|
311
321
|
//const rp = this.currentMouseoverRender?.absoluteRenderRect as Rect;
|
312
322
|
const rp = ElementUtil.getRenderAbsolutePaintRect(cellRender);
|
313
323
|
rp.y -= this.viewOptions.translateY;
|
314
|
-
const relativePos = { x: mousePos.x - rp.x, y: mousePos.y - rp.y };
|
324
|
+
const relativePos: Position = { x: mousePos.x - rp.x, y: mousePos.y - rp.y };
|
315
325
|
const isInCellBorder = CommonUtil.isInRectBorder(cellRender.rect, 2, relativePos);
|
316
326
|
if (isInCellBorder) {
|
317
327
|
//console.log('是否在边框上' + isInCellBorder?.borderType);
|
@@ -320,8 +330,7 @@ export class DocumentEvent {
|
|
320
330
|
this.changeCursor.next(cursorType);
|
321
331
|
if (isInCellBorder?.borderType === 'none') {
|
322
332
|
edgeRenderInfo = null;
|
323
|
-
}
|
324
|
-
else {
|
333
|
+
} else {
|
325
334
|
edgeRenderInfo = { renderElement: cellRender.element, relativePos, mousedown: false, border: isInCellBorder.borderType };
|
326
335
|
}
|
327
336
|
}
|
@@ -338,33 +347,38 @@ export class DocumentEvent {
|
|
338
347
|
}
|
339
348
|
this.changeCursor.next(cursorType);
|
340
349
|
}
|
341
|
-
|
350
|
+
|
351
|
+
|
352
|
+
private isCellRenderObject(render: RenderObject | undefined): boolean {
|
342
353
|
return render instanceof TableCellRenderObject;
|
343
354
|
}
|
355
|
+
|
344
356
|
/**
|
345
357
|
* 当前绘制元素是否在单元格上面
|
346
|
-
* @param render
|
347
|
-
* @returns
|
358
|
+
* @param render
|
359
|
+
* @returns
|
348
360
|
*/
|
349
|
-
isInCellRenderObject(render) {
|
361
|
+
private isInCellRenderObject(render: RenderObject | undefined): boolean {
|
350
362
|
if (!render) {
|
351
363
|
return false;
|
352
364
|
}
|
353
365
|
return ElementUtil.getParentRender(render, TableCellRenderObject) !== null;
|
354
366
|
}
|
355
|
-
|
367
|
+
|
368
|
+
private isResizeRenderObject(render: RenderObject | undefined): boolean {
|
356
369
|
return render instanceof ResizeLeafRenderObject;
|
357
370
|
}
|
371
|
+
|
358
372
|
/**
|
359
373
|
* 触发鼠标移动事件
|
360
374
|
*/
|
361
|
-
invokeMousemoveEvent(oldRender, newRender, mousePos) {
|
375
|
+
private invokeMousemoveEvent(oldRender: RenderObject | null | undefined, newRender: RenderObject | null | undefined, mousePos: { x: number, y: number } | undefined): void {
|
362
376
|
const oldParentRenders = oldRender ? ElementUtil.getRenderMapElements(oldRender) : [];
|
363
377
|
const newParentRenders = newRender ? ElementUtil.getRenderMapElements(newRender) : [];
|
364
378
|
const mouseleaveRenders = oldParentRenders.filter(item => newParentRenders.every(oldItem => item !== oldItem));
|
365
379
|
const mouseenterRenders = newParentRenders.filter(item => oldParentRenders.every(oldItem => item !== oldItem));
|
366
380
|
const mousemoveRenders = oldParentRenders.filter(item => mouseleaveRenders.every(oldItem => item !== oldItem));
|
367
|
-
const loopInvokeEvent = (eventName, array) => {
|
381
|
+
const loopInvokeEvent = (eventName: EventTypes, array: Array<Element>) => {
|
368
382
|
for (const element of array) {
|
369
383
|
const mouseEvent = new MouseElementEvent(this.docCtx);
|
370
384
|
mouseEvent.source = element;
|
@@ -376,23 +390,26 @@ export class DocumentEvent {
|
|
376
390
|
loopInvokeEvent('ElementMouseEnter', mouseenterRenders);
|
377
391
|
loopInvokeEvent('ElementMousemove', mousemoveRenders);
|
378
392
|
}
|
379
|
-
|
393
|
+
|
394
|
+
|
395
|
+
prevCursorItems: Array<Element> = [];
|
380
396
|
/**
|
381
397
|
* 触发获取焦点事件
|
382
398
|
* 需要根据上次获取焦点的元素,比较触发失去焦点事件
|
383
|
-
* @param focusElement
|
399
|
+
* @param focusElement
|
384
400
|
*/
|
385
|
-
invokeCursor(focusElement) {
|
401
|
+
invokeCursor(focusElement: LeafElement): void {
|
386
402
|
if (focusElement === this.prevCursorItems[0]) {
|
387
403
|
return;
|
388
404
|
}
|
389
405
|
const getCursorEvent = new GotCursorEvent(this.docCtx);
|
390
406
|
getCursorEvent.source = focusElement;
|
407
|
+
|
391
408
|
const oldParents = this.prevCursorItems;
|
392
409
|
const newParents = ElementUtil.getParentElements(focusElement);
|
393
410
|
const leaveParents = oldParents.filter(item => newParents.every(oldItem => item !== oldItem));
|
394
411
|
const enterParents = newParents.filter(item => oldParents.every(oldItem => item !== oldItem));
|
395
|
-
const loopInvokeEvent = (eventName, array) => {
|
412
|
+
const loopInvokeEvent = (eventName: EventTypes, array: Array<Element>) => {
|
396
413
|
for (const element of array) {
|
397
414
|
const mouseEvent = new LostCursorEvent(this.docCtx);
|
398
415
|
mouseEvent.source = focusElement;
|
@@ -403,18 +420,20 @@ export class DocumentEvent {
|
|
403
420
|
};
|
404
421
|
loopInvokeEvent('LostCursor', leaveParents);
|
405
422
|
loopInvokeEvent('GotCursor', enterParents);
|
423
|
+
|
406
424
|
this.prevCursorItems = newParents;
|
407
425
|
//dDocumentEvent.invokeEvent('GotCursor', focusElement, getCursorEvent, 'All', this.docCtx);
|
408
426
|
}
|
427
|
+
|
409
428
|
/**
|
410
429
|
* mousedown-mouseup-click
|
411
430
|
*/
|
412
|
-
mouseClickHandle(evt) {
|
431
|
+
private mouseClickHandle(evt: MouseEvent): void {
|
413
432
|
if (this.viewOptions.docMode === DocMode.View) {
|
414
433
|
return;
|
415
434
|
}
|
416
435
|
if (this.startHitInfo && this.endHitInfo && this.startHitInfo.element === this.endHitInfo.element) {
|
417
|
-
const startElement = this.startHitInfo.render.element;
|
436
|
+
const startElement = this.startHitInfo.render.element as LeafElement;
|
418
437
|
const mousedownEvent = new MousedownElementEvent(this.docCtx);
|
419
438
|
mousedownEvent.source = startElement;
|
420
439
|
DocumentEvent.invokeEvent('ElementClick', startElement, mousedownEvent, "All", this.docCtx);
|
@@ -441,10 +460,11 @@ export class DocumentEvent {
|
|
441
460
|
}
|
442
461
|
this.clickEvent.next(evt);
|
443
462
|
}
|
463
|
+
|
444
464
|
/**
|
445
465
|
* 鼠标双击事件
|
446
466
|
*/
|
447
|
-
mouseDblClickHandle(evt) {
|
467
|
+
private mouseDblClickHandle(evt: MouseEvent): void {
|
448
468
|
const docEvent = new MouseElementEvent(this.docCtx);
|
449
469
|
docEvent.globalX = evt.offsetX;
|
450
470
|
docEvent.globalY = evt.offsetY;
|
@@ -453,8 +473,7 @@ export class DocumentEvent {
|
|
453
473
|
if ((hitRegion === 'footer' || hitRegion === 'header') && !this.docCtx.document.headerEditState) {
|
454
474
|
this.docCtx.document.switchPageHeaderEditor(this.selectionState, null);
|
455
475
|
return;
|
456
|
-
}
|
457
|
-
else if (hitRegion === 'body' && this.docCtx.document.headerEditState) {
|
476
|
+
} else if (hitRegion === 'body' && this.docCtx.document.headerEditState) {
|
458
477
|
this.docCtx.document.switchPageHeaderEditor(this.selectionState, null);
|
459
478
|
return;
|
460
479
|
}
|
@@ -463,29 +482,28 @@ export class DocumentEvent {
|
|
463
482
|
docEvent.source = hitInfo.element;
|
464
483
|
docEvent.sourceRender = hitInfo.render;
|
465
484
|
const res = DocumentEvent.invokeEvent('ElementDblClick', hitInfo.element, docEvent, 'All', this.docCtx);
|
466
|
-
if (res) {
|
467
|
-
return;
|
468
|
-
}
|
485
|
+
if (res) { return }
|
469
486
|
this.dblClickEvent.next(evt);
|
470
487
|
}
|
471
488
|
}
|
489
|
+
|
472
490
|
/**
|
473
491
|
* 获取点击的渲染元素对象
|
474
|
-
* @param renderObject
|
475
|
-
* @param parPos
|
476
|
-
* @param hitPos
|
477
|
-
* @returns
|
492
|
+
* @param renderObject
|
493
|
+
* @param parPos
|
494
|
+
* @param hitPos
|
495
|
+
* @returns
|
478
496
|
*/
|
479
|
-
getHitLeafRender(renderObject, parPos, hitPos) {
|
497
|
+
private getHitLeafRender(renderObject: RenderObject, parPos: Position, hitPos: Position): { render: LeafRenderObject, offset: number, absoluteRenderRect: Rect } | null {
|
480
498
|
//处理单元格合并,被合并的单元格当前属于被隐藏状态,不能被选择
|
481
499
|
//if (renderObject.element && renderObject.element.visiable === false || renderObject instanceof FillNullSpaceRenderObject) {
|
482
500
|
if (!ElementUtil.checkAvailHitRender(renderObject)) {
|
483
501
|
return null;
|
484
502
|
}
|
485
503
|
if (!renderObject.rect) {
|
486
|
-
throw new Error('renderObject.rect is null')
|
504
|
+
throw new Error('renderObject.rect is null')
|
487
505
|
}
|
488
|
-
const renderObjectRect = { x: parPos.x + renderObject.rect.x, y: parPos.y + renderObject.rect.y, width: renderObject.rect.width, height: renderObject.rect.height, maxWidth: 0, maxHeight: 0 };
|
506
|
+
const renderObjectRect: Rect = { x: parPos.x + renderObject.rect.x, y: parPos.y + renderObject.rect.y, width: renderObject.rect.width, height: renderObject.rect.height, maxWidth: 0, maxHeight: 0 };
|
489
507
|
if (renderObject instanceof TableRowRenderObject) {
|
490
508
|
return this.getTRowHitLeafRender(renderObject, parPos, hitPos);
|
491
509
|
}
|
@@ -499,8 +517,7 @@ export class DocumentEvent {
|
|
499
517
|
absoluteRenderRect: renderObjectRect
|
500
518
|
};
|
501
519
|
}
|
502
|
-
}
|
503
|
-
else if (renderObject instanceof BranchRenderObject) {
|
520
|
+
} else if (renderObject instanceof BranchRenderObject) {
|
504
521
|
if (CommonUtil.isInsideRectByPosition(renderObjectRect, hitPos)) {
|
505
522
|
for (let i = 0; i < renderObject.length; i++) {
|
506
523
|
const childRender = renderObject.getChild(i);
|
@@ -512,14 +529,16 @@ export class DocumentEvent {
|
|
512
529
|
//如果当前范围未击中任何元素,则需要匹配最近的元素
|
513
530
|
return this.getRecentHitRender(renderObject, parPos, hitPos);
|
514
531
|
}
|
515
|
-
}
|
516
|
-
else {
|
532
|
+
} else {
|
517
533
|
throw new Error('未实现');
|
518
534
|
}
|
519
535
|
return null;
|
520
536
|
}
|
521
|
-
|
522
|
-
|
537
|
+
|
538
|
+
|
539
|
+
|
540
|
+
private getTRowHitLeafRender(renderObject: TableRowRenderObject, parent: Position, position: Position): { render: LeafRenderObject, offset: number, absoluteRenderRect: Rect } | null {
|
541
|
+
const rowEle = renderObject.element as TableRowElement;
|
523
542
|
//跨页重复显示的头行,属于不可点击区域
|
524
543
|
//只有表第一页部分可以点击
|
525
544
|
if (rowEle.props.headerRow) {
|
@@ -527,7 +546,7 @@ export class DocumentEvent {
|
|
527
546
|
return null;
|
528
547
|
}
|
529
548
|
}
|
530
|
-
const renderObjectRect = { x: parent.x + renderObject.rect.x, y: parent.y + renderObject.rect.y, width: renderObject.rect.width, height: renderObject.rect.height, maxWidth: 0, maxHeight: 0 };
|
549
|
+
const renderObjectRect: Rect = { x: parent.x + renderObject.rect.x, y: parent.y + renderObject.rect.y, width: renderObject.rect.width, height: renderObject.rect.height, maxWidth: 0, maxHeight: 0 };
|
531
550
|
for (let i = 0; i < renderObject.length; i++) {
|
532
551
|
const childRender = renderObject.getChild(i);
|
533
552
|
const res = this.getHitLeafRender(childRender, { x: renderObjectRect.x, y: renderObjectRect.y }, position);
|
@@ -537,17 +556,19 @@ export class DocumentEvent {
|
|
537
556
|
}
|
538
557
|
return null;
|
539
558
|
}
|
559
|
+
|
560
|
+
|
540
561
|
/**
|
541
562
|
* 如果当前范围未击中任何元素,则需要匹配最近的元素
|
542
|
-
* @param renderObject
|
543
|
-
* @param parent
|
544
|
-
* @param position
|
563
|
+
* @param renderObject
|
564
|
+
* @param parent
|
565
|
+
* @param position
|
545
566
|
*/
|
546
|
-
getRecentHitRender(renderObject, parent, position) {
|
547
|
-
const currentRenderPos = { x: renderObject.rect.x + parent.x, y: renderObject.rect.y + parent.y }
|
567
|
+
private getRecentHitRender(renderObject: BranchRenderObject, parent: Position, position: Position): { render: LeafRenderObject, offset: number, absoluteRenderRect: Rect } | null {
|
568
|
+
const currentRenderPos: Position = { x: renderObject.rect.x + parent.x, y: renderObject.rect.y + parent.y }
|
548
569
|
let childRenders = ElementUtil.getAvailHitRenderObjects(renderObject, parent);
|
549
570
|
childRenders = childRenders.filter(item => !item.render.disableClick);
|
550
|
-
let childrenRenderMap = childRenders.map(item => ({ rect: item.rect, distance: ElementUtil.getDistanceToRect(item.rect, position), render: item.render }))
|
571
|
+
let childrenRenderMap = childRenders.map(item => ({ rect: item.rect, distance: ElementUtil.getDistanceToRect(item.rect, position), render: item.render }))
|
551
572
|
//rects = rects.concat(childRenders.map(item => ({ rect: item.rect, distance: ElementUtil.getDistance({ x: item.rect.x + item.rect.width, y: item.rect.y }, position), render: item.render })));
|
552
573
|
childrenRenderMap.sort((item1, item2) => item1.distance - item2.distance);
|
553
574
|
for (let i = 0; i < childrenRenderMap.length; i++) {
|
@@ -560,16 +581,13 @@ export class DocumentEvent {
|
|
560
581
|
if (res) {
|
561
582
|
return res;
|
562
583
|
}
|
563
|
-
}
|
564
|
-
else if (adjacentRender.render instanceof LeafRenderObject) {
|
584
|
+
} else if (adjacentRender.render instanceof LeafRenderObject) {
|
565
585
|
let x = 0;
|
566
586
|
if (adjacentRender.rect.x > position.x) {
|
567
587
|
x = 0;
|
568
|
-
}
|
569
|
-
else if (adjacentRender.rect.x + adjacentRender.rect.width < position.x) {
|
588
|
+
} else if (adjacentRender.rect.x + adjacentRender.rect.width < position.x) {
|
570
589
|
x = adjacentRender.rect.width;
|
571
|
-
}
|
572
|
-
else {
|
590
|
+
} else {
|
573
591
|
x = position.x - adjacentRender.rect.x;
|
574
592
|
}
|
575
593
|
const offset = ElementUtil.getHitRenderOffset(adjacentRender.render, x);
|
@@ -582,18 +600,21 @@ export class DocumentEvent {
|
|
582
600
|
}
|
583
601
|
return null;
|
584
602
|
}
|
603
|
+
|
604
|
+
|
605
|
+
|
585
606
|
/**
|
586
607
|
* 获取点击的doc-page
|
587
608
|
*/
|
588
|
-
getHitDocPage(evt) {
|
589
|
-
const hitPos = { x: evt.globalX, y: evt.globalY };
|
609
|
+
private getHitDocPage(evt: MouseElementEvent): { docRender: DocumentRenderObject, paintAbsoluteRect: Position, hitPagePos: Position, docIndex: number } | null {
|
610
|
+
const hitPos: Position = { x: evt.globalX, y: evt.globalY };
|
590
611
|
const docContainer = this.documentPaint.getDocContainer();
|
591
612
|
let { x, y } = docContainer.rect;
|
592
613
|
y -= this.viewOptions.translateY;
|
593
614
|
let i = 0;
|
594
615
|
for (; i < docContainer.length; i++) {
|
595
|
-
const docRender = docContainer.getChild(i);
|
596
|
-
const docRenderPos = { x: docRender.rect.x + x, y: docRender.rect.y + y };
|
616
|
+
const docRender = docContainer.getChild(i) as DocumentRenderObject;
|
617
|
+
const docRenderPos: Position = { x: docRender.rect.x + x, y: docRender.rect.y + y };
|
597
618
|
if (docRenderPos.y + docRender.rect.height > hitPos.y) {
|
598
619
|
break;
|
599
620
|
}
|
@@ -602,22 +623,23 @@ export class DocumentEvent {
|
|
602
623
|
}
|
603
624
|
}
|
604
625
|
i = i === docContainer.length ? i - 1 : i;
|
605
|
-
const hitDoc = docContainer.getChild(i);
|
626
|
+
const hitDoc = docContainer.getChild(i) as DocumentRenderObject;
|
606
627
|
const docPos = { x: hitDoc.rect.x + x, y: hitDoc.rect.y + y };
|
607
|
-
const hitPagePos = { x: hitPos.x - docPos.x, y: hitPos.y - docPos.y }
|
628
|
+
const hitPagePos: Position = { x: hitPos.x - docPos.x, y: hitPos.y - docPos.y }
|
608
629
|
return {
|
609
630
|
docRender: hitDoc,
|
610
631
|
paintAbsoluteRect: docPos,
|
611
632
|
docIndex: i,
|
612
633
|
hitPagePos
|
613
|
-
}
|
634
|
+
}
|
614
635
|
}
|
636
|
+
|
615
637
|
/**
|
616
638
|
* 触发事件
|
617
|
-
* @param type
|
618
|
-
* @param sourceElement
|
639
|
+
* @param type
|
640
|
+
* @param sourceElement
|
619
641
|
*/
|
620
|
-
static invokeEvent(type, sourceElement, event, eventStage, docCtx) {
|
642
|
+
static invokeEvent(type: EventTypes, sourceElement: Element, event: ElementEvent, eventStage: EventStage, docCtx: EditorContext): ElementEvent | null {
|
621
643
|
const parents = ElementUtil.getParentElements(sourceElement);
|
622
644
|
//先执行捕获阶段,在执行冒泡
|
623
645
|
for (let i = parents.length - 1; i > -parents.length; i--) {
|
@@ -642,21 +664,24 @@ export class DocumentEvent {
|
|
642
664
|
}
|
643
665
|
return null;
|
644
666
|
}
|
667
|
+
|
668
|
+
|
645
669
|
/**
|
646
670
|
* 发布当前的点击信息
|
647
671
|
*/
|
648
|
-
pubHitInfo() {
|
649
|
-
this.hitInfoChanged.next({ startHitInfo: this.startHitInfo, endHitInfo: this.endHitInfo });
|
672
|
+
private pubHitInfo(): void {
|
673
|
+
this.hitInfoChanged.next({ startHitInfo: this.startHitInfo as HitEventInfo, endHitInfo: this.endHitInfo as HitEventInfo });
|
650
674
|
}
|
675
|
+
|
651
676
|
/**
|
652
677
|
* 获取鼠标所在的渲染元素对象
|
653
|
-
* @param renderObject
|
654
|
-
* @param parent
|
655
|
-
* @param position
|
656
|
-
* @returns
|
678
|
+
* @param renderObject
|
679
|
+
* @param parent
|
680
|
+
* @param position
|
681
|
+
* @returns
|
657
682
|
*/
|
658
|
-
getMouseoverRender(renderObject, parent, position) {
|
659
|
-
const renderObjectRect = { x: parent.x + renderObject.rect.x, y: parent.y + renderObject.rect.y, width: renderObject.rect.width, height: renderObject.rect.height, maxWidth: 0, maxHeight: 0 };
|
683
|
+
private getMouseoverRender(renderObject: RenderObject, parent: Position, position: Position): { render: RenderObject, absoluteRenderRect: Rect } | null {
|
684
|
+
const renderObjectRect: Rect = { x: parent.x + renderObject.rect.x, y: parent.y + renderObject.rect.y, width: renderObject.rect.width, height: renderObject.rect.height, maxWidth: 0, maxHeight: 0 };
|
660
685
|
if (renderObject instanceof LeafRenderObject) {
|
661
686
|
if (CommonUtil.isInsideRectByPosition(renderObjectRect, position)) {
|
662
687
|
return {
|
@@ -664,8 +689,7 @@ export class DocumentEvent {
|
|
664
689
|
absoluteRenderRect: renderObjectRect
|
665
690
|
};
|
666
691
|
}
|
667
|
-
}
|
668
|
-
else if (renderObject instanceof BranchRenderObject) {
|
692
|
+
} else if (renderObject instanceof BranchRenderObject) {
|
669
693
|
if (CommonUtil.isInsideRectByPosition(renderObjectRect, position)) {
|
670
694
|
//当前为表单元格,但是表格不存在上下padding,
|
671
695
|
//则表格上边框和下边框可能会和内容(paragraph)重叠,
|
@@ -674,7 +698,7 @@ export class DocumentEvent {
|
|
674
698
|
return {
|
675
699
|
render: renderObject,
|
676
700
|
absoluteRenderRect: renderObjectRect
|
677
|
-
}
|
701
|
+
}
|
678
702
|
}
|
679
703
|
for (let i = 0; i < renderObject.length; i++) {
|
680
704
|
const childRender = renderObject.getChild(i);
|
@@ -686,29 +710,29 @@ export class DocumentEvent {
|
|
686
710
|
return {
|
687
711
|
render: renderObject,
|
688
712
|
absoluteRenderRect: renderObjectRect
|
689
|
-
}
|
713
|
+
}
|
690
714
|
}
|
691
|
-
}
|
692
|
-
else {
|
715
|
+
} else {
|
693
716
|
throw new Error('未实现');
|
694
717
|
}
|
695
718
|
return null;
|
696
719
|
}
|
720
|
+
|
697
721
|
/**
|
698
722
|
* 缩放元素
|
699
723
|
*/
|
700
|
-
resizeRender(e) {
|
701
|
-
if (this.edgeRenderInfo?.renderElement['resizeable']) {
|
724
|
+
private resizeRender(e: MouseElementEvent): void {
|
725
|
+
if ((<any>this.edgeRenderInfo?.renderElement)['resizeable']) {
|
702
726
|
this.resizeElement(e);
|
703
|
-
}
|
704
|
-
else if (this.edgeRenderInfo?.renderElement instanceof TableCellElement) {
|
727
|
+
} else if (this.edgeRenderInfo?.renderElement instanceof TableCellElement) {
|
705
728
|
this.resizeTableCell();
|
706
729
|
}
|
707
730
|
}
|
731
|
+
|
708
732
|
/**
|
709
733
|
* 缩放表格
|
710
734
|
*/
|
711
|
-
resizeTableCell() {
|
735
|
+
private resizeTableCell(): void {
|
712
736
|
if (!this.edgeRenderInfo || !this.edgeRenderInfo.mousedownPos) {
|
713
737
|
return;
|
714
738
|
}
|
@@ -718,9 +742,9 @@ export class DocumentEvent {
|
|
718
742
|
const moveDistanceX = this.currentPos.x - mousedownPos.x;
|
719
743
|
const moveDistanceY = this.currentPos.y - mousedownPos.y;
|
720
744
|
const row = cellElement.parent;
|
721
|
-
const table = row?.parent;
|
745
|
+
const table = row?.parent as TableElement;
|
722
746
|
if (!row || !table) {
|
723
|
-
throw new Error('row | table is null')
|
747
|
+
throw new Error('row | table is null')
|
724
748
|
}
|
725
749
|
const cellIndex = row.getChildIndex(cellElement);
|
726
750
|
let cellWidth = table.getCellWidth(cellIndex);
|
@@ -736,8 +760,7 @@ export class DocumentEvent {
|
|
736
760
|
resizeColWidth = table.getCellWidth(resizeColIndex);
|
737
761
|
resizeColWidth += moveDistanceX;
|
738
762
|
cellWidth -= moveDistanceX;
|
739
|
-
}
|
740
|
-
else if (border === 'right') {
|
763
|
+
} else if (border === 'right') {
|
741
764
|
resizeColIndex = cellIndex + 1;
|
742
765
|
//移动最后一列时,右侧没有列了,resizeColWidth的值为-1
|
743
766
|
resizeColWidth = table.getCellWidth(resizeColIndex);
|
@@ -753,18 +776,17 @@ export class DocumentEvent {
|
|
753
776
|
table.setCellWidth(cellIndex, cellWidth);
|
754
777
|
this.edgeRenderInfo.mousedownPos = this.currentPos;
|
755
778
|
table.pubOnChange('self');
|
756
|
-
}
|
757
|
-
else if (['bottom', 'top'].includes(border)) {
|
779
|
+
} else if (['bottom', 'top'].includes(border)) {
|
758
780
|
let rowIndex = row.getIndex();
|
759
781
|
if (rowIndex === 0 && border === 'top') {
|
760
782
|
return;
|
761
783
|
}
|
762
784
|
//按照移动底边计算
|
763
785
|
rowIndex = border === 'top' ? rowIndex - 1 : rowIndex;
|
764
|
-
const resizeRowEle = table.getChild(rowIndex);
|
765
|
-
let resizeRowRender = resizeRowEle.measureRender;
|
786
|
+
const resizeRowEle = table.getChild(rowIndex) as TableRowElement;
|
787
|
+
let resizeRowRender = resizeRowEle.measureRender as TableRowRenderObject;
|
766
788
|
if (resizeRowRender.element !== resizeRowEle) {
|
767
|
-
console.error('缩放表格行高度出现错误,绘制元素和表格对象不对应')
|
789
|
+
console.error('缩放表格行高度出现错误,绘制元素和表格对象不对应')
|
768
790
|
return;
|
769
791
|
}
|
770
792
|
const minHeight = resizeRowEle.props.minHeight ?? 0;
|
@@ -777,8 +799,7 @@ export class DocumentEvent {
|
|
777
799
|
let resizeRowMinHeight = 0;
|
778
800
|
if (minHeight <= 0) {
|
779
801
|
resizeRowMinHeight = resizeRowRenderContentHeight + moveDistanceY;
|
780
|
-
}
|
781
|
-
else {
|
802
|
+
} else {
|
782
803
|
resizeRowMinHeight = minHeight + moveDistanceY;
|
783
804
|
}
|
784
805
|
//缩放的高度小于内容高度,则重置行最小高度
|
@@ -791,36 +812,38 @@ export class DocumentEvent {
|
|
791
812
|
table.pubOnChange('self');
|
792
813
|
}
|
793
814
|
}
|
794
|
-
|
815
|
+
|
816
|
+
private getResizeTableCell(): TableCellElement {
|
795
817
|
if (!this.edgeRenderInfo) {
|
796
|
-
throw new Error('edgeRenderInfo is null')
|
818
|
+
throw new Error('edgeRenderInfo is null')
|
797
819
|
}
|
798
|
-
const cellElement = this.edgeRenderInfo.renderElement;
|
820
|
+
const cellElement = this.edgeRenderInfo.renderElement as TableCellElement;
|
799
821
|
const row = cellElement.parent;
|
800
822
|
if (!row) {
|
801
|
-
throw new Error('row is null')
|
823
|
+
throw new Error('row is null')
|
802
824
|
}
|
803
|
-
const table = row.parent;
|
825
|
+
const table = row.parent as TableElement;
|
804
826
|
const cellIndex = row.getChildIndex(cellElement);
|
805
827
|
const border = this.edgeRenderInfo.border;
|
806
828
|
if (cellElement.props.hMerge === 'restart' || border === 'right') {
|
807
829
|
for (let i = cellIndex + 1; i < table.getColsCount(); i++) {
|
808
|
-
const cell = row.getChild(i);
|
830
|
+
const cell = row.getChild(i) as TableCellElement;
|
809
831
|
if (cell.props.hMerge !== 'continue') {
|
810
|
-
return row.getChild(i - 1);
|
832
|
+
return row.getChild(i - 1) as TableCellElement;
|
811
833
|
}
|
812
834
|
}
|
813
835
|
}
|
814
836
|
return cellElement;
|
815
837
|
}
|
838
|
+
|
816
839
|
/**
|
817
840
|
* 调整元素大小
|
818
841
|
*/
|
819
|
-
resizeElement(e) {
|
842
|
+
private resizeElement(e: MouseElementEvent): void {
|
820
843
|
if (!this.edgeRenderInfo || !this.edgeRenderInfo.mousedownPos) {
|
821
844
|
return;
|
822
845
|
}
|
823
|
-
const imgElement = this.edgeRenderInfo.renderElement;
|
846
|
+
const imgElement = <unknown>this.edgeRenderInfo.renderElement as { props: { width: number, height: number } };
|
824
847
|
const border = this.edgeRenderInfo.border;
|
825
848
|
const mousedownPos = this.edgeRenderInfo.mousedownPos;
|
826
849
|
let moveDistanceX = this.currentPos.x - mousedownPos.x;
|
@@ -838,8 +861,7 @@ export class DocumentEvent {
|
|
838
861
|
if (Math.abs(moveDistanceX) > Math.abs(moveDistanceY)) {
|
839
862
|
scale = moveDistanceX / imgElement.props.width;
|
840
863
|
moveDistanceY = Math.floor(scale * imgElement.props.height);
|
841
|
-
}
|
842
|
-
else {
|
864
|
+
} else {
|
843
865
|
scale = moveDistanceY / imgElement.props.height;
|
844
866
|
moveDistanceX = Math.floor(scale * imgElement.props.width);
|
845
867
|
}
|
@@ -854,11 +876,13 @@ export class DocumentEvent {
|
|
854
876
|
}
|
855
877
|
this.edgeRenderInfo.mousedownPos = this.currentPos;
|
856
878
|
}
|
879
|
+
|
857
880
|
}
|
881
|
+
|
858
882
|
/**
|
859
883
|
* 选中当前全部 ctrl+A
|
860
884
|
*/
|
861
|
-
selectAll() {
|
885
|
+
selectAll(): void {
|
862
886
|
const { startControl } = this.selectionState;
|
863
887
|
const regionTarget = ElementUtil.getElementRegionTarget(startControl);
|
864
888
|
if (!startControl || !regionTarget) {
|
@@ -867,7 +891,7 @@ export class DocumentEvent {
|
|
867
891
|
const firstLeaf = ElementUtil.getFirstLeafElement(regionTarget.target);
|
868
892
|
const lastLeaf = ElementUtil.getLastLeafElement(regionTarget.target);
|
869
893
|
if (!firstLeaf || !lastLeaf) {
|
870
|
-
throw new Error('firstLeaf or lastLeaf is null')
|
894
|
+
throw new Error('firstLeaf or lastLeaf is null')
|
871
895
|
}
|
872
896
|
this.selectionState.clear();
|
873
897
|
const newSelectionRange = new SelectionRange();
|
@@ -876,24 +900,28 @@ export class DocumentEvent {
|
|
876
900
|
this.selectionState.addRange(newSelectionRange);
|
877
901
|
//const doc=
|
878
902
|
}
|
903
|
+
|
904
|
+
|
879
905
|
/**
|
880
906
|
* 移动光标到行首
|
881
907
|
*/
|
882
|
-
moveCursorToLineStart() {
|
908
|
+
moveCursorToLineStart(): void {
|
883
909
|
this.moveCursorToHomeOrEnd();
|
884
910
|
}
|
911
|
+
|
885
912
|
/**
|
886
913
|
* 移动光标到行尾
|
887
914
|
*/
|
888
|
-
moveCursorToLineEnd() {
|
915
|
+
moveCursorToLineEnd(): void {
|
889
916
|
this.moveCursorToHomeOrEnd(false);
|
890
917
|
}
|
918
|
+
|
891
919
|
/**
|
892
920
|
* 处理移动光标到行尾或行首
|
893
|
-
* @param home
|
894
|
-
* @returns
|
921
|
+
* @param home
|
922
|
+
* @returns
|
895
923
|
*/
|
896
|
-
moveCursorToHomeOrEnd(home = true) {
|
924
|
+
private moveCursorToHomeOrEnd(home: boolean = true): void {
|
897
925
|
const { startControl } = this.selectionState;
|
898
926
|
if (!startControl || !this.docCtx.cursorRect) {
|
899
927
|
return;
|
@@ -907,8 +935,8 @@ export class DocumentEvent {
|
|
907
935
|
if (!hitInfo) {
|
908
936
|
return;
|
909
937
|
}
|
910
|
-
const paraRender = ElementUtil.getParentRender(hitInfo.render, ParagraphLineRectRenderObject)
|
911
|
-
const linePosRect = ElementUtil.getRenderAbsolutePaintRect(paraRender)
|
938
|
+
const paraRender = ElementUtil.getParentRender(hitInfo.render, ParagraphLineRectRenderObject) as ParagraphLineRectRenderObject
|
939
|
+
const linePosRect = ElementUtil.getRenderAbsolutePaintRect(paraRender)
|
912
940
|
docEvent.globalX = linePosRect.x + (home ? 0 : linePosRect.width);
|
913
941
|
docEvent.globalY = linePosRect.y + linePosRect.height / 2;
|
914
942
|
this.mousedownPos = { x: docEvent.globalX, y: docEvent.globalY };
|
@@ -916,10 +944,12 @@ export class DocumentEvent {
|
|
916
944
|
this.ismousedown = false;
|
917
945
|
this.edgeRenderInfo = null;
|
918
946
|
}
|
947
|
+
|
948
|
+
|
919
949
|
/**
|
920
950
|
* 向左移动光标
|
921
951
|
*/
|
922
|
-
moveCursorToLeft() {
|
952
|
+
moveCursorToLeft(): void {
|
923
953
|
const { startControl, startOffset } = this.selectionState;
|
924
954
|
if (startOffset === 0) {
|
925
955
|
const oldRegion = ElementUtil.getElementRegion(startControl);
|
@@ -932,20 +962,19 @@ export class DocumentEvent {
|
|
932
962
|
this.selectionState.resetRange(prevEle, -1);
|
933
963
|
return;
|
934
964
|
}
|
935
|
-
}
|
936
|
-
else {
|
965
|
+
} else {
|
937
966
|
if (startControl instanceof TextGroupElement) {
|
938
967
|
this.selectionState.resetRange(startControl, startOffset - 1);
|
939
|
-
}
|
940
|
-
else {
|
968
|
+
} else {
|
941
969
|
this.selectionState.resetRange(startControl, 0);
|
942
970
|
}
|
943
971
|
}
|
944
972
|
}
|
973
|
+
|
945
974
|
/**
|
946
975
|
* 向右移动光标
|
947
976
|
*/
|
948
|
-
moveCursorToRight() {
|
977
|
+
moveCursorToRight(): void {
|
949
978
|
const { startControl, startOffset } = this.selectionState;
|
950
979
|
if (this.isLeafEleEndOffset(startControl, startOffset)) {
|
951
980
|
const oldRegion = ElementUtil.getElementRegion(startControl);
|
@@ -958,20 +987,19 @@ export class DocumentEvent {
|
|
958
987
|
this.selectionState.resetRange(nextEle, 0);
|
959
988
|
return;
|
960
989
|
}
|
961
|
-
}
|
962
|
-
else {
|
990
|
+
} else {
|
963
991
|
if (startControl instanceof TextGroupElement) {
|
964
992
|
this.selectionState.resetRange(startControl, startOffset + 1);
|
965
|
-
}
|
966
|
-
else {
|
993
|
+
} else {
|
967
994
|
this.selectionState.resetRange(startControl, 1);
|
968
995
|
}
|
969
996
|
}
|
970
997
|
}
|
998
|
+
|
971
999
|
/**
|
972
1000
|
* 向上移动光标
|
973
1001
|
*/
|
974
|
-
moveCursorToUpOrDown(up = true) {
|
1002
|
+
moveCursorToUpOrDown(up: boolean = true): void {
|
975
1003
|
if (!this.selectionState.cursorPos) {
|
976
1004
|
return;
|
977
1005
|
}
|
@@ -996,39 +1024,40 @@ export class DocumentEvent {
|
|
996
1024
|
}
|
997
1025
|
}
|
998
1026
|
}
|
1027
|
+
|
1028
|
+
|
999
1029
|
/**
|
1000
1030
|
* 当前偏移量是否处于当前元素的末尾
|
1001
|
-
* @param ele
|
1002
|
-
* @param offset
|
1003
|
-
* @returns
|
1031
|
+
* @param ele
|
1032
|
+
* @param offset
|
1033
|
+
* @returns
|
1004
1034
|
*/
|
1005
|
-
isLeafEleEndOffset(ele, offset) {
|
1035
|
+
private isLeafEleEndOffset(ele: LeafElement, offset: number): boolean {
|
1006
1036
|
if (ele instanceof TextGroupElement) {
|
1007
1037
|
return ele.textMeasures.length === offset;
|
1008
|
-
}
|
1009
|
-
else {
|
1038
|
+
} else {
|
1010
1039
|
if (ele instanceof PSymbolElement) {
|
1011
1040
|
return true;
|
1012
|
-
}
|
1013
|
-
else {
|
1041
|
+
} else {
|
1014
1042
|
return offset === 1;
|
1015
1043
|
}
|
1016
1044
|
}
|
1017
1045
|
}
|
1046
|
+
|
1018
1047
|
/**
|
1019
1048
|
* 获取点击的文档区域
|
1020
|
-
* @param docRender
|
1021
|
-
* @param pos
|
1022
|
-
* @returns
|
1049
|
+
* @param docRender
|
1050
|
+
* @param pos
|
1051
|
+
* @returns
|
1023
1052
|
*/
|
1024
|
-
getHitRegion(docEvent) {
|
1053
|
+
getHitRegion(docEvent: MouseElementEvent): HitRegion | null {
|
1025
1054
|
const hitDocInfo = this.getHitDocPage(docEvent);
|
1026
1055
|
if (!hitDocInfo) {
|
1027
1056
|
return null;
|
1028
1057
|
}
|
1029
1058
|
const { docRender, hitPagePos } = hitDocInfo;
|
1030
|
-
const headerRender = ElementUtil.findChildRender(docRender, (item) => item instanceof DocumentHeaderRenderObject);
|
1031
|
-
const footerRender = ElementUtil.findChildRender(docRender, (item) => item instanceof DocumentFooterRenderObject);
|
1059
|
+
const headerRender = ElementUtil.findChildRender(docRender, (item) => item instanceof DocumentHeaderRenderObject) as DocumentHeaderRenderObject;
|
1060
|
+
const footerRender = ElementUtil.findChildRender(docRender, (item) => item instanceof DocumentFooterRenderObject) as DocumentFooterRenderObject;
|
1032
1061
|
if (!headerRender) {
|
1033
1062
|
throw new Error('header is null');
|
1034
1063
|
}
|
@@ -1039,16 +1068,15 @@ export class DocumentEvent {
|
|
1039
1068
|
const footerLine = footerRender.rect.y;
|
1040
1069
|
if (hitPagePos.y <= headerLine) {
|
1041
1070
|
return 'header';
|
1042
|
-
}
|
1043
|
-
else if (hitPagePos.y <= footerLine) {
|
1071
|
+
} else if (hitPagePos.y <= footerLine) {
|
1044
1072
|
return 'body';
|
1045
|
-
}
|
1046
|
-
else if (hitPagePos.y > footerLine && hitPagePos.y < docRender.rect.height) {
|
1073
|
+
} else if (hitPagePos.y > footerLine && hitPagePos.y < docRender.rect.height) {
|
1047
1074
|
return 'footer';
|
1048
|
-
}
|
1049
|
-
else {
|
1075
|
+
} else {
|
1050
1076
|
return null;
|
1051
1077
|
}
|
1052
1078
|
}
|
1079
|
+
|
1053
1080
|
}
|
1054
|
-
|
1081
|
+
|
1082
|
+
|