openchemlib 8.20.2 → 9.0.0
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/README.md +5 -55
- package/{types.d.ts → dist/openchemlib.d.ts} +66 -240
- package/dist/openchemlib.debug.js +69894 -0
- package/dist/openchemlib.js +24 -0
- package/dist/resources.json +37 -0
- package/package.json +26 -44
- package/core.d.ts +0 -15
- package/core.js +0 -24
- package/dist/openchemlib-core.js +0 -283
- package/dist/openchemlib-full.js +0 -310
- package/dist/openchemlib-full.pretty.js +0 -101963
- package/dist/openchemlib-minimal.js +0 -228
- package/full.d.ts +0 -16
- package/full.js +0 -32
- package/full.pretty.d.ts +0 -1
- package/full.pretty.js +0 -32
- package/lib/canvas_editor/clipboard_handler.js +0 -15
- package/lib/canvas_editor/create_editor.js +0 -152
- package/lib/canvas_editor/cursor_manager_16.js +0 -41
- package/lib/canvas_editor/cursor_manager_24.js +0 -43
- package/lib/canvas_editor/cursors_24px.js +0 -21
- package/lib/canvas_editor/draw_context.js +0 -156
- package/lib/canvas_editor/editor_area.js +0 -31
- package/lib/canvas_editor/editor_dialog.js +0 -250
- package/lib/canvas_editor/editor_image.js +0 -46
- package/lib/canvas_editor/editor_stylesheet.js +0 -21
- package/lib/canvas_editor/events.js +0 -144
- package/lib/canvas_editor/init/canvas_editor.js +0 -137
- package/lib/canvas_editor/init/canvas_editor_element.js +0 -359
- package/lib/canvas_editor/init/index.js +0 -70
- package/lib/canvas_editor/toolbar.js +0 -28
- package/lib/canvas_editor/ui_helper.js +0 -57
- package/lib/canvas_editor/utils.js +0 -55
- package/minimal.d.ts +0 -18
- package/minimal.js +0 -14
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
class EditorDialog {
|
|
4
|
-
/**
|
|
5
|
-
*
|
|
6
|
-
* @param {string} title
|
|
7
|
-
* @param {HTMLElement} rootElement
|
|
8
|
-
*/
|
|
9
|
-
constructor(title, rootElement) {
|
|
10
|
-
this.title = title;
|
|
11
|
-
this.rootElement = rootElement;
|
|
12
|
-
this.elements = [];
|
|
13
|
-
this.dialogElement = null;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
setLayout(hLayout, vLayout) {
|
|
17
|
-
this.hLayout = generateLayout(hLayout);
|
|
18
|
-
this.vLayout = generateLayout(vLayout);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
add(component, x, y, x2, y2) {
|
|
22
|
-
this.elements.push({ component, x, y, x2, y2 });
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
createTextField(width, height) {
|
|
26
|
-
return new TextField(width, height);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
createLabel(text) {
|
|
30
|
-
return new Label(text);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
createComboBox() {
|
|
34
|
-
return new ComboBox();
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
createCheckBox(text) {
|
|
38
|
-
return new CheckBox(text);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
setEventConsumer(consumer) {
|
|
42
|
-
this.consumer = consumer;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
showMessage(message) {
|
|
46
|
-
// eslint-disable-next-line no-alert
|
|
47
|
-
window.alert(message);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
showDialog() {
|
|
51
|
-
const dialog = document.createElement('dialog');
|
|
52
|
-
const rootElementBounds = this.rootElement.getBoundingClientRect();
|
|
53
|
-
// Center the dialog horizontally relative to the editor's canvas.
|
|
54
|
-
Object.assign(dialog.style, {
|
|
55
|
-
position: 'absolute',
|
|
56
|
-
marginBlock: 0,
|
|
57
|
-
left: `${rootElementBounds.left}px`,
|
|
58
|
-
right: `${document.body.parentElement.clientWidth - rootElementBounds.right}px`,
|
|
59
|
-
top: `${this.rootElement.offsetTop + 30}px`,
|
|
60
|
-
});
|
|
61
|
-
this.dialogElement = dialog;
|
|
62
|
-
this.rootElement.getRootNode().append(dialog);
|
|
63
|
-
const grid = document.createElement('div');
|
|
64
|
-
grid.style.display = 'grid';
|
|
65
|
-
grid.style.gridTemplateColumns = this.hLayout;
|
|
66
|
-
grid.style.gridTemplateRows = this.vLayout;
|
|
67
|
-
dialog.append(grid);
|
|
68
|
-
for (const { component, x, y, x2, y2 } of this.elements) {
|
|
69
|
-
const div = document.createElement('div');
|
|
70
|
-
if (x2 === undefined) {
|
|
71
|
-
div.style.gridColumn = `${x + 1} / ${x + 2}`;
|
|
72
|
-
div.style.gridRow = `${y + 1} / ${y + 2}`;
|
|
73
|
-
} else {
|
|
74
|
-
div.style.gridColumn = `${x + 1} / ${x2 + 2}`;
|
|
75
|
-
div.style.gridRow = `${y + 1} / ${y2 + 2}`;
|
|
76
|
-
}
|
|
77
|
-
div.append(component.getElement());
|
|
78
|
-
grid.append(div);
|
|
79
|
-
}
|
|
80
|
-
const buttons = document.createElement('div');
|
|
81
|
-
buttons.style.display = 'flex';
|
|
82
|
-
buttons.style.flexDirection = 'row-reverse';
|
|
83
|
-
buttons.style.gap = '15px';
|
|
84
|
-
const okButton = document.createElement('button');
|
|
85
|
-
okButton.textContent = 'OK';
|
|
86
|
-
okButton.addEventListener('click', () => {
|
|
87
|
-
this.consumer.fireOk();
|
|
88
|
-
});
|
|
89
|
-
buttons.append(okButton);
|
|
90
|
-
const cancelButton = document.createElement('button');
|
|
91
|
-
cancelButton.textContent = 'Cancel';
|
|
92
|
-
cancelButton.addEventListener('click', () => {
|
|
93
|
-
this.consumer.fireCancel();
|
|
94
|
-
});
|
|
95
|
-
buttons.append(cancelButton);
|
|
96
|
-
dialog.append(buttons);
|
|
97
|
-
dialog.showModal();
|
|
98
|
-
dialog.addEventListener('cancel', () => {
|
|
99
|
-
this.consumer.fireCancel();
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
disposeDialog() {
|
|
104
|
-
if (this.dialogElement !== null) {
|
|
105
|
-
this.dialogElement.remove();
|
|
106
|
-
this.dialogElement = null;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
class Component {
|
|
112
|
-
setEventHandler(eventHandler) {
|
|
113
|
-
this.eventHandler = eventHandler;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
fireEvent(what, value) {
|
|
117
|
-
this.eventHandler(what, value);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
class Label extends Component {
|
|
122
|
-
constructor(text) {
|
|
123
|
-
super();
|
|
124
|
-
this.element = document.createElement('label');
|
|
125
|
-
this.setText(text);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
setText(text) {
|
|
129
|
-
this.element.textContent = text;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
getElement() {
|
|
133
|
-
return this.element;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
class TextField extends Component {
|
|
138
|
-
constructor() {
|
|
139
|
-
super();
|
|
140
|
-
this.element = document.createElement('input');
|
|
141
|
-
this.element.type = 'text';
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
setText(text) {
|
|
145
|
-
this.element.value = text;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
getText() {
|
|
149
|
-
return this.element.value;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
getElement() {
|
|
153
|
-
return this.element;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
class ComboBox extends Component {
|
|
158
|
-
constructor() {
|
|
159
|
-
super();
|
|
160
|
-
this.element = document.createElement('select');
|
|
161
|
-
this.element.addEventListener('change', () => {
|
|
162
|
-
this.fireEvent(2, this.element.selectedIndex);
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
setEnabled(enabled) {
|
|
167
|
-
this.element.disabled = !enabled;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
addItem(item) {
|
|
171
|
-
const option = document.createElement('option');
|
|
172
|
-
option.textContent = item;
|
|
173
|
-
this.element.append(option);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
getSelectedIndex() {
|
|
177
|
-
return this.element.selectedIndex;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
setSelectedIndex(index) {
|
|
181
|
-
this.element.selectedIndex = index;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
setSelectedItem(item) {
|
|
185
|
-
const options = this.element.options;
|
|
186
|
-
for (let i = 0; i < options.length; i++) {
|
|
187
|
-
if (options[i].textContent === item) {
|
|
188
|
-
this.element.selectedIndex = i;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
getSelectedItem() {
|
|
194
|
-
return this.element.options[this.element.selectedIndex].textContent;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
removeAllItems() {
|
|
198
|
-
this.element.innerHTML = '';
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
getElement() {
|
|
202
|
-
return this.element;
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
class CheckBox extends Component {
|
|
207
|
-
constructor(text) {
|
|
208
|
-
super();
|
|
209
|
-
const label = document.createElement('label');
|
|
210
|
-
const input = document.createElement('input');
|
|
211
|
-
input.type = 'checkbox';
|
|
212
|
-
input.addEventListener('change', () => {
|
|
213
|
-
this.fireEvent(3, input.checked ? 1 : 0);
|
|
214
|
-
});
|
|
215
|
-
label.append(input);
|
|
216
|
-
label.append(text);
|
|
217
|
-
this.element = label;
|
|
218
|
-
this.checkBox = input;
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
setEnabled(enabled) {
|
|
222
|
-
this.checkBox.disabled = !enabled;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
isSelected() {
|
|
226
|
-
return this.checkBox.checked;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
setSelected(selected) {
|
|
230
|
-
this.checkBox.checked = selected;
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
getElement() {
|
|
234
|
-
return this.element;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
function generateLayout(layout) {
|
|
239
|
-
return layout
|
|
240
|
-
.map((dim) => {
|
|
241
|
-
if (dim > 0) {
|
|
242
|
-
return `${dim}px`;
|
|
243
|
-
} else {
|
|
244
|
-
return 'auto';
|
|
245
|
-
}
|
|
246
|
-
})
|
|
247
|
-
.join(' ');
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
module.exports = EditorDialog;
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
class EditorImage {
|
|
4
|
-
/**
|
|
5
|
-
*
|
|
6
|
-
* @param {ImageData} imageData
|
|
7
|
-
*/
|
|
8
|
-
constructor(imageData) {
|
|
9
|
-
this.imageData = imageData;
|
|
10
|
-
this.dataView = new DataView(imageData.data.buffer);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
getWidth() {
|
|
14
|
-
return this.imageData.width;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
getHeight() {
|
|
18
|
-
return this.imageData.height;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
getRGB(x, y) {
|
|
22
|
-
const color = this.dataView.getInt32(
|
|
23
|
-
(y * this.imageData.width + x) * 4,
|
|
24
|
-
false,
|
|
25
|
-
);
|
|
26
|
-
const alpha = color & 0xff;
|
|
27
|
-
return (alpha << 24) | (color >>> 8);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
setRGB(x, y, argb) {
|
|
31
|
-
const alpha = (argb >>> 24) & 0xff;
|
|
32
|
-
const rgb = (argb << 8) | alpha;
|
|
33
|
-
this.dataView.setInt32((y * this.imageData.width + x) * 4, rgb, false);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
toDataURL() {
|
|
37
|
-
const canvas = document.createElement('canvas');
|
|
38
|
-
const ctx = canvas.getContext('2d');
|
|
39
|
-
canvas.width = this.imageData.width;
|
|
40
|
-
canvas.height = this.imageData.height;
|
|
41
|
-
ctx.putImageData(this.imageData, 0, 0);
|
|
42
|
-
return canvas.toDataURL('image/png');
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
module.exports = EditorImage;
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const styles = `
|
|
4
|
-
/* We can customize editor styles here. */
|
|
5
|
-
`;
|
|
6
|
-
|
|
7
|
-
let stylesheet;
|
|
8
|
-
|
|
9
|
-
function getEditorStylesheet() {
|
|
10
|
-
if (stylesheet) {
|
|
11
|
-
return stylesheet;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const sheet = new CSSStyleSheet();
|
|
15
|
-
sheet.replaceSync(styles);
|
|
16
|
-
|
|
17
|
-
stylesheet = sheet;
|
|
18
|
-
return sheet;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
module.exports = getEditorStylesheet;
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
*
|
|
5
|
-
* @param {HTMLCanvasElement} canvasElement
|
|
6
|
-
* @param drawArea
|
|
7
|
-
* @param JavaEditorArea
|
|
8
|
-
*/
|
|
9
|
-
function addPointerListeners(canvasElement, drawArea, JavaEditorArea) {
|
|
10
|
-
let pointerDownId = -1;
|
|
11
|
-
|
|
12
|
-
function fireMouseEvent(what, ev, clickCount = 0) {
|
|
13
|
-
if (ev.button > 0) {
|
|
14
|
-
// TODO: remove this to implement popup menu.
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
drawArea.fireMouseEvent(
|
|
18
|
-
what,
|
|
19
|
-
ev.button + 1,
|
|
20
|
-
clickCount,
|
|
21
|
-
Math.round(ev.offsetX),
|
|
22
|
-
Math.round(ev.offsetY),
|
|
23
|
-
ev.shiftKey,
|
|
24
|
-
ev.ctrlKey,
|
|
25
|
-
ev.altKey,
|
|
26
|
-
ev.button === 2,
|
|
27
|
-
);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
canvasElement.addEventListener('pointerdown', (ev) => {
|
|
31
|
-
if (pointerDownId === -1) {
|
|
32
|
-
pointerDownId = ev.pointerId;
|
|
33
|
-
fireMouseEvent(JavaEditorArea.MOUSE_EVENT_PRESSED, ev);
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
function handlePointerUp(ev) {
|
|
38
|
-
if (pointerDownId === ev.pointerId) {
|
|
39
|
-
pointerDownId = -1;
|
|
40
|
-
fireMouseEvent(JavaEditorArea.MOUSE_EVENT_RELEASED, ev);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
// Listen on document to capture mouse release outside the canvas.
|
|
44
|
-
document.addEventListener('pointerup', handlePointerUp);
|
|
45
|
-
|
|
46
|
-
canvasElement.addEventListener('click', (ev) => {
|
|
47
|
-
fireMouseEvent(JavaEditorArea.MOUSE_EVENT_CLICKED, ev, ev.detail);
|
|
48
|
-
});
|
|
49
|
-
canvasElement.addEventListener('pointerenter', (ev) => {
|
|
50
|
-
// event.detail on pointerenter doesn't include the click count
|
|
51
|
-
fireMouseEvent(JavaEditorArea.MOUSE_EVENT_ENTERED, ev);
|
|
52
|
-
});
|
|
53
|
-
canvasElement.addEventListener('pointerleave', (ev) => {
|
|
54
|
-
// event.detail on pointerenter doesn't include the click count
|
|
55
|
-
fireMouseEvent(JavaEditorArea.MOUSE_EVENT_EXITED, ev);
|
|
56
|
-
});
|
|
57
|
-
canvasElement.addEventListener('pointermove', (ev) => {
|
|
58
|
-
if (pointerDownId !== -1) {
|
|
59
|
-
if (pointerDownId === ev.pointerId) {
|
|
60
|
-
fireMouseEvent(JavaEditorArea.MOUSE_EVENT_DRAGGED, ev);
|
|
61
|
-
}
|
|
62
|
-
} else {
|
|
63
|
-
fireMouseEvent(JavaEditorArea.MOUSE_EVENT_MOVED, ev);
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
return () => {
|
|
68
|
-
document.removeEventListener('pointerup', handlePointerUp);
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
function addKeyboardListeners(canvasElement, editorArea, JavaEditorArea) {
|
|
73
|
-
const isMac =
|
|
74
|
-
typeof navigator !== 'undefined' && navigator.platform === 'MacIntel';
|
|
75
|
-
const isMenuKey = (ev) => (isMac && ev.metaKey) || (!isMac && ev.ctrlKey);
|
|
76
|
-
|
|
77
|
-
function fireKeyEvent(what, ev) {
|
|
78
|
-
const key = getKeyFromEvent(ev, JavaEditorArea);
|
|
79
|
-
if (key === null) return;
|
|
80
|
-
|
|
81
|
-
editorArea.fireKeyEvent(
|
|
82
|
-
what,
|
|
83
|
-
key,
|
|
84
|
-
ev.altKey,
|
|
85
|
-
ev.ctrlKey,
|
|
86
|
-
ev.shiftKey,
|
|
87
|
-
isMenuKey(ev),
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
canvasElement.addEventListener('keydown', (ev) => {
|
|
92
|
-
// copy-paste is handled by the clipboard event
|
|
93
|
-
// java ctrl-c / ctrl-v events can't work and could throw error
|
|
94
|
-
if (isMenuKey(ev) && ev.key === 'c') return;
|
|
95
|
-
if (isMenuKey(ev) && ev.key === 'v') return;
|
|
96
|
-
|
|
97
|
-
fireKeyEvent(JavaEditorArea.KEY_EVENT_PRESSED, ev);
|
|
98
|
-
});
|
|
99
|
-
canvasElement.addEventListener('keyup', (ev) => {
|
|
100
|
-
fireKeyEvent(JavaEditorArea.KEY_EVENT_RELEASED, ev);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
return () => {
|
|
104
|
-
// No cleanup needed.
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
*
|
|
110
|
-
* @param {KeyboardEvent} ev
|
|
111
|
-
* @param JavaEditorArea
|
|
112
|
-
*/
|
|
113
|
-
function getKeyFromEvent(ev, JavaEditorArea) {
|
|
114
|
-
switch (ev.key) {
|
|
115
|
-
case 'Control':
|
|
116
|
-
return JavaEditorArea.KEY_CTRL;
|
|
117
|
-
case 'Alt':
|
|
118
|
-
return JavaEditorArea.KEY_ALT;
|
|
119
|
-
case 'Shift':
|
|
120
|
-
return JavaEditorArea.KEY_SHIFT;
|
|
121
|
-
case 'Delete':
|
|
122
|
-
case 'Backspace':
|
|
123
|
-
return JavaEditorArea.KEY_DELETE;
|
|
124
|
-
// Backspace is currently unused by the Java code, so we remap it.
|
|
125
|
-
// return JavaEditorArea.KEY_BACKSPACE;
|
|
126
|
-
case 'F1':
|
|
127
|
-
return JavaEditorArea.KEY_HELP;
|
|
128
|
-
case 'Escape':
|
|
129
|
-
return JavaEditorArea.KEY_ESCAPE;
|
|
130
|
-
case 'Enter':
|
|
131
|
-
return JavaEditorArea.KEY_ENTER;
|
|
132
|
-
default:
|
|
133
|
-
if (ev.key.length === 1) {
|
|
134
|
-
return ev.key.codePointAt(0);
|
|
135
|
-
} else {
|
|
136
|
-
return null;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
module.exports = {
|
|
142
|
-
addPointerListeners,
|
|
143
|
-
addKeyboardListeners,
|
|
144
|
-
};
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const createEditor = require('../create_editor');
|
|
4
|
-
|
|
5
|
-
function initCanvasEditor(
|
|
6
|
-
JavaEditorArea,
|
|
7
|
-
JavaEditorToolbar,
|
|
8
|
-
JavaUIHelper,
|
|
9
|
-
Molecule,
|
|
10
|
-
Reaction,
|
|
11
|
-
) {
|
|
12
|
-
class CanvasEditor {
|
|
13
|
-
#editorArea;
|
|
14
|
-
// Can be useful for debugging.
|
|
15
|
-
/* eslint-disable no-unused-private-class-members */
|
|
16
|
-
#toolbar;
|
|
17
|
-
#uiHelper;
|
|
18
|
-
/* eslint-enable no-unused-private-class-members */
|
|
19
|
-
#onChange;
|
|
20
|
-
#changeEventMap;
|
|
21
|
-
#destroy;
|
|
22
|
-
|
|
23
|
-
constructor(parentElement, options = {}) {
|
|
24
|
-
const { editorArea, toolbar, uiHelper, destroy } = createEditor(
|
|
25
|
-
parentElement,
|
|
26
|
-
options,
|
|
27
|
-
(event) => this.#handleChange(event),
|
|
28
|
-
JavaEditorArea,
|
|
29
|
-
JavaEditorToolbar,
|
|
30
|
-
JavaUIHelper,
|
|
31
|
-
Molecule,
|
|
32
|
-
Reaction,
|
|
33
|
-
);
|
|
34
|
-
this.#editorArea = editorArea;
|
|
35
|
-
this.#toolbar = toolbar;
|
|
36
|
-
this.#uiHelper = uiHelper;
|
|
37
|
-
this.#onChange = null;
|
|
38
|
-
this.#changeEventMap = {
|
|
39
|
-
[JavaEditorArea.EDITOR_EVENT_MOLECULE_CHANGED]: 'molecule',
|
|
40
|
-
[JavaEditorArea.EDITOR_EVENT_SELECTION_CHANGED]: 'selection',
|
|
41
|
-
[JavaEditorArea.EDITOR_EVENT_HIGHLIGHT_ATOM_CHANGED]: 'highlight-atom',
|
|
42
|
-
[JavaEditorArea.EDITOR_EVENT_HIGHLIGHT_BOND_CHANGED]: 'highlight-bond',
|
|
43
|
-
};
|
|
44
|
-
this.#destroy = destroy;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
getMode() {
|
|
48
|
-
this.#checkNotDestroyed();
|
|
49
|
-
|
|
50
|
-
const mode = this.#editorArea.getMode();
|
|
51
|
-
const isReaction = mode & (JavaEditorArea.MODE_REACTION !== 0);
|
|
52
|
-
return isReaction ? 'reaction' : 'molecule';
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
setMolecule(molecule) {
|
|
56
|
-
this.#checkNotDestroyed();
|
|
57
|
-
|
|
58
|
-
this.#editorArea.setMolecule(molecule);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
getMolecule() {
|
|
62
|
-
this.#checkNotDestroyed();
|
|
63
|
-
|
|
64
|
-
return this.#editorArea.getMolecule();
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
setReaction(reaction) {
|
|
68
|
-
this.#checkNotDestroyed();
|
|
69
|
-
|
|
70
|
-
this.#editorArea.setReaction(reaction);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
getReaction() {
|
|
74
|
-
this.#checkNotDestroyed();
|
|
75
|
-
|
|
76
|
-
return this.#editorArea.getReaction();
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
setOnChangeListener(onChange) {
|
|
80
|
-
this.#checkNotDestroyed();
|
|
81
|
-
|
|
82
|
-
this.#onChange = onChange;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
removeOnChangeListener() {
|
|
86
|
-
this.#checkNotDestroyed();
|
|
87
|
-
|
|
88
|
-
this.#onChange = null;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
clearAll() {
|
|
92
|
-
this.#checkNotDestroyed();
|
|
93
|
-
|
|
94
|
-
this.#editorArea.clearAll();
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
destroy() {
|
|
98
|
-
this.#checkNotDestroyed();
|
|
99
|
-
|
|
100
|
-
this.#destroy();
|
|
101
|
-
this.#editorArea = null;
|
|
102
|
-
this.#toolbar = null;
|
|
103
|
-
this.#uiHelper = null;
|
|
104
|
-
this.#onChange = null;
|
|
105
|
-
this.#destroy = null;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
moleculeChanged() {
|
|
109
|
-
this.#checkNotDestroyed();
|
|
110
|
-
|
|
111
|
-
this.#editorArea.moleculeChanged();
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
#checkNotDestroyed() {
|
|
115
|
-
if (!this.#editorArea) {
|
|
116
|
-
throw new Error('CanvasEditor has been destroyed');
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* @param {{ what: number; isUserEvent: boolean; }} event
|
|
122
|
-
*/
|
|
123
|
-
#handleChange(event) {
|
|
124
|
-
if (!this.#onChange) return;
|
|
125
|
-
|
|
126
|
-
const { what, isUserEvent } = event;
|
|
127
|
-
this.#onChange({
|
|
128
|
-
type: this.#changeEventMap[what],
|
|
129
|
-
isUserEvent,
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
return CanvasEditor;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
module.exports = initCanvasEditor;
|