blob: 9b69de51955ee9a5698c584774cd29fb1c4c3bef [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2008 Oracle. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0, which accompanies this distribution
* and is available at http://www.eclipse.org/legal/epl-v10.html.
*
* Contributors:
* Oracle - initial API and implementation
******************************************************************************/
package org.eclipse.jpt.utility.model.listener;
import java.lang.reflect.Method;
import org.eclipse.jpt.utility.internal.ClassTools;
import org.eclipse.jpt.utility.model.event.CollectionChangeEvent;
import org.eclipse.jpt.utility.model.event.ListChangeEvent;
import org.eclipse.jpt.utility.model.event.TreeChangeEvent;
/**
* This class is used by ReflectiveChangeListener when the requested listener
* needs to implement multiple methods (i.e. CollectionChangeListener,
* ListChangeListener, or TreeChangeListener).
*/
class MultiMethodReflectiveChangeListener
extends ReflectiveChangeListener
implements CollectionChangeListener, ListChangeListener, TreeChangeListener
{
/** the methods we will invoke on the target object */
private final Method addMethod;
private final Method removeMethod;
private final Method replaceMethod; // this can be null
private final Method moveMethod; // this can be null
private final Method clearMethod;
private final Method changeMethod;
/**
* The "replace" and "move" methods are optional.
*/
MultiMethodReflectiveChangeListener(Object target, Method addMethod, Method removeMethod, Method replaceMethod, Method moveMethod, Method clearMethod, Method changeMethod) {
super(target);
this.addMethod = addMethod;
this.removeMethod = removeMethod;
this.replaceMethod = replaceMethod;
this.moveMethod = moveMethod;
this.clearMethod = clearMethod;
this.changeMethod = changeMethod;
}
/**
* No "replace" or "move" methods.
*/
MultiMethodReflectiveChangeListener(Object target, Method addMethod, Method removeMethod, Method clearMethod, Method changeMethod) {
this(target, addMethod, removeMethod, null, null, clearMethod, changeMethod);
}
// ********** CollectionChangeListener implementation **********
private void invoke(Method method, CollectionChangeEvent event) {
if (method.getParameterTypes().length == 0) {
ClassTools.executeMethod(method, this.target, EMPTY_COLLECTION_CHANGE_EVENT_ARRAY);
} else {
ClassTools.executeMethod(method, this.target, new CollectionChangeEvent[] {event});
}
}
public void itemsAdded(CollectionChangeEvent event) {
this.invoke(this.addMethod, event);
}
public void itemsRemoved(CollectionChangeEvent event) {
this.invoke(this.removeMethod, event);
}
public void collectionCleared(CollectionChangeEvent event) {
this.invoke(this.clearMethod, event);
}
public void collectionChanged(CollectionChangeEvent event) {
this.invoke(this.changeMethod, event);
}
// ********** ListChangeListener implementation **********
private void invoke(Method method, ListChangeEvent event) {
if (method.getParameterTypes().length == 0) {
ClassTools.executeMethod(method, this.target, EMPTY_LIST_CHANGE_EVENT_ARRAY);
} else {
ClassTools.executeMethod(method, this.target, new ListChangeEvent[] {event});
}
}
public void itemsAdded(ListChangeEvent event) {
this.invoke(this.addMethod, event);
}
public void itemsRemoved(ListChangeEvent event) {
this.invoke(this.removeMethod, event);
}
public void itemsReplaced(ListChangeEvent event) {
this.invoke(this.replaceMethod, event);
}
public void itemsMoved(ListChangeEvent event) {
this.invoke(this.moveMethod, event);
}
public void listCleared(ListChangeEvent event) {
this.invoke(this.clearMethod, event);
}
public void listChanged(ListChangeEvent event) {
this.invoke(this.changeMethod, event);
}
// ********** TreeChangeListener implementation **********
private void invoke(Method method, TreeChangeEvent event) {
if (method.getParameterTypes().length == 0) {
ClassTools.executeMethod(method, this.target, EMPTY_TREE_CHANGE_EVENT_ARRAY);
} else {
ClassTools.executeMethod(method, this.target, new TreeChangeEvent[] {event});
}
}
public void nodeAdded(TreeChangeEvent event) {
this.invoke(this.addMethod, event);
}
public void nodeRemoved(TreeChangeEvent event) {
this.invoke(this.removeMethod, event);
}
public void treeCleared(TreeChangeEvent event) {
this.invoke(this.clearMethod, event);
}
public void treeChanged(TreeChangeEvent event) {
this.invoke(this.changeMethod, event);
}
}