blob: 2ac9ce17a79b973825f8f5d5e637d9d9c01a36c5 [file] [log] [blame]
/****************************************************************
* Licensed to the Apache Software Foundation (ASF) under one *
* or more contributor license agreements. See the NOTICE file *
* distributed with this work for additional information *
* regarding copyright ownership. The ASF licenses this file *
* to you 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 org.apache.hupa.widgets.ui;
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.user.client.DOM;
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.MultiWordSuggestOracle;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.SuggestOracle;
import com.google.gwt.user.client.ui.TextArea;
/**
* A text-area which shows a pop-up with suggestions.
* Different values in the text area are separated by comma.
*
* @author manolo
*/
public class MultiValueSuggestArea extends Composite implements HasText, Focusable {
/**
* It is necessary to modify the behavior of the default SuggestBox, because
* it look for items which match the entire text in the box.
*
* @author manolo
*/
@SuppressWarnings("deprecation")
private class CustomSuggestBox extends SuggestBox {
public CustomSuggestBox(SuggestOracle oracle) {
// this is a hack, It is necessary to override the TextBoxBase passed to the constructor
// instead of overriding getText and setText from SuggestBox because a bug in the implementation
// I've sent a patch to gwt.
super(oracle, new TextArea() {
{
// Avoid entering a new-line when selecting a suggestion element
// TODO: I think this is a bug in GWT SuggestBox which should be reported.
addKeyDownHandler(new KeyDownHandler() {
public void onKeyDown(KeyDownEvent event) {
if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
event.preventDefault();
}
}
});
}
String search = null;
@Override
public String getText() {
return search = super.getText().replaceFirst("\\s+$", "").replaceFirst("^\\s+","").replaceAll("[\\s;]", ",").replaceFirst("^.+,", "");
}
@Override
public void setText(String text) {
if (text.trim().length() > 0) {
String actual = super.getText().replaceFirst("\\s+$", "").replaceFirst(search + "[\\s]*$", "");
super.setText(actual + text + ", ");
}
}
});
}
// We have to use getValue and setValue to get/set the entire text of the textarea
// because setText and getText have different behavior since we have modified
// this methods in the the box implementation
@Override
public String getValue() {
return DOM.getElementProperty(getValueBox().getElement(), "value");
}
@Override
public void setValue(String text) {
DOM.setElementProperty(getValueBox().getElement(), "value", text);
}
}
private SuggestBox box;
private MultiWordSuggestOracle oracle;
public MultiValueSuggestArea(SuggestOracle oracle) {
box = new CustomSuggestBox(oracle);
initWidget(box);
}
public MultiValueSuggestArea(String separators) {
this(null, separators);
}
public MultiValueSuggestArea(Object[] list, String separators) {
oracle = new MultiWordSuggestOracle(separators);
box = new CustomSuggestBox(oracle);
initWidget(box);
fillOracle(list);
}
public String getText() {
return box.getValue();
}
public void setText(String text) {
box.setValue(text);
}
public void fillOracle(Object[] list) {
oracle.clear();
if (list != null)
for (Object o : list)
oracle.add(o.toString());
}
public SuggestOracle getOracle() {
return oracle;
}
public int getTabIndex() {
return box.getTabIndex();
}
public void setAccessKey(char key) {
box.setAccessKey(key);
}
public void setFocus(boolean focused) {
box.setFocus(focused);
}
public void setTabIndex(int index) {
box.setTabIndex(index);
}
}