6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package javafx.scene;
27
28 import com.sun.javafx.test.TransformHelper;
29 import javafx.scene.transform.Translate;
30 import javafx.scene.shape.Rectangle;
31 import javafx.beans.Observable;
32 import java.lang.reflect.Method;
33 import javafx.beans.InvalidationListener;
34 import javafx.beans.property.ReadOnlyObjectProperty;
35 import javafx.scene.transform.Transform;
36 import org.junit.Test;
37 import static org.junit.Assert.*;
38
39 public class Node_LocalToSceneTransform_Test {
40 private boolean notified;
41
42 @Test
43 public void notTransformedNodeShouldReturnIdentity() {
44 Node n = new Rectangle(20, 20);
45 TransformHelper.assertMatrix(n.getLocalToSceneTransform(),
46 1, 0, 0, 0,
47 0, 1, 0, 0,
48 0, 0, 1, 0);
49 }
50
51 @Test
52 public void noListenersShouldBeAddedByDefault() throws Exception {
53 Node r = new Rectangle(20, 20);
54 Group n = new Group(r);
55 Group p = new Group(n);
56
57 p.getLocalToSceneTransform();
58 n.getLocalToSceneTransform();
59 r.getLocalToSceneTransform();
60
61 p.setTranslateX(10);
62 p.setRotate(80);
63
64 // n didn't react on its parent's transformation
65 TransformHelper.assertMatrix(n.getCurrentLocalToSceneTransformState(),
66 1, 0, 0, 0,
67 0, 1, 0, 0,
68 0, 0, 1, 0);
69 }
70
71 @Test
72 public void shouldConsiderAllParents() {
73 Node n = new Rectangle(20, 20);
74 Group p1 = new Group(n);
75 Group p2 = new Group(p1);
76
77 n.setTranslateX(10);
78 p1.setTranslateY(20);
79 p2.getTransforms().add(new Translate(5, 6));
80
81 TransformHelper.assertMatrix(n.getLocalToSceneTransform(),
82 1, 0, 0, 15,
83 0, 1, 0, 26,
84 0, 0, 1, 0);
85 }
197 // enable listener
198 notified = false;
199 g2.setTranslateX(60);
200 assertTrue(notified);
201 }
202
203 @Test
204 public void shouldUnregisterListenersWhenNotNeeded() {
205 final Node n = new Rectangle(20, 20);
206 final Group p1 = new Group(n);
207 final Group p2 = new Group(p1);
208
209 InvalidationListener lstnr = o -> {
210 n.getLocalToSceneTransform();
211 };
212
213 n.localToSceneTransformProperty().addListener(lstnr);
214
215 // with listener on leave, parents update
216 p2.setTranslateX(30);
217 TransformHelper.assertMatrix(p1.getCurrentLocalToSceneTransformState(),
218 1, 0, 0, 30,
219 0, 1, 0, 0,
220 0, 0, 1, 0);
221
222 // without listener on leave, parents don't update
223 n.localToSceneTransformProperty().removeListener(lstnr);
224 p2.setTranslateX(60);
225 TransformHelper.assertMatrix(p1.getCurrentLocalToSceneTransformState(),
226 1, 0, 0, 30,
227 0, 1, 0, 0,
228 0, 0, 1, 0);
229
230 // with listener on leave again, parents update again
231 n.localToSceneTransformProperty().addListener(lstnr);
232 p2.setTranslateX(90);
233 TransformHelper.assertMatrix(p1.getCurrentLocalToSceneTransformState(),
234 1, 0, 0, 90,
235 0, 1, 0, 0,
236 0, 0, 1, 0);
237 }
238
239 @Test
240 public void shouldUnregisterListenersWhenNotNeededButStillUpdate() {
241 final Node n = new Rectangle(20, 20);
242 final Group p1 = new Group(n);
243 final Group p2 = new Group(p1);
244
245 InvalidationListener lstnr = o -> {
246 n.getLocalToSceneTransform();
247 };
248
249 n.localToSceneTransformProperty().addListener(lstnr);
250
251 // with listener on leave, parents update
252 p2.setTranslateX(30);
253 TransformHelper.assertMatrix(p1.getCurrentLocalToSceneTransformState(),
254 1, 0, 0, 30,
255 0, 1, 0, 0,
256 0, 0, 1, 0);
257
258 // without listener on leave, parents don't update immediately
259 n.localToSceneTransformProperty().removeListener(lstnr);
260 p2.setTranslateX(60);
261 TransformHelper.assertMatrix(p1.getCurrentLocalToSceneTransformState(),
262 1, 0, 0, 30,
263 0, 1, 0, 0,
264 0, 0, 1, 0);
265
266 // ... but must do it on request:
267 TransformHelper.assertMatrix(p1.getLocalToSceneTransform(),
268 1, 0, 0, 60,
269 0, 1, 0, 0,
270 0, 0, 1, 0);
271 }
272
273 @Test
274 public void shouldUnregisterListenersWhenReparent() {
275 final Node n = new Rectangle(20, 20);
276 final Group p1 = new Group(n);
277 final Group p2 = new Group(p1);
278 final Group g = new Group();
279
280 InvalidationListener lstnr = o -> {
281 n.getLocalToSceneTransform();
282 };
283
284 n.localToSceneTransformProperty().addListener(lstnr);
285
286 // with listener on leave, parents update
287 p2.setTranslateX(30);
288 TransformHelper.assertMatrix(p1.getCurrentLocalToSceneTransformState(),
289 1, 0, 0, 30,
290 0, 1, 0, 0,
291 0, 0, 1, 0);
292
293 // child with listener is moved away, parents stop updating
294 g.getChildren().add(n);
295 p2.setTranslateX(60);
296 TransformHelper.assertMatrix(p1.getCurrentLocalToSceneTransformState(),
297 1, 0, 0, 30,
298 0, 1, 0, 0,
299 0, 0, 1, 0);
300
301 // leaf with listener moved back, parents update again
302 p1.getChildren().add(n);
303 p2.setTranslateX(90);
304 TransformHelper.assertMatrix(p1.getCurrentLocalToSceneTransformState(),
305 1, 0, 0, 90,
306 0, 1, 0, 0,
307 0, 0, 1, 0);
308 }
309
310 @Test
311 public void shouldNotUnregisterListenerIfThereIsOtherReason() {
312 final Node n = new Rectangle(20, 20);
313 final Group p1 = new Group(n);
314 final Group p2 = new Group(p1);
315 final Group g = new Group();
316
317 InvalidationListener nlstnr = o -> {
318 n.getLocalToSceneTransform();
319 };
320 InvalidationListener plstnr = o -> {
321 p1.getLocalToSceneTransform();
322 };
323
324 n.localToSceneTransformProperty().addListener(nlstnr);
325 p1.localToSceneTransformProperty().addListener(plstnr);
326
327 // with listeners, parents update
328 p2.setTranslateX(30);
329 TransformHelper.assertMatrix(p1.getCurrentLocalToSceneTransformState(),
330 1, 0, 0, 30,
331 0, 1, 0, 0,
332 0, 0, 1, 0);
333
334 // child moved away, but there is still listener on parent
335 g.getChildren().add(n);
336 p2.setTranslateX(60);
337 TransformHelper.assertMatrix(p1.getCurrentLocalToSceneTransformState(),
338 1, 0, 0, 60,
339 0, 1, 0, 0,
340 0, 0, 1, 0);
341
342 // removed even the listener on parent, now we can stop updating
343 p1.localToSceneTransformProperty().removeListener(plstnr);
344 p2.setTranslateX(90);
345 TransformHelper.assertMatrix(p1.getCurrentLocalToSceneTransformState(),
346 1, 0, 0, 60,
347 0, 1, 0, 0,
348 0, 0, 1, 0);
349
350 // return both listener and child
351 p1.localToSceneTransformProperty().addListener(plstnr);
352 p1.getChildren().add(n);
353
354 // remove the listener, must still update because of the child
355 p1.localToSceneTransformProperty().removeListener(plstnr);
356 p2.setTranslateX(45);
357 TransformHelper.assertMatrix(p1.getCurrentLocalToSceneTransformState(),
358 1, 0, 0, 45,
359 0, 1, 0, 0,
360 0, 0, 1, 0);
361
362 // remove the child as well, now we can stop updating
363 g.getChildren().add(n);
364 p2.setTranslateX(25);
365 TransformHelper.assertMatrix(p1.getCurrentLocalToSceneTransformState(),
366 1, 0, 0, 45,
367 0, 1, 0, 0,
368 0, 0, 1, 0);
369 }
370
371 @Test
372 public void shouldNotBeReusedWhenReferenceGivenToUser() {
373
374 final Node n = new Rectangle(20, 20);
375 final Group g = new Group(n);
376
377 g.setTranslateX(200);
378 Transform t1 = n.getLocalToSceneTransform();
379 TransformHelper.assertMatrix(t1,
380 1, 0, 0, 200,
381 0, 1, 0, 0,
382 0, 0, 1, 0);
383
384 g.setTranslateX(300);
385 Transform t2 = n.getLocalToSceneTransform();
|
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package test.javafx.scene;
27
28 import test.com.sun.javafx.test.TransformHelper;
29 import javafx.scene.transform.Translate;
30 import javafx.scene.shape.Rectangle;
31 import javafx.beans.Observable;
32 import java.lang.reflect.Method;
33 import javafx.beans.InvalidationListener;
34 import javafx.beans.property.ReadOnlyObjectProperty;
35 import javafx.scene.Group;
36 import javafx.scene.Node;
37 import javafx.scene.NodeShim;
38 import javafx.scene.transform.Transform;
39 import org.junit.Test;
40 import static org.junit.Assert.*;
41
42 public class Node_LocalToSceneTransform_Test {
43 private boolean notified;
44
45 @Test
46 public void notTransformedNodeShouldReturnIdentity() {
47 Node n = new Rectangle(20, 20);
48 TransformHelper.assertMatrix(n.getLocalToSceneTransform(),
49 1, 0, 0, 0,
50 0, 1, 0, 0,
51 0, 0, 1, 0);
52 }
53
54 @Test
55 public void noListenersShouldBeAddedByDefault() throws Exception {
56 Node r = new Rectangle(20, 20);
57 Group n = new Group(r);
58 Group p = new Group(n);
59
60 p.getLocalToSceneTransform();
61 n.getLocalToSceneTransform();
62 r.getLocalToSceneTransform();
63
64 p.setTranslateX(10);
65 p.setRotate(80);
66
67 // n didn't react on its parent's transformation
68 TransformHelper.assertMatrix(NodeShim.getCurrentLocalToSceneTransformState(n),
69 1, 0, 0, 0,
70 0, 1, 0, 0,
71 0, 0, 1, 0);
72 }
73
74 @Test
75 public void shouldConsiderAllParents() {
76 Node n = new Rectangle(20, 20);
77 Group p1 = new Group(n);
78 Group p2 = new Group(p1);
79
80 n.setTranslateX(10);
81 p1.setTranslateY(20);
82 p2.getTransforms().add(new Translate(5, 6));
83
84 TransformHelper.assertMatrix(n.getLocalToSceneTransform(),
85 1, 0, 0, 15,
86 0, 1, 0, 26,
87 0, 0, 1, 0);
88 }
200 // enable listener
201 notified = false;
202 g2.setTranslateX(60);
203 assertTrue(notified);
204 }
205
206 @Test
207 public void shouldUnregisterListenersWhenNotNeeded() {
208 final Node n = new Rectangle(20, 20);
209 final Group p1 = new Group(n);
210 final Group p2 = new Group(p1);
211
212 InvalidationListener lstnr = o -> {
213 n.getLocalToSceneTransform();
214 };
215
216 n.localToSceneTransformProperty().addListener(lstnr);
217
218 // with listener on leave, parents update
219 p2.setTranslateX(30);
220 TransformHelper.assertMatrix(NodeShim.getCurrentLocalToSceneTransformState(p1),
221 1, 0, 0, 30,
222 0, 1, 0, 0,
223 0, 0, 1, 0);
224
225 // without listener on leave, parents don't update
226 n.localToSceneTransformProperty().removeListener(lstnr);
227 p2.setTranslateX(60);
228 TransformHelper.assertMatrix(NodeShim.getCurrentLocalToSceneTransformState(p1),
229 1, 0, 0, 30,
230 0, 1, 0, 0,
231 0, 0, 1, 0);
232
233 // with listener on leave again, parents update again
234 n.localToSceneTransformProperty().addListener(lstnr);
235 p2.setTranslateX(90);
236 TransformHelper.assertMatrix(NodeShim.getCurrentLocalToSceneTransformState(p1),
237 1, 0, 0, 90,
238 0, 1, 0, 0,
239 0, 0, 1, 0);
240 }
241
242 @Test
243 public void shouldUnregisterListenersWhenNotNeededButStillUpdate() {
244 final Node n = new Rectangle(20, 20);
245 final Group p1 = new Group(n);
246 final Group p2 = new Group(p1);
247
248 InvalidationListener lstnr = o -> {
249 n.getLocalToSceneTransform();
250 };
251
252 n.localToSceneTransformProperty().addListener(lstnr);
253
254 // with listener on leave, parents update
255 p2.setTranslateX(30);
256 TransformHelper.assertMatrix(NodeShim.getCurrentLocalToSceneTransformState(p1),
257 1, 0, 0, 30,
258 0, 1, 0, 0,
259 0, 0, 1, 0);
260
261 // without listener on leave, parents don't update immediately
262 n.localToSceneTransformProperty().removeListener(lstnr);
263 p2.setTranslateX(60);
264 TransformHelper.assertMatrix(NodeShim.getCurrentLocalToSceneTransformState(p1),
265 1, 0, 0, 30,
266 0, 1, 0, 0,
267 0, 0, 1, 0);
268
269 // ... but must do it on request:
270 TransformHelper.assertMatrix(p1.getLocalToSceneTransform(),
271 1, 0, 0, 60,
272 0, 1, 0, 0,
273 0, 0, 1, 0);
274 }
275
276 @Test
277 public void shouldUnregisterListenersWhenReparent() {
278 final Node n = new Rectangle(20, 20);
279 final Group p1 = new Group(n);
280 final Group p2 = new Group(p1);
281 final Group g = new Group();
282
283 InvalidationListener lstnr = o -> {
284 n.getLocalToSceneTransform();
285 };
286
287 n.localToSceneTransformProperty().addListener(lstnr);
288
289 // with listener on leave, parents update
290 p2.setTranslateX(30);
291 TransformHelper.assertMatrix(NodeShim.getCurrentLocalToSceneTransformState(p1),
292 1, 0, 0, 30,
293 0, 1, 0, 0,
294 0, 0, 1, 0);
295
296 // child with listener is moved away, parents stop updating
297 g.getChildren().add(n);
298 p2.setTranslateX(60);
299 TransformHelper.assertMatrix(NodeShim.getCurrentLocalToSceneTransformState(p1),
300 1, 0, 0, 30,
301 0, 1, 0, 0,
302 0, 0, 1, 0);
303
304 // leaf with listener moved back, parents update again
305 p1.getChildren().add(n);
306 p2.setTranslateX(90);
307 TransformHelper.assertMatrix(NodeShim.getCurrentLocalToSceneTransformState(p1),
308 1, 0, 0, 90,
309 0, 1, 0, 0,
310 0, 0, 1, 0);
311 }
312
313 @Test
314 public void shouldNotUnregisterListenerIfThereIsOtherReason() {
315 final Node n = new Rectangle(20, 20);
316 final Group p1 = new Group(n);
317 final Group p2 = new Group(p1);
318 final Group g = new Group();
319
320 InvalidationListener nlstnr = o -> {
321 n.getLocalToSceneTransform();
322 };
323 InvalidationListener plstnr = o -> {
324 p1.getLocalToSceneTransform();
325 };
326
327 n.localToSceneTransformProperty().addListener(nlstnr);
328 p1.localToSceneTransformProperty().addListener(plstnr);
329
330 // with listeners, parents update
331 p2.setTranslateX(30);
332 TransformHelper.assertMatrix(NodeShim.getCurrentLocalToSceneTransformState(p1),
333 1, 0, 0, 30,
334 0, 1, 0, 0,
335 0, 0, 1, 0);
336
337 // child moved away, but there is still listener on parent
338 g.getChildren().add(n);
339 p2.setTranslateX(60);
340 TransformHelper.assertMatrix(NodeShim.getCurrentLocalToSceneTransformState(p1),
341 1, 0, 0, 60,
342 0, 1, 0, 0,
343 0, 0, 1, 0);
344
345 // removed even the listener on parent, now we can stop updating
346 p1.localToSceneTransformProperty().removeListener(plstnr);
347 p2.setTranslateX(90);
348 TransformHelper.assertMatrix(NodeShim.getCurrentLocalToSceneTransformState(p1),
349 1, 0, 0, 60,
350 0, 1, 0, 0,
351 0, 0, 1, 0);
352
353 // return both listener and child
354 p1.localToSceneTransformProperty().addListener(plstnr);
355 p1.getChildren().add(n);
356
357 // remove the listener, must still update because of the child
358 p1.localToSceneTransformProperty().removeListener(plstnr);
359 p2.setTranslateX(45);
360 TransformHelper.assertMatrix(NodeShim.getCurrentLocalToSceneTransformState(p1),
361 1, 0, 0, 45,
362 0, 1, 0, 0,
363 0, 0, 1, 0);
364
365 // remove the child as well, now we can stop updating
366 g.getChildren().add(n);
367 p2.setTranslateX(25);
368 TransformHelper.assertMatrix(NodeShim.getCurrentLocalToSceneTransformState(p1),
369 1, 0, 0, 45,
370 0, 1, 0, 0,
371 0, 0, 1, 0);
372 }
373
374 @Test
375 public void shouldNotBeReusedWhenReferenceGivenToUser() {
376
377 final Node n = new Rectangle(20, 20);
378 final Group g = new Group(n);
379
380 g.setTranslateX(200);
381 Transform t1 = n.getLocalToSceneTransform();
382 TransformHelper.assertMatrix(t1,
383 1, 0, 0, 200,
384 0, 1, 0, 0,
385 0, 0, 1, 0);
386
387 g.setTranslateX(300);
388 Transform t2 = n.getLocalToSceneTransform();
|