I'm trying to create a Nattable with 2 columns and Row Header with a checkbox. Whenever, the root node is expanded, it is getting expanded. But, whenever the first level nodes are expanded, they are not getting expanded. I can notice the scrollbar expanding and Shrinking, on further clicks, but, the nodes are not getting expanded. When I click on alt+tab to move to another application and come to my nattable application, I can see that the nodes are expanded, now :)
Collapse works without any problem.
Find below the code snippet used for rendering the elements:
public class AdvancedPackageManagementNattable {
public static final String COLUMN_COMPONENT_NAME = "componentTreeRoot";
public static final String COLUMN_VERSION = "version";
ICellPainter checkBoxPainter;
public Control createAdvancePackageTable(final Composite parent) {
Composite composite = new Composite(parent, SWT.BORDER);
GridDataFactory.fillDefaults().grab(true, true).span(9, 9).align(SWT.FILL, SWT.FILL).applyTo(composite);
GridLayoutFactory.fillDefaults().applyTo(composite);
ConfigRegistry configRegistry = new ConfigRegistry();
configRegistry.registerConfigAttribute(SortConfigAttributes.SORT_COMPARATOR, DefaultComparator.getInstance());
EventList<ComponentTreeItem> eventList = GlazedLists.eventList(datums.values());
SortedList<ComponentTreeItem> sortedList = new SortedList<>(eventList, null);
String[] propertyNames = new String[] {
AdvancedPackageManagementNattable.COLUMN_COMPONENT_NAME,
AdvancedPackageManagementNattable.COLUMN_VERSION };
IColumnPropertyAccessor<ComponentTreeItem> columnPropertyAccessor =
new ReflectiveColumnPropertyAccessor<>(propertyNames);
Map<String, String> propertyNameToLabel = new HashMap<>();
propertyNameToLabel.put(AdvancedPackageManagementNattable.COLUMN_COMPONENT_NAME, "Component(Package) Name");
propertyNameToLabel.put(AdvancedPackageManagementNattable.COLUMN_VERSION, "Version Number");
IDataProvider columnHeaderDataProvider = new DefaultColumnHeaderDataProvider(propertyNames, propertyNameToLabel);
DataLayer columnHeaderDataLayer = new DefaultColumnHeaderDataLayer(columnHeaderDataProvider);
// Body layer
ISortModel sortModel =
new GlazedListsSortModel<>(sortedList, columnPropertyAccessor, configRegistry, columnHeaderDataLayer);
final TreeList<ComponentTreeItem> treeList =
new TreeList<>(sortedList, new ComponentTreeFormat(sortModel), TreeList.nodesStartCollapsed());
GlazedListTreeData<?> treeData = new GlazedListTreeData<>(treeList);
ListDataProvider<?> bodyDataProvider =
new ListDataProvider<>(treeList, new TreeReflectiveColumnPropertyAccessor(columnPropertyAccessor));
final DataLayer bodyDataLayer = new DataLayer(bodyDataProvider);
ColumnReorderLayer columnReorderLayer = new ColumnReorderLayer(bodyDataLayer);
ColumnHideShowLayer columnHideShowLayer = new ColumnHideShowLayer(columnReorderLayer);
SelectionLayer selectionLayer = new SelectionLayer(columnHideShowLayer);
final TreeLayer treeLayer = new TreeLayer(selectionLayer, new GlazedListTreeRowModel<>(treeData));
ViewportLayer viewportLayer = new ViewportLayer(treeLayer);
ColumnHeaderLayer columnHeaderLayer = new ColumnHeaderLayer(columnHeaderDataLayer, viewportLayer, selectionLayer);
ColumnOverrideLabelAccumulator labelAccumulator = new ColumnOverrideLabelAccumulator(columnHeaderDataLayer);
columnHeaderDataLayer.setConfigLabelAccumulator(labelAccumulator);
SortHeaderLayer<?> sortHeaderLayer = new SortHeaderLayer<>(columnHeaderLayer, sortModel, false);
// row header
RowHeaderDataProvider rowHeaderDataProvider = new RowHeaderDataProvider(bodyDataProvider, bodyDataLayer);
DataLayer rowHeaderDataLayer = new DataLayer(rowHeaderDataProvider);
RowHeaderLayer rowHeaderLayer = new RowHeaderLayer(rowHeaderDataLayer, viewportLayer, selectionLayer);
// Corner layer
CornerLayer cornerLayer =
createCornerLayer(columnHeaderDataProvider, sortHeaderLayer, rowHeaderDataProvider, rowHeaderLayer);
// Grid
GridLayer gridLayer = new GridLayer(viewportLayer, sortHeaderLayer, rowHeaderLayer, cornerLayer);
NatTable natTable = new NatTable(composite, gridLayer, false);
bodyDataLayer.setColumnPercentageSizing(true);
GridDataFactory.fillDefaults().grab(true, true).applyTo(natTable);
natTable.setConfigRegistry(configRegistry);
addConfigurations(natTable, bodyDataLayer);
columnHeaderDataLayer.setConfigLabelAccumulator(new ColumnLabelAccumulator());
final ColumnOverrideLabelAccumulator columnLabelAccumulator = new ColumnOverrideLabelAccumulator(bodyDataLayer);
bodyDataLayer.setConfigLabelAccumulator(columnLabelAccumulator);
registerColumnLabels(columnLabelAccumulator);
natTable.configure();
addStyleThemeConfiguration(natTable);
return natTable;
}
private CornerLayer createCornerLayer(final IDataProvider columnHeaderDataProvider,
final SortHeaderLayer<?> sortHeaderLayer, final RowHeaderDataProvider rowHeaderDataProvider,
final RowHeaderLayer rowHeaderLayer) {
DefaultCornerDataProvider cornerDataProvider =
new DefaultCornerDataProvider(columnHeaderDataProvider, rowHeaderDataProvider);
DataLayer cornerDataLayer = new DataLayer(cornerDataProvider);
return new CornerLayer(cornerDataLayer, rowHeaderLayer, sortHeaderLayer);
}
private void addStyleThemeConfiguration(final NatTable natTable) {
natTable.setTheme(new ModernNatTableThemeConfiguration());
natTable.configure();
}
private void addConfigurations(final NatTable natTable, final DataLayer bodyDataLayer) {
natTable.addConfiguration(new DefaultNatTableStyleConfiguration());
natTable.addConfiguration(new HeaderMenuConfiguration(natTable));
natTable.addConfiguration(new SingleClickSortConfiguration());
natTable.addConfiguration(new CommonNattableConfiguration(bodyDataLayer));
natTable.addConfiguration(new DefaultEditBindings());
}
private void registerColumnLabels(final ColumnOverrideLabelAccumulator columnLabelAccumulator) {
columnLabelAccumulator.registerColumnOverrides(0, COLUMN_COMPONENT_NAME);
columnLabelAccumulator.registerColumnOverrides(1, COLUMN_VERSION);
}
}
public class CommonNattableConfiguration extends DefaultNatTableStyleConfiguration {
private static final String CONFIG_LABEL_VERSION = "version";
private final DataLayer dataLayer;
public CommonNattableConfiguration(final DataLayer bodyDataLayer) {
this.dataLayer = bodyDataLayer;
}
@Override
public void configureRegistry(final IConfigRegistry configRegistry) {
super.configureRegistry(configRegistry);
addVersionComboConfig(configRegistry);
addCheckBoxConfig(configRegistry);
nattableStyleConfig(configRegistry);
}
private void nattableStyleConfig(final IConfigRegistry configRegistry) {
Style style = new Style();
style.setAttributeValue(CellStyleAttributes.BACKGROUND_COLOR, GUIHelper.COLOR_WIDGET_LIGHT_SHADOW);
configRegistry.registerConfigAttribute(CellConfigAttributes.CELL_STYLE, style, DisplayMode.NORMAL,
GridRegion.CORNER);
configRegistry.registerConfigAttribute(CellConfigAttributes.CELL_STYLE, style, DisplayMode.NORMAL,
GridRegion.COLUMN_HEADER);
}
private void addVersionComboConfig(final IConfigRegistry configRegistry) {
configRegistry.registerConfigAttribute(EditConfigAttributes.CELL_EDITABLE_RULE, IEditableRule.ALWAYS_EDITABLE,
DisplayMode.EDIT, CommonNattableConfiguration.CONFIG_LABEL_VERSION);
configRegistry.registerConfigAttribute(EditConfigAttributes.CELL_EDITOR, new VersionComboBoxEditor(this.dataLayer),
DisplayMode.EDIT, CommonNattableConfiguration.CONFIG_LABEL_VERSION);
configRegistry.registerConfigAttribute(CellConfigAttributes.DISPLAY_CONVERTER, new VersionDisplayConverter(),
DisplayMode.NORMAL, CommonNattableConfiguration.CONFIG_LABEL_VERSION);
configRegistry.registerConfigAttribute(CellConfigAttributes.DISPLAY_CONVERTER, new ComponentNameDisplayConverter(),
DisplayMode.NORMAL, AdvancedPackageManagementNattable.COLUMN_COMPONENT_NAME);
}
private void addCheckBoxConfig(final IConfigRegistry configRegistry) {
configRegistry.registerConfigAttribute(EditConfigAttributes.CELL_EDITOR, new CheckBoxCellEditor(), DisplayMode.EDIT,
GridRegion.ROW_HEADER);
configRegistry.registerConfigAttribute(EditConfigAttributes.CELL_EDITABLE_RULE, IEditableRule.ALWAYS_EDITABLE,
DisplayMode.EDIT, GridRegion.ROW_HEADER);
Style style = new Style();
style.setAttributeValue(CellStyleAttributes.HORIZONTAL_ALIGNMENT, HorizontalAlignmentEnum.CENTER);
configRegistry.registerConfigAttribute(CellConfigAttributes.CELL_PAINTER, new RowHeaderCheckboxPainter(),
DisplayMode.NORMAL, GridRegion.ROW_HEADER);
configRegistry.registerConfigAttribute(CellConfigAttributes.CELL_PAINTER, new RowHeaderCheckboxPainter(),
DisplayMode.SELECT, GridRegion.ROW_HEADER);
configRegistry.registerConfigAttribute(CellConfigAttributes.DISPLAY_CONVERTER, new DefaultBooleanDisplayConverter(),
DisplayMode.NORMAL, GridRegion.ROW_HEADER);
configRegistry.registerConfigAttribute(CellConfigAttributes.DISPLAY_CONVERTER, new DefaultBooleanDisplayConverter(),
DisplayMode.EDIT, GridRegion.ROW_HEADER);
}
@Override
public void configureUiBindings(final UiBindingRegistry uiBindingRegistry) {
uiBindingRegistry.registerSingleClickBinding(
new MouseEventMatcher(SWT.NONE, GridRegion.ROW_HEADER, MouseEventMatcher.LEFT_BUTTON), new MouseEditAction() {
/**
* {@inheritDoc}
*/
@Override
public void run(final NatTable natTable, final MouseEvent event) {
super.run(natTable, event);
natTable.refresh(false);
}
});
}
}
Any help would be greatly appreciated.
TreeExpandCollapseAction is called in both the working and not working scenario. But, if I debug and go back to the product, it is working :)
Thanks, Palraj

You forgot to add the
GlazedListsEventLayerin the body layer stack. Therefore the changes in theTreeListdo not trigger the refresh.You can look at our examples to see how the structure should look like: TreeStructureGridExample