/** * GRANITE DATA SERVICES * Copyright (C) 2006-2013 GRANITE DATA SERVICES S.A.S. * * This file is part of the Granite Data Services Platform. * * Granite Data Services is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * Granite Data Services is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser * General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA, or see <http://www.gnu.org/licenses/>. */ package org.granite.builder.ui; 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.core.resources.IContainer; 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.layout.GridData; import org.eclipse.swt.widgets.Button; 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.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.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.window.Window; import org.eclipse.ui.dialogs.NewFolderDialog; import org.eclipse.ui.dialogs.SelectionStatusDialog; import org.eclipse.ui.views.navigator.ResourceComparator; import org.eclipse.jdt.internal.ui.dialogs.StatusInfo; import org.eclipse.jdt.internal.ui.wizards.NewWizardMessages; /** * Add an option to enable/disable the new folder button. * @author Franck WOLFF (Granite Data Services) */ @SuppressWarnings("all") public class MultipleFolderSelectionDialog extends SelectionStatusDialog implements ISelectionChangedListener { private CheckboxTreeViewer fViewer; private ILabelProvider fLabelProvider; private ITreeContentProvider fContentProvider; private List fFilters; private Object fInput; private Button fNewFolderButton; private IContainer fSelectedContainer; private Set fExisting; private Object fFocusElement; private boolean enableNewFolder = true; public MultipleFolderSelectionDialog(Shell parent, ILabelProvider labelProvider, ITreeContentProvider contentProvider) { this(parent, labelProvider, contentProvider, true); } public MultipleFolderSelectionDialog(Shell parent, ILabelProvider labelProvider, ITreeContentProvider contentProvider, boolean enableNewFolder) { super(parent); fLabelProvider= labelProvider; fContentProvider= contentProvider; setSelectionResult(null); setStatusLineAboveButtons(true); int shellStyle = getShellStyle(); setShellStyle(shellStyle | SWT.MAX | SWT.RESIZE); fExisting= null; fFocusElement= null; fFilters= null; this.enableNewFolder = enableNewFolder; } public void setExisting(Object[] existing) { fExisting= new HashSet(); for (int i= 0; i < existing.length; i++) { fExisting.add(existing[i]); } } /** * Sets the tree input. * @param input the tree input. */ public void setInput(Object input) { fInput = input; } /** * 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); } /** * Handles cancel button pressed event. */ protected void cancelPressed() { setSelectionResult(null); super.cancelPressed(); } /* * @see SelectionStatusDialog#computeResult() */ protected void computeResult() { Object[] checked= fViewer.getCheckedElements(); if (fExisting == null) { if (checked.length == 0) { checked= null; } } else { ArrayList res= new ArrayList(); for (int i= 0; i < checked.length; i++) { Object elem= checked[i]; if (!fExisting.contains(elem)) { res.add(elem); } } if (!res.isEmpty()) { checked= res.toArray(); } else { checked= null; } } setSelectionResult(checked); } private void access$superCreate() { super.create(); } /* * @see Window#create() */ public void create() { BusyIndicator.showWhile(null, new Runnable() { public void run() { access$superCreate(); fViewer.setCheckedElements( getInitialElementSelections().toArray()); fViewer.expandToLevel(2); if (fExisting != null) { for (Iterator iter= fExisting.iterator(); iter.hasNext();) { fViewer.reveal(iter.next()); } } updateOKStatus(); } }); } /** * Creates the tree viewer. * * @param parent the parent composite * @return the tree viewer */ protected CheckboxTreeViewer createTreeViewer(Composite parent) { fViewer = new CheckboxTreeViewer(parent, SWT.BORDER); fViewer.setContentProvider(fContentProvider); fViewer.setLabelProvider(fLabelProvider); fViewer.addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { updateOKStatus(); } }); fViewer.setComparator(new ResourceComparator(ResourceComparator.NAME)); if (fFilters != null) { for (int i = 0; i != fFilters.size(); i++) fViewer.addFilter((ViewerFilter) fFilters.get(i)); } fViewer.setInput(fInput); return fViewer; } /** * */ protected void updateOKStatus() { computeResult(); if (getResult() != null) { updateStatus(new StatusInfo()); } else { updateStatus(new StatusInfo(IStatus.ERROR, "")); //$NON-NLS-1$ } } /* (non-Javadoc) * @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); 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 (enableNewFolder) { Button button = new Button(composite, SWT.PUSH); button.setText(NewWizardMessages.MultipleFolderSelectionDialog_button); button.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { newFolderButtonPressed(); } }); button.setFont(composite.getFont()); fNewFolderButton= button; } treeViewer.addSelectionChangedListener(this); if (fExisting != null) { Object[] existing= fExisting.toArray(); treeViewer.setGrayedElements(existing); setInitialSelections(existing); } if (fFocusElement != null) { treeViewer.setSelection(new StructuredSelection(fFocusElement), true); } treeViewer.addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { forceExistingChecked(event); } }); applyDialogFont(composite); return composite; } protected void forceExistingChecked(CheckStateChangedEvent event) { if (fExisting != null) { Object elem= event.getElement(); if (fExisting.contains(elem)) { fViewer.setChecked(elem, true); } } } private void updateNewFolderButtonState() { if (enableNewFolder) { IStructuredSelection selection= (IStructuredSelection) fViewer.getSelection(); fSelectedContainer= null; if (selection.size() == 1) { Object first= selection.getFirstElement(); if (first instanceof IContainer) { fSelectedContainer= (IContainer) first; } } fNewFolderButton.setEnabled(fSelectedContainer != null); } } protected void newFolderButtonPressed() { Object createdFolder= createFolder(fSelectedContainer); if (createdFolder != null) { CheckboxTreeViewer treeViewer= fViewer; treeViewer.refresh(fSelectedContainer); treeViewer.reveal(createdFolder); treeViewer.setChecked(createdFolder, true); treeViewer.setSelection(new StructuredSelection(createdFolder)); updateOKStatus(); } } protected Object createFolder(IContainer container) { NewFolderDialog dialog= new NewFolderDialog(getShell(), container); if (dialog.open() == Window.OK) { return dialog.getResult()[0]; } return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) */ public void selectionChanged(SelectionChangedEvent event) { updateNewFolderButtonState(); } public void setInitialFocus(Object focusElement) { fFocusElement= focusElement; } }