| /******************************************************************************* |
| * Copyright (c) 2000, 2005 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.jst.ws.internal.ui.dialog; |
| |
| import java.util.Iterator; |
| |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.jface.dialogs.Dialog; |
| import org.eclipse.jface.viewers.DecoratingLabelProvider; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.ISelectionChangedListener; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.SelectionChangedEvent; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.jface.viewers.TreeViewer; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.jface.viewers.ViewerFilter; |
| import org.eclipse.jst.ws.internal.common.AnyFilter; |
| import org.eclipse.jst.ws.internal.common.Filter; |
| import org.eclipse.jst.ws.internal.common.ResourceUtils; |
| import org.eclipse.jst.ws.internal.ui.WSUIPluginMessages; |
| import org.eclipse.jst.ws.internal.ui.plugin.WebServiceUIPlugin; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Combo; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.swt.widgets.Event; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Listener; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.swt.widgets.Tree; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.model.WorkbenchContentProvider; |
| import org.eclipse.ui.model.WorkbenchLabelProvider; |
| |
| |
| /** |
| * This class provides a dialog for browsing workspace resources. |
| * See also {@link DialogUtils#browseResources}. |
| */ |
| public class ResourceSelectionDialog extends Dialog implements Listener |
| { |
| |
| // Dialog controls. |
| // |
| private Label filterLabel_; |
| private Combo filterCombo_; |
| /*CONTEXT_ID DRES0001 for the Resource Type combo box of the Resource Selection Dialog*/ |
| private static final String INFOPOP_DRES_COMBO_RESOURCE_TYPE = WebServiceUIPlugin.ID + ".DRES0001"; |
| |
| private Tree resourceTree_; |
| private TreeViewer fileViewer_; |
| /*CONTEXT_ID DRES0002 for the Resource tree of the Resource Selection Dialog*/ |
| private static final String INFOPOP_DRES_TREE_RESOURCE = WebServiceUIPlugin.ID + ".DRES0002"; |
| |
| // |
| // Essential goodies. |
| // |
| private IResource root_; |
| private IResource initialSelection_; |
| private Filter[] filters_; |
| private Filter currentFilter_; |
| private IResource[] selection_; |
| private boolean multipleSelectionEnabled_; |
| |
| /** |
| * Constructs a new <code>ResourceSelectionDialog</code> |
| * under the given <code>parent Shell</code>. |
| * The dialog renders all resources including and |
| * under the given <code>root IResource</code>. |
| * @param parent The parent {@link org.eclipse.swt.widgets.Shell}, |
| * or null to create a top-level shell. |
| * @param root The root {@link org.eclipse.core.resources.IResource}, |
| * or null to begin with the workspace root. |
| * @param initialSelection The initially selected object or null if none. |
| */ |
| public ResourceSelectionDialog ( Shell parent, IResource root, IResource initialSelection ) |
| { |
| this(parent,root,initialSelection,new Filter[] {new AnyFilter()}); |
| } |
| |
| /** |
| * Constructs a new <code>ResourceSelectionDialog</code> |
| * under the given <code>parent Shell</code>. |
| * The dialog renders all resources including and |
| * under the given <code>root IResource</code> that |
| * are accepted by the given filter. |
| * See {@link org.eclipse.jst.ws.internal.common.Filter#accepts}. |
| * @param parent The parent {@link org.eclipse.swt.widgets.Shell}, |
| * or null to create a top-level shell. |
| * @param root The root {@link org.eclipse.core.resources.IResource}, |
| * or null to begin with the workspace root. |
| * @param initialSelection The initially selected object or null if none. |
| * @param filter The {@link org.eclipse.jst.ws.internal.common.Filter}, |
| * or null to default to all resources under the <code>root</code>. |
| */ |
| public ResourceSelectionDialog ( Shell parent, IResource root, IResource initialSelection, Filter filter ) |
| { |
| this(parent,root,initialSelection,new Filter[] {filter}); |
| } |
| |
| /** |
| * Constructs a new <code>ResourceSelectionDialog</code> |
| * under the given <code>parent Shell</code>. |
| * The dialog renders all resources including and |
| * under the given <code>root IResource</code> that |
| * are accepted by the given filters. |
| * See {@link org.eclipse.jst.ws.internal.common.Filter#accepts}. |
| * @param parent The parent {@link org.eclipse.swt.widgets.Shell}. |
| * or null to create a top-level shell. |
| * @param root The root {@link org.eclipse.core.resources.IResource}, |
| * or null to begin with the workspace root. |
| * @param initialSelection The initially selected object or null if none. |
| * @param filters An array of {@link org.eclipse.jst.ws.internal.common.Filter} |
| * objects. |
| * If the array is null or of length zero, then all resources are accepted |
| * (ie. equivalent to <code>ResourceSelectionDialog(parent,root)</code>. |
| * If the array is of length one, then the dialog will consist of a single |
| * control showing a list of all filtered resources. |
| * If the array is of length greater than one, then the dialog will |
| * consist of a combo box containing the names of the filters and with the |
| * first filter (ie. <code>filters[0]</code>) selected by default, followed |
| * by a control showing a list of all resources filtered by the selected filter. |
| */ |
| public ResourceSelectionDialog ( Shell parent, IResource root, IResource initialSelection, Filter[] filters ) |
| { |
| super(parent); |
| root_ = root == null ? ResourceUtils.getWorkspaceRoot() : root; |
| initialSelection_ = initialSelection; |
| filters_ = (filters == null || filters.length == 0) ? new Filter[] {new AnyFilter()} : filters; |
| currentFilter_ = filters_[0]; |
| multipleSelectionEnabled_ = false; |
| setShellStyle(SWT.DIALOG_TRIM | SWT.RESIZE | SWT.APPLICATION_MODAL); |
| } |
| |
| /** |
| * Enables or disables multiple selection in the tree view. |
| * Multiple selection is disabled by default. |
| * @param multipleSelectionEnabled True to enabled or false to disable. |
| */ |
| public void setMultipleSelectionEnabled ( boolean multipleSelectionEnabled ) |
| { |
| multipleSelectionEnabled_ = multipleSelectionEnabled; |
| } |
| |
| /** |
| * Returns the selections made in the dialog if OK was pressed, |
| * or null if Cancel was pressed. Returns null if the dialog |
| * has never been opened. |
| * @return An array of selected resources, possibly empty, possibly null. |
| */ |
| public IResource[] getResult () |
| { |
| return selection_; |
| } |
| |
| /** |
| * Called when the Cancel button is pressed. |
| * Insures that {@link #getResult} will return null. |
| */ |
| protected void cancelPressed () |
| { |
| selection_ = null; |
| setReturnCode(Dialog.CANCEL); |
| super.cancelPressed(); |
| } |
| |
| /** |
| * Called when the OK button is pressed. |
| * Squirrels away the list of zero or more selected |
| * <code>IResource</code>s to be returned by {@link #getResult}. |
| */ |
| protected void okPressed () |
| { |
| ISelection selection = fileViewer_.getSelection(); |
| if (selection instanceof IStructuredSelection) |
| { |
| IStructuredSelection structuredSelection = (IStructuredSelection)selection; |
| selection_ = new IResource[structuredSelection.size()]; |
| int i=0; |
| Iterator iter = structuredSelection.iterator(); |
| while (iter.hasNext()) |
| { |
| Object object = iter.next(); |
| if (object instanceof IResource) |
| { |
| selection_[i++] = (IResource)object; |
| } |
| } |
| } |
| setReturnCode(Dialog.OK); |
| super.okPressed(); |
| } |
| |
| /** |
| * See {@link org.eclipse.jface.window.Window#configureShell}. |
| * @param shell The shell. |
| */ |
| protected void configureShell ( Shell shell ) |
| { |
| super.configureShell(shell); |
| shell.setText(WSUIPluginMessages.DIALOG_TITLE_RESOURCE_BROWSE); |
| } |
| |
| /** |
| * Creates the dialog area. |
| * @param parent The parent composite. |
| * @return The control area. |
| */ |
| protected Control createDialogArea ( Composite parent ) |
| { |
| GridLayout gl; |
| GridData gd; |
| |
| Composite composite = (Composite)super.createDialogArea(parent); |
| gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_VERTICAL); |
| gd.widthHint = 400; |
| gd.heightHint = 300; |
| gd.grabExcessVerticalSpace = true; |
| gd.grabExcessHorizontalSpace = true; |
| composite.setLayoutData(gd); |
| |
| if (filters_.length > 1) |
| { |
| Composite f = new Composite(composite,SWT.NONE); |
| gl = new GridLayout(); |
| gl.numColumns = 2; |
| gl.marginHeight = 0; |
| gl.marginWidth = 0; |
| f.setLayout(gl); |
| gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL); |
| f.setLayoutData(gd); |
| |
| filterLabel_ = new Label(f,SWT.WRAP); |
| filterLabel_.setText(WSUIPluginMessages.LABEL_RESOURCE_FILTER); |
| filterLabel_.setToolTipText(WSUIPluginMessages.TOOLTIP_DRES_COMBO_RESOURCE_TYPE); |
| |
| filterCombo_ = new Combo(f,SWT.DROP_DOWN | SWT.READ_ONLY); |
| gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL); |
| filterCombo_.setLayoutData(gd); |
| filterCombo_.addListener(SWT.Selection,this); |
| filterCombo_.setToolTipText(WSUIPluginMessages.TOOLTIP_DRES_COMBO_RESOURCE_TYPE); |
| PlatformUI.getWorkbench().getHelpSystem().setHelp(filterCombo_,INFOPOP_DRES_COMBO_RESOURCE_TYPE); |
| } |
| |
| if (multipleSelectionEnabled_) |
| { |
| resourceTree_ = new Tree(composite,SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); |
| } |
| else |
| { |
| resourceTree_ = new Tree(composite,SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); |
| } |
| gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_VERTICAL); |
| gd.grabExcessVerticalSpace = true; |
| gd.grabExcessHorizontalSpace = true; |
| resourceTree_.setLayoutData(gd); |
| // resourceTree_.addListener(SWT.Selection,this); |
| resourceTree_.setToolTipText(WSUIPluginMessages.TOOLTIP_DRES_TREE_RESOURCE); |
| PlatformUI.getWorkbench().getHelpSystem().setHelp(resourceTree_,INFOPOP_DRES_TREE_RESOURCE); |
| |
| fileViewer_ = new TreeViewer(resourceTree_); |
| fileViewer_.setContentProvider(new WorkbenchContentProvider()); |
| fileViewer_.setLabelProvider( |
| new DecoratingLabelProvider( |
| new WorkbenchLabelProvider(), |
| WebServiceUIPlugin.getInstance().getWorkbench().getDecoratorManager().getLabelDecorator())); |
| fileViewer_.addFilter( |
| new ViewerFilter () |
| { |
| public boolean select ( Viewer viewer, Object parentObject, Object object ) |
| { |
| return |
| ( |
| ((object instanceof IResource) && ((IResource)object).getType() != IResource.FILE) |
| || (ResourceSelectionDialog.this.currentFilter_.accepts(object)) |
| ); |
| } |
| } |
| ); |
| fileViewer_.setInput(root_); |
| fileViewer_.addSelectionChangedListener( |
| new ISelectionChangedListener () |
| { |
| public void selectionChanged ( SelectionChangedEvent event ) |
| { |
| // ResourceSelectionDialog.this.validatePageToStatus(); |
| } |
| } |
| ); |
| if (initialSelection_ != null) |
| { |
| fileViewer_.setSelection(new StructuredSelection(ResourceSelectionDialog.this.initialSelection_),true); |
| } |
| |
| return composite; |
| } |
| |
| /** |
| * Called when an event occurs on the page. |
| * Handles the event and revalidates the page. |
| * @param event The event that occured. |
| */ |
| public void handleEvent ( Event event ) |
| { |
| // validatePageToStatus(); |
| } |
| } |