| /* |
| * Copyright 2010 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.i18n.client; |
| |
| import com.google.gwt.event.dom.client.HasKeyUpHandlers; |
| import com.google.gwt.event.dom.client.KeyUpEvent; |
| import com.google.gwt.event.dom.client.KeyUpHandler; |
| import com.google.gwt.event.shared.HandlerRegistration; |
| import com.google.gwt.i18n.client.HasDirection.Direction; |
| import com.google.gwt.i18n.shared.DirectionEstimator; |
| import com.google.gwt.i18n.shared.HasDirectionEstimator; |
| import com.google.gwt.i18n.shared.WordCountDirectionEstimator; |
| |
| /** |
| * Utility class for handling auto-direction adjustment. |
| * |
| * This class is useful for automatically adjusting the direction of an object |
| * that takes text input, while the text is being entered. |
| */ |
| public class AutoDirectionHandler implements KeyUpHandler, |
| HasDirectionEstimator { |
| |
| /** |
| * The interface an object must implement in order to add an |
| * AutoDirectionHandler to it. |
| * |
| * TODO(tomerigo): add Paste and Input events once they're available in GWT. |
| */ |
| public interface Target extends HasDirection, HasKeyUpHandlers { |
| /** |
| * Gets this object's text. |
| */ |
| String getText(); |
| |
| /** |
| * Sets this object's text. |
| * |
| * @param text the object's new text |
| */ |
| void setText(String text); |
| } |
| |
| /** |
| * Operates like {@link #addTo(Target, DirectionEstimator)}, but always uses |
| * a default DirectionEstimator, {@link |
| * com.google.gwt.i18n.shared.WordCountDirectionEstimator}. |
| * |
| * @param target Object whose direction should be automatically adjusted on |
| * relevant events. |
| * @return AutoDirectionHandler An instance of AutoDirectionHandler for the |
| * given object. |
| */ |
| public static AutoDirectionHandler addTo(Target target) { |
| return addTo(target, true); |
| } |
| |
| /** |
| * Operates like {@link #addTo(Target, DirectionEstimator)}, but uses a |
| * default DirectionEstimator, {@link |
| * com.google.gwt.i18n.shared.WordCountDirectionEstimator} if {@code enabled}, |
| * or else a null DirectionEstimator, which means disabling direction |
| * estimation. |
| * |
| * @param target Object whose direction should be automatically adjusted on |
| * relevant events. |
| * @param enabled Whether the handler is enabled upon creation. |
| * @return AutoDirectionHandler An instance of AutoDirectionHandler for the |
| * given object. |
| */ |
| public static AutoDirectionHandler addTo(Target target, boolean enabled) { |
| return addTo(target, enabled ? WordCountDirectionEstimator.get() : null); |
| } |
| |
| /** |
| * Adds auto-direction adjustment to a given object: |
| * - Creates an AutoDirectionHandler. |
| * - Initializes it with the given DirectionEstimator. |
| * - Adds it as an event handler for the relevant events on the given object. |
| * - Returns the AutoDirectionHandler, so its setAutoDir() method can be |
| * called when the object's text changes by means other than the handled |
| * events. |
| * |
| * @param target Object whose direction should be automatically adjusted on |
| * relevant events. |
| * @param directionEstimator A DirectionEstimator object used for direction |
| * estimation (use null to disable direction estimation). |
| * @return AutoDirectionHandler An instance of AutoDirectionHandler for the |
| * given object. |
| */ |
| public static AutoDirectionHandler addTo(Target target, DirectionEstimator |
| directionEstimator) { |
| return new AutoDirectionHandler(target, directionEstimator); |
| } |
| |
| /** |
| * A DirectionEstimator object used for direction estimation. |
| */ |
| private DirectionEstimator directionEstimator; |
| |
| /** |
| * A HandlerRegistration object used to remove this handler. |
| */ |
| private HandlerRegistration handlerRegistration; |
| |
| /** |
| * The object being handled. |
| */ |
| private Target target; |
| |
| /** |
| * Private constructor. Instantiate using one of the addTo() methods. |
| * |
| * @param target Object whose direction should be automatically adjusted on |
| * relevant events. |
| * @param directionEstimator A DirectionEstimator object used for direction |
| * estimation. |
| */ |
| private AutoDirectionHandler(Target target, DirectionEstimator |
| directionEstimator) { |
| this.target = target; |
| this.handlerRegistration = null; |
| setDirectionEstimator(directionEstimator); |
| } |
| |
| /** |
| * Returns the DirectionEstimator object. |
| */ |
| public DirectionEstimator getDirectionEstimator() { |
| return directionEstimator; |
| } |
| |
| /** |
| * Automatically adjusts hasDirection's direction on KeyUpEvent events. |
| * Implementation of KeyUpHandler interface method. |
| */ |
| public void onKeyUp(KeyUpEvent event) { |
| refreshDirection(); |
| } |
| |
| /** |
| * Adjusts target's direction according to the estimated direction of the text |
| * it supplies. |
| */ |
| public void refreshDirection() { |
| if (directionEstimator != null) { |
| Direction dir = directionEstimator.estimateDirection(target.getText()); |
| if (dir != target.getDirection()) { |
| target.setDirection(dir); |
| } |
| } |
| } |
| |
| /** |
| * Toggles direction estimation on (using a default estimator) and off. |
| */ |
| public void setDirectionEstimator(boolean enabled) { |
| setDirectionEstimator(enabled ? WordCountDirectionEstimator.get() : null); |
| } |
| |
| /** |
| * Sets the DirectionEstimator object. |
| */ |
| public void setDirectionEstimator(DirectionEstimator directionEstimator) { |
| this.directionEstimator = directionEstimator; |
| if ((directionEstimator == null) != (handlerRegistration == null)) { |
| if (directionEstimator == null) { |
| handlerRegistration.removeHandler(); |
| handlerRegistration = null; |
| } else { |
| handlerRegistration = target.addKeyUpHandler(this); |
| } |
| } |
| refreshDirection(); |
| } |
| } |