| /******************************************************************************* |
| * 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); |
| } |
| |
| } |