--- old/modules/controls/src/main/java/com/sun/javafx/scene/control/skin/LabeledImpl.java 2015-09-03 15:16:23.447244600 -0700 +++ /dev/null 2015-09-03 15:16:24.000000000 -0700 @@ -1,153 +0,0 @@ -/* - * Copyright (c) 2011, 2013, 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. - */ - -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - -package com.sun.javafx.scene.control.skin; - -import javafx.beans.InvalidationListener; -import javafx.beans.Observable; -import javafx.scene.control.Label; -import javafx.scene.control.Labeled; - -import javafx.css.CssMetaData; -import javafx.css.StyleOrigin; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import javafx.css.Styleable; -import javafx.css.StyleableProperty; -import javafx.scene.layout.Region; - - -public class LabeledImpl extends Label { - - public LabeledImpl(final Labeled labeled) { - shuttler = new Shuttler(this, labeled); - } - private final Shuttler shuttler; - - private static void initialize(Shuttler shuttler, LabeledImpl labeledImpl, Labeled labeled) { - - labeledImpl.setText(labeled.getText()); - labeled.textProperty().addListener(shuttler); - - labeledImpl.setGraphic(labeled.getGraphic()); - labeled.graphicProperty().addListener(shuttler); - - final List> styleables = StyleableProperties.STYLEABLES_TO_MIRROR; - - for(int n=0, nMax=styleables.size(); n styleable = (CssMetaData)styleables.get(n); - - // the Labeled isn't necessarily a Label, so skip the skin or - // we'll get an argument type mismatch on the invocation of the - // skin constructor. - if ("-fx-skin".equals(styleable.getProperty())) continue; - - final StyleableProperty fromVal = styleable.getStyleableProperty(labeled); - if (fromVal instanceof Observable) { - // listen for changes to this property - ((Observable)fromVal).addListener(shuttler); - // set this LabeledImpl's property to the same value as the Labeled. - final StyleOrigin origin = fromVal.getStyleOrigin(); - if (origin == null) continue; - final StyleableProperty styleableProperty = styleable.getStyleableProperty(labeledImpl); - styleableProperty.applyStyle(origin, fromVal.getValue()); - } - } - } - - private static class Shuttler implements InvalidationListener { - - private final LabeledImpl labeledImpl; - private final Labeled labeled; - - Shuttler(LabeledImpl labeledImpl, Labeled labeled) { - this.labeledImpl = labeledImpl; - this.labeled = labeled; - initialize(this, labeledImpl, labeled); - - } - - @Override public void invalidated(Observable valueModel) { - - if (valueModel == labeled.textProperty()) { - labeledImpl.setText(labeled.getText()); - } else if (valueModel == labeled.graphicProperty()) { - // If the user set the graphic, then mirror that. - // Otherwise, the graphic was set via the imageUrlProperty which - // will be mirrored onto the labeledImpl by the next block. - StyleOrigin origin = ((StyleableProperty)labeled.graphicProperty()).getStyleOrigin(); - if (origin == null || origin == StyleOrigin.USER) { - labeledImpl.setGraphic(labeled.getGraphic()); - } - - } else if (valueModel instanceof StyleableProperty) { - StyleableProperty styleableProperty = (StyleableProperty)valueModel; - @SuppressWarnings("unchecked") - CssMetaData cssMetaData = (CssMetaData)styleableProperty.getCssMetaData(); - if (cssMetaData != null) { - StyleOrigin origin = styleableProperty.getStyleOrigin(); - StyleableProperty targetProperty = cssMetaData.getStyleableProperty(labeledImpl); - targetProperty.applyStyle(origin, styleableProperty.getValue()); - } - } - } - } - - /** Protected for unit test purposes */ - static final class StyleableProperties { - - static final List> STYLEABLES_TO_MIRROR; - static { - // - // We do this as we only want to mirror the Labeled's keys, - // none of Parent's, otherwise all of the properties on Parent, - // like opacity, would be applied twice (once to the Labeled and - // again to the LabeledImpl). - // - // Note, however, that this subset is not the list of properties - // for this LabeledImpl that can be styled. For that, we want all - // the properites that are inherited by virtue of LabeledImpl - // being a Label. This allows for the LabledImpl to be styled - // with styles like .menu-button .label { -fx-opacity: 80%; } - // If just this subset were returned (by impl_CSS_STYLEABLE) then - // -fx-opacity (for example) would be meaningless to the Labeled. - // - final List> labeledStyleables = Labeled.getClassCssMetaData(); - final List> parentStyleables = Region.getClassCssMetaData(); - final List> styleables = - new ArrayList>(labeledStyleables); - styleables.removeAll(parentStyleables); - STYLEABLES_TO_MIRROR = Collections.unmodifiableList(styleables); - } - } - -} --- /dev/null 2015-09-03 15:16:24.000000000 -0700 +++ new/modules/controls/src/main/java/com/sun/javafx/scene/control/LabeledImpl.java 2015-09-03 15:16:22.659199500 -0700 @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2011, 2013, 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. + */ + +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package com.sun.javafx.scene.control; + +import javafx.beans.InvalidationListener; +import javafx.beans.Observable; +import javafx.scene.control.Label; +import javafx.scene.control.Labeled; + +import javafx.css.CssMetaData; +import javafx.css.StyleOrigin; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import javafx.css.Styleable; +import javafx.css.StyleableProperty; +import javafx.scene.layout.Region; + + +public class LabeledImpl extends Label { + + public LabeledImpl(final Labeled labeled) { + shuttler = new Shuttler(this, labeled); + } + private final Shuttler shuttler; + + private static void initialize(Shuttler shuttler, LabeledImpl labeledImpl, Labeled labeled) { + + labeledImpl.setText(labeled.getText()); + labeled.textProperty().addListener(shuttler); + + labeledImpl.setGraphic(labeled.getGraphic()); + labeled.graphicProperty().addListener(shuttler); + + final List> styleables = StyleableProperties.STYLEABLES_TO_MIRROR; + + for(int n=0, nMax=styleables.size(); n styleable = (CssMetaData)styleables.get(n); + + // the Labeled isn't necessarily a Label, so skip the skin or + // we'll get an argument type mismatch on the invocation of the + // skin constructor. + if ("-fx-skin".equals(styleable.getProperty())) continue; + + final StyleableProperty fromVal = styleable.getStyleableProperty(labeled); + if (fromVal instanceof Observable) { + // listen for changes to this property + ((Observable)fromVal).addListener(shuttler); + // set this LabeledImpl's property to the same value as the Labeled. + final StyleOrigin origin = fromVal.getStyleOrigin(); + if (origin == null) continue; + final StyleableProperty styleableProperty = styleable.getStyleableProperty(labeledImpl); + styleableProperty.applyStyle(origin, fromVal.getValue()); + } + } + } + + private static class Shuttler implements InvalidationListener { + + private final LabeledImpl labeledImpl; + private final Labeled labeled; + + Shuttler(LabeledImpl labeledImpl, Labeled labeled) { + this.labeledImpl = labeledImpl; + this.labeled = labeled; + initialize(this, labeledImpl, labeled); + + } + + @Override public void invalidated(Observable valueModel) { + + if (valueModel == labeled.textProperty()) { + labeledImpl.setText(labeled.getText()); + } else if (valueModel == labeled.graphicProperty()) { + // If the user set the graphic, then mirror that. + // Otherwise, the graphic was set via the imageUrlProperty which + // will be mirrored onto the labeledImpl by the next block. + StyleOrigin origin = ((StyleableProperty)labeled.graphicProperty()).getStyleOrigin(); + if (origin == null || origin == StyleOrigin.USER) { + labeledImpl.setGraphic(labeled.getGraphic()); + } + + } else if (valueModel instanceof StyleableProperty) { + StyleableProperty styleableProperty = (StyleableProperty)valueModel; + @SuppressWarnings("unchecked") + CssMetaData cssMetaData = (CssMetaData)styleableProperty.getCssMetaData(); + if (cssMetaData != null) { + StyleOrigin origin = styleableProperty.getStyleOrigin(); + StyleableProperty targetProperty = cssMetaData.getStyleableProperty(labeledImpl); + targetProperty.applyStyle(origin, styleableProperty.getValue()); + } + } + } + } + + /** Protected for unit test purposes */ + static final class StyleableProperties { + + static final List> STYLEABLES_TO_MIRROR; + static { + // + // We do this as we only want to mirror the Labeled's keys, + // none of Parent's, otherwise all of the properties on Parent, + // like opacity, would be applied twice (once to the Labeled and + // again to the LabeledImpl). + // + // Note, however, that this subset is not the list of properties + // for this LabeledImpl that can be styled. For that, we want all + // the properites that are inherited by virtue of LabeledImpl + // being a Label. This allows for the LabledImpl to be styled + // with styles like .menu-button .label { -fx-opacity: 80%; } + // If just this subset were returned (by impl_CSS_STYLEABLE) then + // -fx-opacity (for example) would be meaningless to the Labeled. + // + final List> labeledStyleables = Labeled.getClassCssMetaData(); + final List> parentStyleables = Region.getClassCssMetaData(); + final List> styleables = + new ArrayList>(labeledStyleables); + styleables.removeAll(parentStyleables); + STYLEABLES_TO_MIRROR = Collections.unmodifiableList(styleables); + } + } + +}