-
Notifications
You must be signed in to change notification settings - Fork 541
8252935: Add treeShowing listener only when needed #185
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Closed
hjohn
wants to merge
10
commits into
openjdk:master
from
hjohn:feature/remove-is-tree-showing-listener
Closed
Changes from all commits
Commits
Show all changes
10 commits
Select commit
Hold shift + click to select a range
5ac5d9e
WIP: Moved treeShowingProperty into its own class
hjohn b6ab711
Use registerChangeListener in ProgressIndicatorSkin
hjohn e68a886
Add performance test
hjohn a9adb0d
Update copyrights
hjohn 17e4569
Fix review comments
hjohn 3b55476
Also dispose listeners on Window/Showing in dispose
hjohn 2b6df77
Add missing TreeShowingExpressionTest which also tests SubScene
hjohn 02b4272
Apply changes from review comments
hjohn 7a685f4
Add missed null checks to fix test failure
hjohn fcaf2d6
Fix initial year in SubScene
hjohn File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
152 changes: 152 additions & 0 deletions
152
modules/javafx.graphics/src/main/java/com/sun/javafx/scene/TreeShowingExpression.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,152 @@ | ||
| /* | ||
| * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. | ||
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | ||
| * | ||
| * This code is free software; you can redistribute it and/or modify it | ||
| * under the terms of the GNU General Public License version 2 only, as | ||
| * published by the Free Software Foundation. Oracle designates this | ||
| * particular file as subject to the "Classpath" exception as provided | ||
| * by Oracle in the LICENSE file that accompanied this code. | ||
| * | ||
| * This code is distributed in the hope that it will be useful, but WITHOUT | ||
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
| * version 2 for more details (a copy is included in the LICENSE file that | ||
| * accompanied this code). | ||
| * | ||
| * You should have received a copy of the GNU General Public License version | ||
| * 2 along with this work; if not, write to the Free Software Foundation, | ||
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | ||
| * | ||
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | ||
| * or visit www.oracle.com if you need additional information or have any | ||
| * questions. | ||
| */ | ||
|
|
||
| package com.sun.javafx.scene; | ||
|
|
||
| import com.sun.javafx.binding.ExpressionHelper; | ||
| import javafx.beans.InvalidationListener; | ||
| import javafx.beans.binding.BooleanExpression; | ||
| import javafx.beans.value.ChangeListener; | ||
| import javafx.scene.Node; | ||
| import javafx.scene.Scene; | ||
| import javafx.stage.Window; | ||
|
|
||
| /** | ||
| * Used to observe changes in tree showing status for a {@link Node}. For a Node's tree to be showing | ||
| * it must be visible, its ancestors must be visible, the node must be part of a {@link Scene} and | ||
| * the scene must have a {@link Window} which is currently showing.<p> | ||
| * | ||
| * This class provides the exact same functionality as {@link NodeHelper#isTreeShowing(Node)} in | ||
| * an observable form. | ||
| */ | ||
| public class TreeShowingExpression extends BooleanExpression { | ||
| private final ChangeListener<Boolean> windowShowingChangedListener = (obs, old, current) -> updateTreeShowing(); | ||
| private final ChangeListener<Window> sceneWindowChangedListener = (obs, old, current) -> windowChanged(old, current); | ||
| private final ChangeListener<Scene> nodeSceneChangedListener = (obs, old, current) -> sceneChanged(old, current); | ||
|
|
||
| private final Node node; | ||
|
|
||
| private ExpressionHelper<Boolean> helper; | ||
| private boolean valid; | ||
| private boolean treeShowing; | ||
|
|
||
| /** | ||
| * Constructs a new instance. | ||
| * | ||
| * @param node a {@link Node} for which the tree showing status should be observed, cannot be null | ||
| */ | ||
| public TreeShowingExpression(Node node) { | ||
| this.node = node; | ||
| this.node.sceneProperty().addListener(nodeSceneChangedListener); | ||
|
|
||
| NodeHelper.treeVisibleProperty(node).addListener(windowShowingChangedListener); | ||
|
|
||
| sceneChanged(null, node.getScene()); | ||
| } | ||
|
|
||
| /** | ||
| * Cleans up any listeners that this class may have registered on the {@link Node} | ||
| * that was supplied at construction. | ||
| */ | ||
| public void dispose() { | ||
| node.sceneProperty().removeListener(nodeSceneChangedListener); | ||
|
|
||
| NodeHelper.treeVisibleProperty(node).removeListener(windowShowingChangedListener); | ||
|
|
||
| valid = false; // prevents unregistration from triggering an invalidation notification | ||
| sceneChanged(node.getScene(), null); | ||
| } | ||
|
|
||
| @Override | ||
| public void addListener(InvalidationListener listener) { | ||
| helper = ExpressionHelper.addListener(helper, this, listener); | ||
| } | ||
|
|
||
| @Override | ||
| public void removeListener(InvalidationListener listener) { | ||
| helper = ExpressionHelper.removeListener(helper, listener); | ||
| } | ||
|
|
||
| @Override | ||
| public void addListener(ChangeListener<? super Boolean> listener) { | ||
| helper = ExpressionHelper.addListener(helper, this, listener); | ||
| } | ||
|
|
||
| @Override | ||
| public void removeListener(ChangeListener<? super Boolean> listener) { | ||
| helper = ExpressionHelper.removeListener(helper, listener); | ||
| } | ||
|
|
||
| protected void invalidate() { | ||
| if (valid) { | ||
| valid = false; | ||
| ExpressionHelper.fireValueChangedEvent(helper); | ||
| } | ||
| } | ||
|
|
||
| @Override | ||
| public boolean get() { | ||
| if (!valid) { | ||
| updateTreeShowing(); | ||
| valid = true; | ||
| } | ||
|
|
||
| return treeShowing; | ||
| } | ||
|
|
||
| private void sceneChanged(Scene oldScene, Scene newScene) { | ||
| if (oldScene != null) { | ||
| oldScene.windowProperty().removeListener(sceneWindowChangedListener); | ||
| } | ||
| if (newScene != null) { | ||
| newScene.windowProperty().addListener(sceneWindowChangedListener); | ||
| } | ||
|
|
||
| windowChanged( | ||
| oldScene == null ? null : oldScene.getWindow(), | ||
| newScene == null ? null : newScene.getWindow() | ||
| ); | ||
| } | ||
|
|
||
| private void windowChanged(Window oldWindow, Window newWindow) { | ||
| if (oldWindow != null) { | ||
| oldWindow.showingProperty().removeListener(windowShowingChangedListener); | ||
| } | ||
| if (newWindow != null) { | ||
| newWindow.showingProperty().addListener(windowShowingChangedListener); | ||
| } | ||
|
|
||
| updateTreeShowing(); | ||
| } | ||
|
|
||
| private void updateTreeShowing() { | ||
| boolean newValue = NodeHelper.isTreeShowing(node); | ||
|
|
||
| if (newValue != treeShowing) { | ||
| treeShowing = newValue; | ||
| invalidate(); | ||
| } | ||
| } | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.