/******************************************************************************* * 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.examples.fixtures; import java.util.Collection; 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.data.ListDataProvider; import org.eclipse.nebula.widgets.nattable.data.ReflectiveColumnPropertyAccessor; import org.eclipse.nebula.widgets.nattable.extension.glazedlists.GlazedListsEventLayer; import org.eclipse.nebula.widgets.nattable.extension.glazedlists.GlazedListsSortModel; import org.eclipse.nebula.widgets.nattable.grid.data.DefaultColumnHeaderDataProvider; import org.eclipse.nebula.widgets.nattable.grid.data.DefaultCornerDataProvider; import org.eclipse.nebula.widgets.nattable.grid.data.DefaultRowHeaderDataProvider; import org.eclipse.nebula.widgets.nattable.grid.layer.ColumnHeaderLayer; import org.eclipse.nebula.widgets.nattable.grid.layer.CornerLayer; import org.eclipse.nebula.widgets.nattable.grid.layer.DefaultColumnHeaderDataLayer; import org.eclipse.nebula.widgets.nattable.grid.layer.DefaultRowHeaderDataLayer; import org.eclipse.nebula.widgets.nattable.grid.layer.GridLayer; import org.eclipse.nebula.widgets.nattable.grid.layer.RowHeaderLayer; import org.eclipse.nebula.widgets.nattable.layer.AbstractLayer; import org.eclipse.nebula.widgets.nattable.layer.DataLayer; import org.eclipse.nebula.widgets.nattable.layer.ILayer; import org.eclipse.nebula.widgets.nattable.layer.cell.ColumnOverrideLabelAccumulator; import org.eclipse.nebula.widgets.nattable.layer.event.ColumnStructuralChangeEvent; import org.eclipse.nebula.widgets.nattable.layer.event.ILayerEvent; import org.eclipse.nebula.widgets.nattable.layer.event.StructuralDiff; import org.eclipse.nebula.widgets.nattable.layer.stack.DefaultBodyLayerStack; import org.eclipse.nebula.widgets.nattable.sort.SortHeaderLayer; import org.eclipse.nebula.widgets.nattable.util.IClientAreaProvider; import ca.odell.glazedlists.EventList; import ca.odell.glazedlists.SortedList; /** * Factory for assembling GridLayer and the child layers - with support for * GlazedLists * * @see <a href="http://publicobject.com/glazedlists/"> http://publicobject.com/ * glazedlists/</a> */ public class ColumnStructureUpdatesExampleGridLayer<T> extends GridLayer { private ColumnOverrideLabelAccumulator columnLabelAccumulator; private DataLayer bodyDataLayer; private DataLayer columnHeaderDataLayer; public ColumnStructureUpdatesExampleGridLayer(EventList<T> eventList, String[] propertyNames, Map<String, String> propertyToLabelMap, IConfigRegistry configRegistry) { this(eventList, propertyNames, propertyToLabelMap, configRegistry, true); } public ColumnStructureUpdatesExampleGridLayer(EventList<T> eventList, String[] propertyNames, Map<String, String> propertyToLabelMap, IConfigRegistry configRegistry, boolean useDefaultConfiguration) { super(useDefaultConfiguration); // Body - with list event listener // NOTE: Remember to use the SortedList constructor with 'null' for the // Comparator SortedList<T> sortedList = new SortedList<>(eventList, null); IColumnPropertyAccessor<T> columnPropertyAccessor = new ReflectiveColumnPropertyAccessor<>( propertyNames); this.bodyDataProvider = new ListDataProviderExample<>(sortedList, columnPropertyAccessor); this.bodyDataLayer = new DataLayer(this.bodyDataProvider); GlazedListsEventLayer<T> glazedListsEventLayer = new GlazedListsEventLayer<>( this.bodyDataLayer, eventList); DefaultBodyLayerStack bodyLayer = new DefaultBodyLayerStack( glazedListsEventLayer); // Sort Column header IDataProvider columnHeaderDataProvider = new DefaultColumnHeaderDataProvider( propertyNames, propertyToLabelMap); this.columnHeaderDataLayer = new DefaultColumnHeaderDataLayer( columnHeaderDataProvider); ColumnHeaderLayer columnHeaderLayer = new ColumnHeaderLayer( this.columnHeaderDataLayer, bodyLayer, bodyLayer.getSelectionLayer()); // Auto configure off. Configurations have to applied manually. SortHeaderLayer<T> columnHeaderSortableLayer = new SortHeaderLayer<>( columnHeaderLayer, new GlazedListsSortModel<>(sortedList, columnPropertyAccessor, configRegistry, this.columnHeaderDataLayer), false); // Row header DefaultRowHeaderDataProvider rowHeaderDataProvider = new DefaultRowHeaderDataProvider( this.bodyDataProvider); DefaultRowHeaderDataLayer rowHeaderDataLayer = new DefaultRowHeaderDataLayer( rowHeaderDataProvider); RowHeaderLayer rowHeaderLayer = new RowHeaderLayer(rowHeaderDataLayer, bodyLayer, bodyLayer.getSelectionLayer()); // Corner DefaultCornerDataProvider cornerDataProvider = new DefaultCornerDataProvider( columnHeaderDataProvider, rowHeaderDataProvider); DataLayer cornerDataLayer = new DataLayer(cornerDataProvider); CornerLayer cornerLayer = new CornerLayer(cornerDataLayer, rowHeaderLayer, columnHeaderLayer); // Grid setBodyLayer(bodyLayer); setColumnHeaderLayer(columnHeaderSortableLayer); setRowHeaderLayer(rowHeaderLayer); setCornerLayer(cornerLayer); } public ColumnOverrideLabelAccumulator getColumnLabelAccumulator() { return this.columnLabelAccumulator; } @Override public void setClientAreaProvider(IClientAreaProvider clientAreaProvider) { super.setClientAreaProvider(clientAreaProvider); } public DataLayer getBodyDataLayer() { return this.bodyDataLayer; } public AbstractLayer getColumnHeaderDataLayer() { return this.columnHeaderDataLayer; } public ListDataProviderExample<T> bodyDataProvider; public class ListDataProviderExample<E> extends ListDataProvider<E> { private int mColumnCount = 0; public ListDataProviderExample(SortedList<E> sortedList, IColumnPropertyAccessor<E> columnPropertyAccessor) { super(sortedList, columnPropertyAccessor); } @Override public int getColumnCount() { return this.mColumnCount == 0 ? 2 : this.mColumnCount; } public void setColumnCount(int pColumnCount) { this.mColumnCount = pColumnCount; fireColumnCountChangeEvent(ColumnStructureUpdatesExampleGridLayer.this.bodyDataLayer); } private void fireColumnCountChangeEvent(ILayer layer) { if (layer instanceof AbstractLayer) { AbstractLayer alay = (AbstractLayer) layer; alay.fireLayerEvent(new MultiColumnStructuralChangeEventExtension( layer)); } } private final class MultiColumnStructuralChangeEventExtension extends ColumnStructuralChangeEvent { private MultiColumnStructuralChangeEventExtension(ILayer layer) { super(layer); } @Override public Collection<StructuralDiff> getColumnDiffs() { return null; } @Override public boolean isHorizontalStructureChanged() { return true; } @Override public boolean convertToLocal(ILayer localLayer) { return true; } @Override public ILayerEvent cloneEvent() { return new MultiColumnStructuralChangeEventExtension(getLayer()); } } } }