blob: fba8293a4cbab5ee0e393f80022fe750038bc5ab [file] [log] [blame]
/*******************************************************************************
* 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 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Sonatype, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.m2e.core.ui.internal.wizards;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.IWizardContainer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
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.Label;
import org.apache.maven.model.Dependency;
import org.eclipse.m2e.core.internal.index.IndexedArtifact;
import org.eclipse.m2e.core.internal.index.IndexedArtifactFile;
import org.eclipse.m2e.core.project.ProjectImportConfiguration;
import org.eclipse.m2e.core.ui.internal.MavenImages;
import org.eclipse.m2e.core.ui.internal.Messages;
import org.eclipse.m2e.core.ui.internal.dialogs.MavenRepositorySearchDialog;
/**
* Wizard page for gathering information about Maven artifacts. Allows to select artifacts from the repository index.
*/
public class MavenDependenciesWizardPage extends AbstractMavenWizardPage {
/**
* Viewer containing dependencies
*/
TableViewer dependencyViewer;
private Dependency[] dependencies;
/**
* Listeners notified about all changes
*/
private List<ISelectionChangedListener> listeners = new ArrayList<ISelectionChangedListener>();
boolean showScope = false;
public MavenDependenciesWizardPage() {
this(null, Messages.wizardProjectPageDependenciesTitle, Messages.wizardProjectPageDependenciesDescription);
}
public MavenDependenciesWizardPage(ProjectImportConfiguration projectImportConfiguration, String title,
String description) {
super("MavenDependenciesWizardPage", projectImportConfiguration); //$NON-NLS-1$
setTitle(title);
setDescription(description);
setPageComplete(true);
}
public void setShowScope(boolean showScope) {
this.showScope = showScope;
}
public void setDependencies(Dependency[] dependencies) {
this.dependencies = dependencies;
}
/**
* {@inheritDoc} This wizard page contains a <code>TableViewer</code> to display the currently included Maven2
* directories and a button area with buttons to add further dependencies or remove existing ones.
*/
public void createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NULL);
GridLayout layout = new GridLayout(3, false);
composite.setLayout(layout);
if(dependencies != null) {
createArtifacts(composite);
}
createAdvancedSettings(composite, new GridData(SWT.FILL, SWT.TOP, false, false, 3, 1));
setControl(composite);
updatePage();
}
private void createArtifacts(Composite composite) {
Label mavenArtifactsLabel = new Label(composite, SWT.NONE);
mavenArtifactsLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1));
mavenArtifactsLabel.setText(org.eclipse.m2e.core.ui.internal.Messages.MavenDependenciesWizardPage_lblArtifacts);
dependencyViewer = new TableViewer(composite, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL);
dependencyViewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 2));
dependencyViewer.setUseHashlookup(true);
dependencyViewer.setLabelProvider(new ArtifactLabelProvider());
dependencyViewer.setComparator(new DependencySorter());
dependencyViewer.add(dependencies);
Button addDependencyButton = new Button(composite, SWT.PUSH);
GridData gd_addDependencyButton = new GridData(SWT.FILL, SWT.TOP, false, false);
addDependencyButton.setLayoutData(gd_addDependencyButton);
addDependencyButton.setText(Messages.wizardProjectPageDependenciesAdd);
addDependencyButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
MavenRepositorySearchDialog dialog = MavenRepositorySearchDialog
.createSearchDependencyDialog(
getShell(), //
org.eclipse.m2e.core.ui.internal.Messages.MavenDependenciesWizardPage_searchDialog_title, null, null,
false);
if(dialog.open() == Window.OK) {
Object result = dialog.getFirstResult();
if(result instanceof IndexedArtifactFile) {
Dependency dependency = ((IndexedArtifactFile) result).getDependency();
dependency.setScope(dialog.getSelectedScope());
dependencyViewer.add(dependency);
notifyListeners();
} else if(result instanceof IndexedArtifact) {
// If we have an ArtifactInfo, we add the first FileInfo it contains
// which corresponds to the latest version of the artifact.
Set<IndexedArtifactFile> files = ((IndexedArtifact) result).getFiles();
if(files != null && !files.isEmpty()) {
dependencyViewer.add(files.iterator().next().getDependency());
notifyListeners();
}
}
}
}
});
final Button removeDependencyButton = new Button(composite, SWT.PUSH);
removeDependencyButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, true));
removeDependencyButton.setText(Messages.wizardProjectPageDependenciesRemove);
removeDependencyButton.setEnabled(false);
removeDependencyButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
IStructuredSelection selection = (IStructuredSelection) dependencyViewer.getSelection();
if(selection != null) {
dependencyViewer.remove(selection.toArray());
notifyListeners();
}
}
});
dependencyViewer.addSelectionChangedListener(event -> {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
removeDependencyButton.setEnabled(selection.size() > 0);
});
}
public IWizardContainer getContainer() {
return super.getContainer();
}
void updatePage() {
setPageComplete(isPageValid());
}
private boolean isPageValid() {
setErrorMessage(null);
return true;
}
/**
* Notify listeners about changes
*/
protected void notifyListeners() {
SelectionChangedEvent event = new SelectionChangedEvent(dependencyViewer, dependencyViewer.getSelection());
for(ISelectionChangedListener listener : listeners) {
listener.selectionChanged(event);
}
}
public void addListener(ISelectionChangedListener listener) {
listeners.add(listener);
}
/**
* Returns dependencies currently chosen by the user.
*
* @return dependencies currently chosen by the user. Neither the array nor any of its elements is <code>null</code>.
*/
public Dependency[] getDependencies() {
List<Dependency> dependencies = new ArrayList<Dependency>();
for(int i = 0; i < dependencyViewer.getTable().getItemCount(); i++ ) {
Object element = dependencyViewer.getElementAt(i);
if(element instanceof Dependency) {
dependencies.add((Dependency) element);
}
}
return dependencies.toArray(new Dependency[dependencies.size()]);
}
/**
* Simple <code>LabelProvider</code> attached to the dependency viewer.
* <p>
* The information displayed for objects of type <code>Dependency</code> inside the dependency viewer is the
* following:
* </p>
* <p>
* {groupId} - {artifactId} - {version} - {type}
* </p>
*/
public static class ArtifactLabelProvider extends LabelProvider {
/** The image to show for all objects of type <code>Dependency</code>. */
private static final Image DEPENDENCY_IMAGE = MavenImages.IMG_JAR;
/**
* {@inheritDoc}
* <p>
* The text returned for objects of type <code>Dependency</code> contains the following information about the
* dependency:
* </p>
* <p>
* {groupId} - {artifactId} - {version} - {type}
* </p>
*/
public String getText(Object element) {
if(element instanceof Dependency) {
Dependency d = (Dependency) element;
return d.getGroupId()
+ ":" + d.getArtifactId() + ":" + d.getVersion() + (d.getClassifier() == null ? "" : ":" + d.getClassifier()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
}
return super.getText(element);
}
public Image getImage(Object element) {
if(element instanceof Dependency) {
return DEPENDENCY_IMAGE;
}
return super.getImage(element);
}
}
/**
* Simple <code>ViewerComparator</code> attached to the dependency viewer. Objects of type <code>Dependency</code> are
* sorted by (1) their groupId and (2) their artifactId.
*/
public static class DependencySorter extends ViewerComparator {
/**
* Two objects of type <code>Dependency</code> are sorted by (1) their groupId and (2) their artifactId.
*/
public int compare(Viewer viewer, Object e1, Object e2) {
if(!(e1 instanceof Dependency) || !(e2 instanceof Dependency)) {
return super.compare(viewer, e1, e2);
}
// First of all, compare the group IDs of the two dependencies.
String group1 = ((Dependency) e1).getGroupId();
String group2 = ((Dependency) e2).getGroupId();
int result = (group1 == null) ? -1 : group1.compareToIgnoreCase(group2);
// If the group IDs match, we sort by the artifact IDs.
if(result == 0) {
String artifact1 = ((Dependency) e1).getArtifactId();
String artifact2 = ((Dependency) e2).getArtifactId();
result = artifact1 == null ? -1 : artifact1.compareToIgnoreCase(artifact2);
}
return result;
}
}
}