org.roda.wui.client.common.search.AdvancedSearchFieldsPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.roda.wui.client.common.search.AdvancedSearchFieldsPanel.java

Source

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