blob: fad2ebe98692ca74e12d40b02448fcd506a1839f [file] [log] [blame]
/**
*
* Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Florian Pirchner <florian.pirchner@gmail.com> - Initial implementation
*/
package org.eclipse.osbp.vaadin.addons.suggesttext.client;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.osbp.vaadin.addons.suggesttext.client.OQueryDelegate.FutureCallback;
import org.eclipse.osbp.vaadin.addons.suggesttext.client.OQueryDelegate.SuggestionResult;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.SuggestOracle;
// TODO: Auto-generated Javadoc
/**
* An oracle that delegates to a serverside RPC.
*/
public class ODelegatingOracle extends SuggestOracle {
/** The delegate. */
private final OQueryDelegate delegate;
/** The delay timer. */
private CustomTimer delayTimer;
/** The popup delay. */
private int popupDelay;
/** The o suggest box. */
private OSuggestBox oSuggestBox;
/** The suggestion enabled. */
private boolean suggestionEnabled;
/**
* Instantiates a new o delegating oracle.
*
* @param delegate the delegate
*/
public ODelegatingOracle(OQueryDelegate delegate) {
this.delegate = delegate;
}
/* (non-Javadoc)
* @see com.google.gwt.user.client.ui.SuggestOracle#requestSuggestions(com.google.gwt.user.client.ui.SuggestOracle.Request, com.google.gwt.user.client.ui.SuggestOracle.Callback)
*/
@Override
public void requestSuggestions(final Request request, final Callback callback) {
if (request.getQuery() == null || request.equals("") || !suggestionEnabled) {
return;
}
if (delayTimer == null) {
delayTimer = new CustomTimer();
} else {
delayTimer.cancel();
}
delayTimer.setRequest(request);
delayTimer.setCallback(callback);
delayTimer.schedule(popupDelay);
}
/* (non-Javadoc)
* @see com.google.gwt.user.client.ui.SuggestOracle#requestDefaultSuggestions(com.google.gwt.user.client.ui.SuggestOracle.Request, com.google.gwt.user.client.ui.SuggestOracle.Callback)
*/
public void requestDefaultSuggestions(Request request, Callback callback) {
if (delayTimer != null) {
delayTimer.cancel();
delayTimer = null;
}
super.requestDefaultSuggestions(request, callback);
}
public void resetCurrentHandle() {
delegate.resetCurrentHandle();
}
/**
* Sets the delay until the popup occurs.
*
* @param popupDelay the new popup delay
*/
public void setPopupDelay(int popupDelay) {
this.popupDelay = popupDelay;
}
/**
* Timer to implement the popupDelay.
*/
private class CustomTimer extends Timer {
/** The request. */
private Request request;
/** The callback. */
private Callback callback;
/**
* Sets the request.
*
* @param request the new request
*/
public void setRequest(Request request) {
this.request = request;
}
/**
* Sets the callback.
*
* @param callback the new callback
*/
public void setCallback(Callback callback) {
this.callback = callback;
}
/* (non-Javadoc)
* @see com.google.gwt.user.client.Timer#run()
*/
@Override
public void run() {
// make an rpc call
delegate.requestSuggestions(request, new FutureCallback() {
@Override
public void respondSuggestions(List<SuggestionResult> suggestions) {
if (suggestions.size() == 1) {
oSuggestBox.setSingleSuggestionAndClosePopup(new OSuggestion(suggestions.get(0)));
} else {
List<OSuggestion> temp = new ArrayList<>();
for (SuggestionResult r : suggestions) {
temp.add(new OSuggestion(r));
}
Response response = new Response();
response.setMoreSuggestions(false);
response.setSuggestions(temp);
callback.onSuggestionsReady(request, response);
}
}
});
}
}
/**
* Sets the suggest box.
*
* @param oSuggestBox the new suggest box
*/
protected void setSuggestBox(OSuggestBox oSuggestBox) {
this.oSuggestBox = oSuggestBox;
}
/**
* True, if the suggestion box should be used.
*
* @param suggestionEnabled the new suggestion enabled
*/
public void setSuggestionEnabled(boolean suggestionEnabled) {
this.suggestionEnabled = suggestionEnabled;
}
public boolean isSuggestionEnabled() {
return suggestionEnabled;
}
}