vendredi 28 avril 2017

NatTable with checkbox column - check/uncheck not working

Used EditableGrid example to create a checkbox column inside my NatTable, however the mouse events to check and uncheck are not getting triggered and hence the state of checkbox doesn't change. Below is the code snippet:

private Control exampleNatTableWithCheckBox(Composite parent) {

        final String[] propertyNames = PLAN_PROPERTY_NAMES;
        final Map<String, String> propertyToLabelMap = getPropertyToLabelMap();

        IRowIdAccessor<ConsoleEntry> rowIdAccessor = new IRowIdAccessor<T>() {
            @Override
            public Serializable getRowId(T rowObject) {
                return rowObject.getRcdIdx();
            }
        };
        ConfigRegistry configRegistry = new ConfigRegistry();

        // Body
        this.baseEventList = getBaseEventList();
        FilterList<T> filterList = new FilterList<T>(baseEventList);
        SortedList<T> sortedList = new SortedList<T>(filterList, null);

        bodyLayer = new FullFeaturedBodyStackLayer<ConsoleEntry>(sortedList, rowIdAccessor, propertyNames,configRegistry);

        this.bodyDataProvider = bodyLayer.getBodyDataProvider();

        registerConfigCells(configRegistry);

        registerCheckBoxEditor(configRegistry);

        // Column header
        FullFeaturedColumnHeaderLayerStack<T> columnHeaderLayer = new FullFeaturedColumnHeaderLayerStack<T>(sortedList, filterList, propertyNames, propertyToLabelMap, bodyLayer, bodyLayer.getSelectionLayer(),
                configRegistry);

        // Row header
        final DefaultRowHeaderDataProvider rowHeaderDataProvider = new DefaultSummaryRowHeaderDataProvider(
                this.bodyDataProvider);
        DefaultRowHeaderDataLayer rowHeaderDataLayer = new DefaultRowHeaderDataLayer(rowHeaderDataProvider);
        rowHeaderDataLayer.setDefaultColumnWidth(50);
        ILayer rowHeaderLayer = new RowHeaderLayer(rowHeaderDataLayer, bodyLayer, bodyLayer.getSelectionLayer());

        // Corner
        final DefaultCornerDataProvider cornerDataProvider = new DefaultCornerDataProvider(
                columnHeaderLayer.getColumnHeaderDataProvider(), rowHeaderDataProvider);
        DataLayer cornerDataLayer = new DataLayer(cornerDataProvider);
        ILayer cornerLayer = new CornerLayer(cornerDataLayer, rowHeaderLayer, columnHeaderLayer);

        // Grid
        GridLayer gridLayer = new GridLayer(bodyLayer, columnHeaderLayer, rowHeaderLayer, cornerLayer);

        this.natTable = new NatTable(parent, gridLayer, false);

        this.natTable.setConfigRegistry(configRegistry);

        this.natTable.addConfiguration(new StyledRowHeaderConfiguration());
        this.natTable.addConfiguration(new StyledColumnHeaderConfiguration());
        this.natTable.addConfiguration(new DefaultNatTableStyleConfiguration());

        // Popup menu
        this.natTable.addConfiguration(new HeaderMenuConfiguration(this.natTable) {
            @Override
            protected PopupMenuBuilder createColumnHeaderMenu(NatTable natTable) {
                return super.createColumnHeaderMenu(natTable).withColumnChooserMenuItem();
            }
        });

        this.natTable.addConfiguration(new SingleClickSortConfiguration());

        // Editing
        ColumnOverrideLabelAccumulator columnLabelAccumulator = new ColumnOverrideLabelAccumulator(
                bodyLayer.getBodyDataLayer());
        bodyLayer.getBodyDataLayer().setConfigLabelAccumulator(columnLabelAccumulator);
        columnLabelAccumulator.registerColumnOverrides(0, COLUMN_BOOKMARK_LABEL);

        this.natTable.addConfiguration(editableGridConfiguration(columnLabelAccumulator, this.bodyDataProvider));
        this.natTable.addConfiguration(filterRowConfiguration());

        bodyLayer.getBodyDataLayer().setConfigLabelAccumulator(getConfigLabelAccumulator(bodyLayer.getBodyDataLayer()));

        // Preserve selection on updates and sort
        final SelectionLayer selectionLayer = bodyLayer.getSelectionLayer();
        final RowSelectionModel<ConsoleEntry> rowSelectionModel = new RowSelectionModel<ConsoleEntry>(selectionLayer,
                this.bodyDataProvider, rowIdAccessor);
        selectionLayer.setSelectionModel(rowSelectionModel);

        // Select complete rows
        RowOnlySelectionConfiguration<ConsoleEntry> selectionConfig = new RowOnlySelectionConfiguration<ConsoleEntry>();
        selectionLayer.addConfiguration(selectionConfig);
//      this.natTable.addConfiguration(new RowOnlySelectionBindings());

         rowSelectionProviderNatTable = new RowSelectionProvider<ConsoleEntry>(selectionLayer,
                this.bodyDataProvider);
        if (this.bodyDataProvider.getList() != null && this.bodyDataProvider.getList().size() > 0) {
            rowSelectionProviderNatTable.setSelection(new StructuredSelection(this.bodyDataProvider.getList().get(0)));
        }

        LayerListenerFixture listener = new LayerListenerFixture();
        // we register the listener to the SelectionLayer because for some cases
        // like clearing a collection, the selection change is not propagated
        // the layer stack upwards as it gets stopped on layer conversion
        selectionLayer.addLayerListener(listener);

        // Column chooser
        DisplayColumnChooserCommandHandler columnChooserCommandHandler = new DisplayColumnChooserCommandHandler(
                selectionLayer, bodyLayer.getColumnHideShowLayer(), columnHeaderLayer.getColumnHeaderLayer(),
                columnHeaderLayer.getColumnHeaderDataLayer(), null, null);
        bodyLayer.registerCommandHandler(columnChooserCommandHandler);

        this.natTable.configure();

        return this.natTable;
    }

