/**
* Copyright 2014 SMEdit https://github.com/StarMade/SMEdit SMTools
* https://github.com/StarMade/SMTools
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*
*/
package jo.sm.data;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import jo.sm.logic.utils.BeanUtils;
public class PCSBean extends Bean {
public static boolean debug = false;
private static final Logger log = Logger.getLogger(PCSBean.class.getName());
private final List<PropertyChangeListener> mGenericListeners;
private final Map<String, List<PropertyChangeListener>> mSpecificListerners;
private PropertyChangeEvent queueEvent;
// constructor
public PCSBean() {
mGenericListeners = new ArrayList<>();
mSpecificListerners = new HashMap<>();
}
private String shortName(Object o) {
Class<?> c;
if (o instanceof Class) {
c = (Class<?>) o;
} else {
c = o.getClass();
}
String ret = c.getName();
int off = ret.lastIndexOf(".");
return ret.substring(off + 1);
}
// listeners
public void addPropertyChangeListener(String prop, PropertyChangeListener pcl) {
if (pcl == null) {
log.log(Level.WARNING, "addPropertyChangeListener - WTF???");
}
synchronized (mSpecificListerners) {
List<PropertyChangeListener> listeners = mSpecificListerners.get(prop);
if (listeners == null) {
listeners = new ArrayList<>();
mSpecificListerners.put(prop, listeners);
}
listeners.add(pcl);
}
if (debug) {
System.out.println(shortName(pcl) + " hears change on " + shortName(this) + " for " + queueEvent.getPropertyName());
}
}
public void addPropertyChangeListener(java.beans.PropertyChangeListener pcl) {
if (pcl == null) {
System.out.println("addPropertyChangeListener - wtf???");
}
synchronized (mGenericListeners) {
mGenericListeners.add(pcl);
}
if (debug) {
System.out.println(shortName(pcl) + " hears change on " + shortName(this) + " for " + queueEvent.getPropertyName());
}
}
public void removePropertyChangeListener(java.beans.PropertyChangeListener pcl) {
synchronized (mGenericListeners) {
mGenericListeners.remove(pcl);
}
synchronized (mSpecificListerners) {
for (List<PropertyChangeListener> listeners : mSpecificListerners.values()) {
listeners.remove(pcl);
}
}
if (debug) {
System.out.println(shortName(pcl) + " hears change on " + shortName(this) + " for " + queueEvent.getPropertyName());
}
}
protected void queuePropertyChange(String name, Object oldVal, Object newVal) {
queueEvent = new PropertyChangeEvent(this, name, oldVal, newVal);
}
protected void queuePropertyChange(String name, int oldVal, int newVal) {
queueEvent = new PropertyChangeEvent(this, name, oldVal, newVal);
}
protected void queuePropertyChange(String name, long oldVal, long newVal) {
queueEvent = new PropertyChangeEvent(this, name, oldVal, newVal);
}
protected void queuePropertyChange(String name, double oldVal, double newVal) {
queueEvent = new PropertyChangeEvent(this, name, oldVal, newVal);
}
protected void queuePropertyChange(String name, boolean oldVal, boolean newVal) {
queueEvent = new PropertyChangeEvent(this, name, oldVal, newVal);
}
private PropertyChangeListener[] getPropertyChangeListeners(String prop) {
Object[] list1;
synchronized (mGenericListeners) {
list1 = mGenericListeners.toArray();
}
Object[] list2;
synchronized (mSpecificListerners) {
List<PropertyChangeListener> listeners = mSpecificListerners.get(prop);
if (listeners != null) {
list2 = listeners.toArray();
} else {
list2 = new Object[0];
}
}
PropertyChangeListener[] ret = new PropertyChangeListener[list1.length + list2.length];
System.arraycopy(list1, 0, ret, 0, list1.length);
System.arraycopy(list2, 0, ret, list1.length, list2.length);
return ret;
}
protected void firePropertyChange() {
PropertyChangeListener[] pcls = getPropertyChangeListeners(queueEvent.getPropertyName());
PropertyChangeEvent ev = queueEvent;
queueEvent = null;
for (PropertyChangeListener pcl : pcls) {
if (debug) {
System.out.println(shortName(pcl) + " hears change on " + shortName(this) + " for " + queueEvent.getPropertyName());
}
pcl.propertyChange(ev);
}
}
public void fireMonotonicPropertyChange(String name, Object val) {
queuePropertyChange(name, null, val);
firePropertyChange();
}
public void fireMonotonicPropertyChange(String name) {
Object val = BeanUtils.get(this, name);
fireMonotonicPropertyChange(name, val);
}
}