/* * Copyright 2015 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.popup; import static com.google.common.collect.Lists.newArrayList; import java.util.Arrays; import java.util.List; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.viewers.AlwaysDeactivatingCellEditor; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.RowExposingTableViewer; import org.eclipse.jface.viewers.StyledString; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerColumnsFactory; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.robotframework.ide.eclipse.main.plugin.tableeditor.CellsActivationStrategy; import org.robotframework.ide.eclipse.main.plugin.tableeditor.CellsActivationStrategy.RowTabbingStrategy; import org.robotframework.red.viewers.ElementAddingToken; import org.robotframework.red.viewers.RedCommonLabelProvider; public class ImportSettingFileArgumentsEditor { private RowExposingTableViewer argumentsViewer; private List<String> arguments; public ImportSettingFileArgumentsEditor() { } public Composite createArgumentsEditor(final Composite parent, final List<String> currentArguments) { final Composite composite = new Composite(parent, SWT.BORDER); GridDataFactory.fillDefaults().grab(true, true).applyTo(composite); GridLayoutFactory.fillDefaults().numColumns(1).applyTo(composite); argumentsViewer = new RowExposingTableViewer(composite, SWT.MULTI | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL); CellsActivationStrategy.addActivationStrategy(argumentsViewer, RowTabbingStrategy.MOVE_TO_NEXT); arguments = newArrayList(); if (currentArguments != null) { arguments.addAll(currentArguments); } createTable(); argumentsViewer.setContentProvider(new ArgumentsContentProvider()); argumentsViewer.setInput(arguments); return composite; } public List<String> getArguments() { final List<String> newArgs = newArrayList(); for (final String arg : arguments) { if (!arg.equals("")) { newArgs.add(arg); } } return newArgs; } private void createTable() { ViewerColumnsFactory.newColumn("Argument") .withWidth(350) .labelsProvidedBy(new ArgumentsLabelProvider()) .editingSupportedBy(new ArgumentsEditingSupport(argumentsViewer)) .editingEnabledOnlyWhen(true) .createFor(argumentsViewer); final Table table = argumentsViewer.getTable(); GridDataFactory.fillDefaults().grab(true, true).applyTo(table); table.setHeaderVisible(true); table.setLinesVisible(true); } private class ArgumentsEditingSupport extends EditingSupport { private final CellEditor editor; public ArgumentsEditingSupport(final TableViewer viewer) { super(viewer); this.editor = new TextCellEditor(viewer.getTable()); } @Override protected CellEditor getCellEditor(final Object element) { if (element instanceof ElementAddingToken) { return new AlwaysDeactivatingCellEditor((Composite) getViewer().getControl()); } return editor; } @Override protected boolean canEdit(final Object element) { return true; } @Override protected Object getValue(final Object element) { return element.toString(); } @Override protected void setValue(final Object element, final Object userInputValue) { if (element instanceof String) { final int ind = arguments.indexOf(element); if (ind >= 0) { arguments.set(ind, userInputValue.toString()); getViewer().refresh(); } } else if (element instanceof ElementAddingToken) { arguments.add(""); getViewer().getControl().getDisplay().asyncExec(new Runnable() { @Override public void run() { getViewer().refresh(); if (element != null) { getViewer().editElement(arguments.get(arguments.size() - 1), 0); } } }); } } } private class ArgumentsContentProvider implements IStructuredContentProvider { @Override public void dispose() { } @Override public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) { } @Override public Object[] getElements(final Object inputElement) { final Object[] elements = ((List<?>) inputElement).toArray(); final Object[] newElements = Arrays.copyOf(elements, elements.length + 1, Object[].class); newElements[elements.length] = new ElementAddingToken("argument", true); return newElements; } } private class ArgumentsLabelProvider extends RedCommonLabelProvider { @Override public Image getImage(final Object element) { if (element instanceof ElementAddingToken) { return ((ElementAddingToken) element).getImage(); } return null; } @Override public StyledString getStyledText(final Object element) { if (element instanceof String) { return new StyledString(element.toString()); } else if (element instanceof ElementAddingToken) { return ((ElementAddingToken) element).getStyledText(); } return new StyledString(); } } }