/******************************************************************************* * Copyright (c) 2009 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 * Zend Technologies *******************************************************************************/ package org.eclipse.php.internal.debug.ui.launching; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.*; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.ControlListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; /** * Dialog for selecting a file in the workspace. Derived from * org.eclipse.ui.dialogs.ResourceSelectionDialog */ public class FileSelectionDialog extends MessageDialog { // the root element to populate the viewer with private IAdaptable root; // the visual selection widget group private TreeAndListGroup selectionGroup; // constants private final static int SIZING_SELECTION_WIDGET_WIDTH = 400; private final static int SIZING_SELECTION_WIDGET_HEIGHT = 300; /** * The file(s) selected by the user. */ private IStructuredSelection result = null; private boolean allowMultiselection = false; private Pattern fPattern; /** * Creates a resource selection dialog rooted at the given element. * * @param parentShell * the parent shell * @param rootElement * the root element to populate this dialog with * @param message * the message to be displayed at the top of this dialog, or * <code>null</code> to display a default message */ public FileSelectionDialog(Shell parentShell, IAdaptable rootElement, String message) { super(parentShell, Messages.FileSelectionDialog_0, null, message, MessageDialog.NONE, new String[] { Messages.FileSelectionDialog_1, Messages.FileSelectionDialog_2 }, 0); root = rootElement; setShellStyle(getShellStyle() | SWT.RESIZE); } /** * Limits the files displayed in this dialog to files matching the given * pattern. The string can be a filename or a regular expression containing * '*' for any series of characters or '?' for any single character. * * @param pattern * a pattern used to filter the displayed files or * <code>null</code> to display all files. If a pattern is * supplied, only files whose names match the given pattern will * be available for selection. * @param ignoreCase * if true, case is ignored. If the pattern argument is * <code>null</code>, this argument is ignored. */ public void setFileFilter(String pattern, boolean ignoreCase) { if (pattern != null) { if (ignoreCase) { fPattern = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE); } else { fPattern = Pattern.compile(pattern); } } else { fPattern = null; } } /* * (non-Javadoc) Method declared in Window. */ protected void configureShell(Shell shell) { super.configureShell(shell); // PlatformUI.getWorkbench().getHelpSystem().setHelp(shell, // IExternalToolsHelpContextIds.FILE_SELECTION_DIALOG); } protected void createButtonsForButtonBar(Composite parent) { super.createButtonsForButtonBar(parent); initializeDialog(); } /* * (non-Javadoc) Method declared on Dialog. */ protected Control createDialogArea(Composite parent) { // page group Composite composite = (Composite) super.createDialogArea(parent); // create the input element, which has the root resource // as its only child selectionGroup = new TreeAndListGroup(composite, root, getResourceProvider(IResource.FOLDER | IResource.PROJECT | IResource.ROOT), new WorkbenchLabelProvider(), getResourceProvider(IResource.FILE), new WorkbenchLabelProvider(), SWT.NONE, // since this page has no other significantly-sized // widgets we need to hardcode the combined widget's // size, otherwise it will open too small SIZING_SELECTION_WIDGET_WIDTH, SIZING_SELECTION_WIDGET_HEIGHT, allowMultiselection); composite.addControlListener(new ControlListener() { public void controlMoved(ControlEvent e) { } public void controlResized(ControlEvent e) { // Also try and reset the size of the columns as appropriate TableColumn[] columns = selectionGroup.getListTable().getColumns(); for (int i = 0; i < columns.length; i++) { columns[i].pack(); } } }); return composite; } /** * Returns a content provider for <code>IResource</code> s that returns only * children of the given resource type. */ private ITreeContentProvider getResourceProvider(final int resourceType) { return new WorkbenchContentProvider() { public Object[] getChildren(Object o) { if (o instanceof IContainer) { IResource[] members = null; try { members = ((IContainer) o).members(); List accessibleMembers = new ArrayList(members.length); for (int i = 0; i < members.length; i++) { IResource resource = members[i]; if (resource.isAccessible()) { accessibleMembers.add(resource); } } members = (IResource[]) accessibleMembers.toArray(new IResource[accessibleMembers.size()]); } catch (CoreException e) { // just return an empty set of children return new Object[0]; } // filter out the desired resource types ArrayList results = new ArrayList(); for (int i = 0; i < members.length; i++) { // And the test bits with the resource types to see if // they are what we want if ((members[i].getType() & resourceType) > 0) { if (members[i].getType() == IResource.FILE && fPattern != null && !fPattern.matcher(members[i].getName()).find()) { continue; } results.add(members[i]); } } return results.toArray(); } return new Object[0]; } }; } /** * Initializes this dialog's controls. */ private void initializeDialog() { selectionGroup.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { getButton(IDialogConstants.OK_ID).setEnabled(!selectionGroup.getListTableSelection().isEmpty()); } }); selectionGroup.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { buttonPressed(IDialogConstants.OK_ID); } }); getButton(IDialogConstants.OK_ID).setEnabled(false); } /** * Returns the file the user chose or <code>null</code> if none. */ public IStructuredSelection getResult() { return result; } protected void buttonPressed(int buttonId) { if (buttonId == IDialogConstants.OK_ID) { result = selectionGroup.getListTableSelection(); } super.buttonPressed(buttonId); } /** * Sets whether this dialog will allow multi-selection. Must be called * before <code>open</code> * * @param allowMultiselection * whether to allow multi-selection in the dialog */ public void setAllowMultiselection(boolean allowMultiselection) { this.allowMultiselection = allowMultiselection; } }