@hailin-zheng/editor-core 1.0.1 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/package.json +1 -1
  2. package/tsconfig.json +1 -1
  3. package/webpack.config.js +0 -1
  4. package/dist/doc-ruler.d.ts +0 -51
  5. package/dist/doc-ruler.js +0 -313
  6. package/dist/doc-ruler.js.map +0 -1
  7. package/dist/framework/common-util.d.ts +0 -63
  8. package/dist/framework/common-util.js +0 -178
  9. package/dist/framework/common-util.js.map +0 -1
  10. package/dist/framework/document-change.d.ts +0 -265
  11. package/dist/framework/document-change.js +0 -1342
  12. package/dist/framework/document-change.js.map +0 -1
  13. package/dist/framework/document-combine.d.ts +0 -24
  14. package/dist/framework/document-combine.js +0 -40
  15. package/dist/framework/document-combine.js.map +0 -1
  16. package/dist/framework/document-comment.d.ts +0 -46
  17. package/dist/framework/document-comment.js +0 -148
  18. package/dist/framework/document-comment.js.map +0 -1
  19. package/dist/framework/document-context.d.ts +0 -149
  20. package/dist/framework/document-context.js +0 -330
  21. package/dist/framework/document-context.js.map +0 -1
  22. package/dist/framework/document-eval-func.d.ts +0 -18
  23. package/dist/framework/document-eval-func.js +0 -48
  24. package/dist/framework/document-eval-func.js.map +0 -1
  25. package/dist/framework/document-event.d.ts +0 -213
  26. package/dist/framework/document-event.js +0 -1054
  27. package/dist/framework/document-event.js.map +0 -1
  28. package/dist/framework/document-history.d.ts +0 -26
  29. package/dist/framework/document-history.js +0 -65
  30. package/dist/framework/document-history.js.map +0 -1
  31. package/dist/framework/document-images-loader.d.ts +0 -16
  32. package/dist/framework/document-images-loader.js +0 -66
  33. package/dist/framework/document-images-loader.js.map +0 -1
  34. package/dist/framework/document-input-cursor.d.ts +0 -78
  35. package/dist/framework/document-input-cursor.js +0 -239
  36. package/dist/framework/document-input-cursor.js.map +0 -1
  37. package/dist/framework/document-paint.d.ts +0 -34
  38. package/dist/framework/document-paint.js +0 -103
  39. package/dist/framework/document-paint.js.map +0 -1
  40. package/dist/framework/document-print-offscreen.d.ts +0 -38
  41. package/dist/framework/document-print-offscreen.js +0 -128
  42. package/dist/framework/document-print-offscreen.js.map +0 -1
  43. package/dist/framework/document-print.d.ts +0 -60
  44. package/dist/framework/document-print.js +0 -203
  45. package/dist/framework/document-print.js.map +0 -1
  46. package/dist/framework/document-segmenter.d.ts +0 -2
  47. package/dist/framework/document-segmenter.js +0 -106
  48. package/dist/framework/document-segmenter.js.map +0 -1
  49. package/dist/framework/document-selection.d.ts +0 -89
  50. package/dist/framework/document-selection.js +0 -358
  51. package/dist/framework/document-selection.js.map +0 -1
  52. package/dist/framework/document-template.d.ts +0 -4
  53. package/dist/framework/document-template.js +0 -20
  54. package/dist/framework/document-template.js.map +0 -1
  55. package/dist/framework/document-textline-mode.d.ts +0 -7
  56. package/dist/framework/document-textline-mode.js +0 -30
  57. package/dist/framework/document-textline-mode.js.map +0 -1
  58. package/dist/framework/element-define.d.ts +0 -319
  59. package/dist/framework/element-define.js +0 -579
  60. package/dist/framework/element-define.js.map +0 -1
  61. package/dist/framework/element-event-define.d.ts +0 -99
  62. package/dist/framework/element-event-define.js +0 -108
  63. package/dist/framework/element-event-define.js.map +0 -1
  64. package/dist/framework/element-measure.d.ts +0 -97
  65. package/dist/framework/element-measure.js +0 -551
  66. package/dist/framework/element-measure.js.map +0 -1
  67. package/dist/framework/element-paint.d.ts +0 -42
  68. package/dist/framework/element-paint.js +0 -170
  69. package/dist/framework/element-paint.js.map +0 -1
  70. package/dist/framework/element-props.d.ts +0 -301
  71. package/dist/framework/element-props.js +0 -809
  72. package/dist/framework/element-props.js.map +0 -1
  73. package/dist/framework/element-reader.d.ts +0 -19
  74. package/dist/framework/element-reader.js +0 -151
  75. package/dist/framework/element-reader.js.map +0 -1
  76. package/dist/framework/element-render-cut.d.ts +0 -55
  77. package/dist/framework/element-render-cut.js +0 -449
  78. package/dist/framework/element-render-cut.js.map +0 -1
  79. package/dist/framework/element-serialize.d.ts +0 -30
  80. package/dist/framework/element-serialize.js +0 -113
  81. package/dist/framework/element-serialize.js.map +0 -1
  82. package/dist/framework/element-util.d.ts +0 -369
  83. package/dist/framework/element-util.js +0 -1463
  84. package/dist/framework/element-util.js.map +0 -1
  85. package/dist/framework/impl/checkbox/checkbox-impl.d.ts +0 -24
  86. package/dist/framework/impl/checkbox/checkbox-impl.js +0 -64
  87. package/dist/framework/impl/checkbox/checkbox-impl.js.map +0 -1
  88. package/dist/framework/impl/comments/comment-content-impl.d.ts +0 -40
  89. package/dist/framework/impl/comments/comment-content-impl.js +0 -105
  90. package/dist/framework/impl/comments/comment-content-impl.js.map +0 -1
  91. package/dist/framework/impl/comments/comment-element-impl.d.ts +0 -21
  92. package/dist/framework/impl/comments/comment-element-impl.js +0 -62
  93. package/dist/framework/impl/comments/comment-element-impl.js.map +0 -1
  94. package/dist/framework/impl/comments/comments-container-impl.d.ts +0 -22
  95. package/dist/framework/impl/comments/comments-container-impl.js +0 -62
  96. package/dist/framework/impl/comments/comments-container-impl.js.map +0 -1
  97. package/dist/framework/impl/comments/comments-util.d.ts +0 -12
  98. package/dist/framework/impl/comments/comments-util.js +0 -67
  99. package/dist/framework/impl/comments/comments-util.js.map +0 -1
  100. package/dist/framework/impl/comments/validate-msg-impl.d.ts +0 -21
  101. package/dist/framework/impl/comments/validate-msg-impl.js +0 -83
  102. package/dist/framework/impl/comments/validate-msg-impl.js.map +0 -1
  103. package/dist/framework/impl/data-element/data-decorate-impl.d.ts +0 -30
  104. package/dist/framework/impl/data-element/data-decorate-impl.js +0 -91
  105. package/dist/framework/impl/data-element/data-decorate-impl.js.map +0 -1
  106. package/dist/framework/impl/data-element/data-element-barcode.d.ts +0 -31
  107. package/dist/framework/impl/data-element/data-element-barcode.js +0 -115
  108. package/dist/framework/impl/data-element/data-element-barcode.js.map +0 -1
  109. package/dist/framework/impl/data-element/data-element-base-impl.d.ts +0 -68
  110. package/dist/framework/impl/data-element/data-element-base-impl.js +0 -205
  111. package/dist/framework/impl/data-element/data-element-base-impl.js.map +0 -1
  112. package/dist/framework/impl/data-element/data-element-check-impl.d.ts +0 -35
  113. package/dist/framework/impl/data-element/data-element-check-impl.js +0 -133
  114. package/dist/framework/impl/data-element/data-element-check-impl.js.map +0 -1
  115. package/dist/framework/impl/data-element/data-element-date-impl.d.ts +0 -23
  116. package/dist/framework/impl/data-element/data-element-date-impl.js +0 -111
  117. package/dist/framework/impl/data-element/data-element-date-impl.js.map +0 -1
  118. package/dist/framework/impl/data-element/data-element-group-impl.d.ts +0 -23
  119. package/dist/framework/impl/data-element/data-element-group-impl.js +0 -130
  120. package/dist/framework/impl/data-element/data-element-group-impl.js.map +0 -1
  121. package/dist/framework/impl/data-element/data-element-image-impl.d.ts +0 -30
  122. package/dist/framework/impl/data-element/data-element-image-impl.js +0 -137
  123. package/dist/framework/impl/data-element/data-element-image-impl.js.map +0 -1
  124. package/dist/framework/impl/data-element/data-element-list-impl.d.ts +0 -22
  125. package/dist/framework/impl/data-element/data-element-list-impl.js +0 -131
  126. package/dist/framework/impl/data-element/data-element-list-impl.js.map +0 -1
  127. package/dist/framework/impl/data-element/data-element-text-impl.d.ts +0 -23
  128. package/dist/framework/impl/data-element/data-element-text-impl.js +0 -103
  129. package/dist/framework/impl/data-element/data-element-text-impl.js.map +0 -1
  130. package/dist/framework/impl/decorate/fill-null-space-imple.d.ts +0 -21
  131. package/dist/framework/impl/decorate/fill-null-space-imple.js +0 -43
  132. package/dist/framework/impl/decorate/fill-null-space-imple.js.map +0 -1
  133. package/dist/framework/impl/document/doc-body-impl.d.ts +0 -27
  134. package/dist/framework/impl/document/doc-body-impl.js +0 -79
  135. package/dist/framework/impl/document/doc-body-impl.js.map +0 -1
  136. package/dist/framework/impl/document/doc-body-part-impl.d.ts +0 -30
  137. package/dist/framework/impl/document/doc-body-part-impl.js +0 -94
  138. package/dist/framework/impl/document/doc-body-part-impl.js.map +0 -1
  139. package/dist/framework/impl/document/doc-container-impl.d.ts +0 -16
  140. package/dist/framework/impl/document/doc-container-impl.js +0 -21
  141. package/dist/framework/impl/document/doc-container-impl.js.map +0 -1
  142. package/dist/framework/impl/document/doc-footer-impl.d.ts +0 -26
  143. package/dist/framework/impl/document/doc-footer-impl.js +0 -77
  144. package/dist/framework/impl/document/doc-footer-impl.js.map +0 -1
  145. package/dist/framework/impl/document/doc-header-impl.d.ts +0 -26
  146. package/dist/framework/impl/document/doc-header-impl.js +0 -83
  147. package/dist/framework/impl/document/doc-header-impl.js.map +0 -1
  148. package/dist/framework/impl/document/doc-impl.d.ts +0 -61
  149. package/dist/framework/impl/document/doc-impl.js +0 -209
  150. package/dist/framework/impl/document/doc-impl.js.map +0 -1
  151. package/dist/framework/impl/media-formula/menstrual-history.d.ts +0 -35
  152. package/dist/framework/impl/media-formula/menstrual-history.js +0 -153
  153. package/dist/framework/impl/media-formula/menstrual-history.js.map +0 -1
  154. package/dist/framework/impl/paragraph/p-impl.d.ts +0 -45
  155. package/dist/framework/impl/paragraph/p-impl.js +0 -156
  156. package/dist/framework/impl/paragraph/p-impl.js.map +0 -1
  157. package/dist/framework/impl/picture/image-impl.d.ts +0 -31
  158. package/dist/framework/impl/picture/image-impl.js +0 -124
  159. package/dist/framework/impl/picture/image-impl.js.map +0 -1
  160. package/dist/framework/impl/radio/radio-impl.d.ts +0 -22
  161. package/dist/framework/impl/radio/radio-impl.js +0 -72
  162. package/dist/framework/impl/radio/radio-impl.js.map +0 -1
  163. package/dist/framework/impl/symbol/br-symbol-impl.d.ts +0 -22
  164. package/dist/framework/impl/symbol/br-symbol-impl.js +0 -54
  165. package/dist/framework/impl/symbol/br-symbol-impl.js.map +0 -1
  166. package/dist/framework/impl/symbol/p-symbol-impl.d.ts +0 -19
  167. package/dist/framework/impl/symbol/p-symbol-impl.js +0 -54
  168. package/dist/framework/impl/symbol/p-symbol-impl.js.map +0 -1
  169. package/dist/framework/impl/table/table-cell-impl.d.ts +0 -37
  170. package/dist/framework/impl/table/table-cell-impl.js +0 -145
  171. package/dist/framework/impl/table/table-cell-impl.js.map +0 -1
  172. package/dist/framework/impl/table/table-impl.d.ts +0 -55
  173. package/dist/framework/impl/table/table-impl.js +0 -363
  174. package/dist/framework/impl/table/table-impl.js.map +0 -1
  175. package/dist/framework/impl/table/table-row-impl.d.ts +0 -26
  176. package/dist/framework/impl/table/table-row-impl.js +0 -75
  177. package/dist/framework/impl/table/table-row-impl.js.map +0 -1
  178. package/dist/framework/impl/table/table-split-cell-patch.d.ts +0 -20
  179. package/dist/framework/impl/table/table-split-cell-patch.js +0 -89
  180. package/dist/framework/impl/table/table-split-cell-patch.js.map +0 -1
  181. package/dist/framework/impl/table/table-split-cell.d.ts +0 -90
  182. package/dist/framework/impl/table/table-split-cell.js +0 -464
  183. package/dist/framework/impl/table/table-split-cell.js.map +0 -1
  184. package/dist/framework/impl/table/table-util.d.ts +0 -150
  185. package/dist/framework/impl/table/table-util.js +0 -678
  186. package/dist/framework/impl/table/table-util.js.map +0 -1
  187. package/dist/framework/impl/text/text-impl.d.ts +0 -32
  188. package/dist/framework/impl/text/text-impl.js +0 -149
  189. package/dist/framework/impl/text/text-impl.js.map +0 -1
  190. package/dist/framework/impl/text/track-run-impl.d.ts +0 -27
  191. package/dist/framework/impl/text/track-run-impl.js +0 -112
  192. package/dist/framework/impl/text/track-run-impl.js.map +0 -1
  193. package/dist/framework/notify.d.ts +0 -13
  194. package/dist/framework/notify.js +0 -116
  195. package/dist/framework/notify.js.map +0 -1
  196. package/dist/framework/range-util.d.ts +0 -40
  197. package/dist/framework/range-util.js +0 -312
  198. package/dist/framework/range-util.js.map +0 -1
  199. package/dist/framework/render-context.d.ts +0 -91
  200. package/dist/framework/render-context.js +0 -384
  201. package/dist/framework/render-context.js.map +0 -1
  202. package/dist/framework/render-define.d.ts +0 -109
  203. package/dist/framework/render-define.js +0 -195
  204. package/dist/framework/render-define.js.map +0 -1
  205. package/dist/framework/selection-overlays.d.ts +0 -30
  206. package/dist/framework/selection-overlays.js +0 -124
  207. package/dist/framework/selection-overlays.js.map +0 -1
  208. package/dist/texteditor.d.ts +0 -318
  209. package/dist/texteditor.js +0 -913
  210. package/dist/texteditor.js.map +0 -1
  211. package/dist/util/subject.d.ts +0 -34
  212. package/dist/util/subject.js +0 -88
  213. package/dist/util/subject.js.map +0 -1
  214. package/dist/util/table-bind.d.ts +0 -5
  215. package/dist/util/table-bind.js +0 -6
  216. package/dist/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