/******************************************************************************* * Copyright (c) 2006-2013, Cloudsmith Inc. * The code, documentation and other materials contained herein have been * licensed under the Eclipse Public License - v 1.0 by the copyright holder * listed above, as the Initial Contributor under such license. The text of * such license is available at www.eclipse.org. ******************************************************************************/ package org.eclipse.buckminster.ui.editor.cspec; import java.util.List; import org.eclipse.buckminster.core.cspec.builder.CSpecBuilder; import org.eclipse.buckminster.core.cspec.builder.ComponentRequestBuilder; import org.eclipse.buckminster.core.ctype.AbstractComponentType; import org.eclipse.buckminster.core.helpers.TextUtils; import org.eclipse.buckminster.core.version.VersionHelper; import org.eclipse.buckminster.osgi.filter.Filter; import org.eclipse.buckminster.osgi.filter.FilterFactory; import org.eclipse.buckminster.ui.Messages; import org.eclipse.buckminster.ui.UiUtils; import org.eclipse.buckminster.ui.editor.VersionDesignator; import org.eclipse.buckminster.ui.editor.VersionDesignatorEvent; import org.eclipse.buckminster.ui.editor.VersionDesignatorListener; import org.eclipse.buckminster.ui.general.editor.IValidator; import org.eclipse.buckminster.ui.general.editor.ValidatorException; import org.eclipse.buckminster.ui.general.editor.simple.IWidgetin; import org.eclipse.buckminster.ui.general.editor.simple.SimpleTable; import org.eclipse.buckminster.ui.general.editor.simple.WidgetWrapper; import org.eclipse.core.runtime.CoreException; import org.eclipse.equinox.p2.metadata.VersionRange; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.osgi.framework.InvalidSyntaxException; /** * @author Karel Brezina * */ public class DependenciesTable extends SimpleTable<ComponentRequestBuilder> { class FilterValidator implements IValidator { private ValidatorException lastFilterException; public Filter createFilter(String value) { value = TextUtils.notEmptyString(value); Filter filter = null; lastFilterException = null; try { filter = value == null ? null : FilterFactory.newInstance(value); } catch (InvalidSyntaxException e) { lastFilterException = new ValidatorException(e.getMessage()); } return filter; } @Override public void validate(Object... arg) throws ValidatorException { if (lastFilterException != null) throw lastFilterException; } } class VersionDesignatorValidator implements IValidator { VersionDesignator designator; public VersionDesignatorValidator(VersionDesignator designator) { this.designator = designator; } @Override public void validate(Object... arg) throws ValidatorException { try { designator.getDirectVersionDesignator(); } catch (CoreException e) { throw new ValidatorException(e.getMessage()); } } } private CSpecBuilder cspecBuilder; private VersionDesignatorValidator versionDesignatorValidator; private FilterValidator filterValidator; public DependenciesTable(List<ComponentRequestBuilder> data, CSpecBuilder cspecBuilder, boolean readOnly) { super(data, readOnly); this.cspecBuilder = cspecBuilder; this.filterValidator = new FilterValidator(); } @Override public ComponentRequestBuilder createRowClass() { return cspecBuilder.createDependencyBuilder(); } @Override public IWidgetin[] fillGrid(Composite parent, Object[] fieldValues) { ((GridLayout) parent.getLayout()).numColumns = 3; IWidgetin[] widgetins = new IWidgetin[getColumns()]; UiUtils.createGridLabel(parent, getColumnHeaders()[0] + ":", 1, 0, SWT.NONE); //$NON-NLS-1$ widgetins[0] = getWidgetin(parent, 0, fieldValues[0]); UiUtils.createGridLabel(parent, getColumnHeaders()[1] + ":", 1, 0, SWT.NONE); //$NON-NLS-1$ widgetins[1] = getWidgetin(parent, 1, fieldValues[1]); new Label(parent, SWT.NONE); widgetins[2] = getWidgetin(parent, 2, fieldValues[2]); UiUtils.createGridLabel(parent, getColumnHeaders()[3] + ":", 1, 0, SWT.NONE); //$NON-NLS-1$ widgetins[3] = getWidgetin(parent, 3, fieldValues[3]); return widgetins; } @Override public String[] getColumnHeaders() { return new String[] { Messages.name, Messages.component_type, Messages.version_designator, Messages.filter }; } @Override public int[] getColumnWeights() { return new int[] { 40, 20, 20, 20 }; } @Override public IValidator getFieldValidator(int idx) { switch (idx) { case 0: return SimpleTable.createNotEmptyStringValidator(Messages.dependency_name_cannot_be_empty); case 2: return versionDesignatorValidator; case 3: return filterValidator; default: return SimpleTable.getEmptyValidator(); } } @Override public IWidgetin getWidgetin(Composite parent, int idx, Object value) { switch (idx) { case 0: return getName(parent, idx, value); case 1: return getComboWidgetin(parent, idx, value, AbstractComponentType.getComponentTypeIDs(true), SWT.READ_ONLY); case 2: VersionDesignator designator = getVersionDesignator(parent, idx, value); versionDesignatorValidator = new VersionDesignatorValidator(designator); return designator; case 3: return getFilter(parent, idx, value); default: return getTextWidgetin(parent, idx, value); } } @Override public Object[] toRowArray(ComponentRequestBuilder t) { Object[] array = new Object[getColumns()]; array[0] = t.getName(); array[1] = t.getComponentTypeID(); array[2] = VersionHelper.getHumanReadable(t.getVersionRange()); array[3] = t.getFilter(); return array; } @Override public void updateRowClass(ComponentRequestBuilder builder, Object[] args) throws ValidatorException { builder.setName(TextUtils.notEmptyString((String) args[0])); builder.setComponentTypeID(TextUtils.notEmptyString((String) args[1])); builder.setVersionRange((VersionRange) args[2]); builder.setFilter((Filter) args[3]); } private IWidgetin getFilter(Composite parent, final int idx, Object value) { final Text text = UiUtils.createGridText(parent, 2, 0, isReadOnly(), SWT.NONE); final IWidgetin widgetin = new WidgetWrapper(text); String stringValue = TextUtils.notNullString(value); text.setText(stringValue); text.setData(value); text.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { String filterStr = TextUtils.notEmptyTrimmedString(text.getText()); widgetin.setData(filterValidator.createFilter(filterStr)); validateFieldInFieldListener(widgetin, getFieldValidator(idx), widgetin.getData()); } }); return widgetin; } private IWidgetin getName(Composite parent, final int idx, Object value) { final Text text = UiUtils.createGridText(parent, 2, 0, isReadOnly(), SWT.NONE); final IWidgetin widgetin = new WidgetWrapper(text); String stringValue = value == null ? "" : value.toString(); //$NON-NLS-1$ text.setText(stringValue); text.setData(stringValue); text.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { widgetin.setData(text.getText()); validateFieldInFieldListener(widgetin, getFieldValidator(idx), text.getText()); } }); return widgetin; } private VersionDesignator getVersionDesignator(Composite parent, final int idx, Object value) { final VersionDesignator designator = new VersionDesignator(parent, isReadOnly()); designator.refreshValues(new VersionRange((String) value)); designator.setData(value); designator.addVersionDesignatorListener(new VersionDesignatorListener() { @Override public void modifyVersionDesignator(VersionDesignatorEvent e) { try { VersionRange designatorValue = designator.getDirectVersionDesignator(); designator.setData(designatorValue); } catch (CoreException e1) { // nothing - error message is displayed using // validateFieldInFieldListener method } validateFieldInFieldListener(designator, getFieldValidator(idx), null); } }); return designator; } }