blob: fde8a1618503956a187989ed69b745fc274193da [file] [log] [blame]
/**
* Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
* 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:
* Florian Pirchner - Initial implementation
*/
package org.eclipse.osbp.runtime.web.vaadin.databinding.component.internal;
import java.lang.reflect.Method;
import java.util.Arrays;
import org.eclipse.core.databinding.property.IProperty;
import org.eclipse.core.databinding.property.ISimplePropertyListener;
import org.eclipse.core.databinding.property.NativePropertyListener;
import com.vaadin.event.MethodEventSource;
import com.vaadin.ui.Component;
import com.vaadin.ui.Component.Event;
import com.vaadin.util.ReflectTools;
// TODO: Auto-generated Javadoc
/**
* The listener interface for receiving component events. The class that is
* interested in processing a component event implements this interface, and the
* object created with that class is registered with a component using the
* component's <code>addComponentListener</code> method. When
* the component event occurs, that object's appropriate
* method is invoked.
*
* @see #componentEvent
*/
@SuppressWarnings("serial")
public class ComponentListener extends NativePropertyListener implements
Component.Listener {
/** The Constant COMPONENT_EVENT_METHOD. */
public static final Method COMPONENT_EVENT_METHOD = ReflectTools
.findMethod(ComponentListener.class, "componentEvent",
Component.Event.class);
/** The change events. */
private final Class<? extends Component.Event>[] changeEvents;
/** The stale events. */
private final Class<? extends Component.Event>[] staleEvents;
/**
* Instantiates a new component listener.
*
* @param property
* the property
* @param listener
* the listener
* @param changeEvents
* the change events
* @param staleEvents
* the stale events
*/
public ComponentListener(IProperty property,
ISimplePropertyListener listener,
Class<? extends Component.Event>[] changeEvents,
Class<? extends Component.Event>[] staleEvents) {
super(property, listener);
this.changeEvents = Arrays.copyOf(changeEvents, changeEvents.length);
this.staleEvents = Arrays.copyOf(staleEvents, staleEvents.length);
}
/* (non-Javadoc)
* @see com.vaadin.ui.Component.Listener#componentEvent(com.vaadin.ui.Component.Event)
*/
@Override
public void componentEvent(com.vaadin.ui.Component.Event event) {
if (staleEvents != null) {
for (int i = 0; i < staleEvents.length; i++) {
if (event.getClass().isAssignableFrom(staleEvents[i])) {
fireStale(event.getComponent());
break;
}
}
}
if (changeEvents != null) {
for (int i = 0; i < changeEvents.length; i++) {
if (event.getClass().isAssignableFrom(changeEvents[i])) {
fireChange(event.getComponent(), null);
break;
}
}
}
}
/* (non-Javadoc)
* @see org.eclipse.core.databinding.property.NativePropertyListener#doAddTo(java.lang.Object)
*/
protected void doAddTo(Object source) {
Component widget = (Component) source;
if (changeEvents != null) {
for (int i = 0; i < changeEvents.length; i++) {
Class<? extends Event> event = changeEvents[i];
if (event != null) {
ComponentListenerUtil.asyncAddListener(
(MethodEventSource) widget, event, this,
COMPONENT_EVENT_METHOD);
}
}
}
if (staleEvents != null) {
for (int i = 0; i < staleEvents.length; i++) {
Class<? extends Event> event = staleEvents[i];
if (event != null) {
ComponentListenerUtil.asyncAddListener(
(MethodEventSource) widget, event, this,
COMPONENT_EVENT_METHOD);
}
}
}
}
/* (non-Javadoc)
* @see org.eclipse.core.databinding.property.NativePropertyListener#doRemoveFrom(java.lang.Object)
*/
protected void doRemoveFrom(Object source) {
Component widget = (Component) source;
if (changeEvents != null) {
for (int i = 0; i < changeEvents.length; i++) {
Class<? extends Event> event = changeEvents[i];
if (event != null) {
ComponentListenerUtil.asyncRemoveListener(
(MethodEventSource) widget, event, this,
COMPONENT_EVENT_METHOD);
}
}
}
if (staleEvents != null) {
for (int i = 0; i < staleEvents.length; i++) {
Class<? extends Event> event = staleEvents[i];
if (event != null) {
ComponentListenerUtil.asyncRemoveListener(
(MethodEventSource) widget, event, this,
COMPONENT_EVENT_METHOD);
}
}
}
}
}