Home » Eclipse Projects » NatTable » How to create more than two level column grouping in nattable
| | |
Re: How to create more than two level column grouping in nattable [message #1854371 is a reply to message #1854356] |
Tue, 16 August 2022 08:42   |
Eclipse User |
|
|
|
Hi,
I am trying to do row grouping as well. But its not working as expected. I described below my steps. Please let me know how to configure rowGroupHeaderLayer in CompositeLayer for Nattable creation.
// create configregistry
ConfigRegistry configRegistry = new ConfigRegistry();
// create the body layer stack
BodyLayerStack bodyLayerStack = new BodyLayerStack(this.values, new MyColumnPropertyAccessor(), configRegistry);
// setting column Widths
setColumnWidth(bodyLayerStack.getBodyDataLayer());
// create the column header layer stack
IDataProvider columnHeaderDataProvider = new SimpleColumnHeaderDataProvider(this.columns);
DataLayer columnHeaderDataLayer = new DefaultColumnHeaderDataLayer(columnHeaderDataProvider);
ColumnHeaderLayer columnHeaderLayer = new ColumnHeaderLayer(columnHeaderDataLayer, bodyLayerStack.getViewportLayer(), bodyLayerStack.getSelectionLayer());
ColumnGroupHeaderLayer columnGroupHeaderLayer = new ColumnGroupHeaderLayer(columnHeaderLayer, bodyLayerStack.getSelectionLayer());
// configure the column groups
columnGroupHeaderLayer.addGroup("FC", 0, 4);
columnGroupHeaderLayer.addGroup("FX", 4, 4);
columnGroupHeaderLayer.addGroup("FC", 8, 4);
columnGroupHeaderLayer.addGroup("FX", 12, 4);
columnGroupHeaderLayer.setGroupUnbreakable(1, true);
columnGroupHeaderLayer.addGroupingLevel();
columnGroupHeaderLayer.addGroup(1, "L", 0, 8);
columnGroupHeaderLayer.addGroup(1, "R", 8, 8);
columnGroupHeaderLayer.addGroupingLevel();
columnGroupHeaderLayer.addGroup(2, "C167", 0, 16);
columnGroupHeaderLayer.addGroupingLevel();
columnGroupHeaderLayer.addGroup(3, "C205", 0, 16);
// create the row header layer stack
IDataProvider rowHeaderDataProvider = new DefaultRowHeaderDataProvider(
bodyLayerStack.getBodyDataProvider());
RowHeaderLayer rowHeaderLayer = new RowHeaderLayer(
new DefaultRowHeaderDataLayer(new DefaultRowHeaderDataProvider(
bodyLayerStack.getBodyDataProvider())), bodyLayerStack.getViewportLayer(),
bodyLayerStack.getSelectionLayer());
RowGroupHeaderLayer rowGroupHeaderLayer =
new RowGroupHeaderLayer(rowHeaderLayer, bodyLayerStack.getSelectionLayer());
rowGroupHeaderLayer.addConfiguration(new DefaultRowGroupHeaderLayerConfiguration(true));
rowGroupHeaderLayer.addGroupingLevel();
rowGroupHeaderLayer.addGroup(1, "RowGroup1", 0, 5);
rowGroupHeaderLayer.addGroup(1, "RowGroup2", 5, 5);
rowGroupHeaderLayer.addGroupingLevel();
rowGroupHeaderLayer.addGroup(2, "C206", 0, 10);
//Sort header layer
SortHeaderLayer sortHeaderLayer = new SortHeaderLayer<>(columnGroupHeaderLayer,
new GlazedListsSortModel<>(
bodyLayerStack.getSortedList(), bodyLayerStack.getColumnPropertyAccessor(),
configRegistry, columnGroupHeaderLayer));
// selecting entire row while cell selection
SelectionLayer selectionLayer = bodyLayerStack.getSelectionLayer();
selectionLayer.setSelectionModel(new RowSelectionModel<Object>(selectionLayer,
(IRowDataProvider) bodyLayerStack.getBodyDataLayer().getDataProvider(),
new IRowIdAccessor<Object>() {
public Serializable getRowId(Object rowObject) {
return rowObject.hashCode();
}
}, false));
// add the filter row functionality
final FilterRowHeaderComposite<HierarchicalWrapper> filterRowHeaderLayer = new FilterRowHeaderComposite<>(new CapeGlazedListsFilterStrategy<>(bodyLayerStack.getFilterList(), bodyLayerStack.getColumnPropertyAccessor(), configRegistry), sortHeaderLayer, columnHeaderDataProvider, configRegistry);
filterRowHeaderLayer.addConfigLabelAccumulatorForRegion(GridRegion.FILTER_ROW, new IConfigLabelAccumulator() {
@Override
public void accumulateConfigLabels(LabelStack configLabels, int columnPosition, int rowPosition) {
int columnIndex = filterRowHeaderLayer.getColumnIndexByPosition(columnPosition);
if (columnIndex < 0) {
configLabels.addLabelOnTop(HierarchicalTreeLayer.LEVEL_HEADER_CELL);
}
}
});
// create the corner layer stack
ILayer cornerLayer = new CornerLayer(new DataLayer(
new DefaultCornerDataProvider(columnHeaderDataProvider,
rowHeaderDataProvider)), rowGroupHeaderLayer,
columnGroupHeaderLayer);
// create the grid layer composed with the prior created layer stacks
GridLayer gridLayer = new GridLayer(bodyLayerStack, columnGroupHeaderLayer,
rowGroupHeaderLayer, cornerLayer);
// create the composite layer composed with the prior created layer
// stacks
CompositeLayer compositeLayer = new CompositeLayer(1, 2);
compositeLayer.setChildLayer(GridRegion.COLUMN_HEADER, filterRowHeaderLayer, 0, 0);
compositeLayer.setChildLayer(GridRegion.BODY, bodyLayerStack, 0, 1);
compositeLayer.addConfiguration(new DefaultEditConfiguration());
// create nattable
natTable = new NatTable(natContainer, compositeLayer, false);
natTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
class BodyLayerStack extends AbstractLayerTransform {
private final FilterList filterList;
private final IRowDataProvider bodyDataProvider;
private final SelectionLayer selectionLayer;
private final ViewportLayer viewportLayer;
private final DataLayer bodyDataLayer;
private final IColumnPropertyAccessor columnPropertyAccessor;
private final SortedList sortedList;
private ColumnReorderLayer columnReorderLayer;
private ColumnGroupReorderLayer columnGroupReorderLayer;
private ColumnHideShowLayer columnHideShowLayer;
private ColumnGroupExpandCollapseLayer columnGroupExpandCollapseLayer;
private ColumnGroupModel columnGroupModel;
private RowReorderLayer rowReorderLayer;
private RowHideShowLayer rowHideShowLayer;
private RowGroupExpandCollapseLayer rowGroupExpandCollapseLayer;
public BodyLayerStack(List values, IColumnPropertyAccessor columnPropertyAccessor, ConfigRegistry configRegistry) {
this.columnPropertyAccessor = columnPropertyAccessor;
// wrapping of the list to show into GlazedLists
// see http://publicobject.com/glazedlists/ for further information
EventList eventList = GlazedLists.eventList(values);
TransformedList rowObjectsGlazedList = GlazedLists.threadSafeList(eventList);
// use the SortedList constructor with 'null' for the Comparator
// because the Comparator will be set by configuration
sortedList = new SortedList<>(rowObjectsGlazedList, null);
// wrap the SortedList with the FilterList
this.filterList = new FilterList<>(sortedList);
this.bodyDataProvider = new ListDataProvider<>(this.filterList, this.columnPropertyAccessor);
bodyDataLayer = new DataLayer(getBodyDataProvider());
columnReorderLayer = new ColumnReorderLayer(bodyDataLayer);
columnGroupReorderLayer = new ColumnGroupReorderLayer(columnReorderLayer, columnGroupModel);
columnHideShowLayer = new ColumnHideShowLayer(columnGroupReorderLayer);
columnGroupExpandCollapseLayer = new ColumnGroupExpandCollapseLayer(columnHideShowLayer);
rowReorderLayer = new RowReorderLayer(columnGroupExpandCollapseLayer);
rowHideShowLayer = new RowHideShowLayer(rowReorderLayer);
rowGroupExpandCollapseLayer = new RowGroupExpandCollapseLayer(rowHideShowLayer);
HoverLayer hoverLayer = new HoverLayer(rowGroupExpandCollapseLayer, true);
hoverLayer.addConfiguration(new SimpleHoverStylingBindings(hoverLayer));
// layer for event handling of GlazedLists and PropertyChanges
GlazedListsEventLayer glazedListsEventLayer = new GlazedListsEventLayer<>(hoverLayer, this.filterList);
this.selectionLayer = new SelectionLayer(glazedListsEventLayer);
viewportLayer = new ViewportLayer(getSelectionLayer());
setUnderlyingLayer(viewportLayer);
}
public SortedList getSortedList() {
return sortedList;
}
public SelectionLayer getSelectionLayer() {
return this.selectionLayer;
}
public FilterList getFilterList() {
return this.filterList;
}
public IRowDataProvider getBodyDataProvider() {
return this.bodyDataProvider;
}
public ViewportLayer getViewportLayer() {
return this.viewportLayer;
}
public IColumnPropertyAccessor getColumnPropertyAccessor() {
return this.columnPropertyAccessor;
}
public DataLayer getBodyDataLayer() {
return this.bodyDataLayer;
}
public ColumnReorderLayer getColumnReorderLayer() {
return columnReorderLayer;
}
public ColumnGroupReorderLayer getColumnGroupReorderLayer() {
return columnGroupReorderLayer;
}
public ColumnHideShowLayer getColumnHideShowLayer() {
return columnHideShowLayer;
}
public ColumnGroupExpandCollapseLayer getColumnGroupExpandCollapseLayer() {
return columnGroupExpandCollapseLayer;
}
}
|
|
| |
Re: How to create more than two level column grouping in nattable [message #1854395 is a reply to message #1854388] |
Wed, 17 August 2022 07:01  |
Eclipse User |
|
|
|
Hi Dirk,
Thank you for your response. As you told, I implemented with grid layer and Composite layer with 2/2 dimension also. Both are working fine as expected.
//With Grid layer
CompositeLayer compositeLayer = new CompositeLayer(1, 1);
compositeLayer.setChildLayer("Grid", gridLayer, 0, 0);
//With Composite Layer
CompositeLayer compositeLayer = new CompositeLayer(2, 2);
compositeLayer.setChildLayer(GridRegion.CORNER, cornerLayer, 0, 0);
compositeLayer.setChildLayer(GridRegion.COLUMN_HEADER, filterRowHeaderLayer, 1, 0);
compositeLayer.setChildLayer(GridRegion.ROW_HEADER, rowGroupHeaderLayer, 0, 1);
compositeLayer.setChildLayer(GridRegion.BODY, bodyLayerStack, 1, 1);
The output looks like as attached.
Now my question is, how to remove or hide default row numbers. I have checked your previous answers like to remove or hide row numbers, use Composite layer instead of Grid layer with column header and body layer.
But now in my requirement I need both column group header layer and row group header layer. whenever I use row group header layer, the default row numbers are visible. Is there any possibility to hide or remove these row numbers?
Thanks in Advance
Amaresh
Attachment: output.JPG
(Size: 52.99KB, Downloaded 120 times)
[Updated on: Wed, 17 August 2022 08:09] by Moderator
|
|
|
Goto Forum:
Current Time: Fri May 23 05:31:41 EDT 2025
Powered by FUDForum. Page generated in 0.05267 seconds
|