propane 2.9.3-java → 3.0.0.pre-java

Sign up to get free protection for your applications and to get access to all the features.
@@ -22,1048 +22,129 @@
22
22
 
23
23
  package processing.javafx;
24
24
 
25
- import com.sun.glass.ui.Screen;
25
+ import processing.core.PApplet;
26
+ import processing.core.PImage;
27
+ import processing.core.PSurface;
26
28
 
27
- import java.awt.GraphicsDevice;
28
- import java.awt.GraphicsEnvironment;
29
- import java.awt.Rectangle;
30
- import java.net.URL;
31
- import java.util.ArrayList;
32
- import java.util.HashMap;
33
- import java.util.List;
34
- import java.util.Map;
35
- import java.util.concurrent.SynchronousQueue;
36
29
 
37
- import javafx.animation.Animation;
38
- import javafx.animation.KeyFrame;
39
- import javafx.animation.Timeline;
40
- import javafx.application.Application;
41
- import javafx.application.Platform;
42
- import javafx.beans.value.ChangeListener;
43
- import javafx.beans.value.ObservableValue;
44
- import javafx.event.ActionEvent;
45
- import javafx.event.EventHandler;
46
- import javafx.event.EventType;
47
- import javafx.scene.Cursor;
48
- import javafx.scene.ImageCursor;
49
- import javafx.scene.Scene;
50
- import javafx.scene.SceneAntialiasing;
51
- import javafx.scene.canvas.Canvas;
52
- import javafx.scene.image.Image;
53
- import javafx.scene.image.PixelFormat;
54
- import javafx.scene.image.WritableImage;
55
- import javafx.scene.input.KeyCode;
56
- import javafx.scene.input.KeyEvent;
57
- import javafx.scene.input.MouseEvent;
58
- import javafx.scene.input.ScrollEvent;
59
- import javafx.scene.layout.StackPane;
60
- import javafx.stage.Stage;
61
- import javafx.stage.StageStyle;
62
- import javafx.stage.WindowEvent;
63
- import javafx.util.Duration;
64
- import processing.core.*;
65
30
 
66
31
 
