blob: 5d741cfa226f2d46d68211baea7194160742f47d [file] [log] [blame]
// Copyright (C) 2014 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.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.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.event.logical.shared.HasCloseHandlers;
import com.google.gwt.event.logical.shared.HasSelectionHandlers;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Focusable;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.SuggestBox.DefaultSuggestionDisplay;
import com.google.gwt.user.client.ui.SuggestOracle;
import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
import com.google.gwt.user.client.ui.TextBoxBase;
public class RemoteSuggestBox extends Composite
implements Focusable,
HasText,
HasSelectionHandlers<String>,
HasCloseHandlers<RemoteSuggestBox> {
private final RemoteSuggestOracle remoteSuggestOracle;
private final DefaultSuggestionDisplay display;
private final HintTextBox textBox;
private final SuggestBox suggestBox;
private boolean submitOnSelection;
public RemoteSuggestBox(SuggestOracle oracle) {
remoteSuggestOracle = new RemoteSuggestOracle(oracle);
remoteSuggestOracle.setServeSuggestions(true);
display = new DefaultSuggestionDisplay();
textBox = new HintTextBox();
textBox.addKeyDownHandler(
new KeyDownHandler() {
@Override
public void onKeyDown(KeyDownEvent e) {
submitOnSelection = false;
if (e.getNativeKeyCode() == KeyCodes.KEY_ESCAPE) {
CloseEvent.fire(RemoteSuggestBox.this, RemoteSuggestBox.this);
} else if (e.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
if (display.isSuggestionListShowing()) {
if (textBox.getValue().equals(remoteSuggestOracle.getLast())) {
submitOnSelection = true;
} else {
display.hideSuggestions();
}
} else {
SelectionEvent.fire(RemoteSuggestBox.this, getText());
}
}
}
});
suggestBox = new SuggestBox(remoteSuggestOracle, textBox, display);
suggestBox.addSelectionHandler(
new SelectionHandler<Suggestion>() {
@Override
public void onSelection(SelectionEvent<Suggestion> event) {
if (submitOnSelection) {
SelectionEvent.fire(RemoteSuggestBox.this, getText());
}
remoteSuggestOracle.cancelOutstandingRequest();
display.hideSuggestions();
}
});
initWidget(suggestBox);
}
public void setHintText(String hint) {
textBox.setHintText(hint);
}
public void setVisibleLength(int len) {
textBox.setVisibleLength(len);
}
public void setEnabled(boolean enabled) {
suggestBox.setEnabled(enabled);
}
public TextBoxBase getTextBox() {
return textBox;
}
@Override
public String getText() {
return suggestBox.getText();
}
@Override
public void setText(String value) {
suggestBox.setText(value);
}
@Override
public void setFocus(boolean focus) {
suggestBox.setFocus(focus);
}
@Override
public int getTabIndex() {
return suggestBox.getTabIndex();
}
@Override
public void setAccessKey(char key) {
suggestBox.setAccessKey(key);
}
@Override
public void setTabIndex(int index) {
suggestBox.setTabIndex(index);
}
@Override
public HandlerRegistration addSelectionHandler(SelectionHandler<String> h) {
return addHandler(h, SelectionEvent.getType());
}
@Override
public HandlerRegistration addCloseHandler(CloseHandler<RemoteSuggestBox> h) {
return addHandler(h, CloseEvent.getType());
}
public void selectAll() {
suggestBox.getValueBox().selectAll();
}
public void enableDefaultSuggestions() {
textBox.addFocusHandler(
new FocusHandler() {
@Override
public void onFocus(FocusEvent focusEvent) {
if (textBox.getText().equals("")) {
suggestBox.showSuggestionList();
}
}
});
}
public void setServeSuggestionsOnOracle(boolean serveSuggestions) {
remoteSuggestOracle.setServeSuggestions(serveSuggestions);
}
}