com.databasepreservation.visualization.client.common.search.SearchPanel.java Source code

Java tutorial

Introduction

Here is the source code for com.databasepreservation.visualization.client.common.search.SearchPanel.java

Source

/**
 * The contents of this file are based on those found at https://github.com/keeps/roda
 * and are subject to the license and copyright detailed in https://github.com/keeps/roda
 */
package com.databasepreservation.visualization.client.common.search;

import java.util.ArrayList;
import java.util.List;

import org.roda.core.data.adapter.filter.BasicSearchFilterParameter;
import org.roda.core.data.adapter.filter.Filter;
import org.roda.core.data.adapter.filter.FilterParameter;

import com.databasepreservation.visualization.client.ViewerStructure.ViewerDatabase;
import com.databasepreservation.visualization.client.common.lists.AsyncTableCell;
import com.databasepreservation.visualization.shared.client.Tools.HistoryManager;
import com.databasepreservation.visualization.shared.client.widgets.wcag.AccessibleFocusPanel;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
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.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;

/**
 * @author Bruno Ferreira <bferreira@keep.pt>
 */
public class SearchPanel extends Composite implements HasValueChangeHandlers<String> {
    private static final String FILTER_ICON = "<i class='fa fa-filter' aria-hidden='true'></i>";

    // private static final BrowseMessages messages =
    // GWT.create(BrowseMessages.class);

    private static final Binder binder = GWT.create(Binder.class);

    interface Binder extends UiBinder<Widget, SearchPanel> {
    }

    @UiField
    FlowPanel searchPanel;

    @UiField
    Dropdown searchInputListBox;

    @UiField
    TextBox searchInputBox;

    @UiField
    AccessibleFocusPanel searchInputButton;

    @UiField
    AccessibleFocusPanel searchAdvancedDisclosureButton;

    @UiField
    FlowPanel searchAdvancedPanel;

    @UiField
    FlowPanel searchAdvancedPanelButtons;

    @UiField
    Button searchAdvancedFieldOptionsAdd;

    @UiField
    Button searchAdvancedGo;

    @UiField
    Button saveSearchButton;
    AsyncCallback<Void> saveQueryCallback;

    @UiField
    FlowPanel searchPreFilters;

    private Filter defaultFilter;
    private String allFilter;
    private boolean defaultFilterIncremental = false;

    private FlowPanel fieldsPanel;
    private AsyncTableCell<?, ?> list;

    public SearchPanel(Filter defaultFilter, String allFilter, String placeholder, boolean showSearchInputListBox,
            boolean showSearchAdvancedDisclosureButton, final AsyncCallback<Void> saveQueryCallback) {
        this.saveQueryCallback = saveQueryCallback;
        this.defaultFilter = defaultFilter;
        this.allFilter = allFilter;

        initWidget(binder.createAndBindUi(this));

        if (placeholder != null) {
            searchInputBox.getElement().setPropertyString("placeholder", placeholder);
        }

        searchInputListBox.setVisible(showSearchInputListBox);
        searchAdvancedDisclosureButton.setVisible(showSearchAdvancedDisclosureButton);
        searchAdvancedPanel.setVisible(false);

        searchInputBox.addKeyDownHandler(new KeyDownHandler() {

            @Override
            public void onKeyDown(KeyDownEvent event) {
                if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
                    doSearch();
                }
            }
        });

