/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.gui.utils.common.configuration; import org.eclipse.jface.viewers.ICellEditorValidator; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor; import de.rcenvironment.core.utils.common.StringUtils; /** * A {@link org.eclipse.ui.views.properties.IPropertyDescriptor} representing a property with a * certain set of valid values. * * @author Christian Weiss */ @Deprecated public class ListPropertyDescriptor extends ComboBoxPropertyDescriptor { /** * */ private static final int NO_SUCH_VALUE_INDEX = -1; /** The labels. */ private final String[] labels; /** The value. */ private final Object[] values; /** * Instantiates a new list property descriptor. * * @param id the id * @param displayName the display name * @param labels the labels */ public ListPropertyDescriptor(final Object id, final String displayName, final String[] labels) { this(id, displayName, labels, new Object[labels.length]); } /** * Instantiates a new list property descriptor. * * @param id the id * @param displayName the display name * @param labels the labels * @param values the values */ public ListPropertyDescriptor(final Object id, final String displayName, final String[] labels, final Object[] values) { super(id, displayName, labels); this.labels = labels; this.values = values; // ensure, that labels and data map if (labels.length != values.length) { throw new IllegalArgumentException( "wrong number of value objects provided"); } // ensure, that labels are all non-null for (final String label : labels) { if (label == null) { throw new IllegalArgumentException( "null labels are not allowed"); } } // only accept labels as values setValidator(new ICellEditorValidator() { @Override public String isValid(final Object value) { String result = null; if (value instanceof Number) { if (!isValidIndex(((Number) value).intValue())) { result = "Not a valid index."; } } else if (value instanceof String) { if (!isValidLabel((String) value)) { result = "Not a valid selection."; } } return result; } private boolean isValidIndex(final int index) { return index >= 0 && index < labels.length; } private boolean isValidLabel(final Object value) { for (final String label : labels) { if (label.equals(value)) { return true; } } return false; } }); } /** * Returns the index of the given label. * * @param label the label * @return the index */ public int indexOfLabel(final String label) { return indexOfLabel(label, 0); } /** * Returns the index of the given label from the given start position. * * @param label the label * @param start the start position * @return the index */ public int indexOfLabel(final String label, int start) { for (int index = start; index < labels.length; ++index) { if (labels[index].equals(label)) { return index; } } return NO_SUCH_VALUE_INDEX; } /** * Returns the index of the given value. * * @param value the value * @return the index */ public int indexOfData(final Object value) { return indexOfData(value, 0); } /** * Returns the index of the given value from the given start position. * * @param value the value * @param start the start position * @return the index */ public int indexOfData(final Object value, int start) { for (int index = start; index < labels.length; ++index) { if ((values[index] == null && value == null) || (values[index] != null && values[index].equals(value))) { return index; } } return NO_SUCH_VALUE_INDEX; } /** * Checks whether the given index is within the range of the selection. * * @param index the index */ private void checkRange(final int index) { if (index < 0 || index >= labels.length) { throw new IllegalArgumentException("invalid label index: " + index + " [0," + (labels.length - 1) + "]"); } } /** * Returns the label at the given index. * * @param index the index * @return the label */ public String getLabel(final int index) { checkRange(index); return labels[index]; } /** * Return the value at the given index. * * @param index the index * @return the data */ public Object getValue(final int index) { checkRange(index); return values[index]; } /** * {@inheritDoc} * * @see java.lang.Object#toString() */ @Override public String toString() { return StringUtils.format("%s: (%d) %s", getClass().getSimpleName(), labels.length, labels); } /** * Returns the label provider. * * @return the label provider */ @Override public ILabelProvider getLabelProvider() { if (isLabelProviderSet()) { final ILabelProvider labelProvider = super.getLabelProvider(); return new LabelProvider() { @Override public Image getImage(final Object element) { return labelProvider.getImage(lookup(element)); } @Override public String getText(final Object element) { return labelProvider.getText(lookup(element)); } private Object lookup(final Object element) { // if the element is known return itself for (final Object value : values) { if (value == element || (value != null && value.equals(element))) { return element; } } // if the element is an instance of integer it might be the index to // the values list, in that case check the index range and return the element at // that index if (element instanceof Integer) { final int index = (Integer) element; if (index >= 0 && index < values.length) { return values[index]; } } return element; } }; } return super.getLabelProvider(); } }