/*******************************************************************************
* Copyright (c) 2008-2013 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 org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.ContainerSelectionDialog;
import org.apache.maven.model.Model;
import org.eclipse.m2e.core.MavenPlugin;
import org.eclipse.m2e.core.project.conversion.IProjectConversionEnabler;
import org.eclipse.m2e.core.project.conversion.IProjectConversionManager;
import org.eclipse.m2e.core.ui.internal.Messages;
/**
* Wizard page used to specify basic POM parameters
*/
public class MavenPomWizardPage extends AbstractMavenWizardPage {
private Text projectText;
private ISelection selection;
private MavenArtifactComponent pomComponent;
private IProjectConversionEnabler projectConversionEnabler;
public MavenPomWizardPage(ISelection selection) {
super("wizardPage"); //$NON-NLS-1$
setTitle(Messages.MavenPomWizardPage_title);
setDescription(Messages.MavenPomWizardPage_desc);
this.selection = selection;
}
public void createControl(Composite parent) {
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.makeColumnsEqualWidth = false;
Composite container = new Composite(parent, SWT.NULL);
container.setLayout(layout);
ModifyListener modifyingListener = new ModifyListener() {
public void modifyText(ModifyEvent e) {
dialogChanged();
}
};
Label label = new Label(container, SWT.NULL);
label.setText(Messages.MavenPomWizardPage_lblProject);
projectText = new Text(container, SWT.BORDER | SWT.SINGLE | SWT.READ_ONLY);
projectText.setEditable(false);
projectText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
projectText.addModifyListener(modifyingListener);
pomComponent = new MavenArtifactComponent(container, SWT.NONE);
pomComponent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
pomComponent.setModifyingListener(modifyingListener);
addFieldWithHistory("groupId", pomComponent.getGroupIdCombo()); //$NON-NLS-1$
addFieldWithHistory("artifactId", pomComponent.getArtifactIdCombo()); //$NON-NLS-1$
addFieldWithHistory("version", pomComponent.getVersionCombo()); //$NON-NLS-1$
addFieldWithHistory("name", pomComponent.getNameCombo()); //$NON-NLS-1$
initialize();
dialogChanged();
setControl(container);
}
/**
* Tests if the current workbench selection is a suitable container to use.
*/
private void initialize() {
String packagingToUse = MavenArtifactComponent.DEFAULT_PACKAGING;
String[] availablePackagingTypes = MavenArtifactComponent.PACKAGING_OPTIONS;
if(selection != null && !selection.isEmpty() && selection instanceof IStructuredSelection) {
IStructuredSelection ssel = (IStructuredSelection) selection;
if(ssel.size() > 1) {
return;
}
Object obj = ssel.getFirstElement();
if(obj instanceof IResource) {
IContainer container;
if(obj instanceof IContainer) {
container = (IContainer) obj;
} else {
container = ((IResource) obj).getParent();
}
projectText.setText(container.getFullPath().toString());
pomComponent.setArtifactId(container.getName());
pomComponent.setGroupId(container.getName());
if(container instanceof IProject) {
IProjectConversionManager pcm = MavenPlugin.getProjectConversionManager();
projectConversionEnabler = pcm.getConversionEnablerForProject((IProject) container);
if(projectConversionEnabler != null) {
availablePackagingTypes = projectConversionEnabler.getPackagingTypes((IProject) container);
packagingToUse = availablePackagingTypes[0];
}
}
}
}
pomComponent.setVersion(MavenArtifactComponent.DEFAULT_VERSION);
pomComponent.setPackagingTypes(availablePackagingTypes);
pomComponent.setPackaging(packagingToUse);
pomComponent.setFocus();
}
/**
* Uses the standard container selection dialog to choose the new value for the container field.
*/
void handleBrowse() {
ContainerSelectionDialog dialog = new ContainerSelectionDialog(getShell(), ResourcesPlugin.getWorkspace().getRoot(),
false, Messages.MavenPomWizardPage_dialog_title);
dialog.showClosedProjects(false);
if(dialog.open() == Window.OK) {
Object[] result = dialog.getResult();
if(result.length == 1) {
projectText.setText(((Path) result[0]).toString());
}
}
// IJavaModel javaModel = JavaCore.create();
//
// IJavaProject[] projects;
// try {
// projects = javaModel.getJavaProjects();
// } catch(JavaModelException e) {
// log.error(e.getMessage(), e);
// projects = new IJavaProject[0];
// }
//
// ILabelProvider labelProvider = new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_DEFAULT);
// ElementListSelectionDialog dialog = new ElementListSelectionDialog(getShell(), labelProvider);
// dialog.setTitle("Select Project");
// dialog.setMessage("Choose project where POM will be created");
// dialog.setElements(projects);
//
// String projectName = getProject();
// if(projectName != null && projectName.length() > 0) {
// IJavaProject javaProject = javaModel.getJavaProject(projectName);
// if(javaProject != null) {
// dialog.setInitialSelections(new Object[] {javaProject});
// }
// }
//
// if(dialog.open() == Window.OK) {
// projectText.setText(((IJavaProject) dialog.getFirstResult()).getProject().getFullPath().toString());
// }
}
/**
* Ensures that both text fields are set.
*/
void dialogChanged() {
IResource container = ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(getProject()));
if(getProject().length() == 0) {
updateStatus(Messages.MavenPomWizardPage_error_folder);
return;
}
if(container == null || (container.getType() & IResource.FOLDER | IResource.PROJECT) == 0) {
updateStatus(Messages.MavenPomWizardPage_error_folder2);
return;
}
if(!container.isAccessible()) {
updateStatus(Messages.MavenPomWizardPage_error_folder_write);
return;
}
String message = validateGroupIdInput(pomComponent.getGroupId());
if(message != null) {
updateStatus(message);
return;
}
message = validateArtifactIdInput(pomComponent.getArtifactId());
if(message != null) {
updateStatus(message);
return;
}
if(pomComponent.getVersion().length() == 0) {
updateStatus(Messages.MavenPomWizardPage_error_version);
return;
}
if(pomComponent.getPackaging().length() == 0) {
updateStatus(Messages.MavenPomWizardPage_error_pack);
return;
}
if(container instanceof IProject && projectConversionEnabler != null) {
IStatus status = projectConversionEnabler.canBeConverted((IProject) container);
if(status.getSeverity() == IStatus.ERROR) {
updateStatus(status.getMessage());
return;
}
}
updateStatus(null);
}
private void updateStatus(String message) {
setErrorMessage(message);
setPageComplete(message == null);
}
public String getProject() {
return projectText.getText();
}
public Model getModel() {
return pomComponent.getModel();
}
}