1) Moved net.sourceforge.phpeclipse.ui\src\net\sourceforge\phpdt back to net.sourcefo...
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / ui / dialogs / CheckedTreeSelectionDialog.java
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 (file)
index 0000000..deb47fc
--- /dev/null
@@ -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 <code>ElementTreeSelectionDialog</code>.
+        * 
+        * @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