Java tutorial
/******************************************************************************* * Copyright (c) 2009, 2010 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.widgets; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import org.eclipse.core.runtime.ListenerList; import org.eclipse.jface.dialogs.InputDialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.layout.PixelConverter; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.osgi.util.NLS; import org.eclipse.ptp.internal.services.ui.messages.Messages; 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.ServiceModelManager; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.Table; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; /** * Standard widget for selecting a service configuration. * * Displays a table view of service configurations so that the user can easily * see what services and providers are available in the configuration. * * Provides "Add...", "Remove", and "Rename" buttons to allow the creation, * removal and renaming of service configurations. These buttons can be * enabled/disabled by using the <code>buttons</code> constructor parameter. * * The <code>excluded</code> constructor parameter can be used to supply a list * of configurations to be exclude from the list. * * The whole control can be enabled/disabled using the <code>setEnabled</code> method. * */ public class ServiceConfigurationSelectionWidget extends Composite implements ISelectionProvider { /** * Comparator class used to sort service configurations in ascending order * by name */ private class ServiceConfigurationComparator extends ViewerComparator { /* (non-Javadoc) * @see org.eclipse.jface.viewers.ViewerComparator#compare(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ public int compare(Viewer viewer, Object o1, Object o2) { if (o1 instanceof IServiceConfiguration && o2 instanceof IServiceConfiguration) { return ((IServiceConfiguration) o1).getName() .compareToIgnoreCase(((IServiceConfiguration) o2).getName()); } return super.compare(viewer, o1, o2); } } /** * Content provider for service configurations */ private class ServiceConfigurationContentProvider extends WorkbenchContentProvider { /* (non-Javadoc) * @see org.eclipse.ui.model.BaseWorkbenchContentProvider#getChildren(java.lang.Object) */ @Override public Object[] getChildren(Object element) { List<IServiceConfiguration> children = new ArrayList<IServiceConfiguration>(); if (fDisplayConfigs == null) { children.addAll(ServiceModelManager.getInstance().getConfigurations()); } else { children.addAll(Arrays.asList(fDisplayConfigs)); } if (fExcludedConfigs != null) { children.removeAll(fExcludedConfigs); } return children.toArray(); } } private final static int TABLE_WIDTH = 400; private final static int TABLE_HEIGHT = 250; private final static int BUTTON_WIDTH = 110; private final ListenerList fSelectionListeners = new ListenerList(); private final IServiceModelManager fManager = ServiceModelManager.getInstance(); private TableViewer fTableViewer; private Table fTable; private TableColumnLayout fTableLayout; private Button fAddButton; private Button fRemoveButton; private Button fRenameButton; private Button fSelectAllButton; private Button fDeselectAllButton; private ISelection fSelection; private boolean fEnabled = true; private boolean fButtonsVisible = true; private boolean fUseCheckboxes = false; private Set<IService> fServices = null; private Set<IServiceConfiguration> fExcludedConfigs = null; private IServiceConfiguration[] fDisplayConfigs = null; private IServiceConfiguration fSelectedConfig = null; public ServiceConfigurationSelectionWidget(Composite parent, int style) { this(parent, style, null, null, true); } public ServiceConfigurationSelectionWidget(Composite parent, int style, Set<IServiceConfiguration> excluded, Set<IService> services, boolean enableButtons) { super(parent, style); fServices = services; fUseCheckboxes = ((style & SWT.CHECK) == SWT.CHECK); GridLayout bodyLayout; if (enableButtons && !fUseCheckboxes) { bodyLayout = new GridLayout(2, false); } else { bodyLayout = new GridLayout(1, false); } bodyLayout.marginHeight = 0; bodyLayout.marginWidth = 0; setLayout(bodyLayout); setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL)); Composite tableComposite = new Composite(this, SWT.NONE); fTableLayout = new TableColumnLayout(); tableComposite.setLayout(fTableLayout); tableComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); if (fUseCheckboxes) { fTable = new Table(tableComposite, SWT.CHECK | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); fTableViewer = new CheckboxTableViewer(fTable); ((CheckboxTableViewer) fTableViewer).addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { updateControls(); } }); } else { fTableViewer = new TableViewer(tableComposite, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL); fTable = fTableViewer.getTable(); } fTable.setLayout(new TableLayout()); GridData data = new GridData(GridData.FILL_BOTH); data.heightHint = TABLE_HEIGHT; data.widthHint = TABLE_WIDTH; fTable.setLayoutData(data); /* * Only add headers if there is more than one column */ if (fServices != null) { fTable.setHeaderVisible(true); } fTableViewer.setContentProvider(new ServiceConfigurationContentProvider()); fTableViewer.setLabelProvider(new WorkbenchLabelProvider()); fTableViewer.setComparator(new ServiceConfigurationComparator()); fTableViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { notifySelection(fTableViewer.getSelection()); updateControls(); } }); createColumns(); fTableViewer.setInput(this); if (enableButtons && !fUseCheckboxes) { Composite buttonsComp = new Composite(this, SWT.NONE); buttonsComp.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1)); buttonsComp.setLayout(new GridLayout(1, false)); fAddButton = new Button(buttonsComp, SWT.PUSH); data = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1); data.widthHint = BUTTON_WIDTH; fAddButton.setLayoutData(data); fAddButton.setText(Messages.ServiceConfigurationSelectionWidget_1); fAddButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { InputDialog dialog = new InputDialog(fAddButton.getShell(), Messages.ServiceConfigurationSelectionWidget_2, Messages.ServiceConfigurationSelectionWidget_3, null, null); if (dialog.open() == InputDialog.OK) { IServiceConfiguration config = fManager.newServiceConfiguration(dialog.getValue()); fManager.addConfiguration(config); fTableViewer.refresh(); } } }); fRemoveButton = new Button(buttonsComp, SWT.PUSH); fRemoveButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); fRemoveButton.setText(Messages.ServiceConfigurationSelectionWidget_4); fRemoveButton.setEnabled(false); fRemoveButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { IStructuredSelection selection = (IStructuredSelection) fTableViewer.getSelection(); if (!selection.isEmpty()) { Object[] configs = (Object[]) selection.toArray(); String names = ""; //$NON-NLS-1$ for (int i = 0; i < configs.length; i++) { if (i > 0) { names += ", "; //$NON-NLS-1$ } names += "\"" + ((IServiceConfiguration) configs[i]).getName() + "\""; //$NON-NLS-1$ //$NON-NLS-2$ } boolean doRemove = MessageDialog.openConfirm(fRemoveButton.getShell(), Messages.ServiceConfigurationSelectionWidget_9, NLS.bind(Messages.ServiceConfigurationSelectionWidget_10, names)); if (doRemove) { for (Object config : configs) { fManager.remove((IServiceConfiguration) config); } fTableViewer.refresh(); } } } }); fRenameButton = new Button(buttonsComp, SWT.PUSH); fRenameButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); fRenameButton.setText(Messages.ServiceConfigurationSelectionWidget_11); fRenameButton.setEnabled(false); fRenameButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { IStructuredSelection selection = (IStructuredSelection) fTableViewer.getSelection(); if (!selection.isEmpty()) { InputDialog dialog = new InputDialog(fAddButton.getShell(), Messages.ServiceConfigurationSelectionWidget_12, Messages.ServiceConfigurationSelectionWidget_13, null, null); if (dialog.open() == InputDialog.OK) { IServiceConfiguration config = (IServiceConfiguration) selection.getFirstElement(); config.setName(dialog.getValue()); fTableViewer.update(config, null); } } } }); } if (enableButtons && fUseCheckboxes) { Composite buttonsComp = new Composite(this, SWT.NONE); buttonsComp.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1)); buttonsComp.setLayout(new GridLayout(2, false)); fSelectAllButton = new Button(buttonsComp, SWT.PUSH); data = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1); fSelectAllButton.setLayoutData(data); fSelectAllButton.setText(Messages.ServiceConfigurationSelectionWidget_5); fSelectAllButton.setEnabled(false); fSelectAllButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { setAllChecked(true); } }); fDeselectAllButton = new Button(buttonsComp, SWT.PUSH); data = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1); fDeselectAllButton.setLayoutData(data); fDeselectAllButton.setText(Messages.ServiceConfigurationSelectionWidget_6); fDeselectAllButton.setEnabled(false); fDeselectAllButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent evt) { setAllChecked(false); } }); } fExcludedConfigs = excluded; fButtonsVisible = enableButtons; updateControls(); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) */ public void addSelectionChangedListener(ISelectionChangedListener listener) { fSelectionListeners.add(listener); } /** * Gets the elements that have been checked in the viewer * * @return array containing the elements that are checked */ public IServiceConfiguration[] getCheckedServiceConfigurations() { if (fUseCheckboxes) { Object[] elements = ((CheckboxTableViewer) fTableViewer).getCheckedElements(); return Arrays.asList(elements).toArray(new IServiceConfiguration[0]); } return new IServiceConfiguration[0]; } /* (non-Javadoc) * @see org.eclipse.swt.widgets.Control#getEnabled() */ @Override public boolean getEnabled() { return fEnabled; } /** * Return the service configuration selected by the user * * @return Selected service configuration */ public IServiceConfiguration getSelectedConfiguration() { return fSelectedConfig; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection() */ public ISelection getSelection() { return fSelection; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) */ public void removeSelectionChangedListener(ISelectionChangedListener listener) { fSelectionListeners.remove(listener); } /** * Sets all elements in the viewer to the given checked state. * * @param state */ public void setAllChecked(boolean state) { if (fUseCheckboxes) { ((CheckboxTableViewer) fTableViewer).setAllChecked(state); notifySelection(fTableViewer.getSelection()); } } /** * Set the service configurations to display in the viewer. Passing null * will display all known configurations (default). * * @param configurations configurations to display, or null to display all */ public void setConfigurations(IServiceConfiguration[] configurations) { fDisplayConfigs = configurations; fTableViewer.refresh(); } /* (non-Javadoc) * @see org.eclipse.swt.widgets.Control#setEnabled(boolean) */ @Override public void setEnabled(boolean enabled) { fEnabled = enabled; updateControls(); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection) */ public void setSelection(ISelection selection) { fSelection = selection; } /** * Add the named column to the viewer * * @param colName name to use for the column heading * @return the column */ private TableViewerColumn addColumn(String colName) { TableViewerColumn column = new TableViewerColumn(fTableViewer, SWT.NONE); column.getColumn().setResizable(true); column.getColumn().setMoveable(true); column.getColumn().setText(colName); PixelConverter converter = new PixelConverter(fTableViewer.getControl()); int colWidth = converter.convertWidthInCharsToPixels(colName.length() + 1); fTableLayout.setColumnData(column.getColumn(), new ColumnWeightData(10, colWidth)); return column; } /** * Create the columns in the viewer. Always creates at least one column, the service * configuration name. The other columns are determined by the set of services * passed to the constructor. */ private void createColumns() { TableViewerColumn firstColumn = addColumn(Messages.ServiceConfigurationSelectionWidget_7); firstColumn.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { return ((IServiceConfiguration) element).getName(); } }); if (fServices != null) { SortedSet<IService> services = new TreeSet<IService>(new Comparator<IService>() { public int compare(IService o1, IService o2) { return o1.getName().compareTo(o2.getName()); } }); for (IService service : fServices) { services.add(service); } for (IService service : services) { String name = service.getName() + Messages.ServiceConfigurationSelectionWidget_8; final TableViewerColumn column = addColumn(name); column.getColumn().setData(service); column.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { IServiceConfiguration config = ((IServiceConfiguration) element); IService service = (IService) column.getColumn().getData(); IServiceProvider provider = config.getServiceProvider(service); if (provider == null || provider.equals(service.getNullProvider())) { return Messages.ServiceConfigurationSelectionWidget_14; } return provider.getName(); } }); } } } /** * Notify all listeners of the selection. * * @param e event that was generated by the selection */ private void notifySelection(ISelection selection) { if (!selection.isEmpty()) { IStructuredSelection structuredSelection = (IStructuredSelection) selection; fSelectedConfig = (IServiceConfiguration) structuredSelection.getFirstElement(); } else { fSelectedConfig = null; } setSelection(selection); SelectionChangedEvent event = new SelectionChangedEvent(this, getSelection()); for (Object listener : fSelectionListeners.getListeners()) { ((ISelectionChangedListener) listener).selectionChanged(event); } } /** * Update buttons when something changes */ private void updateControls() { fTable.setEnabled(fEnabled); if (!fUseCheckboxes && fButtonsVisible) { fAddButton.setEnabled(fEnabled); boolean enabled = fEnabled && getSelectedConfiguration() != null; fRemoveButton.setEnabled(enabled); fRenameButton.setEnabled(enabled); } else if (fButtonsVisible) { fSelectAllButton.setEnabled(fEnabled); fDeselectAllButton.setEnabled(fEnabled); } } }