// Copyright (C) 2010 The Android Open Source Project // // 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.gerrit.client.ui; import com.google.gerrit.client.Gerrit; import com.google.gwt.event.dom.client.BlurEvent; import com.google.gwt.event.dom.client.BlurHandler; import com.google.gwt.event.dom.client.FocusEvent; import com.google.gwt.event.dom.client.FocusHandler; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyDownEvent; import com.google.gwt.event.dom.client.KeyDownHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.ui.SuggestBox; import com.google.gwt.user.client.ui.SuggestBox.DefaultSuggestionDisplay; import com.google.gwt.user.client.ui.Widget; import com.google.gwtexpui.globalkey.client.NpTextBox; public class HintTextBox extends NpTextBox { private HandlerRegistration hintFocusHandler; private HandlerRegistration hintBlurHandler; private HandlerRegistration keyDownHandler; private String hintText; private String hintStyleName = Gerrit.RESOURCES.css().inputFieldTypeHint(); private String prevText; private boolean hintOn; private boolean isFocused; public String getText() { if (hintOn) { return ""; } return super.getText(); } public void setText(String text) { focusHint(); super.setText(text); prevText = text; if (! isFocused) { blurHint(); } } public String getHintText() { return hintText; } public void setHintText(String text) { if (text == null) { if (hintText == null) { // was not set, still not set, no change. return; } // Clearing a previously set Hint hintFocusHandler.removeHandler(); hintFocusHandler = null; hintBlurHandler.removeHandler(); hintBlurHandler = null; keyDownHandler.removeHandler(); keyDownHandler = null; hintText = null; focusHint(); return; } // Setting Hints if (hintText == null) { // first time (was not already set) hintText = text; hintFocusHandler = addFocusHandler(new FocusHandler() { @Override public void onFocus(FocusEvent event) { focusHint(); prevText = getText(); isFocused = true; } }); hintBlurHandler = addBlurHandler(new BlurHandler() { @Override public void onBlur(BlurEvent event) { blurHint(); isFocused = false; } }); /* * There seems to be a strange bug (at least on firefox 3.5.9 ubuntu) with * the textbox under the following circumstances: * 1) The field is not focused with BText in it. * 2) The field receives focus and a focus listener changes the text to FText * 3) The ESC key is pressed and the value of the field has not changed * (ever) from FText * 4) BUG: The text value gets reset to BText! * * A counter to this bug seems to be to force setFocus(false) on ESC. */ /* Chrome does not create a KeyPressEvent on ESC, so use KeyDownEvents */ keyDownHandler = addKeyDownHandler(new KeyDownHandler() { @Override public void onKeyDown(final KeyDownEvent event) { onKey(event.getNativeKeyCode()); } }); } else { // Changing an already set Hint focusHint(); hintText = text; } if (! isFocused) { blurHint(); } } private void onKey(int key) { if (key == KeyCodes.KEY_ESCAPE) { setText(prevText); Widget p = getParent(); if (p instanceof SuggestBox) { // Since the text was changed, ensure that the SuggestBox is // aware of this change so that it will refresh properly on // the next keystroke. Without this, if the first keystroke // recreates the same string as before ESC was pressed, the // SuggestBox will think that the string has not changed, and // it will not yet provide any Suggestions. ((SuggestBox)p).showSuggestionList(); // The suggestion list lingers if we don't hide it. ((DefaultSuggestionDisplay) ((SuggestBox) p).getSuggestionDisplay()) .hideSuggestions(); } setFocus(false); } } public void setHintStyleName(String styleName) { if (hintStyleName != null && hintOn) { removeStyleName(hintStyleName); } hintStyleName = styleName; if (styleName != null && hintOn) { addStyleName(styleName); } } public String getHintStyleName() { return hintStyleName; } protected void blurHint() { if (! hintOn && getHintText() != null && "".equals(super.getText())) { hintOn = true; super.setText(getHintText()); if (getHintStyleName() != null) { addStyleName(getHintStyleName()); } } } protected void focusHint() { if (hintOn) { super.setText(""); if (getHintStyleName() != null) { removeStyleName(getHintStyleName()); } hintOn = false; } } public void setFocus(boolean focus) { super.setFocus(focus); if (focus != isFocused) { if (focus) { focusHint(); } else { blurHint(); } } isFocused = focus; } }