/******************************************************************************* * Copyright (c) 2012 Original authors and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Original authors and others - initial API and implementation ******************************************************************************/ package org.eclipse.nebula.widgets.nattable.extension.builder.layers; import java.util.Map; import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry; import org.eclipse.nebula.widgets.nattable.data.IColumnPropertyAccessor; import org.eclipse.nebula.widgets.nattable.data.IDataProvider; import org.eclipse.nebula.widgets.nattable.extension.builder.configuration.ColumnGroupConfiguration; import org.eclipse.nebula.widgets.nattable.extension.builder.configuration.ColumnHeaderConfiguration; import org.eclipse.nebula.widgets.nattable.extension.builder.configuration.SortConfiguration; import org.eclipse.nebula.widgets.nattable.extension.builder.model.TableModel; import org.eclipse.nebula.widgets.nattable.extension.builder.model.TableRow; import org.eclipse.nebula.widgets.nattable.extension.builder.util.TableColumnUtils; import org.eclipse.nebula.widgets.nattable.extension.glazedlists.GlazedListsSortModel; import org.eclipse.nebula.widgets.nattable.extension.glazedlists.filterrow.DefaultGlazedListsFilterStrategy; import org.eclipse.nebula.widgets.nattable.filterrow.FilterRowHeaderComposite; import org.eclipse.nebula.widgets.nattable.grid.data.DefaultColumnHeaderDataProvider; import org.eclipse.nebula.widgets.nattable.grid.layer.ColumnHeaderLayer; import org.eclipse.nebula.widgets.nattable.group.ColumnGroupHeaderLayer; import org.eclipse.nebula.widgets.nattable.layer.AbstractLayerTransform; import org.eclipse.nebula.widgets.nattable.layer.DataLayer; import org.eclipse.nebula.widgets.nattable.layer.cell.AggregateConfigLabelAccumulator; import org.eclipse.nebula.widgets.nattable.layer.cell.IConfigLabelAccumulator; import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer; import org.eclipse.nebula.widgets.nattable.sort.SortHeaderLayer; import org.eclipse.nebula.widgets.nattable.util.IClientAreaProvider; import ca.odell.glazedlists.FilterList; import ca.odell.glazedlists.SortedList; public class ColumnHeaderLayerStack<T extends TableRow> extends AbstractLayerTransform { private final ColumnHeaderLayer columnHeaderLayer; private ColumnGroupHeaderLayer columnGroupHeaderLayer; private SortHeaderLayer<T> sortableColumnHeaderLayer; private final IDataProvider columnHeaderDataProvider; private final DataLayer columnHeaderDataLayer; private AggregateConfigLabelAccumulator aggregateLabelAccumulator; private FilterRowHeaderComposite<T> filterRowHeaderLayer; public ColumnHeaderLayerStack(SortedList<T> sortedList, FilterList<T> filterList, TableModel tableModel, BodyLayerStack<T> bodyLayer, IColumnPropertyAccessor<T> columnAccessor, IConfigRegistry configRegistry) { String[] propertyNames = TableColumnUtils .getPropertyNames(tableModel.columnProperties); Map<String, String> propertyToLabelMap = TableColumnUtils .getPropertyToLabelMap(tableModel.columnProperties); SelectionLayer selectionLayer = bodyLayer.getSelectionLayer(); columnHeaderDataProvider = new DefaultColumnHeaderDataProvider( propertyNames, propertyToLabelMap); columnHeaderDataLayer = new DataLayer(columnHeaderDataProvider, tableModel.tableStyle.defaultColumnWidth, tableModel.tableStyle.columnHeaderHeight); columnHeaderLayer = new ColumnHeaderLayer(columnHeaderDataLayer, bodyLayer, selectionLayer, false); GlazedListsSortModel<T> sortModel = new GlazedListsSortModel<T>( sortedList, columnAccessor, configRegistry, columnHeaderDataLayer); if (tableModel.enableColumnGroups) { columnGroupHeaderLayer = new ColumnGroupHeaderLayer( columnHeaderLayer, selectionLayer, tableModel.columnGroupModel, false); columnGroupHeaderLayer .setRowHeight(tableModel.tableStyle.columnGroupHeaderHeight); sortableColumnHeaderLayer = new SortHeaderLayer<T>( columnGroupHeaderLayer, sortModel, false); } else { sortableColumnHeaderLayer = new SortHeaderLayer<T>( columnHeaderLayer, sortModel, false); } if (tableModel.enableFilterRow) { filterRowHeaderLayer = new FilterRowHeaderComposite<T>( new DefaultGlazedListsFilterStrategy<T>(filterList, columnAccessor, configRegistry), sortableColumnHeaderLayer, columnHeaderDataProvider, configRegistry); setUnderlyingLayer(filterRowHeaderLayer); } else { setUnderlyingLayer(sortableColumnHeaderLayer); } setupAggregateLabelAccumulator(); // ** Configure ** // Sorting sortableColumnHeaderLayer.addConfiguration(new SortConfiguration()); // Column groups if (tableModel.enableColumnGroups) { columnGroupHeaderLayer .addConfiguration(new ColumnGroupConfiguration( tableModel.columnGroupModel, tableModel)); } columnHeaderLayer.addConfiguration(new ColumnHeaderConfiguration( tableModel.tableStyle)); } private void setupAggregateLabelAccumulator() { aggregateLabelAccumulator = new AggregateConfigLabelAccumulator(); getDataLayer().setConfigLabelAccumulator(aggregateLabelAccumulator); } public void addLabelAccumulator(IConfigLabelAccumulator accumulator) { aggregateLabelAccumulator.add(accumulator); } @Override public void setClientAreaProvider(IClientAreaProvider clientAreaProvider) { super.setClientAreaProvider(clientAreaProvider); } public ColumnGroupHeaderLayer getColumnGroupHeaderLayer() { return columnGroupHeaderLayer; } public ColumnHeaderLayer getColumnHeaderLayer() { return columnHeaderLayer; } public IDataProvider getDataProvider() { return columnHeaderDataProvider; } public DataLayer getDataLayer() { return columnHeaderDataLayer; } public SortHeaderLayer<T> getSortHeaderLayer() { return sortableColumnHeaderLayer; } public FilterRowHeaderComposite<T> getFilterRowHeaderLayer() { return filterRowHeaderLayer; } }