/******************************************************************************* * 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.ui.externaltools.internal.ui; 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.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; 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.PlatformUI; import org.eclipse.ui.externaltools.internal.model.IExternalToolsHelpContextIds; 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 * null to display a default message */ public FileSelectionDialog(Shell parentShell, IAdaptable rootElement, String message) { super(parentShell, ExternalToolsUIMessages.FileSelectionDialog_Choose_Location_1, null, message, MessageDialog.NONE, new String[] { ExternalToolsUIMessages.FileSelectionDialog_Ok_2, ExternalToolsUIMessages.FileSelectionDialog_Cancel_3}, 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 null * 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 null, * 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 IResource 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 null 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 open * @param allowMultiselection whether to allow multi-selection in the dialog */ public void setAllowMultiselection(boolean allowMultiselection) { this.allowMultiselection= allowMultiselection; } }