001: /*******************************************************************************
002: * Copyright (c) 2000, 2006 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.ui.internal.keys;
011:
012: import java.util.List;
013:
014: import org.eclipse.swt.widgets.Event;
015: import org.eclipse.swt.widgets.Listener;
016: import org.eclipse.swt.widgets.Widget;
017:
018: /**
019: * A listener that makes sure that global key bindings are processed if no other
020: * listeners do any useful work.
021: *
022: * @since 3.0
023: */
024: public class OutOfOrderListener implements Listener {
025: /**
026: * The time at which this listener was last registered to an event. This is
027: * the <code>event.time</code> value.
028: *
029: * @since 3.1
030: */
031: private int active = Integer.MIN_VALUE;
032:
033: /**
034: * The keyboard interface to which the event should be passed if it is not
035: * eaten.
036: */
037: private final WorkbenchKeyboard keyboard;
038:
039: /**
040: * Constructs a new instance of <code>OutOfOrderListener</code> with a
041: * reference to the keyboard interface which should be allowed to process
042: * uneaten events.
043: *
044: * @param workbenchKeyboard
045: * The keyboard interface for the workbench capable of processing
046: * key bindings; must not be <code>null</code>.
047: */
048: public OutOfOrderListener(WorkbenchKeyboard workbenchKeyboard) {
049: keyboard = workbenchKeyboard;
050: }
051:
052: /**
053: * Handles the key down event on a widget by passing uneaten events to the
054: * key binding architecture. This is used to allow special keys to reach the
055: * widget first -- before being processed by the key binding architecture.
056: *
057: * @param event
058: * The event to process; must not be <code>null</code>
059: */
060: public void handleEvent(Event event) {
061: // Always remove myself as a listener.
062: final Widget widget = event.widget;
063: if ((widget != null) && (!widget.isDisposed())) {
064: widget.removeListener(event.type, this );
065: }
066:
067: /*
068: * If the event is still up for grabs, then re-route through the global
069: * key filter.
070: */
071: if (event.doit) {
072: List keyStrokes = WorkbenchKeyboard
073: .generatePossibleKeyStrokes(event);
074: keyboard.processKeyEvent(keyStrokes, event);
075: }
076: }
077:
078: /**
079: * Returns whether this listener has been hooked by this event already.
080: *
081: * @param timeRegistered
082: * The <code>event.time</code> for the current event.
083: * @return <code>true</code> if this listener is registered for a
084: * different event; <code>false</code> otherwise.
085: *
086: * @since 3.1
087: */
088: final boolean isActive(final int timeRegistered) {
089: return (active == timeRegistered);
090: }
091:
092: /**
093: * Sets the event time at which this listener was last registered with a
094: * widget.
095: *
096: * @param timeRegistered
097: * The time at which this listener was last registered with a
098: * widget.
099: *
100: * @since 3.1
101: */
102: final void setActive(final int timeRegistered) {
103: active = timeRegistered;
104: }
105: }
|