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