diff --git a/plugins/maven/maven.iml b/plugins/maven/maven.iml
index 084702bf62a3..8889960a8ff7 100644
--- a/plugins/maven/maven.iml
+++ b/plugins/maven/maven.iml
@@ -93,6 +93,8 @@
+
+
@@ -105,7 +107,6 @@
-
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.java
index c06efd681e64..b2606733ea80 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.java
@@ -20,15 +20,15 @@ import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import com.intellij.openapi.project.DumbAwareRunnable;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.Pair;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowAnchor;
-import com.intellij.openapi.wm.ToolWindowManager;
-import com.intellij.openapi.util.Pair;
+import com.intellij.openapi.wm.ex.ToolWindowManagerAdapter;
+import com.intellij.openapi.wm.ex.ToolWindowManagerEx;
import com.intellij.ui.treeStructure.SimpleTree;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.TestOnly;
import org.jetbrains.idea.maven.project.*;
-import org.jetbrains.idea.maven.project.MavenProject;
import org.jetbrains.idea.maven.tasks.MavenShortcutsManager;
import org.jetbrains.idea.maven.tasks.MavenTasksManager;
import org.jetbrains.idea.maven.utils.MavenIcons;
@@ -60,6 +60,7 @@ public class MavenProjectsNavigator extends SimpleProjectComponent implements Pe
private SimpleTree myTree;
private MavenProjectsStructure myStructure;
+ private ToolWindow myToolWindow;
public static MavenProjectsNavigator getInstance(Project project) {
return project.getComponent(MavenProjectsNavigator.class);
@@ -81,7 +82,7 @@ public class MavenProjectsNavigator extends SimpleProjectComponent implements Pe
public void loadState(MavenProjectsNavigatorState state) {
myState = state;
- update(true);
+ scheduleStructureUpdate();
}
public boolean getGroupModules() {
@@ -91,7 +92,7 @@ public class MavenProjectsNavigator extends SimpleProjectComponent implements Pe
public void setGroupModules(boolean value) {
if (myState.groupStructurally != value) {
myState.groupStructurally = value;
- update(true);
+ scheduleStructureUpdate();
}
}
@@ -102,7 +103,7 @@ public class MavenProjectsNavigator extends SimpleProjectComponent implements Pe
public void setShowIgnored(boolean value) {
if (myState.showIgnored != value) {
myState.showIgnored = value;
- update(true);
+ scheduleStructureUpdate();
}
}
@@ -113,7 +114,7 @@ public class MavenProjectsNavigator extends SimpleProjectComponent implements Pe
public void setShowBasicPhasesOnly(boolean value) {
if (myState.showBasicPhasesOnly != value) {
myState.showBasicPhasesOnly = value;
- update(false);
+ scheduleStructureUpdate();
}
}
@@ -126,16 +127,13 @@ public class MavenProjectsNavigator extends SimpleProjectComponent implements Pe
@TestOnly
public void initForTests() {
doInit();
+ initTree();
+ initStructure();
}
private void doInit() {
- if (myInitialized.getAndSet(true)) return;
-
- initTree();
- listenForActivation();
-
+ listenForProjectsChanges();
if (isUnitTestMode()) return;
-
MavenUtil.runWhenInitialized(myProject, new DumbAwareRunnable() {
public void run() {
initToolWindow();
@@ -145,11 +143,46 @@ public class MavenProjectsNavigator extends SimpleProjectComponent implements Pe
@Override
public void disposeComponent() {
- myInitialized.set(false);
}
- private boolean isInitialized() {
- return myInitialized.get();
+ private void listenForProjectsChanges() {
+ myProjectsManager.addProjectsTreeListener(new MyProjectsListener());
+
+ myShortcutsManager.addListener(new MavenShortcutsManager.Listener() {
+ public void shortcutsUpdated() {
+ scheduleStructureRequest(new Runnable() {
+ public void run() {
+ myStructure.updateGoals();
+ }
+ });
+ }
+ });
+
+ myTasksManager.addListener(new MavenTasksManager.Listener() {
+ public void compileTasksChanged() {
+ scheduleStructureRequest(new Runnable() {
+ public void run() {
+ myStructure.updateGoals();
+ }
+ });
+ }
+ });
+ }
+
+ private void initToolWindow() {
+ initTree();
+ JPanel panel = new MavenProjectsNavigatorPanel(myProject, myTree);
+
+ ToolWindowManagerEx manager = ToolWindowManagerEx.getInstanceEx(myProject);
+ myToolWindow = manager.registerToolWindow(TOOL_WINDOW_ID, panel, ToolWindowAnchor.RIGHT, myProject, true);
+ myToolWindow.setIcon(MavenIcons.MAVEN_ICON);
+
+ manager.addToolWindowManagerListener(new ToolWindowManagerAdapter() {
+ @Override
+ public void stateChanged() {
+ scheduleStructureUpdate();
+ }
+ });
}
private void initTree() {
@@ -182,65 +215,6 @@ public class MavenProjectsNavigator extends SimpleProjectComponent implements Pe
};
myTree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
- myStructure = new MavenProjectsStructure(myProject, myProjectsManager, myTasksManager, myShortcutsManager, this, myTree);
- }
-
- private void listenForActivation() {
- myProjectsManager.addManagerListener(new MavenProjectsManager.Listener() {
- public void activated() {
- scheduleStructureUpdate(new Runnable() {
- public void run() {
- myStructure.buildTree();
- }
- });
- listenForProjectsChanges();
- }
-
- public void scheduledImportsChanged() {
- }
- });
- }
-
- private void listenForProjectsChanges() {
- myProjectsManager.addProjectsTreeListener(new MyProjectsListener());
-
- myShortcutsManager.addListener(new MavenShortcutsManager.Listener() {
- public void shortcutsUpdated() {
- scheduleStructureUpdate(new Runnable() {
- public void run() {
- myStructure.updateGoals();
- }
- });
- }
- });
-
- myTasksManager.addListener(new MavenTasksManager.Listener() {
- public void compileTasksChanged() {
- scheduleStructureUpdate(new Runnable() {
- public void run() {
- myStructure.updateGoals();
- }
- });
- }
- });
- }
-
- private void initToolWindow() {
- JPanel panel = new MavenProjectsNavigatorPanel(myProject, myTree);
-
- ToolWindowManager manager = ToolWindowManager.getInstance(myProject);
- ToolWindow toolWindow = manager.registerToolWindow(TOOL_WINDOW_ID, panel, ToolWindowAnchor.RIGHT, myProject, true);
- toolWindow.setIcon(MavenIcons.MAVEN_ICON);
- }
-
- private void update(boolean restructure) {
- if (!isInitialized()) return;
- myStructure.update(restructure);
- }
-
- public void selectInTree(MavenProject project) {
- if (!isInitialized()) return;
- myStructure.select(project);
}
@TestOnly
@@ -248,14 +222,56 @@ public class MavenProjectsNavigator extends SimpleProjectComponent implements Pe
return myStructure;
}
- private void scheduleStructureUpdate(Runnable r) {
- MavenUtil.invokeLater(myProject, r);
+ public void selectInTree(final MavenProject project) {
+ scheduleStructureRequest(new Runnable() {
+ public void run() {
+ myStructure.select(project);
+ }
+ });
}
- private class MyProjectsListener extends MavenProjectsTree.ListenerAdapter {
+ private void scheduleStructureRequest(final Runnable r) {
+ if (isUnitTestMode()) {
+ r.run();
+ return;
+ }
+
+ if (myToolWindow == null) return;
+ MavenUtil.invokeLater(myProject, new Runnable() {
+ public void run() {
+ if (!myToolWindow.isVisible()) return;
+ if (myStructure == null) {
+ initStructure();
+ }
+ r.run();
+ }
+ });
+ }
+
+ private void initStructure() {
+ myStructure = new MavenProjectsStructure(myProject, myProjectsManager, myTasksManager,
+ myShortcutsManager, this, myTree);
+ }
+
+ private void scheduleStructureUpdate() {
+ scheduleStructureRequest(new Runnable() {
+ public void run() {
+ myStructure.update();
+ }
+ });
+ }
+
+ private class MyProjectsListener extends MavenProjectsTree.ListenerAdapter implements MavenProjectsManager.Listener {
+ public void activated() {
+ scheduleStructureUpdate();
+ }
+
+ public void scheduledImportsChanged() {
+ }
+
@Override
public void projectsIgnoredStateChanged(final List ignored, final List unignored, Object message) {
- scheduleStructureUpdate(new Runnable() {
+ scheduleStructureRequest(new Runnable() {
public void run() {
myStructure.updateIgnored(ContainerUtil.concat(ignored, unignored));
}
@@ -264,7 +280,7 @@ public class MavenProjectsNavigator extends SimpleProjectComponent implements Pe
@Override
public void profilesChanged(final List profiles) {
- scheduleStructureUpdate(new Runnable() {
+ scheduleStructureRequest(new Runnable() {
public void run() {
myStructure.setActiveProfiles(profiles);
}
@@ -272,30 +288,26 @@ public class MavenProjectsNavigator extends SimpleProjectComponent implements Pe
}
@Override
- public void projectsUpdated(final List> updated,
- final List deleted,
+ public void projectsUpdated(List> updated,
+ List deleted,
Object message) {
- scheduleStructureUpdate(new Runnable() {
- public void run() {
- myStructure.updateProjects(MavenUtil.collectFirsts(updated), deleted);
- }
- });
+ scheduleUpdateProjects(MavenUtil.collectFirsts(updated), deleted);
}
public void projectResolved(Pair projectWithChanges,
org.apache.maven.project.MavenProject nativeMavenProject,
Object message) {
- updateProject(projectWithChanges.first);
+ scheduleUpdateProjects(Collections.singletonList(projectWithChanges.first), Collections.EMPTY_LIST);
}
public void pluginsResolved(MavenProject project) {
- updateProject(project);
+ scheduleUpdateProjects(Collections.singletonList(project), Collections.EMPTY_LIST);
}
- private void updateProject(final MavenProject project) {
- scheduleStructureUpdate(new Runnable() {
+ private void scheduleUpdateProjects(final List projects, final List deleted) {
+ scheduleStructureRequest(new Runnable() {
public void run() {
- myStructure.updateProjects(Collections.singletonList(project), Collections.EMPTY_LIST);
+ myStructure.updateProjects(projects, deleted);
}
});
}
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsStructure.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsStructure.java
index 31b57e9f61ea..68e2831f5d8e 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsStructure.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsStructure.java
@@ -121,17 +121,11 @@ public class MavenProjectsStructure extends SimpleTreeStructure {
return myRoot;
}
- public void buildTree() {
- updateProjects(myProjectsManager.getProjects(), Collections.EMPTY_LIST);
- }
-
- public void update(boolean restructure) {
- if (restructure) {
- buildTree();
- }
- else {
- updateFrom(myRoot);
- }
+ public void update() {
+ List projects = myProjectsManager.getProjects();
+ List deleted = new ArrayList(myProjectToNodeMapping.keySet());
+ deleted.removeAll(projects);
+ updateProjects(projects, deleted);
}
private void updateFrom(SimpleNode node) {
diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/SelectFromMavenProjectsDialog.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/SelectFromMavenProjectsDialog.java
index 1b2deaceb2fe..09becfd63c83 100644
--- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/SelectFromMavenProjectsDialog.java
+++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/SelectFromMavenProjectsDialog.java
@@ -62,7 +62,7 @@ public class SelectFromMavenProjectsDialog extends DialogWrapper {
return false;
}
};
- treeStructure.buildTree();
+ treeStructure.update();
final SimpleNode[] selection = new SimpleNode[]{null};
treeStructure.accept(new SimpleNodeVisitor() {
diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigatorTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigatorTest.java
index fbf7409b0f33..86a61b90dd1b 100644
--- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigatorTest.java
+++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigatorTest.java
@@ -32,9 +32,9 @@ public class MavenProjectsNavigatorTest extends MavenImportingTestCase {
initProjectsManager(false);
myNavigator = MavenProjectsNavigator.getInstance(myProject);
+ myNavigator.initForTests();
myNavigator.setGroupModules(true);
- myNavigator.initForTests();
myStructure = myNavigator.getStructureForTests();
}
@@ -52,7 +52,6 @@ public class MavenProjectsNavigatorTest extends MavenImportingTestCase {
"1");
myProjectsManager.resetManagedFilesAndProfilesInTests(Collections.singletonList(myProjectPom), Collections.EMPTY_LIST);
waitForReadingCompletion();
- assertTrue(getRootNodes().isEmpty());
myProjectsManager.fireActivatedInTests();
assertEquals(1, getRootNodes().size());
@@ -112,7 +111,7 @@ public class MavenProjectsNavigatorTest extends MavenImportingTestCase {
assertEquals(m, getRootNodes().get(0).getModulesNode().getProjectNodes().get(0).getFile());
}
- public void testReconnectingModulesWhenProjectBacomesParent() throws Exception {
+ public void testReconnectingModulesWhenProjectBecomesParent() throws Exception {
myProjectsManager.fireActivatedInTests();
createProjectPom("test" +