package org.testng.eclipse.ui.util; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import org.eclipse.core.runtime.IStatus; import org.eclipse.jdt.internal.ui.dialogs.StatusInfo; 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.StructuredSelection; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Tree; import org.eclipse.ui.dialogs.SelectionStatusDialog; /** * Class usage XXX * * @version $Revision$ */ public class FolderSelectionDialog extends SelectionStatusDialog { protected CheckboxTreeViewer m_viewer; protected ILabelProvider m_labelProvider; protected ITreeContentProvider m_contentProvider; protected Object m_rootInput; protected Set m_selection; protected List m_filters; protected Object m_focusedElement; public FolderSelectionDialog( Shell parentShell, ILabelProvider labelProvider, ITreeContentProvider contentProvider) { super(parentShell); m_labelProvider = labelProvider; m_contentProvider = contentProvider; setSelectionResult(null); setStatusLineAboveButtons(true); setShellStyle(getShellStyle() | SWT.MAX | SWT.RESIZE); m_filters = null; m_focusedElement = null; } /** * Sets the tree input. * @param input the tree input. */ public void setInput(Object input) { m_rootInput = input; } /** * @see org.eclipse.ui.dialogs.SelectionDialog#setInitialSelections(java.lang.Object[]) */ public void setInitialSelections(Object[] selectedElements) { super.setInitialSelections(selectedElements); m_selection = new HashSet(); for(int i = 0; i < selectedElements.length; i++) { m_selection.add(selectedElements[i]); } } /** * Adds a filter to the tree viewer. * @param filter a filter. */ public void addFilter(ViewerFilter filter) { if(null == m_filters) { m_filters = new ArrayList(4); } m_filters.add(filter); } /** * Handles cancel button pressed event. */ protected void cancelPressed() { setSelectionResult(null); super.cancelPressed(); } private void access$superCreate() { super.create(); } /** * @see Window#create() */ public void create() { BusyIndicator.showWhile(null, new Runnable() { public void run() { access$superCreate(); List initialSelection = getInitialElementSelections(); m_viewer.setCheckedElements(initialSelection.toArray()); m_viewer.expandToLevel(2); if(null != initialSelection) { for(Iterator iter = initialSelection.iterator(); iter.hasNext();) { m_viewer.reveal(iter.next()); } } updateOKStatus(); } }); } protected void updateOKStatus() { computeResult(); if(null != getResult()) { updateStatus(new StatusInfo()); } else { updateStatus(new StatusInfo(IStatus.ERROR, "")); //$NON-NLS-1$ } } /** * Creates the tree viewer. * * @param parent the parent composite * @return the tree viewer */ protected CheckboxTreeViewer createTreeViewer(Composite parent) { m_viewer = new CheckboxTreeViewer(parent, SWT.BORDER); m_viewer.setContentProvider(m_contentProvider); m_viewer.setLabelProvider(m_labelProvider); // m_viewer.setSorter(new ResourceSorter(ResourceSorter.NAME)); if(null != m_filters) { for(int i = 0; i != m_filters.size(); i++) m_viewer.addFilter((ViewerFilter) m_filters.get(i)); } m_viewer.setInput(m_rootInput); return m_viewer; } /** * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) */ protected Control createDialogArea(Composite parent) { Composite composite = (Composite) super.createDialogArea(parent); createMessageArea(composite); final CheckboxTreeViewer treeViewer = createTreeViewer(composite); GridData data = new GridData(GridData.FILL_BOTH); data.widthHint = convertWidthInCharsToPixels(60); data.heightHint = convertHeightInCharsToPixels(18); Tree treeWidget = treeViewer.getTree(); treeWidget.setLayoutData(data); treeWidget.setFont(composite.getFont()); if(null != m_selection) { for(Iterator iter = m_selection.iterator(); iter.hasNext();) { treeViewer.setSubtreeChecked(iter.next(), true); } } if(null != m_focusedElement) { treeViewer.setSelection(new StructuredSelection(m_focusedElement), true); } treeViewer.addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { Object element = event.getElement(); boolean add = event.getChecked(); if(add) { m_selection.add(element); } else { m_selection.remove(element); } treeViewer.setSubtreeChecked(element, add); updateOKStatus(); } }); applyDialogFont(composite); return composite; } /** * @see org.eclipse.ui.dialogs.SelectionStatusDialog#computeResult() */ protected void computeResult() { setSelectionResult(m_selection.toArray()); } public void setInitialFocus(Object focusElement) { m_focusedElement = focusElement; } }