diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerParametersConfigurable.form b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerParametersConfigurable.form
index 501a0aa5632b..5f4393018aff 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerParametersConfigurable.form
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerParametersConfigurable.form
@@ -8,16 +8,6 @@
-
-
-
-
-
-
-
-
-
-
@@ -78,6 +68,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerParametersConfigurable.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerParametersConfigurable.java
index 037b30bb1a3c..57e087eb5935 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerParametersConfigurable.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerParametersConfigurable.java
@@ -18,29 +18,42 @@ package org.jetbrains.idea.maven.execution;
import com.intellij.codeInsight.completion.CompletionResultSet;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.execution.configurations.ParametersList;
+import com.intellij.icons.AllIcons;
+import com.intellij.ide.util.treeView.NodeRenderer;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.ui.FixedSizeButton;
import com.intellij.openapi.ui.LabeledComponent;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
+import com.intellij.openapi.ui.popup.JBPopup;
+import com.intellij.openapi.ui.popup.PopupChooserBuilder;
+import com.intellij.openapi.util.Ref;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.EditorTextField;
import com.intellij.ui.PanelWithAnchor;
-import com.intellij.ui.components.JBCheckBox;
import com.intellij.ui.components.JBLabel;
+import com.intellij.ui.treeStructure.Tree;
import com.intellij.util.TextFieldCompletionProvider;
import com.intellij.util.execution.ParametersListUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.maven.model.MavenConstants;
+import org.jetbrains.idea.maven.project.MavenProject;
import org.jetbrains.idea.maven.project.MavenProjectsManager;
+import org.jetbrains.idea.maven.utils.MavenProjectNamer;
import org.jetbrains.idea.maven.utils.Strings;
import javax.swing.*;
-import java.util.LinkedHashMap;
-import java.util.Map;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.TreePath;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.*;
+import java.util.List;
/**
* @author Vladislav.Kaznacheev
@@ -52,6 +65,7 @@ public abstract class MavenRunnerParametersConfigurable implements Configurable,
private LabeledComponent profilesComponent;
private JBLabel myFakeLabel;
private JCheckBox myResolveToWorkspaceCheckBox;
+ private JPanel myWorkingDirectoryPanel;
private JComponent anchor;
public MavenRunnerParametersConfigurable(@NotNull final Project project) {
@@ -91,9 +105,104 @@ public abstract class MavenRunnerParametersConfigurable implements Configurable,
goalsComponent.setComponent(new MavenArgumentsCompletionProvider(project).createEditor(project));
}
+ createShowProjectTreeButton(project);
+
setAnchor(profilesComponent.getLabel());
}
+ private void createShowProjectTreeButton(final Project project) {
+ final FixedSizeButton showProjectTreeButton = new FixedSizeButton();
+ showProjectTreeButton.setIcon(AllIcons.Actions.Module);
+
+ showProjectTreeButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ MavenProjectsManager projectsManager = MavenProjectsManager.getInstance(project);
+
+ List projectList = projectsManager.getProjects();
+ if (projectList.isEmpty()) return;
+
+ MavenProject[] projects = projectList.toArray(new MavenProject[projectList.size()]);
+ Arrays.sort(projects, new MavenProjectNamer.MavenProjectComparator());
+
+ Map projectsToNode = new HashMap();
+ for (MavenProject mavenProject : projects) {
+ projectsToNode.put(mavenProject, new DefaultMutableTreeNode(mavenProject));
+ }
+
+ DefaultMutableTreeNode root = new DefaultMutableTreeNode();
+
+ for (MavenProject mavenProject : projects) {
+ DefaultMutableTreeNode parent;
+
+ MavenProject aggregator = projectsManager.findAggregator(mavenProject);
+ if (aggregator != null) {
+ parent = projectsToNode.get(aggregator);
+ }
+ else {
+ parent = root;
+ }
+
+ parent.add(projectsToNode.get(mavenProject));
+ }
+
+ final Map projectsNameMap = MavenProjectNamer.generateNameMap(projectList);
+
+ final JTree projectTree = new Tree(root);
+ projectTree.setRootVisible(false);
+ projectTree.setCellRenderer(new NodeRenderer() {
+ @Override
+ public void customizeCellRenderer(JTree tree,
+ Object value,
+ boolean selected,
+ boolean expanded,
+ boolean leaf,
+ int row,
+ boolean hasFocus) {
+ if (value instanceof DefaultMutableTreeNode) {
+ MavenProject mavenProject = (MavenProject)((DefaultMutableTreeNode)value).getUserObject();
+ value = projectsNameMap.get(mavenProject);
+ }
+
+ super.customizeCellRenderer(tree, value, selected, expanded, leaf, row, hasFocus);
+ }
+ });
+
+ final Ref popupRef = new Ref();
+
+ Runnable clickCallBack = new Runnable() {
+ @Override
+ public void run() {
+ TreePath path = projectTree.getSelectionPath();
+ if (path == null) return;
+
+ Object lastPathComponent = path.getLastPathComponent();
+ if (!(lastPathComponent instanceof DefaultMutableTreeNode)) return;
+
+ Object object = ((DefaultMutableTreeNode)lastPathComponent).getUserObject();
+ if (object == null) return; // may be it's the root
+
+ workingDirComponent.getComponent().setText(((MavenProject)object).getDirectory());
+
+ popupRef.get().closeOk(null);
+ }
+ };
+
+ JBPopup popup = new PopupChooserBuilder(projectTree)
+ .setTitle("Select maven project")
+ .setItemChoosenCallback(clickCallBack).setAutoselectOnMouseMove(true)
+ .setCloseOnEnter(false)
+ .createPopup();
+
+ popupRef.set(popup);
+
+ popup.showUnderneathOf(showProjectTreeButton);
+ }
+ });
+
+ myWorkingDirectoryPanel.add(showProjectTreeButton, BorderLayout.EAST);
+ }
+
public JComponent createComponent() {
return panel;
}
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenProjectNamer.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenProjectNamer.java
index 201c88cdefd7..80b953e61313 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenProjectNamer.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenProjectNamer.java
@@ -1,6 +1,5 @@
package org.jetbrains.idea.maven.utils;
-import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Comparing;
import com.intellij.util.containers.MultiMap;
import gnu.trove.THashMap;
@@ -86,22 +85,7 @@ public class MavenProjectNamer {
private static void doBuildProjectTree(MavenProjectsManager manager, Map res, List rootProjects, int deep) {
MavenProject[] rootProjectArray = rootProjects.toArray(new MavenProject[rootProjects.size()]);
- Arrays.sort(rootProjectArray, new Comparator() {
- @Override
- public int compare(MavenProject o1, MavenProject o2) {
- MavenId id1 = o1.getMavenId();
- MavenId id2 = o2.getMavenId();
-
- int res = Comparing.compare(id1.getGroupId(), id2.getGroupId());
- if (res != 0) return res;
-
- res = Comparing.compare(id1.getArtifactId(), id2.getArtifactId());
- if (res != 0) return res;
-
- res = Comparing.compare(id1.getVersion(), id2.getVersion());
- return res;
- }
- });
+ Arrays.sort(rootProjectArray, new MavenProjectComparator());
for (MavenProject project : rootProjectArray) {
if (!res.containsKey(project)) {
@@ -120,4 +104,20 @@ public class MavenProjectNamer {
return res;
}
+ public static class MavenProjectComparator implements Comparator {
+ @Override
+ public int compare(MavenProject o1, MavenProject o2) {
+ MavenId id1 = o1.getMavenId();
+ MavenId id2 = o2.getMavenId();
+
+ int res = Comparing.compare(id1.getGroupId(), id2.getGroupId());
+ if (res != 0) return res;
+
+ res = Comparing.compare(id1.getArtifactId(), id2.getArtifactId());
+ if (res != 0) return res;
+
+ res = Comparing.compare(id1.getVersion(), id2.getVersion());
+ return res;
+ }
+ }
}