package com.nokia.mid.ui.gestures; import java.util.Hashtable; import java.util.Vector; import com.sun.midp.events.*; class ZoneRegistration { public Object container; public GestureInteractiveZone zone; public ZoneRegistration(Object container, GestureInteractiveZone zone) { this.container = container; this.zone = zone; } } public class GestureRegistrationManager implements EventListener { public static final int MAX_SUPPORTED_GESTURE_INTERACTIVE_ZONES = 99; private static Vector zoneRegistrations = new Vector(); private static Hashtable listenerRegistrations = new Hashtable(); // http://developer.nokia.com/resources/library/Java/_zip/GUID-237420DE-CCBE-4A74-A129-572E0708D428/com/nokia/mid/ui/gestures/GestureEvent.html // The API imposes the restriction that the gesture event data is only valid during the call to // GestureListener.gestureAction(Object, GestureInteractiveZone, GestureEvent). private static GestureEventImpl gestureEvent = new GestureEventImpl(); static { EventQueue eventQueue = EventQueue.getEventQueue(); eventQueue.registerEventListener(EventTypes.GESTURE_EVENT, GestureRegistrationManager.getRegistrationManagerInstance()); } private static GestureRegistrationManager gestureRegistrationManager = null; private static GestureRegistrationManager getRegistrationManagerInstance() { if (gestureRegistrationManager == null) { gestureRegistrationManager = new GestureRegistrationManager(); } return gestureRegistrationManager; } public boolean preprocess(Event event, Event waitingEvent) { return true; } public void process(Event event) { gestureEvent.nativeEvent = (NativeEvent)event; for (int i = 0; i < zoneRegistrations.size(); i++) { ZoneRegistration zoneReg = (ZoneRegistration)zoneRegistrations.elementAt(i); GestureInteractiveZone zone = zoneReg.zone; if (!zone.contains(gestureEvent.getStartX(), gestureEvent.getStartY())) { continue; } if (!zone.supports(gestureEvent.getType())) { continue; } GestureListener listener = (GestureListener)listenerRegistrations.get(zoneReg.container); if (listener != null) { listener.gestureAction(zoneReg.container, zone, gestureEvent); } } } public static void setListener(Object container, GestureListener listener) throws IllegalArgumentException { if (listener != null) { listenerRegistrations.put(container, listener); } else { listenerRegistrations.remove(container); } } public static boolean register(Object container, GestureInteractiveZone gestureInteractiveZone) throws IllegalArgumentException { zoneRegistrations.addElement(new ZoneRegistration(container, gestureInteractiveZone)); return true; } public static void unregister(Object container, GestureInteractiveZone gestureInteractiveZone) throws IllegalArgumentException { for (int i = 0; i < zoneRegistrations.size(); i++) { ZoneRegistration zoneReg = (ZoneRegistration)zoneRegistrations.elementAt(i); if (zoneReg.zone == gestureInteractiveZone && zoneReg.container == container) { zoneRegistrations.removeElementAt(i); i -= 1; } } } public static void unregisterAll(Object container) throws IllegalArgumentException { for (int i = 0; i < zoneRegistrations.size(); i++) { ZoneRegistration zoneReg = (ZoneRegistration)zoneRegistrations.elementAt(i); if (zoneReg.container == container) { zoneRegistrations.removeElementAt(i); i -= 1; } } } native public static GestureInteractiveZone getInteractiveZone(Object container); }