/* * $Id$ * * Copyright 2007 Sun Microsystems, Inc., 4150 Network Circle, * Santa Clara, California 95054, U.S.A. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ package org.jdesktop.swingx.event; import java.awt.AWTEvent; import java.awt.Component; import java.awt.im.InputContext; import java.util.Locale; /** * An implementation of InputContext which allows to plug-in a custom * InputEventDispatcher to get notified of all Input- and FocusEvents below * the root of the container hierarchy this is installed to. This context * is enabled (automatically) if it has both a delegate InputContext and * a dispatcher. If so, it will dispatch the received events to the dispatcher before * messaging the delegate. All other methods delegate to the wrapped input context * without additional processing. <p> * * Typically, application code need not be aware of this class. JComponents * which support InputEventDispatcher will install this transparently. * * @see InputEventDispatcher * @see org.jdesktop.swingx.JXDatePicker * * @author Jeanette Winzenburg * * */ public class DispatchingInputContext extends InputContext { private InputEventDispatcher dispatcher; private InputContext delegate; /** * Sets the InputEventDispatcher to use. * @param dispatcher */ public void setInputEventDispatcher(InputEventDispatcher dispatcher) { this.dispatcher = dispatcher; } public InputEventDispatcher getInputEventDispatcher() { return dispatcher; } /** * Returns the InputContext. The returned context depends on * whether or not this instance has a EventDispatcher. If so, * it returns this * * @param delegate the InputContext to delegate all methods to. * @return the this or the delegate, if we have a dispatcher or not, * respectively. */ public InputContext getInputContext(InputContext delegate) { if (!hasDispatcher()) { resetDelegate(); return delegate; } setDelegate(delegate); return hasDelegate() ? this : delegate; } //-------------------- super overrides to delegate /** * {@inheritDoc} <p> * * Overridden to dispatch the event to the dispatcher before * passing it to the original InputContext if available, does nothing otherwise. */ @Override public void dispatchEvent(AWTEvent event) { if(!hasDelegate()) { return; } if (hasDispatcher()) { getInputEventDispatcher().dispatchEvent(event); } getDelegate().dispatchEvent(event); } /** * {@inheritDoc} <p> * * Overridden to delegate to original InputContext if available, does nothing otherwise. */ @Override public void dispose() { if(getDelegate() == null) { return; } getDelegate().dispose(); } /** * {@inheritDoc} <p> * * Overridden to delegate to original InputContext if available, does nothing otherwise. */ @Override public void endComposition() { if(getDelegate() == null) { return; } getDelegate().endComposition(); } /** * {@inheritDoc} <p> * * Overridden to delegate to original InputContext if available, does nothing otherwise. */ @Override public Object getInputMethodControlObject() { if(getDelegate() == null) { return null; } return getDelegate().getInputMethodControlObject(); } /** * {@inheritDoc} <p> * * Overridden to delegate to original InputContext if available, does nothing otherwise. */ @Override public Locale getLocale() { if(getDelegate() == null) { return null; } return getDelegate().getLocale(); } /** * {@inheritDoc} <p> * * Overridden to delegate to original InputContext if available, does nothing otherwise. */ @Override public boolean isCompositionEnabled() { if(getDelegate() == null) { return false; } return getDelegate().isCompositionEnabled(); } /** * {@inheritDoc} <p> * * Overridden to delegate to original InputContext if available, does nothing otherwise. */ @Override public void reconvert() { if(getDelegate() == null) { return; } getDelegate().reconvert(); } /** * {@inheritDoc} <p> * * Overridden to delegate to original InputContext if available, does nothing otherwise. */ @Override public void removeNotify(Component client) { if(getDelegate() == null) { return; } getDelegate().removeNotify(client); } /** * {@inheritDoc} <p> * * Overridden to delegate to original InputContext if available, does nothing otherwise. */ @Override public boolean selectInputMethod(Locale locale) { if(getDelegate() == null) { return false; } return getDelegate().selectInputMethod(locale); } /** * {@inheritDoc} <p> * * Overridden to delegate to original InputContext if available, does nothing otherwise. */ @Override public void setCharacterSubsets(Character.Subset[] subsets) { if(getDelegate() == null) { return; } getDelegate().setCharacterSubsets(subsets); } /** * {@inheritDoc} <p> * * Overridden to delegate to original InputContext if available, does nothing otherwise. */ @Override public void setCompositionEnabled(boolean enable) { if(getDelegate() == null) { return; } getDelegate().setCompositionEnabled(enable); } //------------------ internals private boolean hasDispatcher() { return getInputEventDispatcher() != null; } private boolean hasDelegate() { return getDelegate() != null; } private void setDelegate(InputContext delegate) { this.delegate = delegate; } private void resetDelegate() { this.delegate = null; } protected InputContext getDelegate() { return delegate; } }