Skip to main content



      Home
Home » Eclipse Projects » NatTable » How to create more than two level column grouping in nattable
How to create more than two level column grouping in nattable [message #1854341] Mon, 15 August 2022 07:30 Go to next message
Eclipse UserFriend
Hi,

Is it possible to create more than two level column grouping in nattable? I have already implemented two level column grouping by using "ColumnGroupGroupHeaderLayer ". I want to implement 5 level column grouping. How can i achieve this.
Re: How to create more than two level column grouping in nattable [message #1854345 is a reply to message #1854341] Mon, 15 August 2022 10:58 Go to previous messageGo to next message
Eclipse UserFriend
Yes this can be achieved using the performance column grouping introduced with 1.6

https://www.eclipse.org/nattable/nandn/nandn_160.php

The usage of the old column grouping you used is actually deprecated since then.
Re: How to create more than two level column grouping in nattable [message #1854356 is a reply to message #1854345] Mon, 15 August 2022 17:21 Go to previous messageGo to next message
Eclipse UserFriend
Thank you so much for quick response. Its worked.
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 Go to previous messageGo to next message
Eclipse UserFriend
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 #1854388 is a reply to message #1854371] Wed, 17 August 2022 02:34 Go to previous messageGo to next message
Eclipse UserFriend
If you want column groups and row groups you need to use a GridLayer or at least a CompositeLayer with a 2/2 dimension. In your example you create a CompositeLayer with 1/2 dimension, so there is no place for the row header. The GridLayer is only created and not used.
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 Go to previous message
Eclipse UserFriend
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

Previous Topic:NatTable 2.0.3 released
Next Topic:How to remove or hide default row numbers when using row group header layer in composite layer
Goto Forum:
  


Current Time: Fri May 23 05:31:41 EDT 2025

Powered by FUDForum. Page generated in 0.05267 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top