/******************************************************************************* * Copyright (c) 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.refactoring.exclude; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.ltk.ui.refactoring.UserInputWizardPage; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; 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.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; import org.apache.maven.model.DependencyManagement; import org.apache.maven.model.Model; import org.eclipse.m2e.core.project.IMavenProjectFacade; import org.eclipse.m2e.core.ui.internal.components.PomHierarchyComposite; import org.eclipse.m2e.core.ui.internal.util.ParentHierarchyEntry; import org.eclipse.m2e.refactoring.Messages; @SuppressWarnings("restriction") public class ExcludeWizardPage extends UserInputWizardPage implements SelectionListener, ISelectionChangedListener { private PomHierarchyComposite pomHierarchy; private Button currentPom; private Button hierarchy; private IMavenProjectFacade facade; private CLabel status; protected ExcludeWizardPage(IMavenProjectFacade facade) { super(Messages.ExcludeWizardPage_title); this.facade = facade; } @Override public void createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NULL); setControl(composite); composite.setLayout(new GridLayout(1, false)); Label label = new Label(composite, SWT.NONE); label.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, false)); label.setText(Messages.ExcludeWizardPage_location); currentPom = new Button(composite, SWT.RADIO); GridData gd_currentPom = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gd_currentPom.horizontalIndent = 15; currentPom.setLayoutData(gd_currentPom); currentPom.setText(facade.getArtifactKey().toString()); currentPom.setSelection(true); currentPom.addSelectionListener(this); hierarchy = new Button(composite, SWT.RADIO); GridData gd_hierarchy = new GridData(SWT.LEFT, SWT.TOP, false, false); gd_hierarchy.horizontalIndent = 15; hierarchy.setLayoutData(gd_hierarchy); hierarchy.setText(Messages.ExcludeWizardPage_selectFromHierarchy); hierarchy.addSelectionListener(this); pomHierarchy = new PomHierarchyComposite(composite, SWT.BORDER); GridData gd_pomHierarchy = new GridData(SWT.FILL, SWT.FILL, true, true); gd_pomHierarchy.horizontalIndent = 35; pomHierarchy.setLayoutData(gd_pomHierarchy); pomHierarchy.setEnabled(false); pomHierarchy.addSelectionChangedListener(this); status = new CLabel(composite, SWT.WRAP); status.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, true, false)); pomHierarchy.computeHeirarchy(facade, null); getRefactoring().setHierarchy(pomHierarchy.getHierarchy()); } @Override protected ExcludeArtifactRefactoring getRefactoring() { return (ExcludeArtifactRefactoring) super.getRefactoring(); } @Override public void widgetSelected(SelectionEvent e) { if(e.getSource() == currentPom) { pomHierarchy.setEnabled(false); } else if(e.getSource() == hierarchy) { pomHierarchy.setEnabled(true); } updateState(); } @Override public void widgetDefaultSelected(SelectionEvent e) { } private void setStatus(String msg) { if(msg == null) { status.setImage(null); status.setText(""); //$NON-NLS-1$ } else { status.setText(msg); status.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_ERROR_TSK)); } } private void updateState() { ParentHierarchyEntry project; if(hierarchy.getSelection()) { project = pomHierarchy.fromSelection(); } else { project = pomHierarchy.getProject(); } updateStatusBar(project); getRefactoring().setExclusionPoint(project); } private void updateStatusBar(ParentHierarchyEntry project) { if(project == null) { setStatus(Messages.ExcludeWizardPage_errorSelectPom); setPageComplete(false); } else if(project.getResource() == null) { setStatus(Messages.ExcludeWizardPage_errorNonWorkspacePom); setPageComplete(false); } else if((project = isAboveDependencyManagement(project)) != null) { setStatus(NLS.bind(Messages.ExcludeWizardPage_dependenciesManagedIn, toString(project))); setPageComplete(false); } else { setStatus(null); setPageComplete(true); } } @Override public void selectionChanged(SelectionChangedEvent event) { updateState(); } private ParentHierarchyEntry isAboveDependencyManagement(ParentHierarchyEntry project) { for(ParentHierarchyEntry cProject : pomHierarchy.getHierarchy()) { if(project == cProject) { return null; } DependencyManagement dependencyManagement = cProject.getProject().getOriginalModel().getDependencyManagement(); if(dependencyManagement != null && !dependencyManagement.getDependencies().isEmpty()) { return cProject; } } return null; } private static String toString(ParentHierarchyEntry project) { Model model = project.getProject().getModel(); return NLS.bind("{0}:{1}:{2}", new String[] {model.getGroupId(), model.getArtifactId(), model.getVersion()}); //$NON-NLS-1$ } }