/*******************************************************************************
 * Copyright (c) 2000, 2005 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.draw2d;

import org.eclipse.swt.accessibility.AccessibleControlEvent;
import org.eclipse.swt.accessibility.AccessibleControlListener;
import org.eclipse.swt.accessibility.AccessibleListener;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;

/**
 * Listens to various SWT events and dispatches these events to interested Draw2d objects. 
 */
public abstract class EventDispatcher {
	
	/**
	 * Combines {@link AccessibleControlListener} and {@link AccessibleListener}.  
	 * Implements {@link AccessibleControlListener#getChild(AccessibleControlEvent)} to do
	 * nothing.
	 */
	public abstract static class AccessibilityDispatcher
		implements AccessibleControlListener, AccessibleListener
	{
		/** @see AccessibleControlListener#getChild(AccessibleControlEvent) */
		public void getChild(AccessibleControlEvent e) { }
	}

/**
 * Dispatches a focus gained event.
 * @param e the event
 */
public abstract void dispatchFocusGained(FocusEvent e);

/**
 * Dispatches a focus lost event.
 * @param e the event
 */
public abstract void dispatchFocusLost(FocusEvent e);

/**
 * Dispatches a key pressed event.
 * @param e the event
 */
public abstract void dispatchKeyPressed(KeyEvent e);

/**
 * Dispatches a key released event.
 * @param e the event
 */
public abstract void dispatchKeyReleased(KeyEvent e);

/**
 * Dispatches a key traversed event.
 * @param e the event
 */
public abstract void dispatchKeyTraversed(TraverseEvent e);

/**
 * Dispatches a mouse double clicked event.
 * @param me the event
 */
public abstract void dispatchMouseDoubleClicked(MouseEvent me);

/**
 * Dispatches a mouse entered event.
 * @param e the event
 */
public abstract void dispatchMouseEntered(MouseEvent e);

/**
 * Dispatches a mouse exited event.
 * @param e the event
 */
public abstract void dispatchMouseExited(MouseEvent e);

/**
 * Dispatches a mouse hover event.
 * @param me the event
 */
public abstract void dispatchMouseHover(MouseEvent me);

/**
 * Dispatches a moved event event.
 * @param me the event
 */
public abstract void dispatchMouseMoved(MouseEvent me);

/**
 * Dispatches a mouse pressed event.
 * @param me the event
 */
public abstract void dispatchMousePressed(MouseEvent me);

/**
 * Dispatches a mouse released event.
 * @param me the event
 */
public abstract void dispatchMouseReleased(MouseEvent me);

/**
 * Dispatches a MouseWheel event. Does nothing by default.
 * @param event the SWT event
 * @since 3.1
 */
public void dispatchMouseWheelScrolled(Event event) { }

/**
 * Returns the AccessibilityDispatcher.
 * @return the AccessibilityDispatcher
 */
protected abstract AccessibilityDispatcher getAccessibilityDispatcher();

/**
 * @return the IFigure that currently has focus
 */
/*package*/ abstract IFigure getFocusOwner();

/**
 * @return whether events are captured by a figure
 */
public abstract boolean isCaptured();

/**
 * Releases capture initiated by {@link #setCapture(IFigure)}.
 */
protected abstract void releaseCapture();

/**
 * Requests focus for the given figure.
 * @param fig the figure requesting focus
 */
public abstract void requestFocus(IFigure fig);

/**
 * Requests focus to be removed from the given figure.
 * @param fig the figure requesting focus be removed
 */
public abstract void requestRemoveFocus(IFigure fig);

/**
 * Sets capture to the given figure.  All subsequent events will be sent to the given 
 * figure until {@link #releaseCapture()} is called.
 * 
 * @param figure the figure capturing the events
 */
protected abstract void setCapture(IFigure figure);

/**
 * Sets the contol associated with this event dispatcher.
 * @param control the control
 */
public abstract void setControl(Control control);

/**
 * Sets the root figure for this dispatcher.
 * @param figure the root figure
 */
public abstract void setRoot(IFigure figure);

/**
 * Updates the cursor.
 */
protected abstract void updateCursor();

}
