/******************************************************************************* * Copyright (c) 2000, 2010 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.tools; import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPartViewer; import org.eclipse.gef.Request; /** * @author hudsonr Created on Mar 6, 2003 */ class DelayedDirectEditHelper implements Runnable { private EditPartViewer viewer; private EditPart part; private Request req; private FocusListener focus; private MouseListener mouse; private KeyListener key; private static DelayedDirectEditHelper activeHelper; /** * Constructs a new helper and starts it immediately. If another helper is * active, it is aborted and neither helper will run. * * @param viewer * the viewer on which the direct-edit is supposed to happen * @param request * the request that triggered the direct-edit * @param receiver * the EditPart that received the request */ public DelayedDirectEditHelper(EditPartViewer viewer, Request request, EditPart receiver) { this.req = request; this.viewer = viewer; this.part = receiver; if (activeHelper != null) activeHelper = null; else { hookControl(viewer.getControl()); activeHelper = this; Display.getCurrent().timerExec(400, this); } } /** * The edit is canceled by setting the active helper to <code>null</code>. */ void abort() { activeHelper = null; } void hookControl(Control control) { control.addFocusListener(focus = new FocusAdapter() { public void focusLost(FocusEvent e) { abort(); } }); control.addKeyListener(key = new KeyListener() { public void keyPressed(KeyEvent e) { abort(); } public void keyReleased(KeyEvent e) { abort(); } }); control.addMouseListener(mouse = new MouseAdapter() { public void mouseDoubleClick(MouseEvent e) { abort(); } public void mouseDown(MouseEvent e) { abort(); } }); } /** * If this helper has not been aborted, the target editpart will be sent the * request. */ public void run() { if (activeHelper == this && part.isActive() && viewer.getControl() != null && !viewer.getControl().isDisposed()) { part.performRequest(req); } if (viewer.getControl() != null && !viewer.getControl().isDisposed()) { viewer.getControl().removeFocusListener(focus); viewer.getControl().removeMouseListener(mouse); viewer.getControl().removeKeyListener(key); } activeHelper = null; } }