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