/**
Copyright (c) 2014 Olav Lenz.
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:
* Olav Lenz - initial API and implementation
*/
package org.eclipse.recommenders.internal.models.rcp;
import static org.eclipse.recommenders.rcp.SharedImages.Images.OBJ_JAR;
import java.util.Comparator;
import java.util.Set;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.recommenders.coordinates.DependencyInfo;
import org.eclipse.recommenders.coordinates.IDependencyListener;
import org.eclipse.recommenders.coordinates.ProjectCoordinate;
import org.eclipse.recommenders.injection.InjectionService;
import org.eclipse.recommenders.internal.models.rcp.l10n.Messages;
import org.eclipse.recommenders.models.rcp.IProjectCoordinateProvider;
import org.eclipse.recommenders.rcp.SharedImages;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.FilteredItemsSelectionDialog;
import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Ordering;
import com.google.common.collect.Sets;
@SuppressWarnings("restriction")
public class ProjectCoordinateSelectionDialog extends FilteredItemsSelectionDialog {
private static final String DIALOG_SETTINGS = "ProjectCoordinateSelectionDialog"; //$NON-NLS-1$
private LabelProvider labelProvider;
private final SharedImages images;
private final IDependencyListener dependencyListener;
private final IProjectCoordinateProvider pcAdvisor;
public ProjectCoordinateSelectionDialog(Shell shell) {
super(shell, true);
setTitle(Messages.DIALOG_TITLE_SELECT_PROJECT_COORDINATE);
this.images = InjectionService.getInstance().requestInstance(SharedImages.class);
this.dependencyListener = InjectionService.getInstance().requestInstance(IDependencyListener.class);
this.pcAdvisor = InjectionService.getInstance().requestInstance(IProjectCoordinateProvider.class);
this.labelProvider = new LabelProvider() {
@Override
public String getText(Object element) {
if (element == null) {
return ""; //$NON-NLS-1$
}
if (element instanceof ProjectCoordinate) {
return createLabelForProjectCoordinate((ProjectCoordinate) element);
}
return element.toString();
}
@Override
public Image getImage(Object element) {
if (element instanceof ProjectCoordinate) {
return createImageForProjectCoordinate((ProjectCoordinate) element);
}
return super.getImage(element);
}
};
setListLabelProvider(labelProvider);
setDetailsLabelProvider(labelProvider);
}
public Image createImageForProjectCoordinate(ProjectCoordinate element) {
return images.getImage(OBJ_JAR);
}
public String createLabelForProjectCoordinate(ProjectCoordinate element) {
return element.toString();
}
@Override
protected Control createExtendedContentArea(Composite parent) {
return null;
}
@Override
protected IDialogSettings getDialogSettings() {
IDialogSettings settings = IDEWorkbenchPlugin.getDefault().getDialogSettings().getSection(DIALOG_SETTINGS);
if (settings == null) {
settings = IDEWorkbenchPlugin.getDefault().getDialogSettings().addNewSection(DIALOG_SETTINGS);
}
return settings;
}
@Override
protected IStatus validateItem(Object item) {
return Status.OK_STATUS;
}
@Override
protected ItemsFilter createFilter() {
return new ItemsFilter() {
@Override
public boolean matchItem(Object item) {
if (item instanceof ProjectCoordinate) {
if (filter((ProjectCoordinate) item)) {
return false;
}
}
return matches(item.toString());
}
@Override
public String getPattern() {
String pattern = super.getPattern();
if (pattern.equals("")) { //$NON-NLS-1$
return "?"; //$NON-NLS-1$
}
return pattern;
}
@Override
public boolean isConsistentItem(Object item) {
return true;
}
};
}
/**
* Subclasses can override to filter out unwanted project coordinates. I.e. coordinates that have already been
* selected.
*
* @return <code>false</code> if ProjectCoordinate should be displayed, <code>false</code> otherwise.
*/
public boolean filter(ProjectCoordinate pc) {
return false;
}
@Override
protected Comparator<?> getItemsComparator() {
return Ordering.usingToString();
}
@Override
protected void fillContentProvider(AbstractContentProvider contentProvider, ItemsFilter itemsFilter,
IProgressMonitor monitor) throws CoreException {
ImmutableSet<DependencyInfo> dependencies = dependencyListener.getDependencies();
monitor.beginTask(Messages.DIALOG_RESOLVING_DEPENDENCIES, dependencies.size());
try {
for (DependencyInfo dependencyInfo : dependencies) {
ProjectCoordinate pc = pcAdvisor.resolve(dependencyInfo).orNull();
if (pc != null) {
contentProvider.add(pc, itemsFilter);
}
monitor.worked(1);
}
} finally {
monitor.done();
}
}
@Override
public String getElementName(Object item) {
return labelProvider.getText(item);
}
public Set<ProjectCoordinate> getSelectedElements() {
Set<ProjectCoordinate> selectedElements = Sets.newHashSet();
Object[] result = getResult();
if (result != null) {
for (Object object : result) {
if (object instanceof ProjectCoordinate) {
ProjectCoordinate pc = (ProjectCoordinate) object;
selectedElements.add(pc);
}
}
}
return selectedElements;
}
}