![JAR search and dependency download from the Maven repository](/logo.png)
org.eclipse.swt.widgets.EventTable Maven / Gradle / Ivy
/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.swt.widgets;
import org.eclipse.rap.rwt.scripting.ClientListener;
import org.eclipse.swt.SWT;
import org.eclipse.swt.internal.SWTEventListener;
import org.eclipse.swt.internal.SerializableCompatibility;
import org.eclipse.swt.internal.events.EventLCAUtil;
/**
* Instances of this class implement a simple look up mechanism that maps an event type to a
* listener. Multiple listeners for the same event type are supported.
*/
// copied from SWT
@SuppressWarnings( "all" )
class EventTable implements SerializableCompatibility {
private static final Listener[] EMPTY_LISTENERS = new Listener[ 0 ];
private static final int GROW_SIZE = 4;
private int[] types;
private Listener[] listeners;
private int level;
public Listener[] getListeners( int eventType ) {
if( types == null ) {
return EMPTY_LISTENERS;
}
int count = 0;
for( int i = 0; i < types.length; i++ ) {
if( types[ i ] == eventType ) {
count++ ;
}
}
if( count == 0 ) {
return EMPTY_LISTENERS;
}
Listener[] result = new Listener[ count ];
count = 0;
for( int i = 0; i < types.length; i++ ) {
if( types[ i ] == eventType ) {
result[ count++ ] = listeners[ i ];
}
}
return result;
}
public void hook( int eventType, Listener listener ) {
if( types == null ) {
types = new int[ GROW_SIZE ];
}
if( listeners == null ) {
listeners = new Listener[ GROW_SIZE ];
}
int length = types.length, index = length - 1;
while( index >= 0 ) {
if( types[ index ] != 0 ) {
break;
}
--index;
}
index++ ;
if( index == length ) {
int[] newTypes = new int[ length + GROW_SIZE ];
System.arraycopy( types, 0, newTypes, 0, length );
types = newTypes;
Listener[] newListeners = new Listener[ length + GROW_SIZE ];
System.arraycopy( listeners, 0, newListeners, 0, length );
listeners = newListeners;
}
types[ index ] = eventType;
listeners[ index ] = listener;
}
public boolean hooks( int eventType ) {
if( types == null ) {
return false;
}
for( int i = 0; i < types.length; i++ ) {
if( types[ i ] == eventType ) {
return true;
}
}
return false;
}
public void sendEvent( Event event ) {
if( types == null ) {
return;
}
level += level >= 0 ? 1 : -1;
try {
for( int i = 0; i < types.length; i++ ) {
if( event.type == SWT.None ) {
return;
}
if( types[ i ] == event.type ) {
Listener listener = listeners[ i ];
if( listener != null ) {
listener.handleEvent( event );
}
}
}
} finally {
boolean compact = level < 0;
level -= level >= 0 ? 1 : -1;
if( compact && level == 0 ) {
int index = 0;
for( int i = 0; i < types.length; i++ ) {
if( types[ i ] != 0 ) {
types[ index ] = types[ i ];
listeners[ index ] = listeners[ i ];
index++ ;
}
}
for( int i = index; i < types.length; i++ ) {
types[ i ] = 0;
listeners[ i ] = null;
}
}
}
}
public int size() {
if( types == null ) {
return 0;
}
int count = 0;
for( int i = 0; i < types.length; i++ ) {
if( types[ i ] != 0 ) {
count++ ;
}
}
return count;
}
private void remove( int index ) {
if( level == 0 ) {
int end = types.length - 1;
System.arraycopy( types, index + 1, types, index, end - index );
System.arraycopy( listeners, index + 1, listeners, index, end - index );
index = end;
} else {
if( level > 0 ) {
level = -level;
}
}
types[ index ] = 0;
listeners[ index ] = null;
}
public void unhook( int eventType, Listener listener ) {
if( types == null ) {
return;
}
for( int i = 0; i < types.length; i++ ) {
if( types[ i ] == eventType && listeners[ i ] == listener ) {
remove( i );
return;
}
}
}
public void unhook( int eventType, SWTEventListener listener ) {
if( types == null ) {
return;
}
for( int i = 0; i < types.length; i++ ) {
if( types[ i ] == eventType ) {
if( listeners[ i ] instanceof TypedListener ) {
TypedListener typedListener = ( TypedListener )listeners[ i ];
if( typedListener.getEventListener() == listener ) {
remove( i );
return;
}
}
}
}
}
public long getEventList() {
long result = 0;
if( types != null ) {
for( int i = 0; i < types.length; i++ ) {
int type = types[ i ];
Listener listener = listeners[ i ];
if( !( listener instanceof ClientListener ) ) {
result |= EventLCAUtil.getEventMask( type );
}
}
}
return result;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy