/*******************************************************************************
* Copyright (c) 2006-2010 eBay Inc. 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.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*******************************************************************************/
/**
*
*/
package org.ebayopensource.turmeric.eclipse.services.ui.wizards.pages;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import org.ebayopensource.turmeric.eclipse.core.model.services.ServiceFromTemplateWsdlParamModel;
import org.ebayopensource.turmeric.eclipse.core.model.services.ServiceFromTemplateWsdlParamModel.Binding;
import org.ebayopensource.turmeric.eclipse.core.model.services.ServiceFromTemplateWsdlParamModel.TemplateWSDLModel;
import org.ebayopensource.turmeric.eclipse.core.resources.constants.SOAProjectConstants;
import org.ebayopensource.turmeric.eclipse.core.resources.constants.SOAProjectConstants.TemplateBinding;
import org.ebayopensource.turmeric.eclipse.repositorysystem.core.GlobalRepositorySystem;
import org.ebayopensource.turmeric.eclipse.repositorysystem.core.ISOAHelpProvider;
import org.ebayopensource.turmeric.eclipse.ui.SOABasePage;
import org.ebayopensource.turmeric.eclipse.ui.UIActivator;
import org.ebayopensource.turmeric.eclipse.ui.components.TableButtonPanelViewer;
import org.ebayopensource.turmeric.eclipse.ui.components.TableButtonPanelViewer.ColumnDef;
import org.ebayopensource.turmeric.eclipse.utils.plugin.EclipseMessageUtils;
import org.ebayopensource.turmeric.eclipse.utils.ui.UIUtil;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
/**
* The Class ServiceFromNewWSDLAddBindingWizardPage.
*
* @author yayu
*/
public class ServiceFromNewWSDLAddBindingWizardPage extends SOABasePage {
private TableButtonPanelViewer bindingViewer;
/** The Constant COLUMN_TYPE. */
public static final String COLUMN_TYPE = "type";
/** The Constant BINDING_COLUMN_PROPERTIES. */
public static final String[] BINDING_COLUMN_PROPERTIES = {COLUMN_TYPE};
private Set<Binding> bindings = new LinkedHashSet<Binding>();
/**
* Instantiates a new service from new wsdl add binding wizard page.
*
*/
public ServiceFromNewWSDLAddBindingWizardPage() {
super("newSOAServiceProjectFromBlankWSDLAddBindingWizardPage", "Service from Template WSDL - Add Binding",
"Add bindings to the template WSDL");
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.eclipse.ui.SOABasePage#getDefaultValue(org.eclipse.swt.widgets.Text)
*/
@Override
public String getDefaultValue(Text text) {
return SOAProjectConstants.EMPTY_STRING;
}
/**
* {@inheritDoc}
*/
@Override
public void createControl(Composite parent) {
final Composite container = super.createParentControl(parent, 3);
createBindingViewer(container);
}
private void createBindingViewer(Composite parent) {
final ColumnDef[] columns = new ColumnDef[]{
new ColumnDef("Binding Type", 150, UIActivator.getImageFromRegistry("binding.gif"))};
bindingViewer = new TableButtonPanelViewer(parent,
SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION,
columns, true, false) {
@Override
protected void addButtonSelected(SelectionEvent event) {
super.addButtonSelected(event);
if (event.doit == true && bindingViewer != null) {
final Binding binding = new Binding(SOAProjectConstants.TemplateBinding.values()[0]);
if (bindings.add(binding)) {
bindingViewer.refresh();
dialogChanged();
}
}
}
@Override
protected void removeButtonSelected(SelectionEvent event) {
super.removeButtonSelected(event);
final TemplateWSDLModel model = getSelectedModel(null);
if (event.doit == true && model instanceof Binding
&& MessageDialog.openConfirm(UIUtil.getActiveShell(),
"Warning",
"Removing a binding might cause unexpected result " +
"in the generated WSDL, and it is strongly recommmended " +
"to keep the default bindings.\n\nAre you sure to remove binding "
+ ((Binding)model).getBinding().name() + "?")) {
if ( bindings.remove(model)) {
bindingViewer.refresh();
dialogChanged();
}
}
}
@Override
protected void viewerSelectionChanged(
SelectionChangedEvent event) {
super.viewerSelectionChanged(event);
}
};
GridData data = new GridData(GridData.FILL_BOTH);
data.horizontalSpan = 2;
final Table table = bindingViewer.getTable();
table.setLayoutData(data);
table.setHeaderVisible(true);
table.setLinesVisible(true);
bindingViewer.setContentProvider(new IStructuredContentProvider(){
@Override
public Object[] getElements(Object inputElement) {
if (inputElement instanceof Collection<?>) {
return ((Collection<?>)inputElement).toArray();
}
return Collections.EMPTY_LIST.toArray();
}
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput,
Object newInput) {
}
});
bindingViewer.setLabelProvider(new ITableLabelProvider() {
@Override
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
@Override
public String getColumnText(Object element, int columnIndex) {
if (element instanceof Binding) {
final Binding binding = (Binding)element;
if (columnIndex == 0 ) {
return binding.getBinding().name();
}
}
return SOAProjectConstants.EMPTY_STRING;
}
@Override
public void addListener(ILabelProviderListener listener) {
}
@Override
public void dispose() {
}
@Override
public boolean isLabelProperty(Object element, String property) {
return false;
}
@Override
public void removeListener(ILabelProviderListener listener) {
}
});
bindingViewer.setColumnProperties(BINDING_COLUMN_PROPERTIES);
bindingViewer.setCellModifier(new ICellModifier() {
@Override
public boolean canModify(Object element, String property) {
return true;
}
@Override
public Object getValue(Object element, String property) {
if (element instanceof Binding) {
final Binding binding = (Binding) element;
if (COLUMN_TYPE.equals(property)) {
return binding.getBinding().ordinal();
}
}
return SOAProjectConstants.EMPTY_STRING;
}
@Override
public void modify(Object element, String property, Object value) {
if (element instanceof TableItem) {
final TableItem item = (TableItem)element;
if (item.getData() instanceof Binding) {
Object obj = null;
final Binding binding = (Binding) item.getData();
if (COLUMN_TYPE.equals(property)
&& value instanceof Integer) {
final Integer newValue = (Integer)value;
if (binding.getBinding().ordinal()
!= newValue.intValue()) {
binding.setBinding(TemplateBinding.values()[newValue.intValue()]);
obj = binding;
}
}
if (obj != null) {
bindingViewer.refresh(obj);
dialogChanged();
}
}
}
}
});
bindingViewer.setCellEditors(new CellEditor[]{
new ComboBoxCellEditor(table,
SOAProjectConstants.TemplateBinding.getAllBindingNames()
.toArray(new String[0]), SWT.READ_ONLY),
new TextCellEditor(table)});
bindingViewer.setInput(getInputObject());
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.eclipse.ui.SOABasePage#dialogChanged()
*/
@Override
protected boolean dialogChanged() {
if(super.dialogChanged() == false)
return false;
final Set<String> bindingNames = new HashSet<String>();
for (final Binding binding : bindings) {
final String bindingName = binding.getBinding().name();
if (bindingNames.contains(bindingName)) {
updateStatus(bindingViewer.getControl(),
"Duplicate bindings->" + bindingName);
return false;
}
bindingNames.add(bindingName);
}
if (bindings.isEmpty() == true) {
updatePageStatus(bindingViewer.getControl(),
EclipseMessageUtils.createStatus(
"No binding are added to the WSDL", IStatus.WARNING));
}
return true;
}
/**
* Gets the bindings.
*
* @return the bindings
*/
public Set<Binding> getBindings() {
return bindings;
}
private TemplateWSDLModel getSelectedModel(ISelection sel) {
IStructuredSelection selection = null;
if (sel == null && this.bindingViewer != null) {
if (bindingViewer.getSelection().isEmpty() == false
&& bindingViewer.getSelection() instanceof IStructuredSelection) {
selection = (IStructuredSelection) bindingViewer.getSelection();
}
} else if (sel instanceof IStructuredSelection) {
selection = (IStructuredSelection)sel;
}
if (selection != null && selection.getFirstElement() instanceof TemplateWSDLModel) {
return (TemplateWSDLModel)selection.getFirstElement();
}
return null;
}
private Object getInputObject() {
bindings.addAll(ServiceFromTemplateWsdlParamModel.getDefaultBindings());
return bindings;
}
/* (non-Javadoc)
* @see org.ebayopensource.turmeric.eclipse.ui.SOABasePage#getHelpContextID()
*/
@Override
public String getHelpContextID() {
return GlobalRepositorySystem.instanceOf().getActiveRepositorySystem()
.getHelpProvider().getHelpContextID(
ISOAHelpProvider.PAGE_CREATE_SERVICE_FROM_TEMPLATE_WSDL);
}
}