X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/dialogs/CheckedTreeSelectionDialog.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/dialogs/CheckedTreeSelectionDialog.java new file mode 100644 index 0000000..deb47fc --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/dialogs/CheckedTreeSelectionDialog.java @@ -0,0 +1,353 @@ +package net.sourceforge.phpdt.internal.ui.dialogs; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import net.sourceforge.phpdt.internal.ui.viewsupport.ContainerCheckedTreeViewer; + +import org.eclipse.core.runtime.IStatus; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.viewers.CheckStateChangedEvent; +import org.eclipse.jface.viewers.CheckboxTreeViewer; +import org.eclipse.jface.viewers.ICheckStateListener; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.ViewerFilter; +import org.eclipse.jface.viewers.ViewerSorter; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.BusyIndicator; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Tree; + +/** + * A class to select elements out of a tree structure. + */ +public class CheckedTreeSelectionDialog extends SelectionStatusDialog { + + private CheckboxTreeViewer fViewer; + + private ILabelProvider fLabelProvider; + + private ITreeContentProvider fContentProvider; + + private ISelectionValidator fValidator = null; + + private ViewerSorter fSorter; + + private String fEmptyListMessage = "No entries available"; + + private IStatus fCurrStatus = new StatusInfo(); + + private List fFilters; + + private Object fInput; + + private boolean fIsEmpty; + + private int fWidth = 60; + + private int fHeight = 18; + + private boolean fContainerMode; + + private Object[] fExpandedElements; + + /** + * Constructs an instance of ElementTreeSelectionDialog. + * + * @param labelProvider + * the label provider to render the entries + * @param contentProvider + * the content provider to evaluate the tree structure + */ + public CheckedTreeSelectionDialog(Shell parent, + ILabelProvider labelProvider, ITreeContentProvider contentProvider) { + super(parent); + + fLabelProvider = labelProvider; + fContentProvider = contentProvider; + + setResult(new ArrayList(0)); + setStatusLineAboveButtons(true); + + fContainerMode = false; + fExpandedElements = null; + + int shellStyle = getShellStyle(); + setShellStyle(shellStyle | SWT.MAX | SWT.RESIZE); + } + + /** + * If set, the checked /gray state of containers (inner nodes) is derived + * from the checked state of its leaf nodes. + * + * @param containerMode + * The containerMode to set + */ + public void setContainerMode(boolean containerMode) { + fContainerMode = containerMode; + } + + /** + * Sets the initial selection. Convenience method. + * + * @param selection + * the initial selection. + */ + public void setInitialSelection(Object selection) { + setInitialSelections(new Object[] { selection }); + } + + /** + * Sets the message to be displayed if the list is empty. + * + * @param message + * the message to be displayed. + */ + public void setEmptyListMessage(String message) { + fEmptyListMessage = message; + } + + /** + * Sets the sorter used by the tree viewer. + */ + public void setSorter(ViewerSorter sorter) { + fSorter = sorter; + } + + /** + * Adds a filter to the tree viewer. + * + * @param filter + * a filter. + */ + public void addFilter(ViewerFilter filter) { + if (fFilters == null) + fFilters = new ArrayList(4); + + fFilters.add(filter); + } + + /** + * Sets an optional validator to check if the selection is valid. The + * validator is invoked whenever the selection changes. + * + * @param validator + * the validator to validate the selection. + */ + public void setValidator(ISelectionValidator validator) { + fValidator = validator; + } + + /** + * Sets the tree input. + * + * @param input + * the tree input. + */ + public void setInput(Object input) { + fInput = input; + } + + /** + * Expands the tree + */ + public void setExpandedElements(Object[] elements) { + fExpandedElements = elements; + } + + /** + * Sets the size of the tree in unit of characters. + * + * @param width + * the width of the tree. + * @param height + * the height of the tree. + */ + public void setSize(int width, int height) { + fWidth = width; + fHeight = height; + } + + protected void updateOKStatus() { + if (!fIsEmpty) { + if (fValidator != null) { + fCurrStatus = fValidator.validate(fViewer.getCheckedElements()); + updateStatus(fCurrStatus); + } else if (!fCurrStatus.isOK()) { + fCurrStatus = new StatusInfo(); + } + } else { + fCurrStatus = new StatusInfo(IStatus.ERROR, fEmptyListMessage); + } + updateStatus(fCurrStatus); + } + + /* + * @see Window#open() + */ + public int open() { + fIsEmpty = evaluateIfTreeEmpty(fInput); + BusyIndicator.showWhile(null, new Runnable() { + public void run() { + access$superOpen(); + } + }); + + return getReturnCode(); + } + + private void access$superOpen() { + super.open(); + } + + /** + * Handles cancel button pressed event. + */ + protected void cancelPressed() { + setResult(null); + super.cancelPressed(); + } + + /* + * @see SelectionStatusDialog#computeResult() + */ + protected void computeResult() { + setResult(Arrays.asList(fViewer.getCheckedElements())); + } + + /* + * @see Window#create() + */ + public void create() { + super.create(); + + List initialSelections = getInitialElementSelections(); + if (initialSelections != null) { + fViewer.setCheckedElements(initialSelections.toArray()); + } + + if (fExpandedElements != null) { + fViewer.setExpandedElements(fExpandedElements); + } + + updateOKStatus(); + } + + /* + * @see Dialog#createDialogArea(Composite) + */ + protected Control createDialogArea(Composite parent) { + Composite composite = (Composite) super.createDialogArea(parent); + + Label messageLabel = createMessageArea(composite); + Control treeWidget = createTreeViewer(composite); + Control buttonComposite = createSelectionButtons(composite); + + GridData data = new GridData(GridData.FILL_BOTH); + data.widthHint = convertWidthInCharsToPixels(fWidth); + data.heightHint = convertHeightInCharsToPixels(fHeight); + treeWidget.setLayoutData(data); + + if (fIsEmpty) { + messageLabel.setEnabled(false); + treeWidget.setEnabled(false); + buttonComposite.setEnabled(false); + } + + return composite; + } + + private Tree createTreeViewer(Composite parent) { + if (fContainerMode) { + fViewer = new ContainerCheckedTreeViewer(parent, SWT.BORDER); + } else { + fViewer = new CheckboxTreeViewer(parent, SWT.BORDER); + } + + fViewer.setContentProvider(fContentProvider); + fViewer.setLabelProvider(fLabelProvider); + fViewer.addCheckStateListener(new ICheckStateListener() { + public void checkStateChanged(CheckStateChangedEvent event) { + updateOKStatus(); + } + }); + + fViewer.setSorter(fSorter); + if (fFilters != null) { + for (int i = 0; i != fFilters.size(); i++) + fViewer.addFilter((ViewerFilter) fFilters.get(i)); + } + + fViewer.setInput(fInput); + + return fViewer.getTree(); + } + + /** + * Add the selection and deselection buttons to the dialog. + * + * @param composite + * org.eclipse.swt.widgets.Composite + */ + private Composite createSelectionButtons(Composite composite) { + + Composite buttonComposite = new Composite(composite, SWT.RIGHT); + GridLayout layout = new GridLayout(); + layout.numColumns = 2; + buttonComposite.setLayout(layout); + GridData data = new GridData(GridData.HORIZONTAL_ALIGN_END + | GridData.GRAB_HORIZONTAL); + data.grabExcessHorizontalSpace = true; + composite.setData(data); + + Button selectButton = createButton(buttonComposite, + IDialogConstants.SELECT_ALL_ID, "Select &All", false); + + SelectionListener listener = new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + fViewer + .setCheckedElements(fContentProvider + .getElements(fInput)); + updateOKStatus(); + } + }; + selectButton.addSelectionListener(listener); + + Button deselectButton = createButton(buttonComposite, + IDialogConstants.DESELECT_ALL_ID, "&Deselect All", false); + + listener = new SelectionAdapter() { + public void widgetSelected(SelectionEvent e) { + fViewer.setCheckedElements(new Object[0]); + updateOKStatus(); + } + }; + deselectButton.addSelectionListener(listener); + return buttonComposite; + } + + private boolean evaluateIfTreeEmpty(Object input) { + Object[] elements = fContentProvider.getElements(input); + if (elements.length > 0) { + if (fFilters != null) { + for (int i = 0; i < fFilters.size(); i++) { + ViewerFilter curr = (ViewerFilter) fFilters.get(i); + elements = curr.filter(fViewer, input, elements); + } + } + } + return elements.length == 0; + } + +} \ No newline at end of file