Package com.google.gerrit.client.ui

Source Code of com.google.gerrit.client.ui.HintTextBox

// 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;
  }
}
TOP

Related Classes of com.google.gerrit.client.ui.HintTextBox

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.