1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage java.beans;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.ObjectInputStream;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.ObjectOutputStream;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.Serializable;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.ArrayList;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.HashMap;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Hashtable;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Iterator;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.List;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Map;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This utility class
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class PropertyChangeSupport implements Serializable {
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final long serialVersionUID = 6401253773779951803l;
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private transient Object sourceBean;
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private transient List<PropertyChangeListener> allPropertiesChangeListeners =
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            new ArrayList<PropertyChangeListener>();
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private transient Map<String, List<PropertyChangeListener>>
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            selectedPropertiesChangeListeners =
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            new HashMap<String, List<PropertyChangeListener>>();
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // fields for serialization compatibility
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private Hashtable<String, List<PropertyChangeListener>> children;
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private Object source;
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private int propertyChangeSupportSerializedDataVersion = 1;
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Creates a new instance that uses the source bean as source for any event.
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param sourceBean
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the bean used as source for all events.
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public PropertyChangeSupport(Object sourceBean) {
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (sourceBean == null) {
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException();
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.sourceBean = sourceBean;
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Fires a {@link PropertyChangeEvent} with the given name, old value and
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * new value. As source the bean used to initialize this instance is used.
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If the old value and the new value are not null and equal the event will
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * not be fired.
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param propertyName
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the name of the property
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param oldValue
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the old value of the property
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param newValue
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the new value of the property
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void firePropertyChange(String propertyName, Object oldValue,
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Object newValue) {
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        PropertyChangeEvent event = createPropertyChangeEvent(propertyName,
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                oldValue, newValue);
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        doFirePropertyChange(event);
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Fires an {@link IndexedPropertyChangeEvent} with the given name, old
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * value, new value and index. As source the bean used to initialize this
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instance is used. If the old value and the new value are not null and
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * equal the event will not be fired.
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param propertyName
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the name of the property
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the index
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param oldValue
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the old value of the property
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param newValue
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the new value of the property
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void fireIndexedPropertyChange(String propertyName, int index,
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Object oldValue, Object newValue) {
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // nulls and equals check done in doFire...
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        doFirePropertyChange(new IndexedPropertyChangeEvent(sourceBean,
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                propertyName, oldValue, newValue, index));
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Removes the listener from the specific property. This only happens if it
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * was registered to this property. Nothing happens if it was not
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * registered with this property or if the property name or the listener is
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * null.
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param propertyName
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the property name the listener is listening to
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param listener
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the listener to remove
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public synchronized void removePropertyChangeListener(String propertyName,
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            PropertyChangeListener listener) {
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if ((propertyName != null) && (listener != null)) {
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            List<PropertyChangeListener> listeners =
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    selectedPropertiesChangeListeners.get(propertyName);
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (listeners != null) {
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                listeners.remove(listener);
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Adds a listener to a specific property. Nothing happens if the property
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * name or the listener is null.
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param propertyName
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the name of the property
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param listener
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the listener to register for the property with the given name
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public synchronized void addPropertyChangeListener(String propertyName,
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            PropertyChangeListener listener) {
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if ((listener != null) && (propertyName != null)) {
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            List<PropertyChangeListener> listeners =
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    selectedPropertiesChangeListeners.get(propertyName);
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (listeners == null) {
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                listeners = new ArrayList<PropertyChangeListener>();
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                selectedPropertiesChangeListeners.put(propertyName, listeners);
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // RI compatibility
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (listener instanceof PropertyChangeListenerProxy) {
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                PropertyChangeListenerProxy proxy =
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        (PropertyChangeListenerProxy) listener;
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                listeners.add(new PropertyChangeListenerProxy(
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        proxy.getPropertyName(),
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        (PropertyChangeListener) proxy.getListener()));
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                listeners.add(listener);
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns an array of listeners that registered to the property with the
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * given name. If the property name is null an empty array is returned.
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param propertyName
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the name of the property whose listeners should be returned
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the array of listeners to the property with the given name.
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public synchronized PropertyChangeListener[] getPropertyChangeListeners(
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String propertyName) {
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        List<PropertyChangeListener> listeners = null;
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (propertyName != null) {
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            listeners = selectedPropertiesChangeListeners.get(propertyName);
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (listeners == null) ? new PropertyChangeListener[] {}
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                : listeners.toArray(
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        new PropertyChangeListener[listeners.size()]);
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Fires a property change of a boolean property with the given name. If the
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * old value and the new value are not null and equal the event will not be
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fired.
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param propertyName
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the property name
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param oldValue
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the old value
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param newValue
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the new value
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void firePropertyChange(String propertyName, boolean oldValue,
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            boolean newValue) {
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        PropertyChangeEvent event = createPropertyChangeEvent(propertyName,
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                oldValue, newValue);
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        doFirePropertyChange(event);
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Fires a property change of a boolean property with the given name. If the
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * old value and the new value are not null and equal the event will not be
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * fired.
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param propertyName
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the property name
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the index of the changed property
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param oldValue
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the old value
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param newValue
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the new value
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void fireIndexedPropertyChange(String propertyName, int index,
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            boolean oldValue, boolean newValue) {
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (oldValue != newValue) {
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fireIndexedPropertyChange(propertyName, index, Boolean
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    .valueOf(oldValue), Boolean.valueOf(newValue));
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Fires a property change of an integer property with the given name. If
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the old value and the new value are not null and equal the event will not
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * be fired.
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param propertyName
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the property name
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param oldValue
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the old value
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param newValue
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the new value
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void firePropertyChange(String propertyName, int oldValue,
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int newValue) {
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        PropertyChangeEvent event = createPropertyChangeEvent(propertyName,
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                oldValue, newValue);
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        doFirePropertyChange(event);
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Fires a property change of an integer property with the given name. If
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the old value and the new value are not null and equal the event will not
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * be fired.
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param propertyName
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the property name
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param index
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the index of the changed property
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param oldValue
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the old value
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param newValue
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the new value
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void fireIndexedPropertyChange(String propertyName, int index,
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int oldValue, int newValue) {
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (oldValue != newValue) {
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fireIndexedPropertyChange(propertyName, index,
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    new Integer(oldValue), new Integer(newValue));
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns true if there are listeners registered to the property with the
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * given name.
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param propertyName
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the name of the property
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return true if there are listeners registered to that property, false
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         otherwise.
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public synchronized boolean hasListeners(String propertyName) {
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        boolean result = allPropertiesChangeListeners.size() > 0;
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!result && (propertyName != null)) {
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            List<PropertyChangeListener> listeners =
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    selectedPropertiesChangeListeners.get(propertyName);
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (listeners != null) {
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                result = listeners.size() > 0;
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result;
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * removes a property change listener that was registered to all properties.
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param listener
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the listener to remove
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public synchronized void removePropertyChangeListener(
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            PropertyChangeListener listener) {
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (listener != null) {
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (listener instanceof PropertyChangeListenerProxy) {
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                String name = ((PropertyChangeListenerProxy) listener)
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .getPropertyName();
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                PropertyChangeListener lst = (PropertyChangeListener)
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        ((PropertyChangeListenerProxy) listener).getListener();
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                removePropertyChangeListener(name, lst);
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                allPropertiesChangeListeners.remove(listener);
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Registers a listener with all properties.
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param listener
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the listener to register
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public synchronized void addPropertyChangeListener(
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            PropertyChangeListener listener) {
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (listener != null) {
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (listener instanceof PropertyChangeListenerProxy) {
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                String name = ((PropertyChangeListenerProxy) listener)
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .getPropertyName();
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                PropertyChangeListener lst = (PropertyChangeListener)
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        ((PropertyChangeListenerProxy) listener).getListener();
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                addPropertyChangeListener(name, lst);
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                allPropertiesChangeListeners.add(listener);
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns an array with the listeners that registered to all properties.
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the array of listeners
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public synchronized PropertyChangeListener[] getPropertyChangeListeners() {
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ArrayList<PropertyChangeListener> result =
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new ArrayList<PropertyChangeListener>(
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        allPropertiesChangeListeners);
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (String propertyName : selectedPropertiesChangeListeners.keySet()) {
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            List<PropertyChangeListener> selectedListeners =
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    selectedPropertiesChangeListeners.get(propertyName);
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (selectedListeners != null) {
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (PropertyChangeListener listener : selectedListeners) {
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    result.add(new PropertyChangeListenerProxy(propertyName,
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            listener));
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result.toArray(new PropertyChangeListener[result.size()]);
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void writeObject(ObjectOutputStream oos) throws IOException {
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        List<PropertyChangeListener> allSerializedPropertiesChangeListeners =
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                new ArrayList<PropertyChangeListener>();
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (PropertyChangeListener pcl : allPropertiesChangeListeners) {
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (pcl instanceof Serializable) {
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                allSerializedPropertiesChangeListeners.add(pcl);
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Map<String, List<PropertyChangeListener>>
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                selectedSerializedPropertiesChangeListeners =
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        new HashMap<String, List<PropertyChangeListener>>();
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (String propertyName : selectedPropertiesChangeListeners.keySet()) {
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            List<PropertyChangeListener> keyValues =
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    selectedPropertiesChangeListeners.get(propertyName);
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (keyValues != null) {
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                List<PropertyChangeListener> serializedPropertiesChangeListeners
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        = new ArrayList<PropertyChangeListener>();
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (PropertyChangeListener pcl : keyValues) {
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (pcl instanceof Serializable) {
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        serializedPropertiesChangeListeners.add(pcl);
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (!serializedPropertiesChangeListeners.isEmpty()) {
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    selectedSerializedPropertiesChangeListeners.put(
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            propertyName, serializedPropertiesChangeListeners);
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        children = new Hashtable<String, List<PropertyChangeListener>>(
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                selectedSerializedPropertiesChangeListeners);
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        children.put("", allSerializedPropertiesChangeListeners); //$NON-NLS-1$
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        oos.writeObject(children);
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object source = null;
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (sourceBean instanceof Serializable) {
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            source = sourceBean;
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        oos.writeObject(source);
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        oos.writeInt(propertyChangeSupportSerializedDataVersion);
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void readObject(ObjectInputStream ois) throws IOException,
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ClassNotFoundException {
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        children = (Hashtable<String, List<PropertyChangeListener>>) ois
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                .readObject();
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        selectedPropertiesChangeListeners = new HashMap<String, List<PropertyChangeListener>>(
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                children);
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        allPropertiesChangeListeners = selectedPropertiesChangeListeners
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                .remove(""); //$NON-NLS-1$
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (allPropertiesChangeListeners == null) {
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            allPropertiesChangeListeners = new ArrayList<PropertyChangeListener>();
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sourceBean = ois.readObject();
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        propertyChangeSupportSerializedDataVersion = ois.readInt();
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Fires a property change event to all listeners of that property.
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param event
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the event to fire
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void firePropertyChange(PropertyChangeEvent event) {
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        doFirePropertyChange(event);
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private PropertyChangeEvent createPropertyChangeEvent(String propertyName,
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Object oldValue, Object newValue) {
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new PropertyChangeEvent(sourceBean, propertyName, oldValue,
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                newValue);
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private PropertyChangeEvent createPropertyChangeEvent(String propertyName,
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            boolean oldValue, boolean newValue) {
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new PropertyChangeEvent(sourceBean, propertyName, oldValue,
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                newValue);
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private PropertyChangeEvent createPropertyChangeEvent(String propertyName,
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int oldValue, int newValue) {
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new PropertyChangeEvent(sourceBean, propertyName, oldValue,
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                newValue);
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void doFirePropertyChange(PropertyChangeEvent event) {
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String propertyName = event.getPropertyName();
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object oldValue = event.getOldValue();
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object newValue = event.getNewValue();
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if ((newValue != null) && (oldValue != null)
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                && newValue.equals(oldValue)) {
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Copy the listeners collections so they can be modified while we fire
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * events.
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Listeners to all property change events
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        PropertyChangeListener[] listensToAll;
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Listens to a given property change
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        PropertyChangeListener[] listensToOne = null;
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        synchronized (this) {
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            listensToAll = allPropertiesChangeListeners
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    .toArray(new PropertyChangeListener[allPropertiesChangeListeners
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            .size()]);
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            List<PropertyChangeListener> listeners = selectedPropertiesChangeListeners
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    .get(propertyName);
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (listeners != null) {
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                listensToOne = listeners
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .toArray(new PropertyChangeListener[listeners.size()]);
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Fire the listeners
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (PropertyChangeListener listener : listensToAll) {
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            listener.propertyChange(event);
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (listensToOne != null) {
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (PropertyChangeListener listener : listensToOne) {
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                listener.propertyChange(event);
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
502