/* * Copyright 2016 Nokia Solutions and Networks * Licensed under the Apache License, Version 2.0, * see license.txt file for details. */ package org.robotframework.ide.eclipse.main.plugin.tableeditor.settings; import org.eclipse.nebula.widgets.nattable.data.IRowDataProvider; import org.robotframework.ide.eclipse.main.plugin.model.RobotKeywordCall; import org.robotframework.ide.eclipse.main.plugin.model.RobotSettingsSection; import org.robotframework.ide.eclipse.main.plugin.tableeditor.AddingToken; import org.robotframework.ide.eclipse.main.plugin.tableeditor.RobotEditorCommandsStack; import org.robotframework.red.nattable.IFilteringDataProvider; import ca.odell.glazedlists.FilterList; import ca.odell.glazedlists.GlazedLists; import ca.odell.glazedlists.SortedList; import ca.odell.glazedlists.matchers.Matcher; class MetadataSettingsDataProvider implements IFilteringDataProvider, IRowDataProvider<Object> { private final AddingToken addingToken = new AddingToken(null, SettingsAdderState.METADATA); private RobotSettingsSection section; private SortedList<RobotKeywordCall> metadata; private FilterList<RobotKeywordCall> filteredMetadata; private MetadataMatchesFilter filter; private final MetadataSettingsColumnsPropertyAccessor propertyAccessor; MetadataSettingsDataProvider(final RobotEditorCommandsStack commandsStack, final RobotSettingsSection section) { this.propertyAccessor = new MetadataSettingsColumnsPropertyAccessor(commandsStack); setInput(section); } void setInput(final RobotSettingsSection section) { this.section = section; createLists(section); } private void createLists(final RobotSettingsSection section) { if (metadata == null) { metadata = new SortedList<>(GlazedLists.<RobotKeywordCall> eventListOf(), null); filteredMetadata = new FilterList<>(metadata); } if (section != null) { filteredMetadata.setMatcher(null); metadata.clear(); metadata.addAll(section.getMetadataSettings()); } } SortedList<RobotKeywordCall> getSortedList() { return metadata; } RobotSettingsSection getInput() { return section; } MetadataSettingsColumnsPropertyAccessor getPropertyAccessor() { return propertyAccessor; } @Override public int getColumnCount() { return propertyAccessor.getColumnCount(); } @Override public int getRowCount() { if (section != null) { final int addingTokens = isFilterSet() ? 0 : 1; return filteredMetadata.size() + addingTokens; } return 0; } @Override public Object getDataValue(final int columnIndex, final int rowIndex) { if (section != null) { final Object element = getRowObject(rowIndex); if (element instanceof RobotKeywordCall) { return propertyAccessor.getDataValue((RobotKeywordCall) element, columnIndex); } else if (element instanceof AddingToken && columnIndex == 0 && !isFilterSet()) { return ((AddingToken) element).getLabel(); } } return ""; } @Override public void setDataValue(final int columnIndex, final int rowIndex, final Object newValue) { if (newValue instanceof RobotKeywordCall) { return; } final Object metadataSetting = getRowObject(rowIndex); if (metadataSetting instanceof RobotKeywordCall) { propertyAccessor.setDataValue((RobotKeywordCall) metadataSetting, columnIndex, newValue); } } @Override public Object getRowObject(final int rowIndex) { if (section != null && rowIndex < filteredMetadata.size()) { return filteredMetadata.get(rowIndex); } else if (rowIndex == filteredMetadata.size()) { return addingToken; } return null; } @Override public int indexOfRowObject(final Object rowObject) { if (rowObject == addingToken) { return filteredMetadata.size(); } else { return filteredMetadata.indexOf(rowObject); } } @Override public boolean isFilterSet() { return filter != null; } void setFilter(final MetadataMatchesFilter filter) { this.filter = filter; if (filter == null) { filteredMetadata.setMatcher(null); } else { filteredMetadata.setMatcher(new Matcher<RobotKeywordCall>() { @Override public boolean matches(final RobotKeywordCall item) { return filter.isMatching(item); } }); } } boolean isProvided(final RobotKeywordCall setting) { return filteredMetadata.contains(setting); } }