blob: d4100355b740ea8cf86fe6592ee10f5a57fa60ea [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-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 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.externaltools.internal.model.IExternalToolsHelpContextIds;
import org.eclipse.ui.externaltools.internal.model.StringMatcher;
import org.eclipse.ui.help.WorkbenchHelp;
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;
/**
* String matcher used to filter content
*/
private StringMatcher stringMatcher = null;
private boolean allowMultiselection= false;
/**
* 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, ExternalToolsUIMessages.getString("FileSelectionDialog.Choose_Location_1"), null, message, MessageDialog.NONE, new String[] { ExternalToolsUIMessages.getString("FileSelectionDialog.Ok_2"), ExternalToolsUIMessages.getString("FileSelectionDialog.Cancel_3")}, 0); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
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) {
stringMatcher = new StringMatcher(pattern, ignoreCase, false);
} else {
stringMatcher = null;
}
}
/*
* (non-Javadoc) Method declared in Window.
*/
protected void configureShell(Shell shell) {
super.configureShell(shell);
WorkbenchHelp.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
&& stringMatcher != null
&& !stringMatcher.match(members[i].getName())) {
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;
}
}