blob: 85659a6f160f38e19271c3ced9da94339abdece4 [file] [log] [blame]
/*******************************************************************************
* 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.dialogs;
import java.util.ArrayList;
import java.util.Iterator;
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.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
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.internal.ide.IDEWorkbenchMessages;
import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
import org.eclipse.ui.internal.ide.misc.CheckboxTreeAndListGroup;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
/**
* A standard resource selection dialog which solicits a list of resources from
* the user. The <code>getResult</code> method returns the selected resources.
* <p>
* This class may be instantiated; it is not intended to be subclassed.
* </p>
* <p>
* Example:
* <pre>
* ResourceSelectionDialog dialog =
* new ResourceSelectionDialog(getShell(), rootResource, msg);
* dialog.setInitialSelections(selectedResources));
* dialog.open();
* return dialog.getResult();
* </pre>
* </p>
*/
public class ResourceSelectionDialog extends SelectionDialog {
// the root element to populate the viewer with
private IAdaptable root;
// the visual selection widget group
private CheckboxTreeAndListGroup selectionGroup;
// constants
private final static int SIZING_SELECTION_WIDGET_WIDTH = 400;
private final static int SIZING_SELECTION_WIDGET_HEIGHT = 300;
/**
* 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 ResourceSelectionDialog(Shell parentShell, IAdaptable rootElement,
String message) {
super(parentShell);
setTitle(IDEWorkbenchMessages.ResourceSelectionDialog_title);
root = rootElement;
if (message != null)
setMessage(message);
else
setMessage(IDEWorkbenchMessages.ResourceSelectionDialog_message);
setShellStyle(getShellStyle() | SWT.RESIZE);
}
/**
* Visually checks the previously-specified elements in the container (left)
* portion of this dialog's resource selection viewer.
*/
private void checkInitialSelections() {
Iterator itemsToCheck = getInitialElementSelections().iterator();
while (itemsToCheck.hasNext()) {
IResource currentElement = (IResource) itemsToCheck.next();
if (currentElement.getType() == IResource.FILE)
selectionGroup.initialCheckListItem(currentElement);
else
selectionGroup.initialCheckTreeItem(currentElement);
}
}
/**
* @param event the event
*/
public void checkStateChanged(CheckStateChangedEvent event) {
getOkButton().setEnabled(selectionGroup.getCheckedElementCount() > 0);
}
/* (non-Javadoc)
* Method declared in Window.
*/
protected void configureShell(Shell shell) {
super.configureShell(shell);
PlatformUI.getWorkbench().getHelpSystem().setHelp(shell,
IIDEHelpContextIds.RESOURCE_SELECTION_DIALOG);
}
public void create() {
super.create();
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
ArrayList input = new ArrayList();
input.add(root);
createMessageArea(composite);
selectionGroup = new CheckboxTreeAndListGroup(composite, input,
getResourceProvider(IResource.FOLDER | IResource.PROJECT
| IResource.ROOT), WorkbenchLabelProvider
.getDecoratingWorkbenchLabelProvider(),
getResourceProvider(IResource.FILE), WorkbenchLabelProvider
.getDecoratingWorkbenchLabelProvider(), 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);
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();
} 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) {
results.add(members[i]);
}
}
return results.toArray();
}
//input element case
if (o instanceof ArrayList) {
return ((ArrayList) o).toArray();
}
return new Object[0];
}
};
}
/**
* Initializes this dialog's controls.
*/
private void initializeDialog() {
selectionGroup.addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
getOkButton().setEnabled(
selectionGroup.getCheckedElementCount() > 0);
}
});
if (getInitialElementSelections().isEmpty())
getOkButton().setEnabled(false);
else
checkInitialSelections();
}
/**
* The <code>ResourceSelectionDialog</code> implementation of this
* <code>Dialog</code> method builds a list of the selected resources for later
* retrieval by the client and closes this dialog.
*/
protected void okPressed() {
Iterator resultEnum = selectionGroup.getAllCheckedListItems();
ArrayList list = new ArrayList();
while (resultEnum.hasNext())
list.add(resultEnum.next());
setResult(list);
super.okPressed();
}
}