1 /* 2 * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 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 com.apple.laf; 27 28 import java.beans.*; 29 import java.util.*; 30 31 import javax.swing.JComponent; 32 33 public class ClientPropertyApplicator<T extends JComponent, N> implements PropertyChangeListener { 34 private final Map<String, Property<N>> properties = new HashMap<String, Property<N>>(); 35 ClientPropertyApplicator(final Property<N>... propertyList)36 public ClientPropertyApplicator(final Property<N>... propertyList) { 37 for (final Property<N> p : propertyList) { 38 properties.put(p.name, p); 39 } 40 } 41 applyProperty(final N target, final String propName, final Object value)42 void applyProperty(final N target, final String propName, final Object value) { 43 final Property<N> property = properties.get(propName); 44 if (property != null) { 45 property.applyProperty(target, value); 46 } 47 } 48 attachAndApplyClientProperties(final T target)49 public void attachAndApplyClientProperties(final T target) { 50 target.addPropertyChangeListener(this); 51 final N obj = convertJComponentToTarget(target); 52 if (obj == null) { 53 return; 54 } 55 56 final Set<String> propNames = properties.keySet(); 57 for (final String propName : propNames) { 58 final Object value = target.getClientProperty(propName); 59 if (value == null) { 60 continue; 61 } 62 applyProperty(obj, propName, value); 63 } 64 } 65 removeFrom(final T target)66 public void removeFrom(final T target) { 67 target.removePropertyChangeListener(this); 68 } 69 70 @Override 71 @SuppressWarnings("unchecked") propertyChange(final PropertyChangeEvent evt)72 public void propertyChange(final PropertyChangeEvent evt) { 73 final N obj = convertJComponentToTarget((T)evt.getSource()); 74 if (obj == null) return; 75 applyProperty(obj, evt.getPropertyName(), evt.getNewValue()); 76 } 77 78 @SuppressWarnings("unchecked") convertJComponentToTarget(final T component)79 public N convertJComponentToTarget(final T component) { 80 return (N)component; // naive implementation 81 } 82 83 public abstract static class Property<X> { 84 final String name; 85 Property(final String name)86 public Property(final String name) { 87 this.name = name; 88 } 89 applyProperty(final X target, final Object value)90 public abstract void applyProperty(final X target, final Object value); 91 } 92 } 93