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;
This commit is contained in:
Denis.Zhdanov
2011-10-28 14:06:10 +04:00
parent 2b6bd8b0ea
commit 470a8ff0f7
8 changed files with 190 additions and 150 deletions
@@ -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(
@@ -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<T extends AbstractGradleEntity & Named> 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
@@ -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<GradleLibrary> 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;
}
@@ -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<GradleModule> {
public static final Comparator<GradleModuleDependency> COMPARATOR = new Comparator<GradleModuleDependency>() {
@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;
}
@@ -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<Runnable, Runnable> 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<Runnable, Runnable>(refreshCallback, validateCallback);
}
}
@@ -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<Runnable,Runnable> 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;
}
@@ -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<Runnable,Runnable> 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;
}
}
@@ -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