| /* |
| * Copyright 2008 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| * use this file except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package com.google.gwt.user.client.ui; |
| |
| import com.google.gwt.dom.client.Element; |
| import com.google.gwt.event.dom.client.BlurEvent; |
| import com.google.gwt.event.dom.client.BlurHandler; |
| import com.google.gwt.event.dom.client.ClickEvent; |
| import com.google.gwt.event.dom.client.ClickHandler; |
| import com.google.gwt.event.dom.client.DoubleClickEvent; |
| import com.google.gwt.event.dom.client.DoubleClickHandler; |
| import com.google.gwt.event.dom.client.DragEndEvent; |
| import com.google.gwt.event.dom.client.DragEndHandler; |
| import com.google.gwt.event.dom.client.DragEnterEvent; |
| import com.google.gwt.event.dom.client.DragEnterHandler; |
| import com.google.gwt.event.dom.client.DragEvent; |
| import com.google.gwt.event.dom.client.DragHandler; |
| import com.google.gwt.event.dom.client.DragLeaveEvent; |
| import com.google.gwt.event.dom.client.DragLeaveHandler; |
| import com.google.gwt.event.dom.client.DragOverEvent; |
| import com.google.gwt.event.dom.client.DragOverHandler; |
| import com.google.gwt.event.dom.client.DragStartEvent; |
| import com.google.gwt.event.dom.client.DragStartHandler; |
| import com.google.gwt.event.dom.client.DropEvent; |
| import com.google.gwt.event.dom.client.DropHandler; |
| import com.google.gwt.event.dom.client.FocusEvent; |
| import com.google.gwt.event.dom.client.FocusHandler; |
| import com.google.gwt.event.dom.client.GestureChangeEvent; |
| import com.google.gwt.event.dom.client.GestureChangeHandler; |
| import com.google.gwt.event.dom.client.GestureEndEvent; |
| import com.google.gwt.event.dom.client.GestureEndHandler; |
| import com.google.gwt.event.dom.client.GestureStartEvent; |
| import com.google.gwt.event.dom.client.GestureStartHandler; |
| import com.google.gwt.event.dom.client.HasAllDragAndDropHandlers; |
| import com.google.gwt.event.dom.client.HasAllFocusHandlers; |
| import com.google.gwt.event.dom.client.HasAllGestureHandlers; |
| import com.google.gwt.event.dom.client.HasAllKeyHandlers; |
| import com.google.gwt.event.dom.client.HasAllMouseHandlers; |
| import com.google.gwt.event.dom.client.HasAllTouchHandlers; |
| import com.google.gwt.event.dom.client.HasClickHandlers; |
| import com.google.gwt.event.dom.client.HasDoubleClickHandlers; |
| import com.google.gwt.event.dom.client.KeyDownEvent; |
| import com.google.gwt.event.dom.client.KeyDownHandler; |
| import com.google.gwt.event.dom.client.KeyPressEvent; |
| import com.google.gwt.event.dom.client.KeyPressHandler; |
| import com.google.gwt.event.dom.client.KeyUpEvent; |
| import com.google.gwt.event.dom.client.KeyUpHandler; |
| import com.google.gwt.event.dom.client.MouseDownEvent; |
| import com.google.gwt.event.dom.client.MouseDownHandler; |
| import com.google.gwt.event.dom.client.MouseMoveEvent; |
| import com.google.gwt.event.dom.client.MouseMoveHandler; |
| import com.google.gwt.event.dom.client.MouseOutEvent; |
| import com.google.gwt.event.dom.client.MouseOutHandler; |
| import com.google.gwt.event.dom.client.MouseOverEvent; |
| import com.google.gwt.event.dom.client.MouseOverHandler; |
| import com.google.gwt.event.dom.client.MouseUpEvent; |
| import com.google.gwt.event.dom.client.MouseUpHandler; |
| import com.google.gwt.event.dom.client.MouseWheelEvent; |
| import com.google.gwt.event.dom.client.MouseWheelHandler; |
| import com.google.gwt.event.dom.client.TouchCancelEvent; |
| import com.google.gwt.event.dom.client.TouchCancelHandler; |
| import com.google.gwt.event.dom.client.TouchEndEvent; |
| import com.google.gwt.event.dom.client.TouchEndHandler; |
| import com.google.gwt.event.dom.client.TouchMoveEvent; |
| import com.google.gwt.event.dom.client.TouchMoveHandler; |
| import com.google.gwt.event.dom.client.TouchStartEvent; |
| import com.google.gwt.event.dom.client.TouchStartHandler; |
| import com.google.gwt.event.shared.HandlerRegistration; |
| import com.google.gwt.user.client.ui.impl.FocusImpl; |
| |
| /** |
| * Abstract base class for most widgets that can receive keyboard focus. |
| */ |
| @SuppressWarnings("deprecation") |
| public abstract class FocusWidget extends Widget implements SourcesClickEvents, |
| HasClickHandlers, HasDoubleClickHandlers, HasFocus, HasEnabled, |
| HasAllDragAndDropHandlers, HasAllFocusHandlers, HasAllGestureHandlers, |
| HasAllKeyHandlers, HasAllMouseHandlers, HasAllTouchHandlers, |
| SourcesMouseEvents { |
| |
| private static final FocusImpl impl = FocusImpl.getFocusImplForWidget(); |
| |
| /** |
| * Gets the FocusImpl instance. |
| * |
| * @return impl |
| */ |
| protected static FocusImpl getFocusImpl() { |
| return impl; |
| } |
| |
| /** |
| * Creates a new focus widget with no element. {@link #setElement(Element)} |
| * must be called before any other methods. |
| */ |
| protected FocusWidget() { |
| } |
| |
| /** |
| * Creates a new focus widget that wraps the specified browser element. |
| * |
| * @param elem the element to be wrapped |
| */ |
| protected FocusWidget(Element elem) { |
| setElement(elem); |
| } |
| |
| public HandlerRegistration addBlurHandler(BlurHandler handler) { |
| return addDomHandler(handler, BlurEvent.getType()); |
| } |
| |
| public HandlerRegistration addClickHandler(ClickHandler handler) { |
| return addDomHandler(handler, ClickEvent.getType()); |
| } |
| |
| /** |
| * @deprecated Use {@link #addClickHandler} instead |
| */ |
| @Deprecated |
| public void addClickListener(ClickListener listener) { |
| ListenerWrapper.WrappedClickListener.add(this, listener); |
| } |
| |
| public HandlerRegistration addDoubleClickHandler(DoubleClickHandler handler) { |
| return addDomHandler(handler, DoubleClickEvent.getType()); |
| } |
| |
| public HandlerRegistration addDragEndHandler(DragEndHandler handler) { |
| return addBitlessDomHandler(handler, DragEndEvent.getType()); |
| } |
| |
| public HandlerRegistration addDragEnterHandler(DragEnterHandler handler) { |
| return addBitlessDomHandler(handler, DragEnterEvent.getType()); |
| } |
| |
| public HandlerRegistration addDragHandler(DragHandler handler) { |
| return addBitlessDomHandler(handler, DragEvent.getType()); |
| } |
| |
| public HandlerRegistration addDragLeaveHandler(DragLeaveHandler handler) { |
| return addBitlessDomHandler(handler, DragLeaveEvent.getType()); |
| } |
| |
| public HandlerRegistration addDragOverHandler(DragOverHandler handler) { |
| return addBitlessDomHandler(handler, DragOverEvent.getType()); |
| } |
| |
| public HandlerRegistration addDragStartHandler(DragStartHandler handler) { |
| return addBitlessDomHandler(handler, DragStartEvent.getType()); |
| } |
| |
| public HandlerRegistration addDropHandler(DropHandler handler) { |
| return addBitlessDomHandler(handler, DropEvent.getType()); |
| } |
| |
| public HandlerRegistration addFocusHandler(FocusHandler handler) { |
| return addDomHandler(handler, FocusEvent.getType()); |
| } |
| |
| /** |
| * @deprecated Use {@link #addFocusHandler} instead |
| */ |
| @Deprecated |
| public void addFocusListener(FocusListener listener) { |
| ListenerWrapper.WrappedFocusListener.add(this, listener); |
| } |
| |
| public HandlerRegistration addGestureChangeHandler(GestureChangeHandler handler) { |
| return addDomHandler(handler, GestureChangeEvent.getType()); |
| } |
| |
| public HandlerRegistration addGestureEndHandler(GestureEndHandler handler) { |
| return addDomHandler(handler, GestureEndEvent.getType()); |
| } |
| |
| public HandlerRegistration addGestureStartHandler(GestureStartHandler handler) { |
| return addDomHandler(handler, GestureStartEvent.getType()); |
| } |
| |
| /** |
| * @deprecated Use {@link #addKeyDownHandler}, {@link |
| * #addKeyUpHandler} and {@link #addKeyPressHandler} instead |
| */ |
| @Deprecated |
| public void addKeyboardListener(KeyboardListener listener) { |
| ListenerWrapper.WrappedKeyboardListener.add(this, listener); |
| } |
| |
| public HandlerRegistration addKeyDownHandler(KeyDownHandler handler) { |
| return addDomHandler(handler, KeyDownEvent.getType()); |
| } |
| |
| public HandlerRegistration addKeyPressHandler(KeyPressHandler handler) { |
| return addDomHandler(handler, KeyPressEvent.getType()); |
| } |
| |
| public HandlerRegistration addKeyUpHandler(KeyUpHandler handler) { |
| return addDomHandler(handler, KeyUpEvent.getType()); |
| } |
| |
| public HandlerRegistration addMouseDownHandler(MouseDownHandler handler) { |
| return addDomHandler(handler, MouseDownEvent.getType()); |
| } |
| |
| /** |
| * @deprecated Use {@link #addMouseOverHandler} {@link |
| * #addMouseMoveHandler}, {@link #addMouseDownHandler}, {@link |
| * #addMouseUpHandler} and {@link #addMouseOutHandler} instead |
| */ |
| @Deprecated |
| public void addMouseListener(MouseListener listener) { |
| ListenerWrapper.WrappedMouseListener.add(this, listener); |
| } |
| |
| public HandlerRegistration addMouseMoveHandler(MouseMoveHandler handler) { |
| return addDomHandler(handler, MouseMoveEvent.getType()); |
| } |
| |
| public HandlerRegistration addMouseOutHandler(MouseOutHandler handler) { |
| return addDomHandler(handler, MouseOutEvent.getType()); |
| } |
| |
| public HandlerRegistration addMouseOverHandler(MouseOverHandler handler) { |
| return addDomHandler(handler, MouseOverEvent.getType()); |
| } |
| |
| public HandlerRegistration addMouseUpHandler(MouseUpHandler handler) { |
| return addDomHandler(handler, MouseUpEvent.getType()); |
| } |
| |
| public HandlerRegistration addMouseWheelHandler(MouseWheelHandler handler) { |
| return addDomHandler(handler, MouseWheelEvent.getType()); |
| } |
| |
| /** |
| * @deprecated Use {@link #addMouseWheelHandler} instead |
| */ |
| @Deprecated |
| public void addMouseWheelListener(MouseWheelListener listener) { |
| ListenerWrapper.WrappedMouseWheelListener.add(this, listener); |
| } |
| |
| public HandlerRegistration addTouchCancelHandler(TouchCancelHandler handler) { |
| return addDomHandler(handler, TouchCancelEvent.getType()); |
| } |
| |
| public HandlerRegistration addTouchEndHandler(TouchEndHandler handler) { |
| return addDomHandler(handler, TouchEndEvent.getType()); |
| } |
| |
| public HandlerRegistration addTouchMoveHandler(TouchMoveHandler handler) { |
| return addDomHandler(handler, TouchMoveEvent.getType()); |
| } |
| |
| public HandlerRegistration addTouchStartHandler(TouchStartHandler handler) { |
| return addDomHandler(handler, TouchStartEvent.getType()); |
| } |
| |
| /** |
| * Gets the tab index. |
| * |
| * @return the tab index |
| */ |
| public int getTabIndex() { |
| return impl.getTabIndex(getElement()); |
| } |
| |
| /** |
| * Gets whether this widget is enabled. |
| * |
| * @return <code>true</code> if the widget is enabled |
| */ |
| public boolean isEnabled() { |
| return !getElement().getPropertyBoolean("disabled"); |
| } |
| |
| /** |
| * @deprecated Use the {@link HandlerRegistration#removeHandler} method on |
| * the object returned by {@link #addClickHandler} instead |
| */ |
| @Deprecated |
| public void removeClickListener(ClickListener listener) { |
| ListenerWrapper.WrappedClickListener.remove(this, listener); |
| } |
| |
| /** |
| * @deprecated Use the {@link HandlerRegistration#removeHandler} method on |
| * the object returned by {@link #addFocusHandler} instead |
| */ |
| @Deprecated |
| public void removeFocusListener(FocusListener listener) { |
| ListenerWrapper.WrappedFocusListener.remove(this, listener); |
| } |
| |
| /** |
| * @deprecated Use the {@link HandlerRegistration#removeHandler} |
| * method on the object returned by an add*Handler method instead |
| */ |
| @Deprecated |
| public void removeKeyboardListener(KeyboardListener listener) { |
| ListenerWrapper.WrappedKeyboardListener.remove(this, listener); |
| } |
| |
| /** |
| * @deprecated Use the {@link HandlerRegistration#removeHandler} |
| * method on the object returned by an add*Handler method instead |
| */ |
| @Deprecated |
| public void removeMouseListener(MouseListener listener) { |
| ListenerWrapper.WrappedMouseListener.remove(this, listener); |
| } |
| |
| /** |
| * @deprecated Use the {@link HandlerRegistration#removeHandler} |
| * method on the object returned by {@link #addMouseWheelHandler} instead |
| */ |
| @Deprecated |
| public void removeMouseWheelListener(MouseWheelListener listener) { |
| ListenerWrapper.WrappedMouseWheelListener.remove(this, listener); |
| } |
| |
| public void setAccessKey(char key) { |
| getElement().setPropertyString("accessKey", "" + key); |
| } |
| |
| /** |
| * Sets whether this widget is enabled. |
| * |
| * @param enabled <code>true</code> to enable the widget, <code>false</code> |
| * to disable it |
| */ |
| public void setEnabled(boolean enabled) { |
| getElement().setPropertyBoolean("disabled", !enabled); |
| } |
| |
| public void setFocus(boolean focused) { |
| if (focused) { |
| impl.focus(getElement()); |
| } else { |
| impl.blur(getElement()); |
| } |
| } |
| |
| public void setTabIndex(int index) { |
| impl.setTabIndex(getElement(), index); |
| } |
| |
| @Override |
| protected void onAttach() { |
| super.onAttach(); |
| |
| // Accessibility: setting tab index to be 0 by default, ensuring element |
| // appears in tab sequence. We must ensure that the element doesn't already |
| // have a tabIndex set. This is not a problem for normal widgets, but when |
| // a widget is used to wrap an existing static element, it can already have |
| // a tabIndex. |
| int tabIndex = getTabIndex(); |
| if (-1 == tabIndex) { |
| setTabIndex(0); |
| } |
| } |
| } |