/******************************************************************************* * Copyright (c) 2008-2010 Sonatype, Inc. * 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: * Sonatype, Inc. - initial API and implementation *******************************************************************************/ package org.eclipse.m2e.core.ui.internal.wizards; import java.util.ArrayList; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Path; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; 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.TreeItem; import org.eclipse.ui.dialogs.FilteredTree; import org.eclipse.ui.dialogs.PatternFilter; import org.eclipse.ui.model.WorkbenchLabelProvider; import org.eclipse.m2e.core.internal.IMavenConstants; import org.eclipse.m2e.core.ui.internal.Messages; import org.eclipse.m2e.core.ui.internal.dialogs.AbstractMavenDialog; /** * A simple dialog allowing the selection of Maven projects and subfolders containing POMs. */ public class MavenProjectSelectionDialog extends AbstractMavenDialog { private static final Logger log = LoggerFactory.getLogger(MavenProjectSelectionDialog.class); protected static final String DIALOG_SETTINGS = MavenProjectSelectionDialog.class.getName(); protected static final long SEARCH_DELAY = 500L; //in milliseconds private FilteredTree filteredTree; private boolean useCheckboxTree; /** Creates a dialog instance. */ public MavenProjectSelectionDialog(Shell parent, boolean useCheckboxTree) { this(parent); this.useCheckboxTree = useCheckboxTree; } /** Creates a dialog instance. */ public MavenProjectSelectionDialog(Shell parent) { super(parent, DIALOG_SETTINGS); setShellStyle(getShellStyle() | SWT.RESIZE); setTitle(Messages.projectSelectionDialogTitle); } /** Produces the result of the selection. */ protected void computeResult() { if(useCheckboxTree) { List<Object> result = new ArrayList<Object>(); collectCheckedItems(getViewer().getTree().getItems(), result); setResult(result); } else { setResult(((IStructuredSelection) getViewer().getSelection()).toList()); } } private void collectCheckedItems(TreeItem[] items, List<Object> list) { for(TreeItem item : items) { if(item.getChecked()) { Object data = item.getData(); if(data != null) { list.add(data); } } collectCheckedItems(item.getItems(), list); } } /** Creates the dialog controls. */ protected Control createDialogArea(Composite parent) { readSettings(); Composite composite = (Composite) super.createDialogArea(parent); filteredTree = new FilteredTree(composite, SWT.BORDER | (useCheckboxTree ? SWT.CHECK : 0), new PatternFilter(), true); filteredTree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); getViewer().setContentProvider(new MavenContainerContentProvider()); getViewer().setLabelProvider(WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider()); getViewer().setInput(ResourcesPlugin.getWorkspace()); getViewer().addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { okPressed(); } }); return composite; } protected void okPressed() { super.okPressed(); } protected TreeViewer getViewer() { return filteredTree.getViewer(); } /** The content provider class. */ protected static class MavenContainerContentProvider implements ITreeContentProvider { /** Returns the children of the parent node. */ public Object[] getChildren(Object parent) { if(parent instanceof IWorkspace) { IProject[] projects = ((IWorkspace) parent).getRoot().getProjects(); List<IProject> children = new ArrayList<IProject>(); for(IProject project : projects) { try { if(project.isOpen() && project.hasNature(IMavenConstants.NATURE_ID)) { children.add(project); } } catch(CoreException e) { log.error("Error checking project: " + e.getMessage(), e); } } return children.toArray(); } else if(parent instanceof IContainer) { IContainer container = (IContainer) parent; if(container.isAccessible()) { try { List<IResource> children = new ArrayList<IResource>(); IResource[] members = container.members(); for(int i = 0; i < members.length; i++ ) { if(members[i] instanceof IContainer && ((IContainer) members[i]).exists(new Path(IMavenConstants.POM_FILE_NAME))) { children.add(members[i]); } } return children.toArray(); } catch(CoreException e) { log.error("Error checking container: " + e.getMessage(), e); } } } return new Object[0]; } /** Returns the parent of the given element. */ public Object getParent(Object element) { if(element instanceof IResource) { return ((IResource) element).getParent(); } return null; } /** Returns true if the element has any children. */ public boolean hasChildren(Object element) { return getChildren(element).length > 0; } /** Disposes of any resources used. */ public void dispose() { } /** Handles the input change. */ public void inputChanged(Viewer viewer, Object arg1, Object arg2) { } /** Returns the elements of the given root. */ public Object[] getElements(Object element) { return getChildren(element); } } }