/*
* 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.ui;
import static com.amazonaws.util.ValidationUtils.assertNotNull;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.PojoProperties;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import com.amazonaws.eclipse.core.model.RegionDataModel;
import com.amazonaws.eclipse.core.regions.Region;
import com.amazonaws.eclipse.core.regions.RegionUtils;
import com.amazonaws.eclipse.core.widget.ComboViewerComplex;
/**
* A reusable composite for Region selection.
*/
public class RegionComposite extends Composite {
private final DataBindingContext bindingContext;
private final RegionDataModel dataModel;
private final String serviceName;
private final String labelValue;
private final List<ISelectionChangedListener> listeners;
private ComboViewerComplex<Region> regionComboComplex;
private RegionComposite(
Composite parent,
DataBindingContext bindingContext,
RegionDataModel dataModel,
String serviceName,
String labelValue,
List<ISelectionChangedListener> listeners) {
super(parent, SWT.NONE);
this.bindingContext = bindingContext;
this.dataModel = dataModel;
this.serviceName = serviceName;
this.labelValue = labelValue;
this.listeners = listeners;
this.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
this.setLayout(new GridLayout(3, true));
createControl();
}
public Region getCurrentSelectedRegion() {
IStructuredSelection selection = (IStructuredSelection) regionComboComplex.getComboViewer().getSelection();
return (Region) selection.getFirstElement();
}
private void createControl() {
List<Region> regions = serviceName == null ? RegionUtils.getRegions()
: RegionUtils.getRegionsForService(serviceName);
regionComboComplex = ComboViewerComplex.<Region>builder()
.composite(this)
.bindingContext(bindingContext)
.labelValue(labelValue)
.items(regions)
.defaultItem(dataModel.getRegion())
.listeners(listeners)
.pojoObservableValue(PojoProperties.value(RegionDataModel.class, RegionDataModel.P_REGION, Region.class).observe(dataModel))
.labelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof Region) {
Region region = (Region) element;
return region.getName();
}
return super.getText(element);
}
})
.comboSpan(2)
.build();
}
public static RegionCompositeBuilder builder() {
return new RegionCompositeBuilder();
}
public static final class RegionCompositeBuilder {
private Composite parent;
private DataBindingContext bindingContext;
private RegionDataModel dataModel;
private String serviceName;
private String labelValue = "Select Regions:";
private final List<ISelectionChangedListener> listeners = new ArrayList<>();
public RegionComposite build() {
validateParameters();
return new RegionComposite(parent, bindingContext, dataModel, serviceName, labelValue, listeners);
}
public RegionCompositeBuilder parent(Composite parent) {
this.parent = parent;
return this;
}
public RegionCompositeBuilder bindingContext(DataBindingContext bindingContext) {
this.bindingContext = bindingContext;
return this;
}
public RegionCompositeBuilder dataModel(RegionDataModel dataModel) {
this.dataModel = dataModel;
return this;
}
public RegionCompositeBuilder serviceName(String serviceName) {
this.serviceName = serviceName;
return this;
}
public RegionCompositeBuilder labelValue(String labelValue) {
this.labelValue = labelValue;
return this;
}
public RegionCompositeBuilder addListener(ISelectionChangedListener listener) {
this.listeners.add(listener);
return this;
}
private void validateParameters() {
assertNotNull(parent, "Parent composite");
assertNotNull(bindingContext, "BindingContext");
assertNotNull(dataModel, "RegionDataModel");
}
}
}