/*
* Copyright 2017 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 java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import org.dashbuilder.dataset.DataColumn;
import org.dashbuilder.dataset.DataSetLookupConstraints;
import org.dashbuilder.dataset.group.ColumnGroup;
import org.dashbuilder.dataset.group.DataSetGroup;
import org.dashbuilder.dataset.sort.DataSetSort;
import org.dashbuilder.dataset.sort.SortOrder;
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.AbstractErraiDisplayer;
import org.jboss.errai.ioc.client.container.SyncBeanManager;
@Dependent
public class SelectorLabelSetDisplayer extends AbstractErraiDisplayer<SelectorLabelSetDisplayer.View> {
public interface View extends AbstractErraiDisplayer.View<SelectorLabelSetDisplayer> {
void showTitle(String title);
void setWidth(int width);
void margins(int top, int bottom, int left, int right);
void clearItems();
void addItem(SelectorLabelItem item);
String getGroupsTitle();
String getColumnsTitle();
void noData();
}
protected View view;
protected boolean filterOn = false;
protected boolean multipleSelections = false;
protected SyncBeanManager beanManager;
protected Set<SelectorLabelItem> itemCollection = new HashSet<>();
@Inject
public SelectorLabelSetDisplayer(View view, SyncBeanManager beanManager) {
this.beanManager = beanManager;
this.view = view;
this.view.init(this);
}
@Override
public View getView() {
return view;
}
@Override
public void close() {
super.close();
clearItems();
}
protected void clearItems() {
view.clearItems();
for (SelectorLabelItem item : itemCollection) {
beanManager.destroyBean(item);
}
itemCollection.clear();
}
protected void resetItems() {
for (SelectorLabelItem item : itemCollection) {
item.reset();
}
}
@Override
public DisplayerConstraints createDisplayerConstraints() {
DataSetLookupConstraints lookupConstraints = new DataSetLookupConstraints()
.setGroupRequired(true)
.setGroupColumn(true)
.setMaxColumns(-1)
.setMinColumns(1)
.setExtraColumnsAllowed(true)
.setGroupsTitle(view.getGroupsTitle())
.setColumnsTitle(view.getColumnsTitle());
return new DisplayerConstraints(lookupConstraints)
.supportsAttribute(DisplayerAttributeDef.TYPE)
.supportsAttribute(DisplayerAttributeDef.SUBTYPE)
.supportsAttribute(DisplayerAttributeDef.RENDERER)
.supportsAttribute(DisplayerAttributeDef.TITLE)
.supportsAttribute(DisplayerAttributeDef.TITLE_VISIBLE)
.supportsAttribute(DisplayerAttributeGroupDef.SELECTOR_GROUP)
.excludeAttribute(DisplayerAttributeDef.SELECTOR_SHOW_INPUTS)
.supportsAttribute(DisplayerAttributeGroupDef.CHART_MARGIN_GROUP)
.supportsAttribute(DisplayerAttributeGroupDef.COLUMNS_GROUP)
.supportsAttribute(DisplayerAttributeGroupDef.FILTER_GROUP)
.supportsAttribute(DisplayerAttributeGroupDef.REFRESH_GROUP);
}
@Override
protected void beforeDataSetLookup() {
// Make sure the drop down entries are sorted
DataSetGroup group = dataSetHandler.getCurrentDataSetLookup().getLastGroupOp();
if (dataSetHandler.getCurrentDataSetLookup().getOperationList(DataSetSort.class).isEmpty() && group != null) {
ColumnGroup column = group.getColumnGroup();
dataSetHandler.sort(column.getSourceId(), SortOrder.ASCENDING);
}
}
@Override
protected void createVisualization() {
if (displayerSettings.isTitleVisible()) {
view.showTitle(displayerSettings.getTitle());
}
view.margins(displayerSettings.getChartMarginTop(),
displayerSettings.getChartMarginBottom(),
displayerSettings.getChartMarginLeft(),
displayerSettings.getChartMarginRight());
multipleSelections = displayerSettings.isSelectorMultiple();
updateVisualization();
}
@Override
protected void updateVisualization() {
clearItems();
if (dataSet.getRowCount() == 0) {
view.noData();
}
else {
// 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);
StringBuilder title = new StringBuilder();
int ncolumns = dataSet.getColumns().size();
if (ncolumns > 1) {
for (int j = 1; j < ncolumns; j++) {
DataColumn extraColumn = dataSet.getColumnByIndex(j);
ColumnSettings columnSettings = displayerSettings.getColumnSettings(extraColumn);
String extraColumnName = columnSettings.getColumnName();
Object extraValue = dataSet.getValueAt(i, j);
if (extraValue != null) {
title.append(j > 1 ? " " : "");
String formattedValue = super.formatValue(i, j);
title.append(extraColumnName).append("=").append(formattedValue);
}
}
}
final SelectorLabelItem item = beanManager.lookupBean(SelectorLabelItem.class).newInstance();
item.init(i, value, title.toString());
item.setOnSelectCommand(() -> onItemSelected(item));
item.setOnResetCommand(() -> onItemReset(item));
view.addItem(item);
itemCollection.add(item);
}
// Set both the global and each item width
if (displayerSettings.getSelectorWidth() > 0) {
view.setWidth(displayerSettings.getSelectorWidth() + 100);
int itemWidth = 85 / itemCollection.size();
for (SelectorLabelItem labelItem : itemCollection) {
labelItem.setWidth(itemWidth);
}
}
}
}
public String getFirstColumnId() {
DataColumn firstColumn = dataSet.getColumnByIndex(0);
return firstColumn.getId();
}
void onItemSelected(SelectorLabelItem item) {
if (displayerSettings.isFilterEnabled()) {
String firstColumnId = getFirstColumnId();
// Reset current selection (if any) in single selection mode
if (!multipleSelections) {
List<Integer> currentFilter = filterIndexes(firstColumnId);
if (currentFilter != null && !currentFilter.isEmpty()) {
resetItems();
super.filterReset();
item.select();
}
}
// Filter by the selected entry
filterUpdate(firstColumnId, item.getId());
}
}
void onItemReset(SelectorLabelItem item) {
if (displayerSettings.isFilterEnabled()) {
String firstColumnId = getFirstColumnId();
filterUpdate(firstColumnId, item.getId());
}
}
}