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 org.eclipse.swt.SWT;
013: import org.eclipse.swt.custom.StyledText;
014: import org.eclipse.swt.custom.VerifyKeyListener;
015: import org.eclipse.swt.events.VerifyEvent;
016: import org.eclipse.swt.widgets.Widget;
017:
018: /**
019: * A listener that makes sure that out-of-order processing occurs if no other
020: * verify listeners do any work.
021: *
022: * @since 3.0
023: */
024: class OutOfOrderVerifyListener implements VerifyKeyListener {
025:
026: /**
027: * The time at which this listener was last registered to an event. This is
028: * the <code>event.time</code> value.
029: *
030: * @since 3.1
031: */
032: private int active = Integer.MIN_VALUE;
033:
034: /**
035: * The listener that will be chained in if the verify event has not been
036: * eaten yet.
037: */
038: private OutOfOrderListener chainedListener;
039:
040: /**
041: * Constructs a new instance of <code>OutOfOrderVerifyListener</code> with
042: * the listener that will be chained in.
043: *
044: * @param outOfOrderListener
045: * The listener that should be attached to the widget if the
046: * verify event is not eaten; must not be <code>null</code>.
047: */
048: OutOfOrderVerifyListener(OutOfOrderListener outOfOrderListener) {
049: chainedListener = outOfOrderListener;
050: }
051:
052: /**
053: * Returns whether this listener has been hooked by this event already.
054: *
055: * @param timeRegistered
056: * The <code>event.time</code> for the current event.
057: * @return <code>true</code> if this listener is registered for a
058: * different event; <code>false</code> otherwise.
059: *
060: * @since 3.1
061: */
062: final boolean isActive(final int timeRegistered) {
063: return (active == timeRegistered);
064: }
065:
066: /**
067: * Sets the event time at which this listener was last registered with a
068: * widget.
069: *
070: * @param timeRegistered
071: * The time at which this listener was last registered with a
072: * widget.
073: *
074: * @since 3.1
075: */
076: final void setActive(final int timeRegistered) {
077: active = timeRegistered;
078: }
079:
080: /**
081: * Checks whether any other verify listeners have triggered. If not, then it
082: * sets up the top-level out-of-order listener.
083: *
084: * @param event
085: * The verify event after it has been processed by all other
086: * verify listeners; must not be <code>null</code>.
087: */
088: public void verifyKey(VerifyEvent event) {
089: // Always remove the listener.
090: final Widget widget = event.widget;
091: if ((widget instanceof StyledText) && (!widget.isDisposed())) {
092: ((StyledText) widget).removeVerifyKeyListener(this );
093: }
094:
095: /*
096: * If the event is still up for grabs, then re-route through the global
097: * key filter.
098: */
099: if (event.doit) {
100: widget.addListener(SWT.Modify, new CancelOnModifyListener(
101: chainedListener));
102: widget.addListener(SWT.KeyDown, chainedListener);
103: }
104: }
105: }
|