Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPascal Rapicault2010-12-06 22:10:52 +0000
committerPascal Rapicault2010-12-06 22:10:52 +0000
commitfbb4f5902cade92cc1689e73209c60a6413a5ef7 (patch)
treeace0fb107bafe980fc14fd7f3429e5c9aac2d795 /org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/composites/DependenciesComposite.java
parenta9c878c2624b33d8c74062717bf75302f0ae1fa7 (diff)
downloadm2e-core-fbb4f5902cade92cc1689e73209c60a6413a5ef7.tar.gz
m2e-core-fbb4f5902cade92cc1689e73209c60a6413a5ef7.tar.xz
m2e-core-fbb4f5902cade92cc1689e73209c60a6413a5ef7.zip
Initial commit at Eclipse
Diffstat (limited to 'org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/composites/DependenciesComposite.java')
-rw-r--r--org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/composites/DependenciesComposite.java954
1 files changed, 954 insertions, 0 deletions
diff --git a/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/composites/DependenciesComposite.java b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/composites/DependenciesComposite.java
new file mode 100644
index 00000000..687462c2
--- /dev/null
+++ b/org.eclipse.m2e.editor/src/org/eclipse/m2e/editor/composites/DependenciesComposite.java
@@ -0,0 +1,954 @@
+/*******************************************************************************
+ * 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 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.editor.composites;
+
+import static org.eclipse.m2e.editor.pom.FormUtils.nvl;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.project.MavenProject;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+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.emf.common.command.Command;
+import org.eclipse.emf.common.command.CompoundCommand;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.edit.command.AddCommand;
+import org.eclipse.emf.edit.command.RemoveCommand;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.jface.window.Window;
+import org.eclipse.m2e.core.MavenPlugin;
+import org.eclipse.m2e.core.core.IMavenConstants;
+import org.eclipse.m2e.core.core.MavenLogger;
+import org.eclipse.m2e.core.embedder.ArtifactKey;
+import org.eclipse.m2e.core.embedder.IMaven;
+import org.eclipse.m2e.core.index.IIndex;
+import org.eclipse.m2e.core.index.IndexedArtifactFile;
+import org.eclipse.m2e.core.project.IMavenProjectFacade;
+import org.eclipse.m2e.core.project.MavenProjectManager;
+import org.eclipse.m2e.core.ui.dialogs.AddDependencyDialog;
+import org.eclipse.m2e.core.ui.dialogs.EditDependencyDialog;
+import org.eclipse.m2e.core.ui.dialogs.MavenRepositorySearchDialog;
+import org.eclipse.m2e.editor.MavenEditorImages;
+import org.eclipse.m2e.editor.MavenEditorPlugin;
+import org.eclipse.m2e.editor.dialogs.ManageDependenciesDialog;
+import org.eclipse.m2e.editor.internal.Messages;
+import org.eclipse.m2e.editor.pom.MavenPomEditor;
+import org.eclipse.m2e.editor.pom.MavenPomEditor.Callback;
+import org.eclipse.m2e.editor.pom.MavenPomEditorPage;
+import org.eclipse.m2e.editor.pom.SearchControl;
+import org.eclipse.m2e.editor.pom.SearchMatcher;
+import org.eclipse.m2e.editor.pom.ValueProvider;
+import org.eclipse.m2e.model.edit.pom.Dependency;
+import org.eclipse.m2e.model.edit.pom.DependencyManagement;
+import org.eclipse.m2e.model.edit.pom.Model;
+import org.eclipse.m2e.model.edit.pom.PomFactory;
+import org.eclipse.m2e.model.edit.pom.PomPackage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+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.Display;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+import org.sonatype.aether.graph.DependencyNode;
+
+
+/**
+ * @author Eugene Kuleshov
+ */
+public class DependenciesComposite extends Composite {
+
+ protected static PomPackage POM_PACKAGE = PomPackage.eINSTANCE;
+
+ protected MavenPomEditorPage editorPage;
+
+ MavenPomEditor pomEditor;
+
+ private FormToolkit toolkit = new FormToolkit(Display.getCurrent());
+
+ // controls
+
+ PropertiesListComposite<Dependency> dependencyManagementEditor;
+
+ //This ListComposite takes both m2e and maven Dependencies
+ DependenciesListComposite<Object> dependenciesEditor;
+
+ Button dependencySelectButton;
+
+ Action dependencySelectAction;
+
+ SearchControl searchControl;
+
+ SearchMatcher searchMatcher;
+
+ DependencyFilter searchFilter;
+
+ Action openWebPageAction;
+
+ // model
+
+ Model model;
+
+ MavenProject mavenProject;
+
+ ValueProvider<DependencyManagement> dependencyManagementProvider;
+
+ DependencyLabelProvider dependencyLabelProvider = new DependencyLabelProvider();
+
+ DependencyLabelProvider dependencyManagementLabelProvider = new DependencyLabelProvider();
+
+ protected boolean showInheritedDependencies = false;
+ IMavenProjectFacade facade = null;
+
+ ListEditorContentProvider<Object> dependenciesContentProvider = new ListEditorContentProvider<Object>();
+
+ DependenciesComparator<Object> dependenciesComparator;
+
+ ListEditorContentProvider<Dependency> dependencyManagementContentProvider = new ListEditorContentProvider<Dependency>();
+
+ DependenciesComparator<Dependency> dependencyManagementComparator;
+
+ public DependenciesComposite(Composite composite, MavenPomEditorPage editorPage, int flags, MavenPomEditor pomEditor) {
+ super(composite, flags);
+ this.editorPage = editorPage;
+ this.pomEditor = pomEditor;
+ createComposite();
+ editorPage.initPopupMenu(dependenciesEditor.getViewer(), ".dependencies"); //$NON-NLS-1$
+ editorPage.initPopupMenu(dependencyManagementEditor.getViewer(), ".dependencyManagement"); //$NON-NLS-1$
+ }
+
+ private void createComposite() {
+ GridLayout gridLayout = new GridLayout();
+ gridLayout.makeColumnsEqualWidth = true;
+ gridLayout.marginWidth = 0;
+ setLayout(gridLayout);
+ toolkit.adapt(this);
+
+ SashForm horizontalSash = new SashForm(this, SWT.NONE);
+ GridData horizontalCompositeGridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ horizontalCompositeGridData.heightHint = 200;
+ horizontalSash.setLayoutData(horizontalCompositeGridData);
+ toolkit.adapt(horizontalSash, true, true);
+
+ createDependenciesSection(horizontalSash);
+ createDependencyManagementSection(horizontalSash);
+
+ horizontalSash.setWeights(new int[] {1, 1});
+ }
+
+ private void createDependenciesSection(SashForm verticalSash) {
+ Section dependenciesSection = toolkit.createSection(verticalSash, ExpandableComposite.TITLE_BAR);
+ dependenciesSection.marginWidth = 3;
+ dependenciesSection.setText(Messages.DependenciesComposite_sectionDependencies);
+
+ dependenciesComparator = new DependenciesComparator<Object>();
+ dependenciesContentProvider.setComparator(dependenciesComparator);
+
+ dependenciesEditor = new DependenciesListComposite<Object>(dependenciesSection, SWT.NONE, true);
+ dependenciesEditor.setLabelProvider(dependencyLabelProvider);
+ dependenciesEditor.setContentProvider(dependenciesContentProvider);
+
+ dependenciesEditor.setRemoveButtonListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ CompoundCommand compoundCommand = new CompoundCommand();
+ EditingDomain editingDomain = editorPage.getEditingDomain();
+
+ List<Object> dependencyList = dependenciesEditor.getSelection();
+ for(Object obj : dependencyList) {
+ if (obj instanceof Dependency) {
+ Dependency dependency = (Dependency) obj;
+ Command removeCommand = RemoveCommand.create(editingDomain, model, POM_PACKAGE.getModel_Dependencies(),
+ dependency);
+ compoundCommand.append(removeCommand);
+ } else if (obj instanceof org.apache.maven.model.Dependency) {
+ /*
+ * TODO: Support a refactoring of removing an inherited/managed dependency.
+ */
+ }
+ }
+
+ editingDomain.getCommandStack().execute(compoundCommand);
+ setDependenciesInput();
+ }
+ });
+
+ dependenciesEditor.setPropertiesListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ Object selection = dependenciesEditor.getSelection().get(0);
+ if (selection instanceof Dependency) {
+ Dependency dependency = (Dependency) selection;
+ EditDependencyDialog d = new EditDependencyDialog(getShell(), false, editorPage.getEditingDomain(), editorPage
+ .getProject());
+ d.setDependency(dependency);
+ if(d.open() == Window.OK) {
+ setDependenciesInput();
+ dependenciesEditor.setSelection(Collections.singletonList((Object) dependency));
+ }
+ } else if (selection instanceof org.apache.maven.model.Dependency) {
+ /*
+ * TODO: Support editing or displaying of inherited/managed dependencies.
+ */
+ }
+ }
+ });
+
+ dependenciesSection.setClient(dependenciesEditor);
+ toolkit.adapt(dependenciesEditor);
+ toolkit.paintBordersFor(dependenciesEditor);
+
+ dependenciesEditor.setManageButtonListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ try {
+ openManageDependenciesDialog();
+ } catch(InvocationTargetException e1) {
+ MavenEditorPlugin.getDefault().getLog().log(new Status(IStatus.ERROR, MavenEditorPlugin.PLUGIN_ID, "Error: ", e1)); //$NON-NLS-1$
+ } catch(InterruptedException e1) {
+ MavenEditorPlugin.getDefault().getLog().log(new Status(IStatus.ERROR, MavenEditorPlugin.PLUGIN_ID, "Error: ", e1)); //$NON-NLS-1$
+ }
+ }
+ });
+
+ dependenciesEditor.setAddButtonListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ final AddDependencyDialog addDepDialog = new AddDependencyDialog(getShell(), false, editorPage.getProject());
+
+ /*
+ * Load the dependency tree for the dialog so it can show already
+ * added transitive dependencies.
+ */
+ Runnable runnable = new Runnable() {
+
+ public void run() {
+ pomEditor.loadDependencies(new Callback() {
+
+ public void onFinish(DependencyNode node) {
+ addDepDialog.setDepdencyNode(node);
+ }
+
+ public void onException(CoreException ex) {
+ MavenLogger.log(ex);
+ }
+ }, Artifact.SCOPE_TEST);
+ }
+ };
+
+ addDepDialog.onLoad(runnable);
+
+ if(addDepDialog.open() == Window.OK) {
+ List<Dependency> deps = addDepDialog.getDependencies();
+ for(Dependency dep : deps) {
+ setupDependency(new ValueProvider<Model>() {
+ @Override
+ public Model getValue() {
+ return model;
+ }
+ }, POM_PACKAGE.getModel_Dependencies(), dep);
+ }
+ setDependenciesInput();
+ dependenciesEditor.setSelection(Collections.singletonList((Object) deps.get(0)));
+ }
+ }
+
+ });
+
+ ToolBarManager modulesToolBarManager = new ToolBarManager(SWT.FLAT);
+
+ modulesToolBarManager.add(new Action(Messages.DependenciesComposite_action_sortAlphabetically, MavenEditorImages.SORT) {
+ {
+ setChecked(false);
+ }
+
+ @Override
+ public int getStyle() {
+ return AS_CHECK_BOX;
+ }
+
+ @Override
+ public void run() {
+ dependenciesContentProvider.setShouldSort(isChecked());
+ dependenciesEditor.getViewer().refresh();
+ }
+ });
+
+ modulesToolBarManager.add(new Action(Messages.DependenciesComposite_action_showInheritedDependencies,
+ MavenEditorImages.SHOW_INHERITED_DEPENDENCIES) {
+ {
+ setChecked(false);
+ }
+
+ @Override
+ public int getStyle() {
+ return AS_CHECK_BOX;
+ }
+
+ @Override
+ public void run() {
+ if (isChecked()) {
+ IRunnableWithProgress projectLoader = new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ try {
+ facade = readMavenProject(monitor);
+ if (facade == null) {
+ return;
+ }
+ dependencyLabelProvider.setFacade(facade);
+ showInheritedDependencies = true;
+
+ Display.getDefault().asyncExec(new Runnable() {
+
+ public void run() {
+ ISelection selection = dependenciesEditor.getViewer().getSelection();
+ setDependenciesInput();
+ dependenciesEditor.getViewer().refresh();
+ dependenciesEditor.getViewer().setSelection(selection, true);
+ }
+ });
+ } catch(CoreException e) {
+ throw new InvocationTargetException(e);
+ }
+ }
+ };
+
+
+ try {
+ PlatformUI.getWorkbench().getProgressService().run(true, true, projectLoader);
+ } catch(InvocationTargetException e) {
+ MavenEditorPlugin.getDefault().getLog().log(new Status(IStatus.ERROR, MavenEditorPlugin.PLUGIN_ID, null, e));
+ } catch(InterruptedException e) {
+ MavenEditorPlugin.getDefault().getLog().log(new Status(IStatus.ERROR, MavenEditorPlugin.PLUGIN_ID, null, e));
+ }
+
+ if (facade == null || facade.getMavenProject() == null
+ || facade.getMavenProject().getModel() == null) {
+ /*
+ * If this is null here, there was an exception thrown during
+ * readMavenProject above, so we should uncheck the button
+ */
+ setChecked(false);
+ }
+ } else {
+ showInheritedDependencies = false;
+ ISelection selection = dependenciesEditor.getViewer().getSelection();
+ setDependenciesInput();
+ dependenciesEditor.getViewer().setSelection(selection, true);
+ }
+ }
+ });
+
+ modulesToolBarManager.add(new Action(Messages.DependenciesComposite_action_showgroupid,
+ MavenEditorImages.SHOW_GROUP) {
+ {
+ setChecked(false);
+ dependenciesComparator.setSortByGroups(false);
+ }
+
+ public int getStyle() {
+ return AS_CHECK_BOX;
+ }
+
+ public void run() {
+ dependencyLabelProvider.setShowGroupId(isChecked());
+ dependenciesComparator.setSortByGroups(isChecked());
+ dependenciesEditor.getViewer().refresh();
+ }
+ });
+
+ modulesToolBarManager.add(new Action(Messages.DependenciesComposite_action_filter, MavenEditorImages.FILTER) {
+ {
+ setChecked(true);
+ }
+
+ public int getStyle() {
+ return AS_CHECK_BOX;
+ }
+
+ public void run() {
+ TableViewer viewer = dependenciesEditor.getViewer();
+ if(isChecked()) {
+ viewer.addFilter(searchFilter);
+ } else {
+ viewer.removeFilter(searchFilter);
+ }
+ viewer.refresh();
+ if(isChecked()) {
+ searchControl.getSearchText().setFocus();
+ }
+ }
+ });
+
+ Composite toolbarComposite = toolkit.createComposite(dependenciesSection);
+ GridLayout toolbarLayout = new GridLayout(1, true);
+ toolbarLayout.marginHeight = 0;
+ toolbarLayout.marginWidth = 0;
+ toolbarComposite.setLayout(toolbarLayout);
+ toolbarComposite.setBackground(null);
+
+ modulesToolBarManager.createControl(toolbarComposite);
+ dependenciesSection.setTextClient(toolbarComposite);
+ }
+
+ private void createDependencyManagementSection(SashForm verticalSash) {
+ Section dependencyManagementSection = toolkit.createSection(verticalSash, ExpandableComposite.TITLE_BAR);
+ dependencyManagementSection.marginWidth = 3;
+ dependencyManagementSection.setText(Messages.DependenciesComposite_sectionDependencyManagement);
+
+ dependencyManagementEditor = new PropertiesListComposite<Dependency>(dependencyManagementSection, SWT.NONE, true);
+ dependencyManagementSection.setClient(dependencyManagementEditor);
+
+ dependencyManagementComparator = new DependenciesComparator<Dependency>();
+ dependencyManagementContentProvider.setComparator(dependencyManagementComparator);
+ dependencyManagementEditor.setLabelProvider(dependencyManagementLabelProvider);
+ dependencyManagementEditor.setContentProvider(dependencyManagementContentProvider);
+
+ dependencyManagementEditor.setRemoveButtonListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ CompoundCommand compoundCommand = new CompoundCommand();
+ EditingDomain editingDomain = editorPage.getEditingDomain();
+
+ List<Dependency> dependencyList = dependencyManagementEditor.getSelection();
+ for(Dependency dependency : dependencyList) {
+ Command removeCommand = RemoveCommand.create(editingDomain, //
+ dependencyManagementProvider.getValue(), POM_PACKAGE.getDependencyManagement_Dependencies(), dependency);
+ compoundCommand.append(removeCommand);
+ }
+
+ editingDomain.getCommandStack().execute(compoundCommand);
+ }
+ });
+
+ dependencyManagementEditor.setPropertiesListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ Dependency dependency = dependencyManagementEditor.getSelection().get(0);
+ EditDependencyDialog d = new EditDependencyDialog(getShell(), true, editorPage.getEditingDomain(), editorPage
+ .getProject());
+ d.setDependency(dependency);
+ if(d.open() == Window.OK) {
+ dependencyManagementEditor.setInput(dependencyManagementProvider.getValue().getDependencies());
+ dependencyManagementEditor.setSelection(Collections.singletonList(dependency));
+ }
+ }
+ });
+
+ dependencyManagementEditor.addSelectionListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ List<Dependency> selection = dependencyManagementEditor.getSelection();
+
+ if(!selection.isEmpty()) {
+ dependenciesEditor.setSelection(Collections.<Object> emptyList());
+ }
+ }
+ });
+
+ toolkit.adapt(dependencyManagementEditor);
+ toolkit.paintBordersFor(dependencyManagementEditor);
+
+ dependencyManagementEditor.setAddButtonListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ // TODO calculate current list of artifacts for the project
+ Set<ArtifactKey> artifacts = Collections.emptySet();
+ MavenRepositorySearchDialog dialog = new MavenRepositorySearchDialog(getShell(), //
+ Messages.DependenciesComposite_searchDialog_title, IIndex.SEARCH_ARTIFACT, artifacts, true);
+ if(dialog.open() == Window.OK) {
+ IndexedArtifactFile af = (IndexedArtifactFile) dialog.getFirstResult();
+ if(af != null) {
+ Dependency dependency = createDependency(dependencyManagementProvider,
+ POM_PACKAGE.getDependencyManagement_Dependencies(), //
+ af.group, af.artifact, af.version, af.classifier, "jar".equals(nvl(af.type)) ? "" : nvl(af.type), //$NON-NLS-1$ //$NON-NLS-2$
+ "compile".equals(nvl(dialog.getSelectedScope())) ? "" : nvl(dialog.getSelectedScope()));//$NON-NLS-1$ //$NON-NLS-2$
+ dependencyManagementEditor.setInput(dependencyManagementProvider.getValue().getDependencies());
+ dependencyManagementEditor.setSelection(Collections.singletonList(dependency));
+ }
+ }
+ }
+ });
+
+ ToolBarManager modulesToolBarManager = new ToolBarManager(SWT.FLAT);
+
+ modulesToolBarManager.add(new Action(Messages.DependenciesComposite_action_sortAlphabetically, MavenEditorImages.SORT) {
+ {
+ setChecked(false);
+ dependencyManagementContentProvider.setShouldSort(false);
+ }
+
+ @Override
+ public int getStyle() {
+ return AS_CHECK_BOX;
+ }
+
+ @Override
+ public void run() {
+ dependencyManagementContentProvider.setShouldSort(isChecked());
+ dependencyManagementEditor.getViewer().refresh();
+ }
+ });
+
+ modulesToolBarManager.add(new Action(Messages.DependenciesComposite_action_showgroupid,
+ MavenEditorImages.SHOW_GROUP) {
+ {
+ setChecked(false);
+ dependencyManagementComparator.setSortByGroups(false);
+ }
+
+ public int getStyle() {
+ return AS_CHECK_BOX;
+ }
+
+ public void run() {
+ dependencyManagementLabelProvider.setShowGroupId(isChecked());
+ dependencyManagementComparator.setSortByGroups(isChecked());
+ dependencyManagementEditor.getViewer().refresh();
+ }
+ });
+
+ modulesToolBarManager.add(new Action(Messages.DependenciesComposite_action_filter, MavenEditorImages.FILTER) {
+ {
+ setChecked(true);
+ }
+
+ public int getStyle() {
+ return AS_CHECK_BOX;
+ }
+
+ public void run() {
+ TableViewer viewer = dependencyManagementEditor.getViewer();
+ if(isChecked()) {
+ viewer.addFilter(searchFilter);
+ } else {
+ viewer.removeFilter(searchFilter);
+ }
+ viewer.refresh();
+ if(isChecked()) {
+ searchControl.getSearchText().setFocus();
+ }
+ }
+ });
+
+ Composite toolbarComposite = toolkit.createComposite(dependencyManagementSection);
+ GridLayout toolbarLayout = new GridLayout(1, true);
+ toolbarLayout.marginHeight = 0;
+ toolbarLayout.marginWidth = 0;
+ toolbarComposite.setLayout(toolbarLayout);
+ toolbarComposite.setBackground(null);
+
+ modulesToolBarManager.createControl(toolbarComposite);
+ dependencyManagementSection.setTextClient(toolbarComposite);
+ }
+
+
+ @SuppressWarnings("unchecked")
+ public void loadData(Model model, ValueProvider<DependencyManagement> dependencyManagementProvider) {
+ this.model = model;
+ this.dependencyManagementProvider = dependencyManagementProvider;
+ this.dependencyLabelProvider.setPomEditor(editorPage.getPomEditor());
+ this.dependencyManagementLabelProvider.setPomEditor(editorPage.getPomEditor());
+
+ dependenciesEditor.setInput((List<Object>)(List<?>)model.getDependencies());
+
+ DependencyManagement dependencyManagement = dependencyManagementProvider.getValue();
+ dependencyManagementEditor.setInput(dependencyManagement == null ? null : dependencyManagement.getDependencies());
+
+ dependenciesEditor.setReadOnly(editorPage.isReadOnly());
+ dependencyManagementEditor.setReadOnly(editorPage.isReadOnly());
+
+ if(searchControl != null) {
+ searchControl.getSearchText().setEditable(true);
+ }
+ }
+
+ public void updateView(final MavenPomEditorPage editorPage, final Notification notification) {
+ Display.getDefault().asyncExec(new Runnable() {
+ @SuppressWarnings("unchecked")
+ public void run() {
+ EObject object = (EObject) notification.getNotifier();
+
+ // XXX event is not received when <dependencies> is deleted in XML
+ if(object instanceof Model) {
+ Model model2 = (Model) object;
+
+ if(model2.getDependencyManagement() != null && dependencyManagementEditor.getInput() == null) {
+ dependencyManagementEditor.setInput(model2.getDependencyManagement().getDependencies());
+ } else if(model2.getDependencyManagement() == null) {
+ dependencyManagementEditor.setInput(null);
+ }
+
+ if(model2.getDependencies() != null && dependenciesEditor.getInput() == null) {
+ dependenciesEditor.setInput((List<Object>)(List<?>)model2.getDependencies());
+ } else if(model2.getDependencies() == null) {
+ dependenciesEditor.setInput(null);
+ }
+
+ dependenciesEditor.refresh();
+ dependencyManagementEditor.refresh();
+ }
+
+ if(object instanceof DependencyManagement) {
+ if(dependenciesEditor.getInput() == null) {
+ dependenciesEditor.setInput((List<Object>)(List<?>)((DependencyManagement) object).getDependencies());
+ }
+ dependencyManagementEditor.refresh();
+ }
+ }
+ });
+ }
+
+ void setupDependency(ValueProvider<? extends EObject> parentProvider, EReference feature, Dependency dependency) {
+ CompoundCommand compoundCommand = new CompoundCommand();
+ EditingDomain editingDomain = editorPage.getEditingDomain();
+
+ EObject parent = parentProvider.getValue();
+ if(parent == null) {
+ parent = parentProvider.create(editingDomain, compoundCommand);
+ }
+
+ Command addDependencyCommand = AddCommand.create(editingDomain, parent, feature, dependency);
+ compoundCommand.append(addDependencyCommand);
+
+ editingDomain.getCommandStack().execute(compoundCommand);
+ }
+
+ Dependency createDependency(ValueProvider<? extends EObject> parentProvider, EReference feature, String groupId,
+ String artifactId, String version, String classifier, String type, String scope) {
+ CompoundCommand compoundCommand = new CompoundCommand();
+ EditingDomain editingDomain = editorPage.getEditingDomain();
+
+ EObject parent = parentProvider.getValue();
+ if(parent == null) {
+ parent = parentProvider.create(editingDomain, compoundCommand);
+ }
+
+ Dependency dependency = PomFactory.eINSTANCE.createDependency();
+ dependency.setGroupId(groupId);
+ dependency.setArtifactId(artifactId);
+ dependency.setVersion(version);
+ dependency.setClassifier(classifier);
+ dependency.setType(type);
+ dependency.setScope(scope);
+
+ Command addDependencyCommand = AddCommand.create(editingDomain, parent, feature, dependency);
+ compoundCommand.append(addDependencyCommand);
+
+ editingDomain.getCommandStack().execute(compoundCommand);
+
+ return dependency;
+ }
+
+ public void setSearchControl(SearchControl searchControl) {
+ if(this.searchControl != null) {
+ return;
+ }
+
+ this.searchMatcher = new SearchMatcher(searchControl);
+ this.searchFilter = new DependencyFilter(searchMatcher);
+ this.searchControl = searchControl;
+ this.searchControl.getSearchText().addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ selectDepenendencies(dependenciesEditor, model, POM_PACKAGE.getModel_Dependencies());
+ selectDepenendencies(dependencyManagementEditor, dependencyManagementProvider.getValue(),
+ POM_PACKAGE.getDependencyManagement_Dependencies());
+ }
+
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ private void selectDepenendencies(ListEditorComposite<?> editor, EObject parent,
+ EStructuralFeature feature) {
+ if(parent != null) {
+ editor.setSelection((List) parent.eGet(feature));
+ editor.refresh();
+ }
+ }
+ });
+ //we add filter here as the default behaviour is to filter..
+ TableViewer viewer = dependenciesEditor.getViewer();
+ viewer.addFilter(searchFilter);
+ viewer = dependencyManagementEditor.getViewer();
+ viewer.addFilter(searchFilter);
+
+ }
+
+ String getVersion(String groupId, String artifactId, IProgressMonitor monitor) {
+ try {
+ MavenProject mavenProject = editorPage.getPomEditor().readMavenProject(false, monitor);
+ Artifact a = mavenProject.getArtifactMap().get(groupId + ":" + artifactId); //$NON-NLS-1$
+ if(a != null) {
+ return a.getBaseVersion();
+ }
+ } catch(CoreException ex) {
+ MavenLogger.log(ex);
+ }
+ return null;
+ }
+
+ public static class DependencyFilter extends ViewerFilter {
+ private SearchMatcher searchMatcher;
+
+ public DependencyFilter(SearchMatcher searchMatcher) {
+ this.searchMatcher = searchMatcher;
+ }
+
+ public boolean select(Viewer viewer, Object parentElement, Object element) {
+ if(element instanceof Dependency) {
+ Dependency d = (Dependency) element;
+ return searchMatcher.isMatchingArtifact(d.getGroupId(), d.getArtifactId());
+ } else if (element instanceof org.apache.maven.model.Dependency) {
+ org.apache.maven.model.Dependency dependency = (org.apache.maven.model.Dependency) element;
+ return searchMatcher.isMatchingArtifact(dependency.getGroupId(), dependency.getArtifactId());
+ }
+ return false;
+ }
+ }
+
+ void openManageDependenciesDialog() throws InvocationTargetException, InterruptedException {
+ /*
+ * A linked list representing the path from child to root parent pom.
+ * The head is the child, the tail is the root pom
+ */
+ final LinkedList<MavenProject> hierarchy = new LinkedList<MavenProject>();
+
+ IRunnableWithProgress projectLoader = new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+ try {
+ IMavenProjectFacade projectFacade = readMavenProject(monitor);
+ hierarchy.addAll(new ParentGatherer(mavenProject, projectFacade).getParentHierarchy(monitor));
+ } catch(CoreException e) {
+ throw new InvocationTargetException(e);
+ }
+ }
+ };
+
+ PlatformUI.getWorkbench().getProgressService().run(false, true, projectLoader);
+
+ if (hierarchy.isEmpty()) {
+ //We were unable to read the project metadata above, so there was an error.
+ //User has already been notified to fix the problem.
+ return;
+ }
+
+ final ManageDependenciesDialog manageDepDialog = new ManageDependenciesDialog(getShell(), model, hierarchy,
+ pomEditor.getEditingDomain());
+ manageDepDialog.open();
+ }
+
+ /**
+ * Attempts to completely load the current MavenProject so as to get at the
+ * effective pom.
+ *
+ * In the case where the MavenProject cannot be accessed and markers are present,
+ * it will inform the user that they need to fix the problems before they can
+ * proceed.
+ *
+ * @param monitor
+ * @return the IMavenProjectFacade that corresponds to the project, or null if one was not loaded.
+ * @throws CoreException
+ */
+ protected IMavenProjectFacade readMavenProject(IProgressMonitor monitor) throws CoreException {
+ IMaven maven = MavenPlugin.getDefault().getMaven();
+ MavenProjectManager projectManager = MavenPlugin.getDefault().getMavenProjectManager();
+ mavenProject = pomEditor.readMavenProject(false, monitor);
+ if (mavenProject == null) {
+ IMarker[] markers = pomEditor.getPomFile().findMarkers(IMavenConstants.MARKER_ID, true, IResource.DEPTH_ZERO);
+ if (markers != null && markers.length > 0) {
+ Display.getDefault().asyncExec(new Runnable() {
+
+ public void run() {
+ MessageDialog.openError(getShell(), Messages.DependenciesComposite_error, Messages.DependenciesComposite_fixProjectErrors);
+ }
+ });
+ return null;
+ } else {
+ Display.getDefault().asyncExec(new Runnable() {
+
+ public void run() {
+ MessageDialog.openError(getShell(), Messages.DependenciesComposite_error, Messages.DependenciesComposite_checkConsoleForErrors);
+ }
+ });
+ return null;
+ }
+ } else {
+ maven.detachFromSession(mavenProject);
+ }
+ IMavenProjectFacade projectFacade = projectManager.create(pomEditor.getPomFile(), true, monitor);
+ return projectFacade;
+ }
+
+ protected void setDependenciesInput() {
+ List<Object> deps = new ArrayList<Object>(model.getDependencies());
+ if (showInheritedDependencies) {
+
+ /*
+ * Add the inherited dependencies into the bunch. But don't we need to
+ * filter out the dependencies that are duplicated in the M2E model, so
+ * we need to run through each list and only add ones that aren't in both.
+ */
+ List<org.apache.maven.model.Dependency> allDeps = new LinkedList<org.apache.maven.model.Dependency>();
+ allDeps.addAll(facade.getMavenProject().getModel().getDependencies());
+ allDeps.addAll(facade.getMavenProject().getModel().getDependencyManagement().getDependencies());
+ for (org.apache.maven.model.Dependency mavenDep : allDeps) {
+ boolean found = false;
+ Iterator<Dependency> iter = model.getDependencies().iterator();
+ while (!found && iter.hasNext()) {
+ Dependency m2eDep = iter.next();
+ if (mavenDep.getGroupId().equals(m2eDep.getGroupId())
+ && mavenDep.getArtifactId().equals(m2eDep.getArtifactId())
+ && mavenDep.getVersion().equals(m2eDep.getVersion())) {
+ found = true;
+ }
+ }
+ if (!found) {
+ deps.add(mavenDep);
+ }
+ }
+ }
+ dependenciesEditor.setInput(deps);
+ }
+
+ protected class PropertiesListComposite<T> extends ListEditorComposite<T> {
+ private static final String PROPERTIES_BUTTON_KEY = "PROPERTIES"; //$NON-NLS-1$
+ protected Button properties;
+
+ public PropertiesListComposite(Composite parent, int style, boolean includeSearch) {
+ super(parent, style, includeSearch);
+ }
+
+ @Override
+ protected void createButtons(boolean includeSearch) {
+ if(includeSearch) {
+ createAddButton();
+ }
+ createRemoveButton();
+ properties = createButton(Messages.ListEditorComposite_btnProperties);
+ addButton(PROPERTIES_BUTTON_KEY, properties);
+ }
+
+ public void setPropertiesListener(SelectionListener listener) {
+ properties.addSelectionListener(listener);
+ }
+
+ @Override
+ protected void viewerSelectionChanged() {
+ super.viewerSelectionChanged();
+ updatePropertiesButton();
+ }
+
+ protected void updatePropertiesButton() {
+ boolean enable = !viewer.getSelection().isEmpty() && !isBadSelection();
+ properties.setEnabled(!readOnly && enable);
+ }
+
+ @Override
+ protected void updateRemoveButton() {
+ boolean enable = !viewer.getSelection().isEmpty() && !isBadSelection();
+ getRemoveButton().setEnabled(!readOnly && enable);
+ }
+
+ @Override
+ public void setReadOnly(boolean readOnly) {
+ super.setReadOnly(readOnly);
+ updatePropertiesButton();
+ }
+
+ /**
+ * Returns true if the viewer has no input or if there is currently
+ * an inherited dependency selected
+ * @return
+ */
+ protected boolean isBadSelection() {
+ @SuppressWarnings("unchecked")
+ List<Object> deps = (List<Object>) viewer.getInput();
+ if (deps == null || deps.isEmpty()) {
+ return true;
+ }
+ boolean bad = false;
+ IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
+ @SuppressWarnings("unchecked")
+ Iterator<Object> iter = selection.iterator();
+ while (iter.hasNext()) {
+ Object obj = iter.next();
+ if (obj instanceof org.apache.maven.model.Dependency) {
+ bad = true;
+ break;
+ }
+ }
+ return bad;
+ }
+ }
+
+ protected class DependenciesListComposite<T> extends PropertiesListComposite<T> {
+
+ private static final String MANAGE = "MANAGE"; //$NON-NLS-1$
+ protected Button manage;
+
+ public DependenciesListComposite(Composite parent, int style, boolean includeSearch) {
+ super(parent, style, includeSearch);
+ }
+
+ @Override
+ protected void createButtons(boolean includeSearch) {
+ super.createButtons(includeSearch);
+ manage = createButton(Messages.DependenciesComposite_manageButton);
+ addButton(MANAGE, manage);
+ }
+
+ @Override
+ protected void viewerSelectionChanged() {
+ super.viewerSelectionChanged();
+ updateManageButton();
+ }
+
+ @Override
+ public void setReadOnly(boolean readOnly) {
+ super.setReadOnly(readOnly);
+ updateManageButton();
+ }
+
+ protected void updateManageButton() {
+ manage.setEnabled(!readOnly && model.getDependencies() != null && !model.getDependencies().isEmpty());
+ }
+
+ public void setManageButtonListener(SelectionListener listener) {
+ manage.addSelectionListener(listener);
+ }
+ }
+}

Back to the top