67
32
  public class PSurfaceFX implements PSurface {
68
- PApplet sketch;
69
-
70
- PGraphicsFX2D fx;
71
- Stage stage;
72
- Canvas canvas;
73
-
74
- final Animation animation;
75
- float frameRate = 60;
76
-
77
- private SynchronousQueue<Throwable> drawExceptionQueue = new SynchronousQueue<>();
78
-
79
- public PSurfaceFX(PGraphicsFX2D graphics) {
80
- fx = graphics;
81
- canvas = new ResizableCanvas();
82
-
83
- // set up main drawing loop
84
- KeyFrame keyFrame = new KeyFrame(Duration.millis(1000),
85
- new EventHandler<ActionEvent>() {
86
- public void handle(ActionEvent event) {
87
- long startNanoTime = System.nanoTime();
88
- try {
89
- sketch.handleDraw();
90
- } catch (Throwable e) {
91
- // Let exception handler thread crash with our exception
92
- drawExceptionQueue.offer(e);
93
- // Stop animating right now so nothing runs afterwards
94
- // and crash frame can be for example traced by println()
95
- animation.stop();
96
- return;
97
- }
98
- long drawNanos = System.nanoTime() - startNanoTime;
99
-
100
- if (sketch.exitCalled()) {
101
- // using Platform.runLater() didn't work
102
- // Platform.runLater(new Runnable() {
103
- // public void run() {
104
- // instead of System.exit(), safely shut down JavaFX this way
105
- Platform.exit();
106
- // }
107
- // });
108
- }
109
- if (sketch.frameCount > 5) {
110
- animation.setRate(-PApplet.min(1e9f / drawNanos, frameRate));
111
- }
112
- }
113
- });
114
- animation = new Timeline(keyFrame);
115
- animation.setCycleCount(Animation.INDEFINITE);
116
-
117
- // key frame has duration of 1 second, so the rate of the animation
118
- // should be set to frames per second
119
-
120
- // setting rate to negative so that event fires at the start of
121
- // the key frame and first frame is drawn immediately
122
- animation.setRate(-frameRate);
123
- }
124
-
125
-
126
- public Object getNative() {
127
- return canvas;
128
- }
129
-
130
-
131
- class ResizableCanvas extends Canvas {
132
-
133
- public ResizableCanvas() {
134
- widthProperty().addListener(new ChangeListener<Number>() {
135
- @Override
136
- public void changed(ObservableValue<? extends Number> value,
137
- Number oldWidth, Number newWidth) {
138
- // sketch.width = newWidth.intValue();
139
- sketch.setSize(newWidth.intValue(), sketch.height);
140
- // draw();
141
- fx.setSize(sketch.width, sketch.height);
142
- }
143
- });
144
- heightProperty().addListener(new ChangeListener<Number>() {
145
- @Override
146
- public void changed(ObservableValue<? extends Number> value,
147
- Number oldHeight, Number newHeight) {
148
- // sketch.height = newHeight.intValue();
149
- sketch.setSize(sketch.width, newHeight.intValue());
150
- // draw();
151
- fx.setSize(sketch.width, sketch.height);
152
- }
153
- });
154
-
155
- //addEventHandler(eventType, eventHandler);
156
-
157
- EventHandler<MouseEvent> mouseHandler = new EventHandler<MouseEvent>() {
158
- public void handle(MouseEvent e) {
159
- fxMouseEvent(e);
160
- }
161
- };
162
-
163
- setOnMousePressed(mouseHandler);
164
- setOnMouseReleased(mouseHandler);
165
- setOnMouseClicked(mouseHandler);
166
- setOnMouseEntered(mouseHandler);
167
- setOnMouseExited(mouseHandler);
168
-
169
- setOnMouseDragged(mouseHandler);
170
- setOnMouseMoved(mouseHandler);
171
-
172
- setOnScroll(new EventHandler<ScrollEvent>() {
173
- public void handle(ScrollEvent e) {
174
- fxScrollEvent(e);
175
- }
176
- });
177
-
178
- EventHandler<KeyEvent> keyHandler = new EventHandler<KeyEvent>() {
179
- public void handle(KeyEvent e) {
180
- fxKeyEvent(e);
181
- }
182
- };
183
-
184
- setOnKeyPressed(keyHandler);
185
- setOnKeyReleased(keyHandler);
186
- setOnKeyTyped(keyHandler);
187
-
188
- setFocusTraversable(false); // prevent tab from de-focusing
189
-
190
- focusedProperty().addListener(new ChangeListener<Boolean>() {
191
- public void changed(ObservableValue<? extends Boolean> value,
192
- Boolean oldValue, Boolean newValue) {
193
- if (newValue.booleanValue()) {
194
- sketch.focused = true;
195
- sketch.focusGained();
196
- } else {
197
- sketch.focused = false;
198
- sketch.focusLost();
199
- }
200
- }
201
- });
202
- }
203
-
204
- public Stage getStage() {
205
- return stage;
206
- }
33
+ final String message = "FX2D renderer not supported in this version of propane";
207
34
 
208
35
  @Override
209
- public boolean isResizable() {
210
- return true;
36
+ public void initOffscreen(PApplet sketch) {
37
+ throw new UnsupportedOperationException(message);
211
38
  }
212
39
 
213
40
  @Override
214
- public double prefWidth(double height) {
215
- return getWidth();
41
+ public void initFrame(PApplet sketch) {
42
+ throw new UnsupportedOperationException(message);
216
43
  }
217
44
 
218
45
  @Override
219
- public double prefHeight(double width) {
220
- return getHeight();
46
+ public Object getNative() {
47
+ throw new UnsupportedOperationException(message);
221
48
  }
222
- }
223
-
224
-
225
- public void initOffscreen(PApplet sketch) {
226
- }
227
-
228
-
229
- // public Component initComponent(PApplet sketch) {
230
- // return null;
231
- // }
232
-
233
-
234
- static public class PApplicationFX extends Application {
235
- static public PSurfaceFX surface;
236
- // static String title; // title set at launch
237
- // static boolean resizable; // set at launch
238
-
239
- public PApplicationFX() { }
240
49
 
241
50
  @Override
242
- public void start(final Stage stage) {
243
- // if (title != null) {
244
- // stage.setTitle(title);
245
- // }
246
-
247
- PApplet sketch = surface.sketch;
248
-
249
- float renderScale = Screen.getMainScreen().getRenderScale();
250
- if (PApplet.platform == PConstants.MACOSX) {
251
- for (Screen s : Screen.getScreens()) {
252
- renderScale = Math.max(renderScale, s.getRenderScale());
253
- }
254
- }
255
- float uiScale = Screen.getMainScreen().getUIScale();
256
- if (sketch.pixelDensity == 2 && renderScale < 2) {
257
- sketch.pixelDensity = 1;
258
- sketch.g.pixelDensity = 1;
259
- System.err.println("pixelDensity(2) is not available for this display");
260
- }
261
-
262
- // Use AWT display code, because FX orders screens in different way
263
- GraphicsDevice displayDevice = null;
264
-
265
- GraphicsEnvironment environment =
266
- GraphicsEnvironment.getLocalGraphicsEnvironment();
267
-
268
- int displayNum = sketch.sketchDisplay();
269
- if (displayNum > 0) { // if -1, use the default device
270
- GraphicsDevice[] devices = environment.getScreenDevices();
271
- if (displayNum <= devices.length) {
272
- displayDevice = devices[displayNum - 1];
273
- } else {
274
- System.err.format("Display %d does not exist, " +
275
- "using the default display instead.%n", displayNum);
276
- for (int i = 0; i < devices.length; i++) {
277
- System.err.format("Display %d is %s%n", (i+1), devices[i]);
278
- }
279
- }
280
- }
281
- if (displayDevice == null) {
282
- displayDevice = environment.getDefaultScreenDevice();
283
- }
284
-
285
- boolean fullScreen = sketch.sketchFullScreen();
286
- boolean spanDisplays = sketch.sketchDisplay() == PConstants.SPAN;
287
-
288
- Rectangle primaryScreenRect = displayDevice.getDefaultConfiguration().getBounds();
289
- Rectangle screenRect = primaryScreenRect;
290
- if (fullScreen || spanDisplays) {
291
- double minX = screenRect.getMinX();
292
- double maxX = screenRect.getMaxX();
293
- double minY = screenRect.getMinY();
294
- double maxY = screenRect.getMaxY();
295
- if (spanDisplays) {
296
- for (GraphicsDevice s : environment.getScreenDevices()) {
297
- Rectangle bounds = s.getDefaultConfiguration().getBounds();
298
- minX = Math.min(minX, bounds.getMinX());
299
- maxX = Math.max(maxX, bounds.getMaxX());
300
- minY = Math.min(minY, bounds.getMinY());
301
- maxY = Math.max(maxY, bounds.getMaxY());
302
- }
303
- }
304
- screenRect = new Rectangle((int) minX, (int) minY,
305
- (int) (maxX - minX), (int) (maxY - minY));
306
- }
307
-
308
- // Set the displayWidth/Height variables inside PApplet, so that they're
309
- // usable and can even be returned by the sketchWidth()/Height() methods.
310
- sketch.displayWidth = (int) screenRect.getWidth();
311
- sketch.displayHeight = (int) screenRect.getHeight();
312
-
313
- int sketchWidth = sketch.sketchWidth();
314
- int sketchHeight = sketch.sketchHeight();
315
-
316
- if (fullScreen || spanDisplays) {
317
- sketchWidth = (int) (screenRect.getWidth() / uiScale);
318
- sketchHeight = (int) (screenRect.getHeight() / uiScale);
319
-
320
- stage.initStyle(StageStyle.UNDECORATED);
321
- stage.setX(screenRect.getMinX() / uiScale);
322
- stage.setY(screenRect.getMinY() / uiScale);
323
- stage.setWidth(screenRect.getWidth() / uiScale);
324
- stage.setHeight(screenRect.getHeight() / uiScale);
325
- }
326
-
327
- Canvas canvas = surface.canvas;
328
- surface.fx.context = canvas.getGraphicsContext2D();
329
- StackPane stackPane = new StackPane();
330
- stackPane.getChildren().add(canvas);
331
- canvas.widthProperty().bind(stackPane.widthProperty());
332
- canvas.heightProperty().bind(stackPane.heightProperty());
333
-
334
- int width = sketchWidth;
335
- int height = sketchHeight;
336
- int smooth = sketch.sketchSmooth();
337
-
338
- // Workaround for https://bugs.openjdk.java.net/browse/JDK-8136495
339
- // https://github.com/processing/processing/issues/3823
340
- if ((PApplet.platform == PConstants.MACOSX ||
341
- PApplet.platform == PConstants.LINUX) &&
342
- PApplet.javaVersionName.compareTo("1.8.0_60") >= 0 &&
343
- PApplet.javaVersionName.compareTo("1.8.0_72") < 0) {
344
- System.err.println("smooth() disabled for JavaFX with this Java version due to Oracle bug");
345
- System.err.println("https://github.com/processing/processing/issues/3795");
346
- smooth = 0;
347
- }
348
-
349
- SceneAntialiasing sceneAntialiasing = (smooth == 0) ?
350
- SceneAntialiasing.DISABLED : SceneAntialiasing.BALANCED;
351
-
352
- stage.setScene(new Scene(stackPane, width, height, false, sceneAntialiasing));
353
-
354
- // initFrame in different thread is waiting for
355
- // the stage, assign it only when it is all set up
356
- surface.stage = stage;
51
+ public void setTitle(String title) {
52
+ throw new UnsupportedOperationException(message);
357
53
  }
358
54
 
359
55
  @Override
360
- public void stop() throws Exception {
361
- surface.sketch.dispose();
56
+ public void setVisible(boolean visible) {
57
+ throw new UnsupportedOperationException(message);
362
58
  }
363
- }
364
-
365
59
 
366
- //public Frame initFrame(PApplet sketch, java.awt.Color backgroundColor,
367
- public void initFrame(PApplet sketch) {/*, int backgroundColor,
368
- int deviceIndex, boolean fullScreen,
369
- boolean spanDisplays) {*/
370
- this.sketch = sketch;
371
- PApplicationFX.surface = this;
372
- //Frame frame = new DummyFrame();
373
- new Thread(new Runnable() {
374
- public void run() {
375
- Application.launch(PApplicationFX.class);
376
- }
377
- }).start();
378
-
379
- // wait for stage to be initialized on its own thread before continuing
380
- while (stage == null) {
381
- try {
382
- //System.out.println("waiting for launch");
383
- Thread.sleep(5);
384
- } catch (InterruptedException e) { }
60
+ @Override
61
+ public void setResizable(boolean resizable) {
62
+ throw new UnsupportedOperationException(message);
385
63
  }
386
64
 
387
- startExceptionHandlerThread();
388
-
389
- setProcessingIcon(stage);
390
- }
391
-
392
-
393
- private void startExceptionHandlerThread() {
394
- Thread exceptionHandlerThread = new Thread(() -> {
395
- Throwable drawException;
396
- try {
397
- drawException = drawExceptionQueue.take();
398
- } catch (InterruptedException e) {
399
- return;
400
- }
401
- // Adapted from PSurfaceJOGL
402
- if (drawException != null) {
403
- if (drawException instanceof ThreadDeath) {
404
- // System.out.println("caught ThreadDeath");
405
- // throw (ThreadDeath)cause;
406
- } else if (drawException instanceof RuntimeException) {
407
- throw (RuntimeException) drawException;
408
- } else if (drawException instanceof UnsatisfiedLinkError) {
409
- throw new UnsatisfiedLinkError(drawException.getMessage());
410
- } else {
411
- throw new RuntimeException(drawException);
412
- }
413
- }
414
- });
415
- exceptionHandlerThread.setDaemon(true);
416
- exceptionHandlerThread.setName("Processing-FX-ExceptionHandler");
417
- exceptionHandlerThread.start();
418
- }
419
-
420
-
421
- /** Set the window (and dock, or whatever necessary) title. */
422
- public void setTitle(String title) {
423
- // PApplicationFX.title = title; // store this in case the stage still null
424
- // if (stage != null) {
425
- stage.setTitle(title);
426
- // }
427
- }
428
-
429
-
430
- /** Show or hide the window. */
431
- @Override
432
- public void setVisible(final boolean visible) {
433
- Platform.runLater(new Runnable() {
434
- public void run() {
435
- if (visible) {
436
- stage.show();
437
- canvas.requestFocus();
438
- } else {
439
- stage.hide();
440
- }
441
- }
442
- });
443
- }
444
-
445
-
446
- /** Set true if we want to resize things (default is not resizable) */
447
- public void setResizable(boolean resizable) {
448
- // PApplicationFX.resizable = resizable;
449
- // if (stage != null) {
450
- stage.setResizable(resizable);
451
- // }
452
- }
453
-
454
-
455
- public void setIcon(PImage icon) {
456
- int w = icon.pixelWidth;
457
- int h = icon.pixelHeight;
458
- WritableImage im = new WritableImage(w, h);
459
- im.getPixelWriter().setPixels(0, 0, w, h,
460
- PixelFormat.getIntArgbInstance(),
461
- icon.pixels,
462
- 0, w);
463
-
464
- Stage stage = (Stage) canvas.getScene().getWindow();
465
- stage.getIcons().clear();
466
- stage.getIcons().add(im);
467
- }
468
-
469
-
470
- List<Image> iconImages;
471
-
472
- protected void setProcessingIcon(Stage stage) {
473
- // Adapted from PSurfaceAWT
474
- // Note: FX chooses wrong icon size, should be fixed in Java 9, see:
475
- // https://bugs.openjdk.java.net/browse/JDK-8091186
476
- // Removing smaller sizes helps a bit, but big ones are downsized
477
- try {
478
- if (iconImages == null) {
479
- iconImages = new ArrayList<>();
480
- final int[] sizes = { 48, 64, 128, 256, 512 };
481
-
482
- for (int sz : sizes) {
483
- URL url = PApplet.class.getResource("/icon/icon-" + sz + ".png");
484
- Image image = new Image(url.toString());
485
- iconImages.add(image);
486
- }
487
- }
488
- List<Image> icons = stage.getIcons();
489
- icons.clear();
490
- icons.addAll(iconImages);
491
- } catch (Exception e) { } // harmless; keep this to ourselves
492
- }
493
-
494
-
495
- @Override
496
- public void setAlwaysOnTop(boolean always) {
497
- stage.setAlwaysOnTop(always);
498
- }
499
-
500
-
501
- /*
502
- @Override
503
- public void placeWindow(int[] location) {
504
- //setFrameSize();
505
-
506
- if (location != null) {
507
- // a specific location was received from the Runner
508
- // (applet has been run more than once, user placed window)
509
- stage.setX(location[0]);
510
- stage.setY(location[1]);
511
-
512
- } else { // just center on screen
513
- // Can't use frame.setLocationRelativeTo(null) because it sends the
514
- // frame to the main display, which undermines the --display setting.
515
- // frame.setLocation(screenRect.x + (screenRect.width - sketchWidth) / 2,
516
- // screenRect.y + (screenRect.height - sketchHeight) / 2);
517
- }
518
- if (stage.getY() < 0) {
519
- // Windows actually allows you to place frames where they can't be
520
- // closed. Awesome. http://dev.processing.org/bugs/show_bug.cgi?id=1508
521
- //frame.setLocation(frameLoc.x, 30);
522
- stage.setY(30);
65
+ @Override
66
+ public void setAlwaysOnTop(boolean always) {
67
+ throw new UnsupportedOperationException(message);
523
68
  }
524
69
 
525
- //setCanvasSize();
526
-
527
- // TODO add window closing behavior
528
- // frame.addWindowListener(new WindowAdapter() {
529
- // @Override
530
- // public void windowClosing(WindowEvent e) {
531
- // System.exit(0);
532
- // }
533
- // });
534
-
535
- // TODO handle frame resizing events
536
- // setupFrameResizeListener();
537
-
538
- if (sketch.getGraphics().displayable()) {
539
- setVisible(true);
70
+ @Override
71
+ public void setIcon(PImage icon) {
72
+ throw new UnsupportedOperationException(message);
540
73
  }
541
- }
542
- */
543
-
544
74
 
545
- @Override
546
- public void placeWindow(int[] location, int[] editorLocation) {
547
- if (sketch.sketchFullScreen()) {
548
- PApplet.hideMenuBar();
549
- return;
75
+ @Override
76
+ public void placeWindow(int[] location, int[] editorLocation) {
77
+ throw new UnsupportedOperationException(message);
550
78
  }
551
79
 
552
- int wide = sketch.width; // stage.getWidth() is NaN here
553
- //int high = sketch.height; // stage.getHeight()
554
-
555
- if (location != null) {
556
- // a specific location was received from the Runner
557
- // (applet has been run more than once, user placed window)
558
- stage.setX(location[0]);
559
- stage.setY(location[1]);
560
-
561
- } else if (editorLocation != null) {
562
- int locationX = editorLocation[0] - 20;
563
- int locationY = editorLocation[1];
564
-
565
- if (locationX - wide > 10) {
566
- // if it fits to the left of the window
567
- stage.setX(locationX - wide);
568
- stage.setY(locationY);
569
-
570
- } else { // doesn't fit
571
- stage.centerOnScreen();
572
- }
573
- } else { // just center on screen
574
- stage.centerOnScreen();
80
+ @Override
81
+ public void placePresent(int stopColor) {
82
+ throw new UnsupportedOperationException(message);
575
83
  }
576
- }
577
-
578
-
579
- // http://download.java.net/jdk8/jfxdocs/javafx/stage/Stage.html#setFullScreenExitHint-java.lang.String-
580
- // http://download.java.net/jdk8/jfxdocs/javafx/stage/Stage.html#setFullScreenExitKeyCombination-javafx.scene.input.KeyCombination-
581
- public void placePresent(int stopColor) {
582
- // TODO Auto-generated method stub
583
- PApplet.hideMenuBar();
584
- }
585
-
586
-
587
- @Override
588
- public void setupExternalMessages() {
589
- stage.xProperty().addListener(new ChangeListener<Number>() {
590
- @Override
591
- public void changed(ObservableValue<? extends Number> value,
592
- Number oldX, Number newX) {
593
- sketch.frameMoved(newX.intValue(), stage.yProperty().intValue());
594
- }
595
- });
596
-
597
- stage.yProperty().addListener(new ChangeListener<Number>() {
598
- @Override
599
- public void changed(ObservableValue<? extends Number> value,
600
- Number oldY, Number newY) {
601
- sketch.frameMoved(stage.xProperty().intValue(), newY.intValue());
602
- }
603
- });
604
-
605
- stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
606
- public void handle(WindowEvent we) {
607
- sketch.exit();
608
- }
609
- });
610
- }
611
84
 
612
-
613
- public void setLocation(int x, int y) {
614
- stage.setX(x);
615
- stage.setY(y);
616
- }
617
-
618
-
619
- public void setSize(int wide, int high) {
620
- // When the surface is set to resizable via surface.setResizable(true),
621
- // a crash may occur if the user sets the window to size zero.
622
- // https://github.com/processing/processing/issues/5052
623
- if (high <= 0) {
624
- high = 1;
625
- }
626
- if (wide <= 0) {
627
- wide = 1;
85
+ @Override
86
+ public void setupExternalMessages() {
87
+ throw new UnsupportedOperationException(message);
628
88
  }
629
89
 
630
- //System.out.format("%s.setSize(%d, %d)%n", getClass().getSimpleName(), width, height);
631
- Scene scene = stage.getScene();
632
- double decorH = stage.getWidth() - scene.getWidth();
633
- double decorV = stage.getHeight() - scene.getHeight();
634
- stage.setWidth(wide + decorH);
635
- stage.setHeight(high + decorV);
636
- fx.setSize(wide, high);
637
- }
638
-
639
-
640
- // public Component getComponent() {
641
- // return null;
642
- // }
643
-
644
-
645
- public void setSmooth(int level) {
646
- // TODO Auto-generated method stub
647
-
648
- }
649
-
650
-
651
- public void setFrameRate(float fps) {
652
- // setting rate to negative so that event fires at the start of
653
- // the key frame and first frame is drawn immediately
654
- if (fps > 0) {
655
- frameRate = fps;
656
- animation.setRate(-frameRate);
90
+ @Override
91
+ public void setLocation(int x, int y) {
92
+ throw new UnsupportedOperationException(message);
657
93
  }
658
- }
659
-
660
-
661
- // @Override
662
- // public void requestFocus() {
663
- // canvas.requestFocus();
664
- // }
665
94
 
666
- Cursor lastCursor = Cursor.DEFAULT;
667
-
668
- public void setCursor(int kind) {
669
- Cursor c;
670
- switch (kind) {
671
- case PConstants.ARROW: c = Cursor.DEFAULT; break;
672
- case PConstants.CROSS: c = Cursor.CROSSHAIR; break;
673
- case PConstants.HAND: c = Cursor.HAND; break;
674
- case PConstants.MOVE: c = Cursor.MOVE; break;
675
- case PConstants.TEXT: c = Cursor.TEXT; break;
676
- case PConstants.WAIT: c = Cursor.WAIT; break;
677
- default: c = Cursor.DEFAULT; break;
95
+ @Override
96
+ public void setSize(int width, int height) {
97
+ throw new UnsupportedOperationException(message);
678
98
  }
679
- lastCursor = c;
680
- canvas.getScene().setCursor(c);
681
- }
682
-
683
-
684
- public void setCursor(PImage image, int hotspotX, int hotspotY) {
685
- int w = image.pixelWidth;
686
- int h = image.pixelHeight;
687
- WritableImage im = new WritableImage(w, h);
688
- im.getPixelWriter().setPixels(0, 0, w, h,
689
- PixelFormat.getIntArgbInstance(),
690
- image.pixels,
691
- 0, w);
692
- ImageCursor c = new ImageCursor(im, hotspotX, hotspotY);
693
- lastCursor = c;
694
- canvas.getScene().setCursor(c);
695
- }
696
-
697
-
698
- public void showCursor() {
699
- canvas.getScene().setCursor(lastCursor);
700
- }
701
-
702
-
703
- public void hideCursor() {
704
- canvas.getScene().setCursor(Cursor.NONE);
705
- }
706
-
707
-
708
- public void startThread() {
709
- animation.play();
710
- }
711
-
712
-
713
- public void pauseThread() {
714
- animation.pause();
715
- }
716
-
717
-
718
- public void resumeThread() {
719
- animation.play();
720
- }
721
-
722
-
723
- public boolean stopThread() {
724
- animation.stop();
725
- return true;
726
- }
727
-
728
-
729
- public boolean isStopped() {
730
- return animation.getStatus() == Animation.Status.STOPPED;
731
- }
732
-
733
-
734
- // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
735
-
736
-
737
- /*
738
- protected void addListeners() {
739
-
740
- canvas.addMouseListener(new MouseListener() {
741
-
742
- public void mousePressed(java.awt.event.MouseEvent e) {
743
- nativeMouseEvent(e);
744
- }
745
-
746
- public void mouseReleased(java.awt.event.MouseEvent e) {
747
- nativeMouseEvent(e);
748
- }
749
-
750
- public void mouseClicked(java.awt.event.MouseEvent e) {
751
- nativeMouseEvent(e);
752
- }
753
-
754
- public void mouseEntered(java.awt.event.MouseEvent e) {
755
- nativeMouseEvent(e);
756
- }
757
-
758
- public void mouseExited(java.awt.event.MouseEvent e) {
759
- nativeMouseEvent(e);
760
- }
761
- });
762
-
763
- canvas.addMouseMotionListener(new MouseMotionListener() {
764
-
765
- public void mouseDragged(java.awt.event.MouseEvent e) {
766
- nativeMouseEvent(e);
767
- }
768
-
769
- public void mouseMoved(java.awt.event.MouseEvent e) {
770
- nativeMouseEvent(e);
771
- }
772
- });
773
-
774
- canvas.addMouseWheelListener(new MouseWheelListener() {
775
99
 
776
- public void mouseWheelMoved(MouseWheelEvent e) {
777
- nativeMouseEvent(e);
778
- }
779
- });
780
-
781
- canvas.addKeyListener(new KeyListener() {
782
-
783
- public void keyPressed(java.awt.event.KeyEvent e) {
784
- nativeKeyEvent(e);
785
- }
786
-
787
-
788
- public void keyReleased(java.awt.event.KeyEvent e) {
789
- nativeKeyEvent(e);
790
- }
791
-
792
-
793
- public void keyTyped(java.awt.event.KeyEvent e) {
794
- nativeKeyEvent(e);
795
- }
796
- });
797
-
798
- canvas.addFocusListener(new FocusListener() {
799
-
800
- public void focusGained(FocusEvent e) {
801
- sketch.focused = true;
802
- sketch.focusGained();
803
- }
804
-
805
- public void focusLost(FocusEvent e) {
806
- sketch.focused = false;
807
- sketch.focusLost();
808
- }
809
- });
810
- }
811
- */
812
-
813
-
814
- static Map<EventType<? extends MouseEvent>, Integer> mouseMap =
815
- new HashMap<EventType<? extends MouseEvent>, Integer>();
816
- static {
817
- mouseMap.put(MouseEvent.MOUSE_PRESSED, processing.event.MouseEvent.PRESS);
818
- mouseMap.put(MouseEvent.MOUSE_RELEASED, processing.event.MouseEvent.RELEASE);
819
- mouseMap.put(MouseEvent.MOUSE_CLICKED, processing.event.MouseEvent.CLICK);
820
- mouseMap.put(MouseEvent.MOUSE_DRAGGED, processing.event.MouseEvent.DRAG);
821
- mouseMap.put(MouseEvent.MOUSE_MOVED, processing.event.MouseEvent.MOVE);
822
- mouseMap.put(MouseEvent.MOUSE_ENTERED, processing.event.MouseEvent.ENTER);
823
- mouseMap.put(MouseEvent.MOUSE_EXITED, processing.event.MouseEvent.EXIT);
824
- }
825
-
826
- protected void fxMouseEvent(MouseEvent fxEvent) {
827
- // the 'amount' is the number of button clicks for a click event,
828
- // or the number of steps/clicks on the wheel for a mouse wheel event.
829
- int count = fxEvent.getClickCount();
830
-
831
- int action = mouseMap.get(fxEvent.getEventType());
832
-
833
- int modifiers = 0;
834
- if (fxEvent.isShiftDown()) {
835
- modifiers |= processing.event.Event.SHIFT;
836
- }
837
- if (fxEvent.isControlDown()) {
838
- modifiers |= processing.event.Event.CTRL;
839
- }
840
- if (fxEvent.isMetaDown()) {
841
- modifiers |= processing.event.Event.META;
842
- }
843
- if (fxEvent.isAltDown()) {
844
- modifiers |= processing.event.Event.ALT;
100
+ @Override
101
+ public void setFrameRate(float fps) {
102
+ throw new UnsupportedOperationException(message);
845
103
  }
846
104
 
847
- int button = 0;
848
- switch (fxEvent.getButton()) {
849
- case PRIMARY:
850
- button = PConstants.LEFT;
851
- break;
852
- case SECONDARY:
853
- button = PConstants.RIGHT;
854
- break;
855
- case MIDDLE:
856
- button = PConstants.CENTER;
857
- break;
858
- case NONE:
859
- // not currently handled
860
- break;
105
+ @Override
106
+ public void setCursor(int kind) {
107
+ throw new UnsupportedOperationException(message);
861
108
  }
862
109
 
863
- // If running on Mac OS, allow ctrl-click as right mouse.
864
- // Verified to be necessary with Java 8u45.
865
- if (PApplet.platform == PConstants.MACOSX &&
866
- fxEvent.isControlDown() &&
867
- button == PConstants.LEFT) {
868
- button = PConstants.RIGHT;
110
+ @Override
111
+ public void setCursor(PImage image, int hotspotX, int hotspotY) {
112
+ throw new UnsupportedOperationException(message);
869
113
  }
870
114
 
871
- //long when = nativeEvent.getWhen(); // from AWT
872
- long when = System.currentTimeMillis();
873
- int x = (int) fxEvent.getX(); // getSceneX()?
874
- int y = (int) fxEvent.getY();
875
-
876
- sketch.postEvent(new processing.event.MouseEvent(fxEvent, when,
877
- action, modifiers,
878
- x, y, button, count));
879
- }
880
-
881
- // https://docs.oracle.com/javase/8/javafx/api/javafx/scene/input/ScrollEvent.html
882
- protected void fxScrollEvent(ScrollEvent fxEvent) {
883
- // the number of steps/clicks on the wheel for a mouse wheel event.
884
- int count = (int) -(fxEvent.getDeltaY() / fxEvent.getMultiplierY());
885
-
886
- int action = processing.event.MouseEvent.WHEEL;
887
-
888
- int modifiers = 0;
889
- if (fxEvent.isShiftDown()) {
890
- modifiers |= processing.event.Event.SHIFT;
891
- }
892
- if (fxEvent.isControlDown()) {
893
- modifiers |= processing.event.Event.CTRL;
894
- }
895
- if (fxEvent.isMetaDown()) {
896
- modifiers |= processing.event.Event.META;
897
- }
898
- if (fxEvent.isAltDown()) {
899
- modifiers |= processing.event.Event.ALT;
115
+ @Override
116
+ public void showCursor() {
117
+ throw new UnsupportedOperationException(message);
900
118
  }
901
119
 
902
- // FX does not supply button info
903
- int button = 0;
904
-
905
- long when = System.currentTimeMillis();
906
- int x = (int) fxEvent.getX(); // getSceneX()?
907
- int y = (int) fxEvent.getY();
908
-
909
- sketch.postEvent(new processing.event.MouseEvent(fxEvent, when,
910
- action, modifiers,
911
- x, y, button, count));
912
- }
913
-
914
-
915
- protected void fxKeyEvent(javafx.scene.input.KeyEvent fxEvent) {
916
- int action = 0;
917
- EventType<? extends KeyEvent> et = fxEvent.getEventType();
918
- if (et == KeyEvent.KEY_PRESSED) {
919
- action = processing.event.KeyEvent.PRESS;
920
- } else if (et == KeyEvent.KEY_RELEASED) {
921
- action = processing.event.KeyEvent.RELEASE;
922
- } else if (et == KeyEvent.KEY_TYPED) {
923
- action = processing.event.KeyEvent.TYPE;
120
+ @Override
121
+ public void hideCursor() {
122
+ throw new UnsupportedOperationException(message);
924
123
  }
925
124
 
926
- int modifiers = 0;
927
- if (fxEvent.isShiftDown()) {
928
- modifiers |= processing.event.Event.SHIFT;
929
- }
930
- if (fxEvent.isControlDown()) {
931
- modifiers |= processing.event.Event.CTRL;
932
- }
933
- if (fxEvent.isMetaDown()) {
934
- modifiers |= processing.event.Event.META;
935
- }
936
- if (fxEvent.isAltDown()) {
937
- modifiers |= processing.event.Event.ALT;
125
+ @Override
126
+ public void startThread() {
127
+ throw new UnsupportedOperationException(message);
938
128
  }
939
129
 
940
- long when = System.currentTimeMillis();
941
-
942
- char keyChar = getKeyChar(fxEvent);
943
- int keyCode = getKeyCode(fxEvent);
944
- sketch.postEvent(new processing.event.KeyEvent(fxEvent, when,
945
- action, modifiers,
946
- keyChar, keyCode));
947
- }
948
-
949
-
950
- @SuppressWarnings("deprecation")
951
- private int getKeyCode(KeyEvent fxEvent) {
952
- if (fxEvent.getEventType() == KeyEvent.KEY_TYPED) {
953
- return 0;
130
+ @Override
131
+ public void pauseThread() {
132
+ throw new UnsupportedOperationException(message);
954
133
  }
955
134
 
956
- KeyCode kc = fxEvent.getCode();
957
- switch (kc) {
958
- case ALT_GRAPH:
959
- return PConstants.ALT;
960
- default:
961
- break;
135
+ @Override
136
+ public void resumeThread() {
137
+ throw new UnsupportedOperationException(message);
962
138
  }
963
- return kc.impl_getCode();
964
- }
965
-
966
-
967
- @SuppressWarnings("deprecation")
968
- private char getKeyChar(KeyEvent fxEvent) {
969
- KeyCode kc = fxEvent.getCode();
970
139
 
971
- // Overriding chars for some
972
- // KEY_PRESSED and KEY_RELEASED events
973
- switch (kc) {
974
- case UP:
975
- case KP_UP:
976
- case DOWN:
977
- case KP_DOWN:
978
- case LEFT:
979
- case KP_LEFT:
980
- case RIGHT:
981
- case KP_RIGHT:
982
- case ALT:
983
- case ALT_GRAPH:
984
- case CONTROL:
985
- case SHIFT:
986
- case CAPS:
987
- case META:
988
- case WINDOWS:
989
- case CONTEXT_MENU:
990
- case HOME:
991
- case PAGE_UP:
992
- case PAGE_DOWN:
993
- case END:
994
- case PAUSE:
995
- case PRINTSCREEN:
996
- case INSERT:
997
- case NUM_LOCK:
998
- case SCROLL_LOCK:
999
- case F1:
1000
- case F2:
1001
- case F3:
1002
- case F4:
1003
- case F5:
1004
- case F6:
1005
- case F7:
1006
- case F8:
1007
- case F9:
1008
- case F10:
1009
- case F11:
1010
- case F12:
1011
- return PConstants.CODED;
1012
- case ENTER:
1013
- return '\n';
1014
- case DIVIDE:
1015
- return '/';
1016
- case MULTIPLY:
1017
- return '*';
1018
- case SUBTRACT:
1019
- return '-';
1020
- case ADD:
1021
- return '+';
1022
- case NUMPAD0:
1023
- return '0';
1024
- case NUMPAD1:
1025
- return '1';
1026
- case NUMPAD2:
1027
- return '2';
1028
- case NUMPAD3:
1029
- return '3';
1030
- case NUMPAD4:
1031
- return '4';
1032
- case NUMPAD5:
1033
- return '5';
1034
- case NUMPAD6:
1035
- return '6';
1036
- case NUMPAD7:
1037
- return '7';
1038
- case NUMPAD8:
1039
- return '8';
1040
- case NUMPAD9:
1041
- return '9';
1042
- case DECIMAL:
1043
- // KEY_TYPED does not go through here and will produce
1044
- // dot or comma based on the keyboard layout.
1045
- // For KEY_PRESSED and KEY_RELEASED, let's just go with
1046
- // the dot. Users can detect the key by its keyCode.
1047
- return '.';
1048
- case UNDEFINED:
1049
- // KEY_TYPED has KeyCode: UNDEFINED
1050
- // and falls through here
1051
- break;
1052
- default:
1053
- break;
140
+ @Override
141
+ public boolean stopThread() {
142
+ throw new UnsupportedOperationException(message);
1054
143
  }
1055
144
 
1056
- // Just go with what FX gives us for the rest of
1057
- // KEY_PRESSED and KEY_RELEASED and all of KEY_TYPED
1058
- String ch;
1059
- if (fxEvent.getEventType() == KeyEvent.KEY_TYPED) {
1060
- ch = fxEvent.getCharacter();
1061
- } else {
1062
- ch = kc.impl_getChar();
145
+ @Override
146
+ public boolean isStopped() {
147
+ throw new UnsupportedOperationException(message);
1063
148
  }
1064
149
 
1065
- if (ch.length() < 1) return PConstants.CODED;
1066
- if (ch.startsWith("\r")) return '\n'; // normalize enter key
1067
- return ch.charAt(0);
1068
- }
1069
150
  }