        searchInputButton.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                doSearch();
            }
        });

        searchAdvancedDisclosureButton.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                showSearchAdvancedPanel();
            }
        });

        searchInputListBox.addValueChangeHandler(new ValueChangeHandler<String>() {

            @Override
            public void onValueChange(ValueChangeEvent<String> event) {
                onChange();
            }
        });

        if (showSearchAdvancedDisclosureButton) {
            searchPanel.addStyleName("searchPanelAdvanced");
        }

        saveSearchReset();

        searchPreFilters.setVisible(!defaultFilter.getParameters().isEmpty());
        drawSearchPreFilters();
    }

    private void drawSearchPreFilters() {
        searchPreFilters.clear();

        for (FilterParameter parameter : defaultFilter.getParameters()) {
            // HTML header = new HTML(SafeHtmlUtils.fromSafeConstant(FILTER_ICON));
            // header.addStyleName("inline gray");
            // searchPreFilters.add(header);

            HTML html = null;

            /*
             * Unused in DBViewer, for now if (parameter instanceof
             * SimpleFilterParameter) { SimpleFilterParameter p =
             * (SimpleFilterParameter) parameter; html = new
             * HTML(messages.searchPreFilterSimpleFilterParameter
             * (messages.searchPreFilterName(p.getName()),
             * messages.searchPreFilterValue(p.getValue()))); } else if (parameter
             * instanceof BasicSearchFilterParameter) { BasicSearchFilterParameter p =
             * (BasicSearchFilterParameter) parameter; // TODO put '*' in some
             * constant, see Search if (!"*".equals(p.getValue())) { html = new
             * HTML(messages
             * .searchPreFilterBasicSearchFilterParameter(messages.searchPreFilterName
             * (p.getName()), messages.searchPreFilterValue(p.getValue()))); } } else
             * if (parameter instanceof NotSimpleFilterParameter) {
             * NotSimpleFilterParameter p = (NotSimpleFilterParameter) parameter; html
             * = new HTML(messages.searchPreFilterNotSimpleFilterParameter(messages.
             * searchPreFilterName(p.getName()),
             * messages.searchPreFilterValue(p.getValue()))); } else if (parameter
             * instanceof EmptyKeyFilterParameter) { EmptyKeyFilterParameter p =
             * (EmptyKeyFilterParameter) parameter; html = new
             * HTML(messages.searchPreFilterEmptyKeyFilterParameter
             * (messages.searchPreFilterName(p.getName()))); } else { html = new
             * HTML(SafeHtmlUtils.fromString(parameter.getClass().getSimpleName())); }
             */

            if (html != null) {
                html.addStyleName("xsmall gray inline nowrap");
                searchPreFilters.add(html);
            }
        }
    }

    public void doSearch() {
        Filter filter = buildSearchFilter(searchInputBox.getText(), defaultFilter, allFilter, fieldsPanel,
                defaultFilterIncremental);
        list.setFilter(filter);
    }

    private Filter buildSearchFilter(String basicQuery, Filter defaultFilter, String allFilter,
            FlowPanel fieldsPanel, boolean defaultFilterIncremental) {
        List<FilterParameter> parameters = new ArrayList<FilterParameter>();

        if (basicQuery != null && basicQuery.trim().length() > 0) {
            parameters.add(new BasicSearchFilterParameter(allFilter, basicQuery));
        }

        if (fieldsPanel != null && fieldsPanel.getParent() != null && fieldsPanel.getParent().isVisible()) {
            for (int i = 0; i < fieldsPanel.getWidgetCount(); i++) {
                SearchFieldPanel searchAdvancedFieldPanel = (SearchFieldPanel) fieldsPanel.getWidget(i);
                FilterParameter filterParameter = searchAdvancedFieldPanel.getFilter();

                if (filterParameter != null) {
                    parameters.add(filterParameter);
                }
            }
        }

        Filter filter;
        if (defaultFilterIncremental) {
            filter = new Filter(defaultFilter);
            filter.add(parameters);
            searchPreFilters.setVisible(defaultFilter.getParameters().size() > 0);
            GWT.log("Incremental filter: " + filter);
        } else if (parameters.size() == 0) {
            filter = defaultFilter;
            searchPreFilters.setVisible(defaultFilter.getParameters().size() > 0);
            GWT.log("Default filter: " + filter);
        } else {
            filter = new Filter(parameters);
            searchPreFilters.setVisible(false);
            GWT.log("New filter: " + filter);
        }

        return filter;
    }

    public String getDropdownSelectedValue() {
        return searchInputListBox.getSelectedValue();
    }

    public void setDropdownLabel(String label) {
        searchInputListBox.setLabel(label);
    }

    public void addDropdownItem(String label, String value) {
        searchInputListBox.addItem(label, value);
    }

    private void showSearchAdvancedPanel() {
        searchAdvancedPanel.setVisible(!searchAdvancedPanel.isVisible());
        if (searchAdvancedPanel.isVisible()) {
            searchAdvancedDisclosureButton.addStyleName("open");
        } else {
            searchAdvancedDisclosureButton.removeStyleName("open");
        }
    }

    public void openSearchAdvancedPanel() {
        if (!searchAdvancedPanel.isVisible()) {
            searchAdvancedPanel.setVisible(true);
        }

        if (searchAdvancedPanel.isVisible()) {
            searchAdvancedDisclosureButton.addStyleName("open");
        }
    }

    public void addDropdownPopupStyleName(String styleName) {
        searchInputListBox.addPopupStyleName(styleName);
    }

    public void setFieldsPanel(FlowPanel fieldsPanel) {
        this.fieldsPanel = fieldsPanel;
        searchAdvancedPanel.clear();
        searchAdvancedPanel.add(fieldsPanel);
        searchAdvancedPanel.add(searchAdvancedPanelButtons);
    }

    public void setList(AsyncTableCell<?, ?> list) {
        this.list = list;
    }

    public void setDefaultFilter(Filter defaultFilter) {
        this.defaultFilter = defaultFilter;
        drawSearchPreFilters();
    }

    public void setAllFilter(String allFilter) {
        this.allFilter = allFilter;
    }

    public void setVariables(Filter defaultFilter, String allFilter, AsyncTableCell<?, ?> list,
            FlowPanel fieldsPanel) {
        setDefaultFilter(defaultFilter);
        setAllFilter(allFilter);
        setList(list);
        setFieldsPanel(fieldsPanel);
    }

    public void setDefaultFilterIncremental(boolean defaultFilterIncremental) {
        this.defaultFilterIncremental = defaultFilterIncremental;
    }

    public void clearSearchInputBox() {
        searchInputBox.setText("");
    }

    public void setSearchAdvancedFieldOptionsAddVisible(boolean visible) {
        searchAdvancedFieldOptionsAdd.setVisible(visible);
    }

    public void setSearchAdvancedGoEnabled(boolean enabled) {
        searchAdvancedGo.setEnabled(enabled);
    }

    public void addSearchAdvancedFieldAddHandler(ClickHandler handler) {
        searchAdvancedFieldOptionsAdd.addClickHandler(handler);
    }

    @UiHandler("searchAdvancedGo")
    void handleSearchAdvancedGo(ClickEvent e) {
        doSearch();
    }

    @Override
    public HandlerRegistration addValueChangeHandler(ValueChangeHandler<String> handler) {
        return addHandler(handler, ValueChangeEvent.getType());
    }

    protected void onChange() {
        ValueChangeEvent.fire(this, searchInputListBox.getSelectedValue());
    }

    public void updateSearchPanel(SearchInfo searchInfo) {
        if (SearchInfo.isPresentAndValid(searchInfo)) {
            this.defaultFilter = searchInfo.getDefaultFilter();
            this.searchInputBox.setText(searchInfo.getCurrentFilter());

            openSearchAdvancedPanel();
            if (fieldsPanel != null && fieldsPanel.getParent() != null && fieldsPanel.getParent().isVisible()) {
                for (int i = 0; i < fieldsPanel.getWidgetCount(); i++) {
                    SearchFieldPanel searchAdvancedFieldPanel = (SearchFieldPanel) fieldsPanel.getWidget(i);
                    searchAdvancedFieldPanel.setInputFromFilterParam(searchInfo.getFieldParameters().get(i));
                }
            }

            doSearch();
        }
    }

    public Filter getDefaultFilter() {
        return defaultFilter;
    }

    public String getCurrentFilter() {
        return searchInputBox.getText();
    }

    public List<FilterParameter> getAdvancedSearchFilterParameters() {
        List<FilterParameter> parameters = new ArrayList<>();

        if (fieldsPanel != null && fieldsPanel.getParent() != null && fieldsPanel.getParent().isVisible()) {
            for (int i = 0; i < fieldsPanel.getWidgetCount(); i++) {
                SearchFieldPanel searchAdvancedFieldPanel = (SearchFieldPanel) fieldsPanel.getWidget(i);

                parameters.add(searchAdvancedFieldPanel.getFilter());
            }
        }

        return parameters;
    }

    public List<SearchField> getAdvancedSearchSearchFields() {
        List<SearchField> searchFields = new ArrayList<>();

        if (fieldsPanel != null && fieldsPanel.getParent() != null && fieldsPanel.getParent().isVisible()) {
            for (int i = 0; i < fieldsPanel.getWidgetCount(); i++) {
                SearchFieldPanel searchAdvancedFieldPanel = (SearchFieldPanel) fieldsPanel.getWidget(i);

                searchFields.add(searchAdvancedFieldPanel.getSearchField());
            }
        }

        return searchFields;
    }

    private void saveSearchReset() {
        saveSearchButton.setText("Save search");
        saveSearchButton.addStyleName("searchPanelAdvancedSaveSearchButton");
        saveSearchButton.setEnabled(saveQueryCallback != null);
        saveSearchButton.setVisible(saveQueryCallback != null);
    }

    @UiHandler("saveSearchButton")
    void saveSearchOpenPanel(ClickEvent e) {
        saveSearchButton.setEnabled(false);
        saveSearchButton.setText("Saving...");
        saveQueryCallback.onSuccess(null);
    }

    public void querySavedHandler(boolean succeeded, ViewerDatabase database, String savedSearchUUID) {
        saveSearchReset();

        if (succeeded) {
            HistoryManager.gotoEditSavedSearch(database.getUUID(), savedSearchUUID);
        }
    }
}