blob: ab5d06a8621fb4ab01ddacc8f7ebe4de55a33775 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008-2013 Sonatype, Inc. and others.
* 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
* Red Hat, Inc. - refactored lifecycle mapping discovery
*******************************************************************************/
package org.eclipse.m2e.core.ui.internal.wizards;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
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.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider;
import org.eclipse.jface.viewers.IColorProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.IWorkingSet;
import org.apache.maven.model.Model;
import org.apache.maven.model.Parent;
import org.eclipse.m2e.core.MavenPlugin;
import org.eclipse.m2e.core.embedder.MavenModelManager;
import org.eclipse.m2e.core.project.AbstractProjectScanner;
import org.eclipse.m2e.core.project.LocalProjectScanner;
import org.eclipse.m2e.core.project.MavenProjectInfo;
import org.eclipse.m2e.core.project.ProjectImportConfiguration;
import org.eclipse.m2e.core.ui.internal.Messages;
import org.eclipse.m2e.core.ui.internal.WorkingSets;
/**
* Maven Import Wizard Page
*
* @author Eugene Kuleshov
*/
public class MavenImportWizardPage extends AbstractMavenWizardPage {
private static final Logger log = LoggerFactory.getLogger(MavenImportWizardPage.class);
static final Object[] EMPTY = new Object[0];
protected Combo rootDirectoryCombo;
protected CheckboxTreeViewer projectTreeViewer;
private List<String> locations;
private IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
private boolean showLocation = true;
private boolean basedirRemameRequired = false;
private String rootDirectory;
private String loadingErrorMessage;
private Button btnSelectTree;
private Button btnDeselectTree;
private Button createWorkingSet;
private Combo workingSetName;
private String preselectedWorkingSetName;
public MavenImportWizardPage(ProjectImportConfiguration importConfiguration) {
super("MavenProjectImportWizardPage", importConfiguration); //$NON-NLS-1$
setTitle(org.eclipse.m2e.core.ui.internal.Messages.MavenImportWizardPage_title);
setDescription(org.eclipse.m2e.core.ui.internal.Messages.MavenImportWizardPage_desc);
setPageComplete(false);
}
public void setShowLocation(boolean showLocation) {
this.showLocation = showLocation;
}
public void setLocations(List<String> locations) {
this.locations = locations;
}
public void setBasedirRemameRequired(boolean basedirRemameRequired) {
this.basedirRemameRequired = basedirRemameRequired;
}
public void createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout(3, false));
setControl(composite);
if(showLocation || locations == null || locations.isEmpty()) {
final Label selectRootDirectoryLabel = new Label(composite, SWT.NONE);
selectRootDirectoryLabel.setLayoutData(new GridData());
selectRootDirectoryLabel.setText(Messages.wizardImportPageRoot);
rootDirectoryCombo = new Combo(composite, SWT.NONE);
rootDirectoryCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
rootDirectoryCombo.setFocus();
addFieldWithHistory("rootDirectory", rootDirectoryCombo); //$NON-NLS-1$
if(locations != null && locations.size() == 1) {
rootDirectoryCombo.setText(locations.get(0));
rootDirectory = locations.get(0);
}
final Button browseButton = new Button(composite, SWT.NONE);
browseButton.setText(Messages.wizardImportPageBrowse);
browseButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
browseButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.NONE);
dialog.setText(Messages.wizardImportPageSelectRootFolder);
String path = rootDirectoryCombo.getText();
if(path.length() == 0) {
path = ResourcesPlugin.getWorkspace().getRoot().getLocation().toPortableString();
}
dialog.setFilterPath(path);
String result = dialog.open();
if(result != null) {
rootDirectoryCombo.setText(result);
if(rootDirectoryChanged()) {
scanProjects();
}
}
}
});
rootDirectoryCombo.addListener(SWT.Traverse, e -> {
if(e.keyCode == SWT.CR && rootDirectoryChanged()) {
//New location entered : don't finish the wizard
if(e.detail == SWT.TRAVERSE_RETURN) {
e.doit = false;
}
scanProjects();
}
});
rootDirectoryCombo.addFocusListener(new FocusAdapter() {
public void focusLost(FocusEvent e) {
if(rootDirectoryChanged()) {
scanProjects();
}
}
});
rootDirectoryCombo.addSelectionListener(new SelectionAdapter() {
public void widgetDefaultSelected(SelectionEvent e) {
if(rootDirectoryChanged()) {
scanProjects();
}
}
public void widgetSelected(SelectionEvent e) {
if(rootDirectoryChanged()) {
//in runnable to have the combo popup collapse before disabling controls.
Display.getDefault().asyncExec(() -> scanProjects());
}
}
});
}
final Label projectsLabel = new Label(composite, SWT.NONE);
projectsLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1));
projectsLabel.setText(Messages.wizardImportPageProjects);
projectTreeViewer = new CheckboxTreeViewer(composite, SWT.BORDER);
projectTreeViewer.addCheckStateListener(event -> {
updateCheckedState();
setPageComplete();
});
projectTreeViewer.addSelectionChangedListener(event -> {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
btnSelectTree.setEnabled(!selection.isEmpty());
btnDeselectTree.setEnabled(!selection.isEmpty());
if(selection.getFirstElement() != null) {
String errorMsg = validateProjectInfo((MavenProjectInfo) selection.getFirstElement());
if(errorMsg != null) {
setMessage(errorMsg, IMessageProvider.WARNING);
} else {
//TODO if no error on current, shall show any existing general errors if found..
setMessage(loadingErrorMessage, IMessageProvider.WARNING);
}
} else {
//TODO if on current selection, shall show any existing general errors if existing..
setMessage(loadingErrorMessage, IMessageProvider.WARNING);
}
});
projectTreeViewer.setContentProvider(new ITreeContentProvider() {
public Object[] getElements(Object element) {
if(element instanceof List) {
@SuppressWarnings("unchecked")
List<MavenProjectInfo> projects = (List<MavenProjectInfo>) element;
return projects.toArray(new MavenProjectInfo[projects.size()]);
}
return EMPTY;
}
public Object[] getChildren(Object parentElement) {
if(parentElement instanceof List) {
@SuppressWarnings("unchecked")
List<MavenProjectInfo> projects = (List<MavenProjectInfo>) parentElement;
return projects.toArray(new MavenProjectInfo[projects.size()]);
} else if(parentElement instanceof MavenProjectInfo) {
MavenProjectInfo mavenProjectInfo = (MavenProjectInfo) parentElement;
Collection<MavenProjectInfo> projects = mavenProjectInfo.getProjects();
return projects.toArray(new MavenProjectInfo[projects.size()]);
}
return EMPTY;
}
public Object getParent(Object element) {
return null;
}
public boolean hasChildren(Object parentElement) {
if(parentElement instanceof List) {
List<?> projects = (List<?>) parentElement;
return !projects.isEmpty();
} else if(parentElement instanceof MavenProjectInfo) {
MavenProjectInfo mavenProjectInfo = (MavenProjectInfo) parentElement;
return !mavenProjectInfo.getProjects().isEmpty();
}
return false;
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
});
projectTreeViewer.setLabelProvider(new DelegatingStyledCellLabelProvider(new ProjectLabelProvider()));
final Tree projectTree = projectTreeViewer.getTree();
GridData projectTreeData = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 5);
projectTreeData.heightHint = 250;
projectTreeData.widthHint = 500;
projectTree.setLayoutData(projectTreeData);
Menu menu = new Menu(projectTree);
projectTree.setMenu(menu);
MenuItem mntmSelectTree = new MenuItem(menu, SWT.NONE);
mntmSelectTree.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
setProjectSubtreeChecked(true);
}
});
mntmSelectTree.setText(Messages.MavenImportWizardPage_mntmSelectTree_text);
MenuItem mntmDeselectTree = new MenuItem(menu, SWT.NONE);
mntmDeselectTree.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
setProjectSubtreeChecked(false);
}
});
mntmDeselectTree.setText(Messages.MavenImportWizardPage_mntmDeselectTree_text);
final Button selectAllButton = new Button(composite, SWT.NONE);
selectAllButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
selectAllButton.setText(Messages.wizardImportPageSelectAll);
selectAllButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
projectTreeViewer.expandAll();
setAllChecked(true);
// projectTreeViewer.setSubtreeChecked(projectTreeViewer.getInput(), true);
validate();
}
});
final Button deselectAllButton = new Button(composite, SWT.NONE);
deselectAllButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
deselectAllButton.setText(Messages.wizardImportPageDeselectAll);
deselectAllButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
setAllChecked(false);
// projectTreeViewer.setSubtreeChecked(projectTreeViewer.getInput(), false);
setPageComplete(false);
}
});
btnSelectTree = new Button(composite, SWT.NONE);
btnSelectTree.setEnabled(false);
btnSelectTree.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
setProjectSubtreeChecked(true);
}
});
btnSelectTree.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
btnSelectTree.setText(Messages.MavenImportWizardPage_btnSelectTree_text);
btnDeselectTree = new Button(composite, SWT.NONE);
btnDeselectTree.setEnabled(false);
btnDeselectTree.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
setProjectSubtreeChecked(false);
}
});
btnDeselectTree.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
btnDeselectTree.setText(Messages.MavenImportWizardPage_btnDeselectTree_text);
final Button refreshButton = new Button(composite, SWT.NONE);
refreshButton.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, true));
refreshButton.setText(Messages.wizardImportPageRefresh);
refreshButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
scanProjects();
}
});
createWorkingSet = new Button(composite, SWT.CHECK);
createWorkingSet.setText(Messages.MavenImportWizardPage_createWorkingSet);
createWorkingSet.setSelection(true);
createWorkingSet.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1));
createWorkingSet.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
boolean enabled = createWorkingSet.getSelection();
workingSetName.setEnabled(enabled);
if(enabled) {
workingSetName.setFocus();
}
}
});
workingSetName = new Combo(composite, SWT.BORDER);
GridData gd_workingSet = new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1);
gd_workingSet.horizontalIndent = 20;
workingSetName.setLayoutData(gd_workingSet);
createAdvancedSettings(composite, new GridData(SWT.FILL, SWT.TOP, false, false, 3, 1));
resolverConfigurationComponent.template.addModifyListener(arg0 -> Display.getDefault().asyncExec(() -> validate()));
if(locations != null && !locations.isEmpty()) {
scanProjects();
}
}
protected boolean rootDirectoryChanged() {
String _rootDirectory = rootDirectory;
rootDirectory = rootDirectoryCombo.getText().trim();
IPath p = new Path(rootDirectory);
if(p.isRoot()) {
setErrorMessage(Messages.MavenImportWizardPage_forbiddenImportFromRoot);
return false;
}
setErrorMessage(null);
return _rootDirectory == null || !_rootDirectory.equals(rootDirectory);
}
public void dispose() {
super.dispose();
}
public void scanProjects() {
final AbstractProjectScanner<MavenProjectInfo> projectScanner = getProjectScanner();
try {
getWizard().getContainer().run(true, true, new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
projectScanner.run(monitor);
}
//this collects all projects for analyzing..
List<MavenProjectInfo> getProjects(Collection<MavenProjectInfo> input) {
List<MavenProjectInfo> toRet = new ArrayList<MavenProjectInfo>();
for(MavenProjectInfo info : input) {
toRet.add(info);
toRet.addAll(getProjects(info.getProjects()));
}
return toRet;
}
});
List<MavenProjectInfo> projects = projectScanner.getProjects();
projectTreeViewer.setInput(projects);
projectTreeViewer.expandAll();
// projectTreeViewer.setAllChecked(true);
setAllChecked(true);
setPageComplete();
setErrorMessage(null);
setMessage(null);
loadingErrorMessage = null;
updateWorkingSet(projects);
//mkleint: XXX this sort of error handling is rather unfortunate
List<Throwable> errors = new ArrayList<Throwable>(projectScanner.getErrors());
if(!errors.isEmpty()) {
StringBuilder sb = new StringBuilder(NLS.bind(Messages.wizardImportPageScanningErrors, errors.size()));
int n = 1;
for(Throwable ex : errors) {
if(ex instanceof CoreException) {
String msg = ((CoreException) ex).getStatus().getMessage();
sb.append("\n ").append(n).append(" ").append(msg.trim()); //$NON-NLS-1$ //$NON-NLS-2$
} else {
String msg = ex.getMessage() == null ? ex.toString() : ex.getMessage();
sb.append("\n ").append(n).append(" ").append(msg.trim()); //$NON-NLS-1$ //$NON-NLS-2$
}
n++ ;
}
loadingErrorMessage = sb.toString();
setMessage(sb.toString(), IMessageProvider.WARNING);
}
} catch(InterruptedException ex) {
// canceled
} catch(InvocationTargetException ex) {
Throwable e = ex.getCause() == null ? ex : ex.getCause();
String msg;
if(e instanceof CoreException) {
msg = e.getMessage();
log.error(msg, e);
} else {
msg = "Scanning error " + projectScanner.getDescription() + "; " + e.toString(); //$NON-NLS-1$//$NON-NLS-2$
log.error(msg, e);
}
projectTreeViewer.setInput(null);
setPageComplete(false);
setErrorMessage(msg);
}
}
private void updateWorkingSet(List<MavenProjectInfo> projects) {
MavenProjectInfo rootProject = null;
if(projects != null && projects.size() == 1) {
rootProject = projects.get(0);
}
// check if working set name was preselected
if(preselectedWorkingSetName != null) {
updateWorkingSet(preselectedWorkingSetName, true);
return;
}
// check if imported project(s) are nested inside existing workspace project
String rootDirectory = rootDirectoryCombo != null ? rootDirectoryCombo.getText().trim() : null;
if(rootDirectory != null && rootDirectory.length() > 0) {
Set<IWorkingSet> workingSets = new HashSet<IWorkingSet>();
for(IContainer container : workspaceRoot.findContainersForLocationURI(new File(rootDirectory).toURI())) {
workingSets.addAll(WorkingSets.getAssignedWorkingSets(container.getProject()));
}
if(workingSets.size() == 1) {
updateWorkingSet(workingSets.iterator().next().getName(), true);
return;
}
}
// derive working set name from project name
if(rootProject != null) {
updateWorkingSet(getImportConfiguration().getProjectName(rootProject.getModel()), //
!rootProject.getProjects().isEmpty());
} else {
updateWorkingSet(null, false);
}
}
private void updateWorkingSet(String name, boolean enabled) {
Set<String> workingSetNames = new LinkedHashSet<String>();
if(name == null) {
name = ""; //$NON-NLS-1$
} else {
workingSetNames.add(name);
}
workingSetNames.addAll(Arrays.asList(WorkingSets.getWorkingSets()));
workingSetName.setItems(workingSetNames.toArray(new String[workingSetNames.size()]));
workingSetName.setText(name);
createWorkingSet.setSelection(enabled);
workingSetName.setEnabled(enabled);
}
private void setSubtreeChecked(Object obj, boolean checked) {
// CheckBoxTreeViewer#setSubtreeChecked is severely inefficient
projectTreeViewer.setChecked(obj, checked);
Object[] children = ((ITreeContentProvider) projectTreeViewer.getContentProvider()).getChildren(obj);
if(children != null) {
for(Object child : children) {
setSubtreeChecked(child, checked);
}
}
}
void setAllChecked(boolean state) {
@SuppressWarnings("unchecked")
List<MavenProjectInfo> input = (List<MavenProjectInfo>) projectTreeViewer.getInput();
if(input != null) {
for(MavenProjectInfo mavenProjectInfo : input) {
setSubtreeChecked(mavenProjectInfo, state);
}
updateCheckedState();
}
}
void updateCheckedState() {
Object[] elements = projectTreeViewer.getCheckedElements();
for(int i = 0; i < elements.length; i++ ) {
Object element = elements[i];
if(element instanceof MavenProjectInfo) {
MavenProjectInfo info = (MavenProjectInfo) element;
if(isWorkspaceFolder(info) || isAlreadyExists(info)) {
projectTreeViewer.setChecked(info, false);
}
}
}
}
boolean isWorkspaceFolder(MavenProjectInfo info) {
if(info != null) {
File pomFile = info.getPomFile();
if(pomFile != null) {
File parentFile = pomFile.getParentFile();
if(parentFile.getAbsolutePath().equals(workspaceRoot.getLocation().toFile().getAbsolutePath())) {
return true;
}
}
}
return false;
}
boolean isAlreadyExists(MavenProjectInfo info) {
if(info != null) {
IWorkspace workspace = ResourcesPlugin.getWorkspace();
String name = getImportConfiguration().getProjectName(info.getModel());
if(name != null && name.length() > 0) {
IProject project = workspace.getRoot().getProject(name);
return project.exists();
}
}
return false;
}
/**
* this will iterate all existing projects and return true if the absolute location URI of the old (imported) and new
* (to-be-imported) projects match
*
* @param info
* @return
*/
boolean isAlreadyImported(MavenProjectInfo info) {
if(info != null) {
IWorkspace workspace = ResourcesPlugin.getWorkspace();
for(IProject project : workspace.getRoot().getProjects()) {
URI mavenuri = info.getPomFile().getParentFile().toURI();
//mkleint: this is sort of heuristic blah blah code. unfortunately for some reason the
// URI returned by the eclipse code in project.getLocationURI() differs by the ending / character from the
// java.io.File code. That results in failing match of the URIs. I've blah it by removing the ending slash.
// please tell me there is a more sane solution!
if(mavenuri.toString().endsWith("/")) { //$NON-NLS-1$
try {
mavenuri = new URI(mavenuri.toString().substring(0, mavenuri.toString().length() - 1));
} catch(URISyntaxException ex) {
log.error(ex.getMessage(), ex);
}
}
boolean ok = project.exists() && project.getLocationURI().equals(mavenuri);
if(ok) {
return true;
}
}
}
return false;
}
public boolean shouldCreateWorkingSet() {
return createWorkingSet.getSelection();
}
public String getWorkingSetName() {
return workingSetName.getText();
}
protected AbstractProjectScanner<MavenProjectInfo> getProjectScanner() {
File root = workspaceRoot.getLocation().toFile();
MavenModelManager modelManager = MavenPlugin.getMavenModelManager();
if(showLocation) {
String location = rootDirectoryCombo.getText().trim();
if(location.length() > 0) {
return new LocalProjectScanner(root, location, basedirRemameRequired, modelManager);
}
} else if(locations != null && !locations.isEmpty()) {
return new LocalProjectScanner(root, locations, basedirRemameRequired, modelManager);
}
// empty scanner
return new AbstractProjectScanner<MavenProjectInfo>() {
@Override
public String getDescription() {
return ""; //$NON-NLS-1$
}
@Override
public void run(IProgressMonitor monitor) throws InterruptedException {
}
};
}
/**
* @return collection of <code>MavenProjectInfo</code>
*/
public Collection<MavenProjectInfo> getProjects() {
Collection<MavenProjectInfo> checkedProjects = new ArrayList<MavenProjectInfo>();
for(Object o : projectTreeViewer.getCheckedElements()) {
checkedProjects.add((MavenProjectInfo) o);
}
return checkedProjects;
}
public MavenProjectInfo getRootProject() {
Object[] elements = projectTreeViewer.getExpandedElements();
return elements == null || elements.length == 0 ? null : (MavenProjectInfo) elements[0];
}
/**
* @param info
* @return
*/
protected String validateProjectInfo(MavenProjectInfo info) {
if(info != null) {
if(isWorkspaceFolder(info)) {
String projectName = getImportConfiguration().getProjectName(info.getModel());
return NLS.bind(Messages.wizardImportValidatorWorkspaceFolder, projectName);
} else if(isAlreadyImported(info)) {
String projectName = getImportConfiguration().getProjectName(info.getModel());
return NLS.bind(Messages.wizardImportValidatorProjectImported, projectName);
} else if(isAlreadyExists(info)) {
String projectName = getImportConfiguration().getProjectName(info.getModel());
return NLS.bind(Messages.wizardImportValidatorProjectExists, projectName);
}
}
return null;
}
protected void validate() {
if(projectTreeViewer.getControl().isDisposed()) {
return;
}
Object[] elements = projectTreeViewer.getCheckedElements();
for(int i = 0; i < elements.length; i++ ) {
Object element = elements[i];
if(element instanceof MavenProjectInfo) {
String errorMsg = validateProjectInfo((MavenProjectInfo) element);
if(errorMsg != null) {
setPageComplete(false);
return;
}
}
}
setMessage(null);
setPageComplete();
projectTreeViewer.refresh();
}
void setPageComplete() {
Object[] checkedElements = projectTreeViewer.getCheckedElements();
setPageComplete(checkedElements != null && checkedElements.length > 0);
}
void setProjectSubtreeChecked(boolean checked) {
ITreeSelection selection = (ITreeSelection) projectTreeViewer.getSelection();
setSubtreeChecked(selection.getFirstElement(), checked);
updateCheckedState();
setPageComplete();
}
/**
* ProjectLabelProvider
*/
class ProjectLabelProvider extends LabelProvider implements IColorProvider,
DelegatingStyledCellLabelProvider.IStyledLabelProvider {
public String getText(Object element) {
if(element instanceof MavenProjectInfo) {
MavenProjectInfo info = (MavenProjectInfo) element;
if(info.getProfiles().isEmpty()) {
return info.getLabel() + " - " + getId(info); //$NON-NLS-1$
}
return info.getLabel() + " - " + getId(info) + " " + info.getProfiles(); //$NON-NLS-1$ //$NON-NLS-2$
}
return super.getText(element);
}
private String getId(MavenProjectInfo info) {
Model model = info.getModel();
String groupId = model.getGroupId();
String artifactId = model.getArtifactId();
String version = model.getVersion();
String packaging = model.getPackaging();
Parent parent = model.getParent();
if(groupId == null && parent != null) {
groupId = parent.getGroupId();
}
if(groupId == null) {
groupId = org.eclipse.m2e.core.ui.internal.Messages.MavenImportWizardPage_inherited;
}
if(version == null && parent != null) {
version = parent.getVersion();
}
if(version == null) {
version = org.eclipse.m2e.core.ui.internal.Messages.MavenImportWizardPage_inherited;
}
return groupId + ":" + artifactId + ":" + version + ":" + packaging; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object)
*/
public Color getForeground(Object element) {
if(element instanceof MavenProjectInfo) {
MavenProjectInfo info = (MavenProjectInfo) element;
if(isWorkspaceFolder(info)) {
return Display.getDefault().getSystemColor(SWT.COLOR_RED);
} else if(isAlreadyExists(info)) {
return Display.getDefault().getSystemColor(SWT.COLOR_GRAY);
}
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object)
*/
public Color getBackground(Object element) {
return null;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider#getStyledText(java.lang.Object)
*/
public StyledString getStyledText(Object element) {
if(element instanceof MavenProjectInfo) {
MavenProjectInfo info = (MavenProjectInfo) element;
StyledString ss = new StyledString();
ss.append(info.getLabel() + " "); //$NON-NLS-1$
ss.append(getId(info), StyledString.DECORATIONS_STYLER);
if(!info.getProfiles().isEmpty()) {
ss.append(" - " + info.getProfiles(), StyledString.QUALIFIER_STYLER); //$NON-NLS-1$
}
return ss;
}
return null;
}
}
/**
* Preselected default working set name.
*
* @since 1.5
*/
public void setWorkingSetName(String workingSetName) {
this.preselectedWorkingSetName = workingSetName;
}
}