/******************************************************************************* * 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.gef; import java.util.Map; import org.eclipse.swt.dnd.DragSourceEvent; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseTrackListener; import org.eclipse.swt.events.TraverseEvent; import org.eclipse.swt.widgets.Event; /** * A <code>Tool</code> interprets Mouse and Keyboard input from an {@link EditDomain} and * its {@link EditPartViewer EditPartViewers}. The active Tool and its state determines * how the EditDomain will interpret input. Input flows from a Viewer, to the EditDomain, * to the EditDomain's active Tool. * <P> * <code>Tools</code> process low-level events and turn them into higher-level operations. * These operations are encapsulated by {@link Request Requests}. The Requests are then * used to communicate with EditParts in the Viewer to perform the User's operation. Using * Requests, Tools will: * <UL> * <LI>Ask EditParts for {@link org.eclipse.gef.commands.Command Commands} to perform * changes on the model. * <LI>Ask EditParts to show and erase feedback during an operation. * <LI>Ask EditParts to perform a generic function, using * {@link org.eclipse.gef.EditPart#performRequest(Request)}. * <P>Tools also perform operations that do not involve the EditParts directly, such as * changing the Viewer's selection, scrolling the viewer, or invoking an * {@link org.eclipse.jface.action.IAction Action}. * <table> * <tr> * <td valign=top><img src="doc-files/important.gif"/> * <td>All feedback should be erased and temporary changes reverted prior to * executing any command. * </tr> * <tr> * <td valign=top><img src="doc-files/important.gif"/> * <td>Tools should process most keystrokes. For example, the DELETE key should * <EM>not</EM> be handled by adding a KeyListener to the Viewer's Control. Doing * so would mean that pressing DELETE would <EM>not</EM> be sensitive to which Tool * is currently active, and the state of the Tool. See {@link * org.eclipse.gef.KeyHandler} for how keystrokes are generally processed. * </tr> * </table> * <p> * IMPORTANT: This interface is <EM>not</EM> intended to be implemented by clients. * Clients should inherit from {@link org.eclipse.gef.tools.AbstractTool}. New methods may * be added in the future. */ public interface Tool { /** * Called when this tool becomes the active tool for the EditDomain. * implementors can perform any necessary initialization here. * @see #deactivate() */ void activate(); /** * Called when another Tool becomes the active tool for the EditDomain. * implementors can perform state clean-up or to free resources. */ void deactivate(); /** * Called when a Viewer's Control gains keyboard focus. * @param event The SWT focus event * @param viewer The Viewer which gained focus */ void focusGained(FocusEvent event, EditPartViewer viewer); /** * Called when a Viewer's Control loses keyboard focus. * @param event The SWT focus event * @param viewer The viewer that is losing focus */ void focusLost(FocusEvent event, EditPartViewer viewer); /** * Called when a Viewer receives a key press. * @param keyEvent the SWT KeyEvent * @param viewer the Viewer which received a key press */ void keyDown(KeyEvent keyEvent, EditPartViewer viewer); /** * Called when a viewer receives a key traversal. A tool can prevent the * traversal from occuring by setting the doit field to <code>false</code>. * @param event the SWT event * @param viewer the viewer which received the traversal * @since 3.1 */ void keyTraversed(TraverseEvent event, EditPartViewer viewer); /** * Called when a Viewer receives a key up. * @param keyEvent the SWT KeyEvent * @param viewer the Viewer which received a key up */ void keyUp(KeyEvent keyEvent, EditPartViewer viewer); /** * Called when a Viewer receives a double-click. * @param mouseEvent the SWT mouse event * @param viewer the Viewer which received a double-click */ void mouseDoubleClick(MouseEvent mouseEvent, EditPartViewer viewer); /** * Called when a Viewer receives a mouse down. * @param mouseEvent the SWT mouse event * @param viewer the Viewer which received a mouse down */ void mouseDown(MouseEvent mouseEvent, EditPartViewer viewer); /** * Called when a Viewer receives a mouse drag. SWT does not distinguish between mouse * drags and mouse moves, but GEF Viewers will make this distinction when dispatching * events. A drag occurs if any mouse button is down. * @param mouseEvent the SWT mouse event * @param viewer the Viewer which received a drag */ void mouseDrag(MouseEvent mouseEvent, EditPartViewer viewer); /** * Called when a Viewer receives a mouse hover. * @see MouseTrackListener#mouseHover(MouseEvent) * @param mouseEvent the SWT mouse event * @param viewer the Viewer which received a mouse down */ void mouseHover(MouseEvent mouseEvent, EditPartViewer viewer); /** * Called when a Viewer receives a mouse move. * @see #mouseDrag(MouseEvent, EditPartViewer) * @param mouseEvent the SWT mouse event * @param viewer the Viewer which received a mouse move */ void mouseMove(MouseEvent mouseEvent, EditPartViewer viewer); /** * Called when a Viewer receives a mouse up. * @param mouseEvent the SWT mouse event * @param viewer the Viewer which received a mouse up */ void mouseUp(MouseEvent mouseEvent, EditPartViewer viewer); /** * Called when the mouse wheel has been scrolled. * @param event The SWT event * @param viewer The source of the event */ void mouseWheelScrolled(Event event, EditPartViewer viewer); /** * Called when a native drag ends on a Viewer. This event is important to Tools * because {@link #mouseUp(MouseEvent, EditPartViewer) mouseUp(..)} will not occur * once a native drag has started. The Tool should correct its state to handle this * lost Event. * @param event the SWT DragSourceEvent * @param viewer the Viewer on which a native drag started */ void nativeDragFinished(DragSourceEvent event, EditPartViewer viewer); /** * Called when a native drag begins on a Viewer. This event is important to Tools * because {@link #mouseUp(MouseEvent, EditPartViewer) mouseUp(..)} will not occur * once a native drag has started. The Tool should correct its state to handle this * lost Event. * @param event the SWT DragSourceEvent * @param viewer the Viewer on which a native drag started */ void nativeDragStarted(DragSourceEvent event, EditPartViewer viewer); /** * Called to set the EditDomain for this Tool. This is called right before {@link * #activate()}. * @param domain The EditDomain to which this Tool belongs */ void setEditDomain(EditDomain domain); /** * Called to set the current Viewer receiving events. This method is rarely called, since * the Viewer is always passed along with the events themselves. This method really just * applies to {@link DragTracker DragTrackers}. * @param viewer The current Viewer */ void setViewer(EditPartViewer viewer); /** * Called when a Viewer receives a mouse enter. * @param mouseEvent the SWT mouse event * @param viewer the Viewer which received a mouse enter */ void viewerEntered(MouseEvent mouseEvent, EditPartViewer viewer); /** * Called when a Viewer receives a mouse exit. * @param mouseEvent the SWT mouse event * @param viewer the Viewer which received a mouse exit */ void viewerExited(MouseEvent mouseEvent, EditPartViewer viewer); /** * This method can be invoked to set any properties of this tool. This allows clients * who do not have direct access to a Tool to still be able to configure that tool. * The given Map should have the property's key and value. This method will ignore * unrecognized keys and values that are not of the expected type. * <p> * This method should only be invoked once when the tool is first constructed and is * being initialized. Invoking this method at other times may have undesired effects. * @param properties a mapping of the properties to be set and their new values; can be * <code>null</code> * @since 3.1 */ void setProperties(Map properties); }