Here is the code to registeryCheckBoxEditor & editableGridConfiguration

private void registerCheckBoxEditor(IConfigRegistry configRegistry) {

        // make checkbox cells editable
        configRegistry.registerConfigAttribute(EditConfigAttributes.CELL_EDITABLE_RULE, IEditableRule.ALWAYS_EDITABLE,
                DisplayMode.EDIT, COLUMN_BOOKMARK_LABEL);

        configRegistry.registerConfigAttribute(EditConfigAttributes.CELL_EDITOR, new CheckBoxCellEditor(),
                DisplayMode.NORMAL, COLUMN_BOOKMARK_LABEL);

        final CheckBoxPainter checkBoxCellPainter = new CheckBoxPainter();

        configRegistry.registerConfigAttribute(CellConfigAttributes.CELL_PAINTER, checkBoxCellPainter,
                DisplayMode.NORMAL, COLUMN_BOOKMARK_LABEL);

        configRegistry.registerConfigAttribute(CellConfigAttributes.DISPLAY_CONVERTER,
                new DefaultBooleanDisplayConverter(), DisplayMode.NORMAL, COLUMN_BOOKMARK_LABEL);
    }

public AbstractRegistryConfiguration editableGridConfiguration(
            final ColumnOverrideLabelAccumulator columnLabelAccumulator, final IDataProvider dataProvider) {

        return new AbstractRegistryConfiguration() {

            @Override
            public void configureRegistry(IConfigRegistry configRegistry) {

                columnLabelAccumulator.registerColumnOverrides(0, COLUMN_BOOKMARK_LABEL);

                registerCheckBoxEditor(configRegistry, new CheckBoxPainter(), new CheckBoxCellEditor());

                configRegistry.registerConfigAttribute(EditConfigAttributes.CELL_EDITABLE_RULE,
                        IEditableRule.ALWAYS_EDITABLE, DisplayMode.EDIT, COLUMN_BOOKMARK_LABEL);
            }

        };
    }

I have done all the settings similar to Example code but trigger mouse events are not working. Any pointer or help is really appreciated. TIA.




Aucun commentaire:

Enregistrer un commentaire