/*
* Copyright 2008 Jeff Dwyer
*
* 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.apress.progwt.client.suggest;
import com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.KeyboardListenerAdapter;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.SuggestionEvent;
import com.google.gwt.user.client.ui.SuggestionHandler;
import com.google.gwt.user.client.ui.Widget;
public abstract class AbstractCompleter<T> extends Composite {
private AbstractSuggestOracle<T> oracle;
private CompleteListener<T> completeListener;
private SuggestBox suggestBox;
private Timer keyboardEnterTimer;
public AbstractCompleter(AbstractSuggestOracle<T> oracle,
CompleteListener<T> completeListener) {
super();
this.oracle = oracle;
this.completeListener = completeListener;
suggestBox = new SuggestBox(oracle);
suggestBox.addEventHandler(new SuggestionHandler() {
public void onSuggestionSelected(SuggestionEvent event) {
Log.debug("On Suggestion Selected! "
+ event.getSelectedSuggestion()
.getReplacementString());
// Important, this prevents duplications
if (keyboardEnterTimer != null) {
keyboardEnterTimer.cancel();
}
complete(event.getSelectedSuggestion()
.getReplacementString());
}
});
suggestBox.addKeyboardListener(new KeyboardListenerAdapter() {
// @Override
public void onKeyPress(Widget sender, char keyCode,
int modifiers) {
if (keyCode == KEY_ENTER) {
keyboardEnterTimer = new Timer() {
// @Override
public void run() {
complete(suggestBox.getText());
}
};
keyboardEnterTimer.schedule(400);
}
}
});
initWidget(suggestBox);
}
/**
* public so we can call this at any time
*/
public void complete() {
complete(suggestBox.getText());
}
/**
* Careful to prevent dupes, one from enter key keyboard listener, one
* from the enter key selecting a suggestion. We need the keyboard
* listener because we want the enter key to add the current text when
* there's no suggestion.
*
* @param completeStr
*/
private void complete(final String completeStr) {
Log.debug("AbstractCompleter:" + completeStr + " ");
oracle.fireCompleteListenerFromCompleteString(completeStr,
completeListener);
suggestBox.setText("");
}
public void setText(String string) {
suggestBox.setText(string);
}
public String getText() {
return suggestBox.getText();
}
public void setFocus(final boolean b) {
DeferredCommand.addCommand(new Command() {
public void execute() {
suggestBox.setFocus(b);
}
});
}
}