diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/bootstrap/GradleBootstrap.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/bootstrap/GradleBootstrap.java
index 254145d26a65..8280bcbc400b 100644
--- a/plugins/gradle/src/org/jetbrains/plugins/gradle/bootstrap/GradleBootstrap.java
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/bootstrap/GradleBootstrap.java
@@ -9,6 +9,7 @@ import com.intellij.openapi.wm.ToolWindowAnchor;
import com.intellij.openapi.wm.ex.ToolWindowManagerEx;
import com.intellij.ui.content.impl.ContentImpl;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.plugins.gradle.diff.GradleProjectStructureHelper;
import org.jetbrains.plugins.gradle.sync.GradleProjectStructureChangesModel;
import org.jetbrains.plugins.gradle.sync.GradleProjectStructureChangesPanel;
import org.jetbrains.plugins.gradle.ui.GradleIcons;
@@ -25,10 +26,14 @@ public class GradleBootstrap extends AbstractProjectComponent {
private static final String GRADLE_TOOL_WINDOW_ID = GradleBundle.message("gradle.name");
private final GradleProjectStructureChangesModel myChangesModel;
+ private final GradleProjectStructureHelper myProjectStructureHelper;
- public GradleBootstrap(@NotNull Project project, @NotNull GradleProjectStructureChangesModel changesModel) {
+ public GradleBootstrap(@NotNull Project project,
+ @NotNull GradleProjectStructureChangesModel changesModel,
+ @NotNull GradleProjectStructureHelper projectStructureHelper) {
super(project);
myChangesModel = changesModel;
+ myProjectStructureHelper = projectStructureHelper;
}
@Override
@@ -46,7 +51,8 @@ public class GradleBootstrap extends AbstractProjectComponent {
ToolWindow toolWindow = manager.registerToolWindow(GRADLE_TOOL_WINDOW_ID, false, ToolWindowAnchor.RIGHT);
toolWindow.setIcon(GradleIcons.GRADLE_ICON);
String syncTitle = GradleBundle.message("gradle.sync.title.tab");
- final GradleProjectStructureChangesPanel projectStructureChanges = new GradleProjectStructureChangesPanel(myProject, myChangesModel);
+ final GradleProjectStructureChangesPanel projectStructureChanges
+ = new GradleProjectStructureChangesPanel(myProject, myChangesModel, myProjectStructureHelper);
toolWindow.getContentManager().addContent(new ContentImpl(projectStructureChanges, syncTitle, true));
}
}
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleToolWindowPanel.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleToolWindowPanel.java
index 063cb6eee62b..585e30522962 100644
--- a/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleToolWindowPanel.java
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleToolWindowPanel.java
@@ -9,6 +9,7 @@ import com.intellij.ui.ScrollPaneFactory;
import com.intellij.util.messages.MessageBusConnection;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.plugins.gradle.diff.GradleProjectStructureHelper;
import org.jetbrains.plugins.gradle.util.GradleBundle;
import org.jetbrains.plugins.gradle.ui.RichTextControlBuilder;
@@ -41,11 +42,16 @@ public abstract class GradleToolWindowPanel extends SimpleToolWindowPanel {
/** Top-level container, managed by the card layout. */
private final JPanel myContent = new JPanel(myLayout);
- private final Project myProject;
+ private final Project myProject;
+ private final GradleProjectStructureHelper myProjectStructureHelper;
- protected GradleToolWindowPanel(@NotNull Project project, @NotNull String place) {
+ protected GradleToolWindowPanel(@NotNull Project project,
+ @Nullable GradleProjectStructureHelper projectStructureHelper,
+ @NotNull String place)
+ {
super(true);
myProject = project;
+ myProjectStructureHelper = projectStructureHelper;
final ActionManager actionManager = ActionManager.getInstance();
final ActionGroup actionGroup = (ActionGroup)actionManager.getAction(TOOL_WINDOW_TOOLBAR_ID);
ActionToolbar actionToolbar = actionManager.createActionToolbar(place, actionGroup, true);
@@ -91,6 +97,11 @@ public abstract class GradleToolWindowPanel extends SimpleToolWindowPanel {
return myProject;
}
+ @NotNull
+ public GradleProjectStructureHelper getProjectStructureHelper() {
+ return myProjectStructureHelper;
+ }
+
/**
* @return GUI control to be displayed at the current tab
*/
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPanel.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPanel.java
index b2d0a5ce81eb..65fb40336251 100644
--- a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPanel.java
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesPanel.java
@@ -1,38 +1,18 @@
package org.jetbrains.plugins.gradle.sync;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
-import com.intellij.openapi.roots.LibraryOrderEntry;
-import com.intellij.openapi.roots.ModuleRootManager;
-import com.intellij.openapi.roots.OrderEntry;
-import com.intellij.openapi.roots.RootPolicy;
import com.intellij.ui.treeStructure.Tree;
import com.intellij.util.containers.ContainerUtil;
-import com.intellij.util.containers.hash.HashMap;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.plugins.gradle.config.GradleTextAttributes;
import org.jetbrains.plugins.gradle.config.GradleToolWindowPanel;
-import org.jetbrains.plugins.gradle.diff.*;
-import org.jetbrains.plugins.gradle.model.GradleLibraryDependency;
-import org.jetbrains.plugins.gradle.model.GradleModule;
-import org.jetbrains.plugins.gradle.model.Named;
-import org.jetbrains.plugins.gradle.ui.GradleIcons;
-import org.jetbrains.plugins.gradle.ui.GradleProjectStructureNodeDescriptor;
-import org.jetbrains.plugins.gradle.util.GradleBundle;
+import org.jetbrains.plugins.gradle.diff.GradleProjectStructureChange;
+import org.jetbrains.plugins.gradle.diff.GradleProjectStructureHelper;
import org.jetbrains.plugins.gradle.util.GradleConstants;
import javax.swing.*;
-import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.DefaultTreeModel;
-import javax.swing.tree.MutableTreeNode;
-import javax.swing.tree.TreeNode;
import java.awt.*;
-import java.util.ArrayList;
import java.util.Collection;
-import java.util.List;
-import java.util.Map;
/**
* UI control for showing difference between the gradle and intellij project structure.
@@ -42,31 +22,15 @@ import java.util.Map;
*/
public class GradleProjectStructureChangesPanel extends GradleToolWindowPanel {
- /**
- *
- * ...
- * |_module <- module's name is a key
- * |_...
- * |_dependencies <- dependencies holder node is a value
- * |_dependency1
- * |_dependency2
- *
- */
- private final Map myModuleDependencies = new HashMap();
- private final Map myModules = new HashMap();
+ private GradleProjectStructureTreeModel myTreeModel;
+ private JPanel myContent;
- private final TreeNode[] myNodeHolder = new TreeNode[1];
- private final int[] myIndexHolder = new int[1];
-
- private final GradleProjectStructureChangesModel myChangesModel;
-
- private DefaultTreeModel myTreeModel;
- private JPanel myContent;
-
- public GradleProjectStructureChangesPanel(@NotNull Project project, @NotNull GradleProjectStructureChangesModel model) {
- super(project, GradleConstants.TOOL_WINDOW_TOOLBAR_PLACE);
- myChangesModel = model;
- myChangesModel.addListener(new GradleProjectStructureChangeListener() {
+ public GradleProjectStructureChangesPanel(@NotNull Project project,
+ @NotNull GradleProjectStructureChangesModel model,
+ @NotNull GradleProjectStructureHelper projectStructureHelper)
+ {
+ super(project, projectStructureHelper, GradleConstants.TOOL_WINDOW_TOOLBAR_PLACE);
+ model.addListener(new GradleProjectStructureChangeListener() {
@Override
public void onChanges(@NotNull final Collection oldChanges,
@NotNull final Collection currentChanges)
@@ -74,111 +38,30 @@ public class GradleProjectStructureChangesPanel extends GradleToolWindowPanel {
UIUtil.invokeLaterIfNeeded(new Runnable() {
@Override
public void run() {
- updateTree(currentChanges);
- processObsoleteChanges(ContainerUtil.subtract(oldChanges, currentChanges));
-
+ myTreeModel.update(currentChanges);
+ myTreeModel.pruneObsoleteNodes(ContainerUtil.subtract(oldChanges, currentChanges));
}
});
}
});
- rebuildTree();
}
- @NotNull
- private DefaultTreeModel init() {
+ private void init() {
myContent = new JPanel(new GridBagLayout());
- DefaultTreeModel treeModel = new DefaultTreeModel(null);
- Tree tree = new Tree(treeModel);
+ myTreeModel = new GradleProjectStructureTreeModel(getProject(), getProjectStructureHelper());
+ Tree tree = new Tree(myTreeModel);
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
constraints.weightx = constraints.weighty = 1;
myContent.add(tree, constraints);
myContent.setBackground(tree.getBackground());
- return treeModel;
- }
-
- private void rebuildTree() {
- myModules.clear();
- myModuleDependencies.clear();
-
- DefaultMutableTreeNode root = new DefaultMutableTreeNode(buildDescriptor(getProject()));
- final Module[] modules = ModuleManager.getInstance(getProject()).getModules();
- RootPolicy policy = new RootPolicy() {
- @Override
- public LibraryOrderEntry visitLibraryOrderEntry(LibraryOrderEntry libraryOrderEntry, LibraryOrderEntry value) {
- return libraryOrderEntry;
- }
- };
- for (Module module : modules) {
- final DefaultMutableTreeNode moduleNode = new DefaultMutableTreeNode(buildDescriptor(module));
- myModules.put(module.getName(), moduleNode); // Assuming that module names are unique.
- List libraryDependencies = new ArrayList();
- final ModuleRootManager moduleRootManager = ModuleRootManager.getInstance(module);
- for (OrderEntry orderEntry : moduleRootManager.getOrderEntries()) {
- final LibraryOrderEntry library = orderEntry.accept(policy, null);
- if (library != null) {
- libraryDependencies.add(library);
- }
- }
- if (!libraryDependencies.isEmpty()) {
- DefaultMutableTreeNode dependenciesNode = getDependenciesNode(module.getName());
- for (LibraryOrderEntry dependency : libraryDependencies) {
- dependenciesNode.add(new DefaultMutableTreeNode(buildDescriptor(dependency)));
- }
- }
- root.add(moduleNode);
- }
-
- myTreeModel.setRoot(root);
- updateTree(myChangesModel.getChanges());
- }
-
- private static GradleProjectStructureNodeDescriptor