/** * 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.common.client.tools; import java.util.List; import java.util.Map; import org.roda.core.data.v2.index.IndexResult; import org.roda.core.data.v2.index.IsIndexed; import org.roda.core.data.v2.index.facet.FacetFieldResult; import org.roda.core.data.v2.index.facet.FacetParameter; import org.roda.core.data.v2.index.facet.FacetValue; import org.roda.core.data.v2.index.facet.Facets; import org.roda.wui.client.common.lists.utils.AsyncTableCell; import org.roda.wui.common.client.ClientLogger; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.FlowPanel; public class FacetUtils { private FacetUtils() { } private static ClientLogger LOGGER = new ClientLogger(FacetUtils.class.getName()); public static <T extends IsIndexed> void bindFacets(final AsyncTableCell<T, ?> list, final Map<String, FlowPanel> facetPanels) { bindFacets(list, facetPanels, false); } public static <T extends IsIndexed> void bindFacets(final AsyncTableCell<T, ?> list, final Map<String, FlowPanel> facetPanels, final boolean hideDisabled) { list.addValueChangeHandler(new ValueChangeHandler<IndexResult<T>>() { @Override public void onValueChange(ValueChangeEvent<IndexResult<T>> event) { FacetUtils.updateFacetPanels(list, facetPanels, event.getValue().getFacetResults(), hideDisabled); } }); } private static <T extends IsIndexed> void updateFacetPanels(final AsyncTableCell<T, ?> list, final Map<String, FlowPanel> facetPanels, final List<FacetFieldResult> facetResults, final boolean hideDisabled) { for (FacetFieldResult facetResult : facetResults) { final String facetField = facetResult.getField(); FlowPanel facetPanel = facetPanels.get(facetResult.getField()); if (facetPanel != null) { facetPanel.clear(); if (facetResult.getTotalCount() == 0) { facetPanel.getParent().addStyleName("facet-empty"); } else { facetPanel.getParent().removeStyleName("facet-empty"); } for (FacetValue facetValue : facetResult.getValues()) { final String value = facetValue.getValue(); final String label = facetValue.getLabel(); long count = facetValue.getCount(); boolean selected = facetResult.getSelectedValues().contains(value); StringBuilder checkboxLabel = new StringBuilder(); checkboxLabel.append(label); if (count > 0 || facetResult.getSelectedValues().isEmpty() || selected) { checkboxLabel.append(" (").append(count).append(")"); } CheckBox facetValuePanel = new CheckBox(checkboxLabel.toString()); facetValuePanel.setTitle(checkboxLabel.toString()); facetValuePanel.addStyleName("sidebar-facet-label"); facetValuePanel.addStyleName("fade-out"); boolean enabled = count > 0 || !facetResult.getSelectedValues().isEmpty(); facetValuePanel.setEnabled(enabled); if (hideDisabled) { facetValuePanel.setVisible(enabled); } facetPanel.add(facetValuePanel); facetValuePanel.setValue(selected); facetValuePanel.addValueChangeHandler(new ValueChangeHandler<Boolean>() { @Override public void onValueChange(ValueChangeEvent<Boolean> event) { Facets facets = list.getFacets(); FacetParameter selectedFacetParameter = facets.getParameters().get(facetField); if (selectedFacetParameter != null) { if (event.getValue()) { selectedFacetParameter.getValues().add(value); } else { selectedFacetParameter.getValues().remove(value); } } else { LOGGER.warn("Haven't found the facet parameter: " + facetField); } list.setFacets(facets); } }); } } else { LOGGER.warn("Got a facet but haven't got a panel for it"); } } } public static boolean hasSelected(Facets facets) { boolean hasSelected = false; if (facets != null) { for (FacetParameter fp : facets.getParameters().values()) { if (!fp.getValues().isEmpty()) { hasSelected = true; break; } } } return hasSelected; } public static void clearFacets(Facets facets) { for (Map.Entry<String, FacetParameter> entry : facets.getParameters().entrySet()) { entry.getValue().getValues().clear(); } } }