| /******************************************************************************* |
| * Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) 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: |
| * Soyatec - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.xwt.javabean; |
| |
| import java.lang.reflect.Field; |
| import java.lang.reflect.Method; |
| |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.widgets.Event; |
| import org.eclipse.swt.widgets.Listener; |
| import org.eclipse.swt.widgets.Widget; |
| import org.eclipse.xwt.IEventConstants; |
| import org.eclipse.xwt.IEventInvoker; |
| import org.eclipse.xwt.XWTMaps; |
| import org.eclipse.xwt.internal.core.IEventController; |
| import org.eclipse.xwt.metadata.IEvent; |
| |
| public class Controller implements Listener, IEventController { |
| int waterMark = 0; |
| protected int[] eventTypes = null; |
| protected String[] names = null; |
| protected Object[] handlers = null; |
| protected Object[] receivers = null; |
| protected Object[] args = null; |
| |
| protected void fireEvent(Event e) { |
| int eventType = e.type; |
| if (eventTypes == null) { |
| return; |
| } |
| |
| for (int i = 0; i < eventTypes.length; i++) { |
| if (eventTypes[i] == eventType) { |
| Object handler = handlers[i]; |
| if (handler instanceof IEventInvoker) { |
| IEventInvoker eventInvoker = (IEventInvoker) handler; |
| try { |
| eventInvoker.invoke(args[i], e); |
| } catch (Exception e1) { |
| e1.printStackTrace(); |
| return; |
| } |
| } else { |
| Method method = (Method) handler; |
| try { |
| method.setAccessible(true); |
| // support old style |
| if (method.getParameterTypes().length == 1) { |
| method.invoke(receivers[i], e); |
| } else if (method.getParameterTypes().length == 0) { |
| method.invoke(receivers[i]); |
| } else { |
| method.invoke(receivers[i], args[i], e); |
| } |
| } catch (Exception e1) { |
| e1.printStackTrace(); |
| return; |
| } |
| } |
| } |
| } |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.xwt.javabean.IEventHandler#hasEvent(java.lang.Object, |
| * org.eclipse.xwt.metadata.IEvent) |
| */ |
| public boolean hasEvent(Object receiver, IEvent event) { |
| if (receivers == null) { |
| return false; |
| } |
| for (int i = 0; i < receivers.length; i++) { |
| if (receivers[i] == receiver |
| && names[i].equalsIgnoreCase(event.getName())) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.xwt.javabean.IEventHandler#addEvent(int, |
| * java.lang.String, org.eclipse.xwt.metadata.IEvent, |
| * org.eclipse.swt.widgets.Widget, java.lang.Object, java.lang.Object, |
| * java.lang.reflect.Method) |
| */ |
| public void addEvent(int eventType, String name, IEvent event, |
| Widget control, Object receiver, Object arg, Method method) { |
| doAddEvent(eventType, name, event, control, receiver, arg, method); |
| } |
| |
| public void addEvent(int eventType, String name, IEvent event, |
| Widget control, Object arg, IEventInvoker eventInvoker) { |
| doAddEvent(eventType, name, event, control, null, arg, eventInvoker); |
| } |
| |
| protected void doAddEvent(int eventType, String name, IEvent event, |
| Widget control, Object receiver, Object arg, Object method) { |
| if (eventTypes == null) { |
| eventTypes = new int[3]; |
| handlers = new Method[3]; |
| names = new String[3]; |
| receivers = new Object[3]; |
| args = new Object[3]; |
| } else { |
| for (int i = 0; i < eventTypes.length; i++) { |
| if (eventTypes[i] == eventType && handlers[i] == method |
| && receivers[i] == receivers && args[i] == arg) { |
| return; |
| } |
| } |
| } |
| if (waterMark >= eventTypes.length) { |
| int[] oldEventTypes = eventTypes; |
| Object[] oldHandlers = handlers; |
| Object[] oldReceivers = receivers; |
| Object[] oldNames = names; |
| Object[] oldArgs = args; |
| |
| eventTypes = new int[waterMark + 3]; |
| handlers = new Object[waterMark + 3]; |
| receivers = new Object[waterMark + 3]; |
| names = new String[waterMark + 3]; |
| args = new Object[waterMark + 3]; |
| |
| System.arraycopy(oldEventTypes, 0, eventTypes, 0, waterMark); |
| System.arraycopy(oldHandlers, 0, handlers, 0, waterMark); |
| System.arraycopy(oldReceivers, 0, receivers, 0, waterMark); |
| System.arraycopy(oldArgs, 0, args, 0, waterMark); |
| System.arraycopy(oldNames, 0, names, 0, waterMark); |
| } |
| |
| eventTypes[waterMark] = eventType; |
| handlers[waterMark] = method; |
| receivers[waterMark] = receiver; |
| args[waterMark] = arg; |
| names[waterMark++] = name; |
| |
| if (eventType == IEventConstants.XWT_SWT_LOADED) { |
| int swt_paint = XWTMaps.getEvent("swt.paint"); |
| if (swt_paint != SWT.None) { // for RAP integration |
| Listener[] listeners = control.getListeners(swt_paint); |
| if (listeners.length > 0) { |
| for (Listener listener : listeners) { |
| control.removeListener(swt_paint, listener); |
| } |
| control.addListener(swt_paint, new LoadedEventListener( |
| control)); |
| for (Listener listener : listeners) { |
| control.addListener(swt_paint, listener); |
| } |
| } else { |
| control.addListener(swt_paint, new LoadedEventListener( |
| control)); |
| } |
| } |
| } |
| control.addListener(eventType, this); |
| } |
| |
| class LoadedEventListener implements Listener { |
| protected Widget control; |
| |
| public LoadedEventListener(Widget control) { |
| this.control = control; |
| } |
| |
| public void handleEvent(Event event) { |
| Event loadedEvent = copy(event); |
| loadedEvent.type = IEventConstants.XWT_SWT_LOADED; |
| if (XWTMaps.getEvent("swt.paint") != SWT.None) { |
| control.removeListener(XWTMaps.getEvent("swt.paint"), this); |
| } |
| Controller.this.handleEvent(loadedEvent); |
| } |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see |
| * org.eclipse.xwt.javabean.IEventHandler#setEvent(org.eclipse.xwt |
| * .metadata.IEvent, org.eclipse.swt.widgets.Widget, java.lang.Object, |
| * java.lang.Object, java.lang.reflect.Method) |
| */ |
| public void setEvent(IEvent event, Widget control, Object receiver, |
| Object arg, Method method) { |
| String name = event.getName(); |
| int eventType = getEventTypeByName(name); |
| if (eventType != SWT.None) { |
| addEvent(eventType, name, event, control, receiver, arg, method); |
| } |
| } |
| |
| public void setEvent(IEvent event, Widget control, Object arg, |
| IEventInvoker eventInvoker) { |
| String name = event.getName(); |
| int eventType = getEventTypeByName(name); |
| if (eventType != SWT.None) { |
| doAddEvent(eventType, name, event, control, null, arg, eventInvoker); |
| } |
| } |
| |
| public static Event copy(Event event) { |
| Event copyEvent = new Event(); |
| for (Field field : event.getClass().getDeclaredFields()) { |
| try { |
| field.set(copyEvent, field.get(event)); |
| } catch (Exception e) { |
| e.printStackTrace(); |
| } |
| } |
| return copyEvent; |
| } |
| |
| public static int getEventTypeByName(String name) { |
| if (IEventConstants.KEY_DOWN.equalsIgnoreCase(name)) { |
| return SWT.KeyDown; |
| } else if (IEventConstants.KEY_UP.equalsIgnoreCase(name)) { |
| return SWT.KeyUp; |
| } else if (IEventConstants.MOUSE_DOWN.equalsIgnoreCase(name)) { |
| return SWT.MouseDown; |
| } else if (IEventConstants.MOUSE_UP.equalsIgnoreCase(name)) { |
| return SWT.MouseUp; |
| } else if (IEventConstants.MOUSE_MOVE.equalsIgnoreCase(name)) { |
| return XWTMaps.getEvent("swt.mousemove"); |
| } else if (IEventConstants.MOUSE_ENTER.equalsIgnoreCase(name)) { |
| return XWTMaps.getEvent("swt.mouseenter"); |
| } else if (IEventConstants.MOUSE_EXIT.equalsIgnoreCase(name)) { |
| return XWTMaps.getEvent("swt.mouseexit"); |
| } else if (IEventConstants.MOUSE_DOUBLE_CLICK.equalsIgnoreCase(name)) { |
| return SWT.MouseDoubleClick; |
| } else if (IEventConstants.PAINT.equalsIgnoreCase(name)) { |
| return XWTMaps.getEvent("swt.paint"); |
| } else if (IEventConstants.MOVE.equalsIgnoreCase(name)) { |
| return SWT.Move; |
| } else if (IEventConstants.RESIZE.equalsIgnoreCase(name)) { |
| return SWT.Resize; |
| } else if (IEventConstants.DISPOSE.equalsIgnoreCase(name)) { |
| return SWT.Dispose; |
| } else if (IEventConstants.SELECTION.equalsIgnoreCase(name)) { |
| return SWT.Selection; |
| } else if (IEventConstants.DEFAULT_SELECTION.equalsIgnoreCase(name)) { |
| return SWT.DefaultSelection; |
| } else if (IEventConstants.FOCUS_IN.equalsIgnoreCase(name)) { |
| return SWT.FocusIn; |
| } else if (IEventConstants.FOCUS_OUT.equalsIgnoreCase(name)) { |
| return SWT.FocusOut; |
| } else if (IEventConstants.EXPAND.equalsIgnoreCase(name)) { |
| return SWT.Expand; |
| } else if (IEventConstants.COLLAPSE.equalsIgnoreCase(name)) { |
| return SWT.Collapse; |
| } else if (IEventConstants.ICONIFY.equalsIgnoreCase(name)) { |
| return XWTMaps.getEvent("swt.iconify"); |
| } else if (IEventConstants.DEICONIFY.equalsIgnoreCase(name)) { |
| return XWTMaps.getEvent("swt.deiconify"); |
| } else if (IEventConstants.CLOSE.equalsIgnoreCase(name)) { |
| return SWT.Close; |
| } else if (IEventConstants.SHOW.equalsIgnoreCase(name)) { |
| return SWT.Show; |
| } else if (IEventConstants.HIDE.equalsIgnoreCase(name)) { |
| return SWT.Hide; |
| } else if (IEventConstants.MODIFY.equalsIgnoreCase(name)) { |
| return SWT.Modify; |
| } else if (IEventConstants.VERIFY.equalsIgnoreCase(name)) { |
| return SWT.Verify; |
| } else if (IEventConstants.ACTIVATE.equalsIgnoreCase(name)) { |
| return SWT.Activate; |
| } else if (IEventConstants.DEACTIVATE.equalsIgnoreCase(name)) { |
| return SWT.Deactivate; |
| } else if (IEventConstants.HELP.equalsIgnoreCase(name)) { |
| return SWT.Help; |
| } else if (IEventConstants.DRAG_SELECT.equalsIgnoreCase(name)) { |
| return SWT.DragDetect; |
| } else if (IEventConstants.ARM.equalsIgnoreCase(name)) { |
| return SWT.Arm; |
| } else if (IEventConstants.TRAVERSE.equalsIgnoreCase(name)) { |
| return SWT.Traverse; |
| } else if (IEventConstants.MOUSE_HOVER.equalsIgnoreCase(name)) { |
| return XWTMaps.getEvent("swt.mousehover"); |
| } else if (IEventConstants.HARD_KEY_DOWN.equalsIgnoreCase(name)) { |
| return XWTMaps.getEvent("swt.hardkeydown"); |
| } else if (IEventConstants.HARD_KEY_UP.equalsIgnoreCase(name)) { |
| return XWTMaps.getEvent("swt.hardkeyup"); |
| } else if (IEventConstants.MENU_DETECT.equalsIgnoreCase(name)) { |
| return SWT.MenuDetect; |
| } else if (IEventConstants.MOUSE_WHEEL.equalsIgnoreCase(name)) { |
| return XWTMaps.getEvent("swt.mousewheel"); |
| } else if (IEventConstants.SETTINGS.equalsIgnoreCase(name)) { |
| return XWTMaps.getEvent("swt.settings"); |
| } else if (IEventConstants.ERASE_ITEM.equalsIgnoreCase(name)) { |
| return XWTMaps.getEvent("swt.eraseitem"); |
| } else if (IEventConstants.MEASURE_ITEM.equalsIgnoreCase(name)) { |
| return XWTMaps.getEvent("swt.measureitem"); |
| } else if (IEventConstants.PAINT_ITEM.equalsIgnoreCase(name)) { |
| return XWTMaps.getEvent("swt.paintitem"); |
| } else if (IEventConstants.XWT_LOADED.equalsIgnoreCase(name) |
| || IEventConstants.XWT_LOADED_EVENT.equalsIgnoreCase(name)) { |
| return IEventConstants.XWT_SWT_LOADED; |
| } |
| // case SWT.PaintItem: |
| // firePaintItem(e); |
| // break; |
| // case DND.DragStart: |
| // dnde = new DNDEventWrapper(e); |
| // fireGiveFeedback(dnde); |
| // break; |
| // case DND.DragEnter: |
| // dnde = new DNDEventWrapper(e); |
| // fireDragEnter(dnde); |
| // break; |
| // case DND.DragLeave: |
| // dnde = new DNDEventWrapper(e); |
| // fireDragLeaves(dnde); |
| // break; |
| // case DND.DragOver: |
| // dnde = new DNDEventWrapper(e); |
| // fireDragOver(dnde); |
| // break; |
| // case DND.Drop: |
| // dnde = new DNDEventWrapper(e); |
| // fireDrop(dnde); |
| // break; |
| // } |
| return SWT.None; |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see |
| * org.eclipse.xwt.javabean.IEventHandler#handleEvent(org.eclipse.swt |
| * .widgets.Event) |
| */ |
| public void handleEvent(Event e) { |
| fireEvent(e); |
| } |
| } |