/* * Copyright 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ package com.amazonaws.eclipse.core.widget; import static com.amazonaws.eclipse.core.ui.wizards.WizardWidgetFactory.newComboViewer; import static com.amazonaws.eclipse.core.ui.wizards.WizardWidgetFactory.newLabel; import static com.amazonaws.util.ValidationUtils.assertNotNull; import java.util.Collection; import java.util.Collections; import java.util.List; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.validation.IValidator; import org.eclipse.jface.databinding.viewers.IViewerObservableValue; import org.eclipse.jface.databinding.viewers.ViewerProperties; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.widgets.Composite; import com.amazonaws.eclipse.databinding.ChainValidator; /** * A JFace ComboView widget along with a Label and data binding feature. Instead of * observing the value of the combo box item, it observes the attached data directly * and binds it to the model. */ public class ComboViewerComplex<T> { private final ComboViewer comboViewer; private ComboViewerComplex( Composite parent, ILabelProvider labelProvider, Collection<T> items, T defaultItem, DataBindingContext bindingContext, IObservableValue pojoObservableValue, IValidator validator, String labelValue, int comboSpan, List<ISelectionChangedListener> listeners) { if (labelValue != null) { newLabel(parent, labelValue); } comboViewer = newComboViewer(parent, comboSpan); comboViewer.setContentProvider(ArrayContentProvider.getInstance()); comboViewer.setLabelProvider(labelProvider); comboViewer.setInput(items); IViewerObservableValue viewerObservableValue = ViewerProperties.singleSelection().observe(comboViewer); bindingContext.bindValue(viewerObservableValue, pojoObservableValue); if (validator != null) { ChainValidator<T> comboViewerValidationStatusProvider = new ChainValidator<>(viewerObservableValue, validator); bindingContext.addValidationStatusProvider(comboViewerValidationStatusProvider); } if (defaultItem != null) { comboViewer.setSelection(new StructuredSelection(defaultItem)); } if (listeners != null && !listeners.isEmpty()) { for (ISelectionChangedListener listener : listeners) { comboViewer.addSelectionChangedListener(listener); } } } public ComboViewer getComboViewer() { return this.comboViewer; } public static <T> ComboViewerComplexBuilder<T> builder() { return new ComboViewerComplexBuilder<T>(); } public static final class ComboViewerComplexBuilder<T> { private Composite parent; private ILabelProvider labelProvider; private Collection<T> items = Collections.emptyList(); private T defaultItem; private DataBindingContext bindingContext; private IObservableValue pojoObservableValue; private IValidator validator; private String labelValue; private int comboSpan = 1; private List<ISelectionChangedListener> listeners; public ComboViewerComplex<T> build() { validateParameters(); return new ComboViewerComplex<T>( parent, labelProvider, items, defaultItem, bindingContext, pojoObservableValue, validator, labelValue, comboSpan, listeners); } public ComboViewerComplexBuilder<T> composite(Composite parent) { this.parent = parent; return this; } public ComboViewerComplexBuilder<T> labelProvider(ILabelProvider labelProvider) { this.labelProvider = labelProvider; return this; } public ComboViewerComplexBuilder<T> items(Collection<T> items) { this.items = items; return this; } public ComboViewerComplexBuilder<T> defaultItem(T defaultItme) { this.defaultItem = defaultItme; return this; } public ComboViewerComplexBuilder<T> bindingContext(DataBindingContext bindingContext) { this.bindingContext = bindingContext; return this; } public ComboViewerComplexBuilder<T> validator(IValidator validator) { this.validator = validator; return this; } public ComboViewerComplexBuilder<T> pojoObservableValue(IObservableValue pojoObservableValue) { this.pojoObservableValue = pojoObservableValue; return this; } public ComboViewerComplexBuilder<T> labelValue(String labelValue) { this.labelValue = labelValue; return this; } public ComboViewerComplexBuilder<T> comboSpan(int comboSpan) { this.comboSpan = comboSpan; return this; } public ComboViewerComplexBuilder<T> listeners(List<ISelectionChangedListener> listeners) { this.listeners = listeners; return this; } private void validateParameters() { assertNotNull(parent, "Parent composite"); assertNotNull(labelProvider, "LabelProvider"); assertNotNull(pojoObservableValue, "PojoObservableValue"); assertNotNull(items, "Item collection"); } } }