blob: a4fbde13edcfe27d5e10674335fcc7c92abc4205 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - Initial API and implementation
*******************************************************************************/
package org.eclipse.ptp.services.ui.wizards;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.osgi.util.NLS;
import org.eclipse.ptp.services.core.IService;
import org.eclipse.ptp.services.core.IServiceConfiguration;
import org.eclipse.ptp.services.core.IServiceModelManager;
import org.eclipse.ptp.services.core.IServiceProvider;
import org.eclipse.ptp.services.core.IServiceProviderDescriptor;
import org.eclipse.ptp.services.core.ServiceModelManager;
import org.eclipse.ptp.services.ui.ServicesUIPlugin;
import org.eclipse.ptp.services.ui.IServiceProviderContributor;
import org.eclipse.ptp.services.ui.ServiceModelUIManager;
import org.eclipse.ptp.services.ui.dialogs.ServicesDialog;
import org.eclipse.ptp.services.ui.messages.Messages;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
/**
* <strong>EXPERIMENTAL</strong>. This class or interface has been added as
* part of a work in progress. There is no guarantee that this API will work or
* that it will remain the same. Please do not use this API without consulting
* with the RDT team.
*
*/
public class ServiceConfigurationWidget extends Wizard implements INewWizard {
public class AddListener implements Listener {
public void handleEvent(Event event) {
Set<IService> displaySet = new HashSet<IService>();
Set<IService> configServices = getServiceConfiguration().getServices();
for (IService service : ServiceModelManager.getInstance().getServices()) {
if (!configServices.contains(service)) {
displaySet.add(service);
}
}
ServicesDialog dialog = new ServicesDialog(getShell(), displaySet.toArray(new IService[0]));
if (dialog.open() == Dialog.OK) {
IService[] selectedServices = dialog.getSelectedServices();
for (IService service : selectedServices) {
SortedSet<IServiceProviderDescriptor> providers = getProvidersByPriority(service);
if (providers.size() > 0) {
IServiceProvider provider = ServiceModelManager.getInstance().getServiceProvider(providers.iterator().next());
// addTableRow(service, provider);
getServiceConfiguration().setServiceProvider(service, provider);
} else {
ServicesUIPlugin.getDefault().log(NLS.bind(Messages.ServiceModelWidget_8, service.getId()));
}
}
updateAddRemoveButtons();
}
}
}
public class ConfigureListener implements Listener {
public void handleEvent(Event event) {
// launch the configuration UI for the service provider
TableItem[] selection = fTable.getSelection();
if (selection.length == 0) {
return;
}
TableItem item = selection[0];
IServiceProvider provider = (IServiceProvider) item.getData(PROVIDER_KEY);
IServiceProviderContributor contrib = ServiceModelUIManager.getInstance().getServiceProviderContributor(provider);
IWizard wizard = contrib.getWizard(provider, null);
WizardDialog dialog = new WizardDialog(getShell(), wizard);
dialog.open();
String configString = provider.getConfigurationString();
// column 2 holds the configuration string of the provider's current configuration
if (configString == null) {
configString = Messages.ServiceModelWidget_4;
}
item.setText(2, configString);
// allow container page to check if configurations are set
if (fConfigChangeListener != null) {
fConfigChangeListener.handleEvent(null);
}
}
}
public class RemoveListener implements Listener {
public void handleEvent(Event event) {
TableItem[] items = fTable.getSelection();
if (items.length == 0) {
return;
}
for (TableItem item : items) {
IService service = (IService) item.getData(SERVICE_KEY);
if (service != null) {
getServiceConfiguration().disable(service);
}
fTable.remove(fTable.indexOf(item));
}
updateAddRemoveButtons();
}
}
protected static final String PROVIDER_KEY = "provider-id"; //$NON-NLS-1$
protected static final String SERVICE_KEY = "service-id"; //$NON-NLS-1$
protected Set<IServiceConfiguration> fServiceConfigurations;
protected IServiceConfiguration fServiceConfiguration;
protected Map<String, String> fServiceIDToSelectedProviderID;
protected Map<String, IServiceProvider> fProviderIDToProviderMap;
protected Table fTable;
protected Button fConfigureButton;
protected Button fAddButton;
protected Button fRemoveButton;
protected Listener fConfigChangeListener = null;
protected IWorkbench fWorkbench = null;
protected IStructuredSelection fSelection = null;
public ServiceConfigurationWidget(Set<IServiceConfiguration> serviceConfigurations) {
fServiceConfigurations = serviceConfigurations;
}
public Control createContents(Composite parent) {
Composite canvas = new Composite(parent, SWT.NONE);
GridLayout canvasLayout = new GridLayout(2, false);
canvas.setLayout(canvasLayout);
Composite tableParent = new Composite(canvas, SWT.NONE);
tableParent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
fTable = new Table (tableParent, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION | SWT.H_SCROLL);
fTable.setLinesVisible (true);
fTable.setHeaderVisible (true);
TableColumnLayout layout = new TableColumnLayout();
String[] titles = {"Project", "Configuration", "Status"};
for (int i=0; i<titles.length; i++) {
TableColumn column = new TableColumn (fTable, SWT.NONE);
column.setText (titles [i]);
int width = ColumnWeightData.MINIMUM_WIDTH;
// set the column widths
switch (i) {
case 0: // Project name... usually short
width = 100;
break;
case 1: // Configuation name... usually short
width = 100;
break;
case 2: // configuration status... typically short
width = 100;
break;
}
layout.setColumnData(column, new ColumnWeightData(1, width, true));
}
tableParent.setLayout(layout);
fTable.setLayout(new FillLayout());
createTableContent();
fTable.setVisible(true);
Composite buttonParent = new Composite(canvas, SWT.NONE);
GridLayout buttonLayout = new GridLayout(1, true);
buttonParent.setLayout(buttonLayout);
buttonParent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
fConfigureButton = new Button(buttonParent, SWT.PUSH);
fConfigureButton.setEnabled(false);
fConfigureButton.setText(Messages.ServiceModelWidget_2);
fConfigureButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Listener configureListener = getConfigureListener();
fConfigureButton.addListener(SWT.Selection, configureListener);
fAddButton = new Button(buttonParent, SWT.PUSH);
fAddButton.setEnabled(true);
fAddButton.setText(Messages.ServiceModelWidget_6);
fAddButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Listener addListener = getAddListener();
fAddButton.addListener(SWT.Selection, addListener);
fRemoveButton = new Button(buttonParent, SWT.PUSH);
fRemoveButton.setEnabled(false);
fRemoveButton.setText(Messages.ServiceModelWidget_7);
fRemoveButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Listener removeListener = getRemoveListener();
fRemoveButton.addListener(SWT.Selection, removeListener);
updateAddRemoveButtons();
return canvas;
}
/**
* @return the configuration change listener
*/
public Listener getConfigChangeListener() {
return fConfigChangeListener;
}
public Map<String, IServiceProvider> getProviderIDToProviderMap() {
return fProviderIDToProviderMap;
}
/**
* Get the service configuration for this widget
*
* @return service configuration
*/
public IServiceConfiguration getServiceConfiguration() {
return fServiceConfiguration;
}
public Map<String, String> getServiceIDToSelectedProviderID() {
return fServiceIDToSelectedProviderID;
}
public Table getTable() {
return fTable;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
*/
public void init(IWorkbench workbench, IStructuredSelection selection) {
fWorkbench = workbench;
fSelection = selection;
}
/**
* Sub-class may override behaviour
* @return true if all available services have been configured
*/
public boolean isConfigured() {
return isConfigured(null, fServiceIDToSelectedProviderID, getProviderIDToProviderMap());
}
/* (non-Javadoc)
* @see org.eclipse.jface.wizard.Wizard#performFinish()
*/
@Override
public boolean performFinish() {
return true;
}
/**
* Listens for changes in service provider configuration
* @param configChangeListener the configuration change listener to set
*/
public void setConfigChangeListener(Listener configChangeListener) {
fConfigChangeListener = configChangeListener;
}
public void setProviderIDToProviderMap(
Map<String, IServiceProvider> providerIDToProviderMap) {
fProviderIDToProviderMap = providerIDToProviderMap;
}
public void setServiceIDToSelectedProviderID(
Map<String, String> serviceIDToSelectedProviderID) {
fServiceIDToSelectedProviderID = serviceIDToSelectedProviderID;
}
public void setTable(Table table) {
fTable = table;
}
private void addTableRow(IServiceConfiguration config) {
TableItem item = new TableItem (fTable, SWT.NONE);
// column 0 lists the name of the configuration
item.setText (0, config.getName());
// column 1 holds the status string
item.setText(1, "Not configured");
item.setData(SERVICE_KEY, config);
// allow container page to check if configurations are set
if (fConfigChangeListener != null) {
fConfigChangeListener.handleEvent(null);
}
}
/**
* Return the set of providers sorted by priority
*
* @param service service containing providers
* @return sorted providers
*/
private SortedSet<IServiceProviderDescriptor> getProvidersByPriority(IService service) {
SortedSet<IServiceProviderDescriptor> sortedProviders =
new TreeSet<IServiceProviderDescriptor>(new Comparator<IServiceProviderDescriptor>() {
public int compare(IServiceProviderDescriptor o1, IServiceProviderDescriptor o2) {
return o2.getPriority().compareTo(o1.getPriority());
}
});
for (IServiceProviderDescriptor p : service.getProviders()) {
sortedProviders.add(p);
}
return sortedProviders;
}
/**
* Get a the service provider for the descriptor. Keeps a cache of service providers.
*
* @param descriptor descriptor for the service provider
* @return service provider
*/
private IServiceProvider getServiceProvider(IServiceProviderDescriptor descriptor) {
IServiceProvider serviceProvider = getProviderIDToProviderMap().get(descriptor.getId());
if (serviceProvider == null) {
serviceProvider = ServiceModelManager.getInstance().getServiceProvider(descriptor);
getProviderIDToProviderMap().put(descriptor.getId(), serviceProvider);
}
return serviceProvider;
}
/**
* Generate the services, providers and provider configuration available for
* the given configuration in the table
*
* Sub-classes may override its behaviour
* @param project
*/
protected void createTableContent() {
fTable.removeAll();
for (IServiceConfiguration config : fServiceConfigurations) {
addTableRow(config);
}
}
//sub class may override to change behaviour
protected Listener getAddListener() {
return new AddListener();
}
//sub class may override to change behaviour
protected Listener getConfigureListener() {
return new ConfigureListener();
}
/**
* Find available remote services and service providers for a given project
*/
protected Set<IService> getContributedServices(IProject project) {
IServiceModelManager modelManager = ServiceModelManager.getInstance();
Set<IService> allApplicableServices = new LinkedHashSet<IService>();
if (project != null) {
String[] natureIds = new String[] {};
try {
//get the project natures of the project
natureIds = project.getDescription().getNatureIds();
} catch (CoreException e) {
e.printStackTrace();
}
for (int i = 0; i < natureIds.length; i++) {
String natureId = natureIds[i];
Set<IService> services = modelManager.getServices(natureId);
if (services != null)
allApplicableServices.addAll(services);
}
}
return allApplicableServices;
}
//sub class may override to change behaviour
protected Listener getRemoveListener() {
return new RemoveListener();
}
/**
* Determine if all service providers have been configured
* @param project
* @param serviceIDToSelectedProviderID
* @param providerIDToProviderMap
* @return true if all service providers have been configured
*/
protected boolean isConfigured(IProject project, Map<String, String> serviceIDToSelectedProviderID, Map<String, IServiceProvider> providerIDToProviderMap) {
Set<IService> allApplicableServices = getContributedServices(project);
Iterator<IService> iterator = allApplicableServices.iterator();
boolean configured = true;
while (iterator.hasNext()) {
String providerID = serviceIDToSelectedProviderID.get(iterator.next().getId());
if (providerID == null)
return false;
else {
IServiceProvider provider = providerIDToProviderMap.get(providerID);
if (provider == null)
return false;
else
configured = configured && provider.isConfigured();
}
}
return configured;
}
protected void updateAddRemoveButtons() {
Set<IService> services = ServiceModelManager.getInstance().getServices();
fAddButton.setEnabled(services.size() > fTable.getItemCount());
fRemoveButton.setEnabled(fTable.getItemCount() > 0);
}
/**
* Enable/disable the configure button in this widget based on the service provider descriptor selected
* @param enabled
*/
protected void updateConfigureButton(IServiceProviderDescriptor descriptor) {
IServiceProviderContributor contrib = ServiceModelUIManager.getInstance().getServiceProviderContributor(descriptor);
fConfigureButton.setEnabled(contrib != null);
}
}