/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* 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 org.uberfire.ext.widgets.common.client.dropdown;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Widget;
import org.uberfire.client.mvp.UberView;
import org.uberfire.mvp.Command;
@Dependent
public class LiveSearchDropDown implements IsWidget {
View view;
int maxItems = 10;
LiveSearchService searchService = null;
boolean searchEnabled = true;
boolean searchCacheEnabled = true;
Map<String, List<String>> searchCache = new HashMap<>();
String selectedItem = null;
String lastSearch = null;
String searchHint = null;
String selectorHint = null;
String notFoundMessage = null;
Command onChange;
@Inject
public LiveSearchDropDown(View view) {
this.view = view;
view.init(this);
searchHint = view.getDefaultSearchHintI18nMessage();
selectorHint = view.getDefaultSelectorHintI18nMessage();
notFoundMessage = view.getDefaultNotFoundI18nMessage();
}
@Override
public Widget asWidget() {
return view.asWidget();
}
public boolean isSearchEnabled() {
return searchEnabled;
}
public void setSearchEnabled(boolean searchEnabled) {
this.searchEnabled = searchEnabled;
view.setSearchEnabled(searchEnabled);
}
public void setSelectorHint(String text) {
selectorHint = text;
view.setDropDownText(text);
}
public void setSearchHint(String text) {
searchHint = text;
view.setSearchHint(text);
}
public void setNotFoundMessage(String noItemsMessage) {
this.notFoundMessage = noItemsMessage;
}
public void setOnChange(Command onChange) {
this.onChange = onChange;
}
public void setSearchService(LiveSearchService searchService) {
this.searchService = searchService;
}
public boolean isSearchCacheEnabled() {
return searchCacheEnabled;
}
public void setSearchCacheEnabled(boolean searchCacheEnabled) {
this.searchCacheEnabled = searchCacheEnabled;
}
public int getMaxItems() {
return maxItems;
}
public void setMaxItems(int maxItems) {
this.maxItems = maxItems;
}
public void setWidth(int minWidth) {
view.setWidth(minWidth);
}
public String getSelectedItem() {
return selectedItem;
}
public void setSelectedItem(String selectedItem) {
this.selectedItem = selectedItem;
view.setSelectedItem(selectedItem);
}
public void clear() {
lastSearch = null;
view.clearSearch();
view.clearItems();
view.setDropDownText(selectorHint);
}
public String getLastSearch() {
return lastSearch;
}
public void search(String pattern) {
if (lastSearch == null || !lastSearch.equals(pattern)) {
lastSearch = pattern != null ? pattern : "";
if (searchCacheEnabled && searchCache.containsKey(lastSearch)) {
showItemList(getFromSearchCache(lastSearch));
} else {
doSearch(pattern);
}
}
}
protected void doSearch(String pattern) {
view.searchInProgress(searchHint);
searchService.search(lastSearch,
maxItems,
itemList -> {
addToSearchCache(pattern,
itemList);
showItemList(itemList);
view.searchFinished();
});
}
protected List<String> getFromSearchCache(String pattern) {
return searchCache.get(pattern);
}
protected void addToSearchCache(String pattern,
List<String> itemList) {
searchCache.put(pattern,
itemList);
}
public void showItemList(List<String> itemList) {
view.clearItems();
if (itemList.isEmpty()) {
view.noItems(notFoundMessage);
}
for (String i : itemList) {
view.addItem(i);
}
}
void onItemsShown() {
Scheduler.get().scheduleDeferred(() -> {
search(lastSearch);
});
}
// View callbacks
void onItemSelected(String item) {
selectedItem = item;
view.setDropDownText(item);
if (onChange != null) {
onChange.execute();
}
}
public interface View extends UberView<LiveSearchDropDown> {
void clearItems();
void noItems(String msg);
void addItem(String item);
void setSelectedItem(String selectedItem);
void setSearchEnabled(boolean enabled);
void setSearchHint(String text);
void clearSearch();
void searchInProgress(String msg);
void searchFinished();
void setDropDownText(String text);
void setWidth(int minWidth);
void setMaxHeight(int maxHeight);
String getDefaultSearchHintI18nMessage();
String getDefaultSelectorHintI18nMessage();
String getDefaultNotFoundI18nMessage();
}
}