/* * Copyright 2014 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.dashbuilder.renderer.client.selector; import org.dashbuilder.dataset.ColumnType; import org.dashbuilder.dataset.DataColumn; import org.dashbuilder.dataset.DataSetLookupConstraints; import org.dashbuilder.dataset.group.DataSetGroup; import org.dashbuilder.displayer.ColumnSettings; import org.dashbuilder.displayer.DisplayerAttributeDef; import org.dashbuilder.displayer.DisplayerAttributeGroupDef; import org.dashbuilder.displayer.DisplayerConstraints; import org.dashbuilder.displayer.client.AbstractDisplayer; import org.dashbuilder.displayer.client.Displayer; import java.util.List; import javax.enterprise.context.Dependent; import javax.inject.Inject; @Dependent public class SelectorDisplayer extends AbstractDisplayer<SelectorDisplayer.View> { public interface View extends AbstractDisplayer.View<SelectorDisplayer> { void showSelectHint(String column); void showResetHint(String column); void clearItems(); void addItem(String id, String value, boolean selected); String getSelectedId(); int getItemCount(); void setItemTitle(int id, String title); void setFilterEnabled(boolean enabled); String getGroupsTitle(); String getColumnsTitle(); } protected View view; protected boolean filterOn = false; public SelectorDisplayer() { this(new SelectorDisplayerView()); } @Inject public SelectorDisplayer(View view) { this.view = view; this.view.init(this); } @Override public View getView() { return view; } @Override public DisplayerConstraints createDisplayerConstraints() { DataSetLookupConstraints lookupConstraints = new DataSetLookupConstraints() .setGroupRequired(true) .setGroupColumn(true) .setMaxColumns(-1) .setMinColumns(1) .setExtraColumnsAllowed(true) .setGroupsTitle(view.getGroupsTitle()) .setColumnsTitle(view.getColumnsTitle()) .setColumnTypes(new ColumnType[] { ColumnType.LABEL}); return new DisplayerConstraints(lookupConstraints) .supportsAttribute( DisplayerAttributeDef.TYPE ) .supportsAttribute( DisplayerAttributeGroupDef.COLUMNS_GROUP ) .supportsAttribute( DisplayerAttributeGroupDef.FILTER_GROUP ) .supportsAttribute( DisplayerAttributeGroupDef.REFRESH_GROUP ) .supportsAttribute( DisplayerAttributeGroupDef.GENERAL_GROUP ); } @Override protected void createVisualization() { view.setFilterEnabled(displayerSettings.isFilterEnabled()); updateVisualization(); } @Override protected void updateVisualization() { view.clearItems(); DataColumn firstColumn = dataSet.getColumnByIndex(0); String firstColumnId = firstColumn.getId(); ColumnSettings columnSettings = displayerSettings.getColumnSettings(firstColumn); String firstColumnName = columnSettings.getColumnName(); List<Integer> currentFilter = super.filterIndexes(firstColumnId); // Add a selector hint according to the filter status if (currentFilter.isEmpty()) { view.showSelectHint(firstColumnName); } else { view.showResetHint(firstColumnName); } // Generate the list entries from the current data set for (int i = 0; i < dataSet.getRowCount(); i++) { Object obj = dataSet.getValueAt(i, 0); if (obj == null) { continue; } String value = super.formatValue(i, 0); boolean selected = currentFilter != null && currentFilter.contains(i); view.addItem(Integer.toString(i), value, selected); // Generate an option tooltip (only if extra data set columns are defined) int ncolumns = dataSet.getColumns().size(); if (ncolumns > 1) { StringBuilder out = new StringBuilder(); for (int j = 1; j < ncolumns; j++) { DataColumn extraColumn = dataSet.getColumnByIndex(j); columnSettings = displayerSettings.getColumnSettings(extraColumn); String extraColumnName = columnSettings.getColumnName(); Object extraValue = dataSet.getValueAt(i, j); if (extraValue != null) { out.append(j > 1 ? " " : ""); String formattedValue = super.formatValue(i, j); out.append(extraColumnName).append("=").append(formattedValue); } } view.setItemTitle(view.getItemCount()-1, out.toString()); } } } // View notifications public void onItemSelected() { // Reset the current filter (if any) DataColumn firstColumn = dataSet.getColumnByIndex(0); String firstColumnId = firstColumn.getId(); List<Integer> currentFilter = filterIndexes(firstColumnId); if (currentFilter != null && !currentFilter.isEmpty()) { filterReset(); } ColumnSettings columnSettings = displayerSettings.getColumnSettings(firstColumn); String firstColumnName = columnSettings.getColumnName(); String selected = view.getSelectedId(); if (selected != null) { // Filter by the selected value (if any) filterUpdate(firstColumnId, Integer.parseInt(selected)); view.showResetHint(firstColumnName); } else { view.showSelectHint(firstColumnName); } } // KEEP IN SYNC THE CURRENT SELECTION WITH ANY EXTERNAL FILTER @Override public void onFilterEnabled(Displayer displayer, DataSetGroup groupOp) { String firstColumnId = dataSet.getColumnByIndex(0).getId(); List<Integer> currentFilter = super.filterIndexes(firstColumnId); // If selector is active then ignore external filters. if (currentFilter.isEmpty()) { if (firstColumnId.equals(groupOp.getColumnGroup().getColumnId())) { columnSelectionMap.put(groupOp.getColumnGroup().getColumnId(), groupOp.getSelectedIntervalList()); } super.onFilterEnabled(displayer, groupOp); } } @Override public void onFilterReset(Displayer displayer, List<DataSetGroup> groupOps) { String firstColumnId = dataSet.getColumnByIndex(0).getId(); List<Integer> currentFilter = super.filterIndexes(firstColumnId); // If selector is active then ignore external filters. if (currentFilter.isEmpty()) { for (DataSetGroup groupOp : groupOps) { if (firstColumnId.equals(groupOp.getColumnGroup().getColumnId())) { columnSelectionMap.remove(groupOp.getColumnGroup().getColumnId()); } } super.onFilterReset(displayer, groupOps); } } }