/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE file at the root of the source
* tree and available online at
*
* https://github.com/keeps/roda
*/
package org.roda.wui.client.common.search;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.roda.core.data.common.RodaConstants;
import org.roda.core.data.v2.ip.IndexedAIP;
import org.roda.core.data.v2.ip.IndexedFile;
import org.roda.core.data.v2.ip.IndexedRepresentation;
import org.roda.wui.client.browse.BrowserService;
import org.roda.wui.client.common.utils.AsyncCallbackUtils;
import org.roda.wui.client.common.utils.ListboxUtils;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.HasValueChangeHandlers;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Widget;
public class AdvancedSearchFieldsPanel extends FlowPanel implements HasValueChangeHandlers<Integer> {
private String className;
private final Map<String, SearchField> searchFields = new HashMap<>();
private ListBox searchAdvancedFieldOptions;
public AdvancedSearchFieldsPanel(String className) {
super();
this.className = className;
searchAdvancedFieldOptions = new ListBox();
BrowserService.Util.getInstance().retrieveSearchFields(className, LocaleInfo.getCurrentLocale().getLocaleName(),
new AsyncCallback<List<SearchField>>() {
@Override
public void onFailure(Throwable caught) {
AsyncCallbackUtils.defaultFailureTreatment(caught);
}
@Override
public void onSuccess(List<SearchField> searchFields) {
AdvancedSearchFieldsPanel.this.searchFields.clear();
for (SearchField searchField : searchFields) {
ListboxUtils.insertItemByAlphabeticOrder(searchAdvancedFieldOptions, searchField.getLabel(),
searchField.getId());
AdvancedSearchFieldsPanel.this.searchFields.put(searchField.getId(), searchField);
}
for (SearchField searchField : searchFields) {
if (searchField.isFixed()) {
addSearchFieldPanel(searchField.getId());
}
}
}
});
addStyleName("searchAdvancedFieldsPanel empty");
}
public void addSearchFieldPanel() {
addSearchFieldPanel(null);
}
public void addSearchFieldPanel(String field) {
final SearchFieldPanel searchFieldPanel = new SearchFieldPanel();
String selectedField = field;
searchFieldPanel.setSearchAdvancedFields(searchAdvancedFieldOptions);
searchFieldPanel.setSearchFields(searchFields);
if (selectedField == null) {
selectedField = searchFieldPanel.getFirstSearchField();
}
searchFieldPanel.selectSearchField(selectedField);
ClickHandler clickHandler = new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
AdvancedSearchFieldsPanel.this.remove(searchFieldPanel);
if (AdvancedSearchFieldsPanel.this.getWidgetCount() == 0) {
AdvancedSearchFieldsPanel.this.addStyleName("empty");
AdvancedSearchFieldsPanel.this.onChange();
addWarningToDuplicateFields();
}
}
};
searchFieldPanel.addRemoveClickHandler(clickHandler);
searchFieldPanel.addValueChangeHandler(new ValueChangeHandler<String>() {
@Override
public void onValueChange(ValueChangeEvent<String> event) {
setSuggestions(searchFieldPanel);
}
});
searchFieldPanel.addListBoxChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
addWarningToDuplicateFields();
}
});
setSuggestions(searchFieldPanel);
add(searchFieldPanel);
removeStyleName("empty");
onChange();
addWarningToDuplicateFields();
}
private void addWarningToDuplicateFields() {
List<String> activeFields = new ArrayList<>();
for (int i = 0; i < getWidgetCount(); i++) {
Widget widget = getWidget(i);
if (widget instanceof SearchFieldPanel) {
SearchFieldPanel fieldPanel = (SearchFieldPanel) widget;
ListBox listBox = fieldPanel.getAdvancedFieldBox();
if (activeFields.contains(listBox.getSelectedValue())) {
fieldPanel.setWarningVisible(true, listBox.getSelectedValue());
} else {
activeFields.add(listBox.getSelectedValue());
fieldPanel.setWarningVisible(false);
}
}
}
}
private void setSuggestions(SearchFieldPanel searchFieldPanel) {
SearchField searchField = searchFieldPanel.getSearchField();
if (searchField.getType().equals(RodaConstants.SEARCH_FIELD_TYPE_SUGGEST)) {
if (className.equals(RodaConstants.SEARCH_ITEMS)) {
searchFieldPanel.addInputSearchSuggestBox(new SearchSuggestBox<IndexedAIP>(IndexedAIP.class,
searchField.getSuggestField(), searchField.isSuggestPartial()));
} else if (className.equals(RodaConstants.SEARCH_REPRESENTATIONS)) {
searchFieldPanel.addInputSearchSuggestBox(new SearchSuggestBox<IndexedRepresentation>(
IndexedRepresentation.class, searchField.getSuggestField(), searchField.isSuggestPartial()));
} else if (className.equals(RodaConstants.SEARCH_FILES)) {
searchFieldPanel.addInputSearchSuggestBox(new SearchSuggestBox<IndexedFile>(IndexedFile.class,
searchField.getSuggestField(), searchField.isSuggestPartial()));
}
}
}
@Override
public HandlerRegistration addValueChangeHandler(ValueChangeHandler<Integer> handler) {
return addHandler(handler, ValueChangeEvent.getType());
}
protected void onChange() {
ValueChangeEvent.fire(this, getWidgetCount());
}
}