From 470a8ff0f794badb44aaa9f48da7eac176e06df6 Mon Sep 17 00:00:00 2001 From: "Denis.Zhdanov" Date: Fri, 28 Oct 2011 14:04:49 +0400 Subject: [PATCH] IDEA-75726 Gradle: Allow to adjust project settings prior to importing 1. Dependencies model is refactored in order to share common functionality at the base class; 2. Added ability to adjust module dependency settings prior to importing; --- .../importing/GradleModulesImporter.java | 4 +- .../model/AbstractGradleDependency.java | 81 ++++++++++++++++-- .../model/GradleLibraryDependency.java | 85 +------------------ .../model/GradleModuleDependency.java | 34 +------- .../GradleAdjustImportSettingsUtil.java | 41 +++++++++ .../GradleLibraryDependencySettings.java | 36 ++------ .../GradleModuleDependencySettings.java | 52 ++++++++++++ .../adjust/GradleProjectStructureFactory.java | 7 +- 8 files changed, 190 insertions(+), 150 deletions(-) create mode 100644 plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleModuleDependencySettings.java diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleModulesImporter.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleModulesImporter.java index 9ffe4201140a..4830411f2202 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleModulesImporter.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/GradleModulesImporter.java @@ -259,7 +259,7 @@ public class GradleModulesImporter { dependency.invite(new GradleEntityVisitorAdapter() { @Override public void visit(@NotNull GradleModuleDependency dependency) { - ModuleOrderEntry orderEntry = model.addModuleOrderEntry(modules.get(dependency.getModule())); + ModuleOrderEntry orderEntry = model.addModuleOrderEntry(modules.get(dependency.getTarget())); orderEntry.setExported(dependency.isExported()); orderEntry.setScope(dependency.getScope()); } @@ -412,7 +412,7 @@ public class GradleModulesImporter { GradleEntityVisitor visitor = new GradleEntityVisitorAdapter() { @Override public void visit(@NotNull GradleLibraryDependency dependency) { - GradleLibrary gradleLibrary = dependency.getLibrary(); + GradleLibrary gradleLibrary = dependency.getTarget(); Library intellijLibrary = libraryMappings.get(gradleLibrary); if (intellijLibrary == null) { GradleLog.LOG.warn(String.format( diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/model/AbstractGradleDependency.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/model/AbstractGradleDependency.java index 5e26f0accf18..dde3f117abb2 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/model/AbstractGradleDependency.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/model/AbstractGradleDependency.java @@ -3,16 +3,35 @@ package org.jetbrains.plugins.gradle.importing.model; import com.intellij.openapi.roots.DependencyScope; import org.jetbrains.annotations.NotNull; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.io.IOException; +import java.io.ObjectInputStream; + /** * @author Denis Zhdanov * @since 8/10/11 6:41 PM */ -public abstract class AbstractGradleDependency extends AbstractGradleEntity implements GradleDependency { +public abstract class AbstractGradleDependency extends AbstractGradleEntity implements GradleDependency, Named { private static final long serialVersionUID = 1L; + + private final T myTarget; private DependencyScope myScope = DependencyScope.COMPILE; - private boolean myExported; + + private transient boolean mySkipNameChange; + private boolean myExported; + + protected AbstractGradleDependency(@NotNull T dependency) { + myTarget = dependency; + initListener(); + } + + @NotNull + public T getTarget() { + return myTarget; + } @Override @NotNull @@ -33,19 +52,69 @@ public abstract class AbstractGradleDependency extends AbstractGradleEntity impl myExported = exported; } + @NotNull @Override - public int hashCode() { - return 31; + public String getName() { + return myTarget.getName(); + } + + @Override + public void setName(@NotNull String name) { + mySkipNameChange = true; + try { + String oldName = myTarget.getName(); + myTarget.setName(name); + firePropertyChange(Named.NAME_PROPERTY, oldName, name); + } + finally { + mySkipNameChange = false; + } + } + + private void initListener() { + myTarget.addPropertyChangeListener(new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (mySkipNameChange || !Named.NAME_PROPERTY.equals(evt.getPropertyName())) { + return; + } + mySkipNameChange = true; + try { + firePropertyChange(Named.NAME_PROPERTY, evt.getOldValue(), evt.getNewValue()); + } + finally { + mySkipNameChange = false; + } + } + }); + } + + @SuppressWarnings("MethodOverridesPrivateMethodOfSuperclass") + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + in.defaultReadObject(); + initListener(); } + @Override + public int hashCode() { + return myTarget.hashCode(); + } + @Override public boolean equals(Object o) { - return this == o || (o != null && getClass() == o.getClass()); + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + AbstractGradleDependency that = (AbstractGradleDependency)o; + return myTarget.equals(that.myTarget); } @Override public String toString() { - return "scope: " + getScope() + ", exported: " + isExported(); + return "scope: " + getScope() + ", exported: " + isExported() + ", dependency: " + getTarget(); } @NotNull diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/model/GradleLibraryDependency.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/model/GradleLibraryDependency.java index 72dd14ef3c2a..6d9c04d58191 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/model/GradleLibraryDependency.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/model/GradleLibraryDependency.java @@ -2,30 +2,16 @@ package org.jetbrains.plugins.gradle.importing.model; import org.jetbrains.annotations.NotNull; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.io.IOException; -import java.io.ObjectInputStream; - /** * Not thread-safe. * * @author Denis Zhdanov * @since 8/10/11 6:46 PM */ -public class GradleLibraryDependency extends AbstractGradleDependency implements Named { - - private final GradleLibrary myLibrary; - private transient boolean mySkipNameChange; +public class GradleLibraryDependency extends AbstractGradleDependency implements Named { public GradleLibraryDependency(@NotNull GradleLibrary library) { - myLibrary = library; - initListener(); - } - - @NotNull - public GradleLibrary getLibrary() { - return myLibrary; + super(library); } @Override @@ -33,75 +19,10 @@ public class GradleLibraryDependency extends AbstractGradleDependency implements visitor.visit(this); } - @NotNull - @Override - public String getName() { - return myLibrary.getName(); - } - - @Override - public void setName(@NotNull String name) { - mySkipNameChange = true; - try { - String oldName = myLibrary.getName(); - myLibrary.setName(name); - firePropertyChange(Named.NAME_PROPERTY, oldName, name); - } - finally { - mySkipNameChange = false; - } - } - - @SuppressWarnings("MethodOverridesPrivateMethodOfSuperclass") - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - initListener(); - } - - private void initListener() { - myLibrary.addPropertyChangeListener(new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - if (mySkipNameChange || !Named.NAME_PROPERTY.equals(evt.getPropertyName())) { - return; - } - mySkipNameChange = true; - try { - firePropertyChange(Named.NAME_PROPERTY, evt.getOldValue(), evt.getNewValue()); - } - finally { - mySkipNameChange = false; - } - } - }); - } - - @Override - public int hashCode() { - int result = super.hashCode(); - result = 31 * result + myLibrary.hashCode(); - return result; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - - GradleLibraryDependency that = (GradleLibraryDependency)o; - return myLibrary.equals(that.myLibrary); - } - - @Override - public String toString() { - return super.toString() + ", dependency library: " + getLibrary(); - } - @NotNull @Override public GradleLibraryDependency clone(@NotNull GradleEntityCloneContext context) { - GradleLibraryDependency result = new GradleLibraryDependency(getLibrary().clone(context)); + GradleLibraryDependency result = new GradleLibraryDependency(getTarget().clone(context)); copyTo(result); return result; } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/model/GradleModuleDependency.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/model/GradleModuleDependency.java index da9e2e86045d..4e6d9f2ae1d0 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/model/GradleModuleDependency.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/model/GradleModuleDependency.java @@ -8,26 +8,19 @@ import java.util.Comparator; * @author Denis Zhdanov * @since 8/10/11 6:40 PM */ -public class GradleModuleDependency extends AbstractGradleDependency { +public class GradleModuleDependency extends AbstractGradleDependency { public static final Comparator COMPARATOR = new Comparator() { @Override public int compare(GradleModuleDependency o1, GradleModuleDependency o2) { - return Named.COMPARATOR.compare(o1.getModule(), o2.getModule()); + return Named.COMPARATOR.compare(o1.getTarget(), o2.getTarget()); } }; private static final long serialVersionUID = 1L; - private final GradleModule myModule; - public GradleModuleDependency(@NotNull GradleModule module) { - myModule = module; - } - - @NotNull - public GradleModule getModule() { - return myModule; + super(module); } @Override @@ -35,29 +28,10 @@ public class GradleModuleDependency extends AbstractGradleDependency { visitor.visit(this); } - @Override - public int hashCode() { - return myModule.hashCode(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - GradleModuleDependency that = (GradleModuleDependency)o; - return myModule.equals(that.myModule); - } - - @Override - public String toString() { - return super.toString() + ", dependency module: " + getModule(); - } - @NotNull @Override public GradleModuleDependency clone(@NotNull GradleEntityCloneContext context) { - GradleModuleDependency result = new GradleModuleDependency(getModule().clone(context)); + GradleModuleDependency result = new GradleModuleDependency(getTarget().clone(context)); copyTo(result); return result; } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleAdjustImportSettingsUtil.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleAdjustImportSettingsUtil.java index f2c3f91db6f9..61f2a364073d 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleAdjustImportSettingsUtil.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleAdjustImportSettingsUtil.java @@ -1,8 +1,11 @@ package org.jetbrains.plugins.gradle.importing.wizard.adjust; +import com.intellij.openapi.roots.DependencyScope; import com.intellij.openapi.ui.MessageType; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.text.StringUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.gradle.importing.model.AbstractGradleDependency; import org.jetbrains.plugins.gradle.importing.model.Named; import org.jetbrains.plugins.gradle.util.GradleBundle; import org.jetbrains.plugins.gradle.util.GradleUtil; @@ -69,4 +72,42 @@ public class GradleAdjustImportSettingsUtil { GradleUtil.showBalloon(componentNameUI, MessageType.ERROR, GradleBundle.message("gradle.import.text.error.undefined.name")); return false; } + + /** + * Allows to configure GUI controls for managing common dependency settings. + * + * @param builder target GUI builder + * @param dependency target dependency + * @return pair of two callbacks. The first one is {@link GradleProjectStructureNodeSettings#refresh() 'refresh'} callback, + * the second one is {@link GradleProjectStructureNodeSettings#validate() 'validate'} callback + */ + @NotNull + public static Pair configureCommonDependencyControls(@NotNull GradleProjectSettingsBuilder builder, + @NotNull final AbstractGradleDependency dependency) + { + builder.setKeyAndValueControlsOnSameRow(true); + + final JCheckBox exportedCheckBock = new JCheckBox(); + builder.add("gradle.import.structure.settings.label.export", exportedCheckBock); + + final JComboBox scopeComboBox = new JComboBox(DependencyScope.values()); + builder.add("gradle.import.structure.settings.label.scope", scopeComboBox); + + Runnable refreshCallback = new Runnable() { + @Override + public void run() { + exportedCheckBock.setSelected(dependency.isExported()); + scopeComboBox.setSelectedItem(dependency.getScope()); + } + }; + + Runnable validateCallback = new Runnable() { + @Override + public void run() { + dependency.setExported(exportedCheckBock.isSelected()); + dependency.setScope((DependencyScope)scopeComboBox.getSelectedItem()); + } + }; + return new Pair(refreshCallback, validateCallback); + } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleLibraryDependencySettings.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleLibraryDependencySettings.java index d9169c583697..173872f9b09f 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleLibraryDependencySettings.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleLibraryDependencySettings.java @@ -1,6 +1,6 @@ package org.jetbrains.plugins.gradle.importing.wizard.adjust; -import com.intellij.openapi.roots.DependencyScope; +import com.intellij.openapi.util.Pair; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.gradle.importing.model.GradleLibraryDependency; @@ -12,44 +12,27 @@ import javax.swing.*; */ public class GradleLibraryDependencySettings implements GradleProjectStructureNodeSettings { - private final GradleLibraryDependency myDependency; private final GradleLibrarySettings myLibrarySettings; - private final JCheckBox myExportedCheckBox; - private final JComboBox myScopeComboBox; + private final Runnable myRefreshCallback; + private final Runnable myValidateCallback; private final JComponent myComponent; public GradleLibraryDependencySettings(@NotNull GradleLibraryDependency dependency) { - myDependency = dependency; - myLibrarySettings = new GradleLibrarySettings(dependency.getLibrary()); + myLibrarySettings = new GradleLibrarySettings(dependency.getTarget()); GradleProjectSettingsBuilder builder = new GradleProjectSettingsBuilder(); - builder.setKeyAndValueControlsOnSameRow(true); builder.add(myLibrarySettings.getComponent(), GradleProjectSettingsBuilder.InsetSize.NONE); - myExportedCheckBox = setupExported(builder); - myScopeComboBox = setupScope(builder); + Pair pair = GradleAdjustImportSettingsUtil.configureCommonDependencyControls(builder, dependency); + myRefreshCallback = pair.first; + myValidateCallback = pair.second; myComponent = builder.build(); refresh(); } - @NotNull - private static JCheckBox setupExported(@NotNull GradleProjectSettingsBuilder builder) { - JCheckBox result = new JCheckBox(); - builder.add("gradle.import.structure.settings.label.export", result); - return result; - } - - @NotNull - private static JComboBox setupScope(@NotNull GradleProjectSettingsBuilder builder) { - JComboBox result = new JComboBox(DependencyScope.values()); - builder.add("gradle.import.structure.settings.label.scope", result); - return result; - } - @Override public void refresh() { myLibrarySettings.refresh(); - myExportedCheckBox.setSelected(myDependency.isExported()); - myScopeComboBox.setSelectedItem(myDependency.getScope()); + myRefreshCallback.run(); } @Override @@ -57,8 +40,7 @@ public class GradleLibraryDependencySettings implements GradleProjectStructureNo if (!myLibrarySettings.validate()) { return false; } - myDependency.setExported(myExportedCheckBox.isSelected()); - myDependency.setScope((DependencyScope)myScopeComboBox.getSelectedItem()); + myValidateCallback.run(); return true; } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleModuleDependencySettings.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleModuleDependencySettings.java new file mode 100644 index 000000000000..03d37f92eb5c --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleModuleDependencySettings.java @@ -0,0 +1,52 @@ +package org.jetbrains.plugins.gradle.importing.wizard.adjust; + +import com.intellij.openapi.util.Pair; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.gradle.importing.model.GradleModuleDependency; + +import javax.swing.*; + +/** + * @author Denis Zhdanov + * @since 10/28/11 12:40 PM + */ +public class GradleModuleDependencySettings implements GradleProjectStructureNodeSettings { + + private final GradleModuleSettings myModuleSettings; + private final Runnable myRefreshCallback; + private final Runnable myValidateCallback; + private final JComponent myComponent; + + public GradleModuleDependencySettings(@NotNull GradleModuleDependency dependency) { + myModuleSettings = new GradleModuleSettings(dependency.getTarget()); + + GradleProjectSettingsBuilder builder = new GradleProjectSettingsBuilder(); + builder.add(myModuleSettings.getComponent(), GradleProjectSettingsBuilder.InsetSize.NONE); + Pair pair = GradleAdjustImportSettingsUtil.configureCommonDependencyControls(builder, dependency); + myRefreshCallback = pair.first; + myValidateCallback = pair.second; + myComponent = builder.build(); + refresh(); + } + + @Override + public boolean validate() { + if (!myModuleSettings.validate()) { + return false; + } + myValidateCallback.run(); + return true; + } + + @Override + public void refresh() { + myModuleSettings.refresh(); + myRefreshCallback.run(); + } + + @NotNull + @Override + public JComponent getComponent() { + return myComponent; + } +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleProjectStructureFactory.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleProjectStructureFactory.java index 8262ea6e8809..5076f64d45ab 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleProjectStructureFactory.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleProjectStructureFactory.java @@ -57,12 +57,12 @@ public class GradleProjectStructureFactory { @Override public void visit(@NotNull GradleModuleDependency dependency) { - visit(dependency.getModule()); + visit(dependency.getTarget()); } @Override public void visit(@NotNull GradleLibraryDependency dependency) { - visit(dependency.getLibrary()); + visit(dependency.getTarget()); } }); return result.get(); @@ -117,7 +117,8 @@ public class GradleProjectStructureFactory { @Override public void visit(@NotNull GradleModuleDependency dependency) { - visit(dependency.getModule()); + setupController(dependency, treeModel, treeNodes); + result.set(new GradleModuleDependencySettings(dependency)); } @Override