remove listeners from SdkModel on dispose (IDEA-80315)

This commit is contained in:
nik
2012-01-26 10:05:00 +04:00
parent 4a32ebd563
commit f29ed953d1
4 changed files with 69 additions and 86 deletions
@@ -26,13 +26,41 @@ import javax.swing.*;
* @author Eugene.Kudelevsky
*/
public class AndroidSdkConfigurable implements AdditionalDataConfigurable {
private final AndroidSdkConfigurableForm myForm;
private Sdk mySdk;
private final SdkModel.Listener myListener;
private final SdkModel mySdkModel;
public AndroidSdkConfigurable(@NotNull SdkModel sdkModel, @NotNull SdkModificator sdkModificator) {
mySdkModel = sdkModel;
myForm = new AndroidSdkConfigurableForm(sdkModel, sdkModificator);
myListener = new SdkModel.Listener() {
public void sdkAdded(Sdk sdk) {
if (sdk.getSdkType().equals(JavaSdk.getInstance())) {
myForm.addJavaSdk(sdk);
}
}
public void beforeSdkRemove(Sdk sdk) {
if (sdk.getSdkType().equals(JavaSdk.getInstance())) {
myForm.removeJavaSdk(sdk);
}
}
public void sdkChanged(Sdk sdk, String previousName) {
if (sdk.getSdkType().equals(JavaSdk.getInstance())) {
myForm.updateJdks(sdk, previousName);
}
}
public void sdkHomeSelected(final Sdk sdk, final String newSdkHome) {
if (sdk.getSdkType().equals(AndroidSdkType.getInstance())) {
myForm.internalJdkUpdate(sdk);
}
}
};
mySdkModel.addListener(myListener);
}
@Override
@@ -83,21 +111,6 @@ public class AndroidSdkConfigurable implements AdditionalDataConfigurable {
@Override
public void disposeUIResources() {
}
public void addJavaSdk(Sdk sdk) {
myForm.addJavaSdk(sdk);
}
public void removeJavaSdk(Sdk sdk) {
myForm.removeJavaSdk(sdk);
}
public void updateJavaSdkList(Sdk sdk, String previousName) {
myForm.updateJdks(sdk, previousName);
}
public void internalJdkUpdate(Sdk sdk) {
myForm.internalJdkUpdate(sdk);
mySdkModel.removeListener(myListener);
}
}
@@ -97,12 +97,12 @@ public class AndroidSdkType extends SdkType implements JavaSdkType {
}
if (javaSdks.isEmpty()){
Messages.showErrorDialog(AndroidBundle.message("no.jdk.for.android.found.error"), "No Java SDK found");
Messages.showErrorDialog(AndroidBundle.message("no.jdk.for.android.found.error"), "No Java SDK Found");
return false;
}
int choice = Messages
.showChooseDialog("Please select Java SDK", "Select internal Java platform", ArrayUtil.toStringArray(javaSdks), javaSdks.get(0),
.showChooseDialog("Please select Java SDK", "Select Internal Java Platform", ArrayUtil.toStringArray(javaSdks), javaSdks.get(0),
Messages.getQuestionIcon());
if (choice == -1) {
@@ -117,7 +117,7 @@ public class AndroidSdkType extends SdkType implements JavaSdkType {
if (sdkObject == null) {
String errorMessage = log.getErrorMessage().length() > 0 ? log.getErrorMessage() : AndroidBundle.message("cannot.parse.sdk.error");
Messages.showErrorDialog(errorMessage, "SDK parsing error");
Messages.showErrorDialog(errorMessage, "SDK Parsing Error");
return false;
}
@@ -144,7 +144,7 @@ public class AndroidSdkType extends SdkType implements JavaSdkType {
}
choice =
Messages.showChooseDialog("Select build target", "Create new Android SDK", targetNames,
Messages.showChooseDialog("Select build target", "Create New Android SDK", targetNames,
newestPlatform != null ? newestPlatform : targetNames[0], Messages.getQuestionIcon());
if (choice == -1) {
@@ -158,35 +158,7 @@ public class AndroidSdkType extends SdkType implements JavaSdkType {
@Override
public AdditionalDataConfigurable createAdditionalDataConfigurable(SdkModel sdkModel, SdkModificator sdkModificator) {
final AndroidSdkConfigurable c = new AndroidSdkConfigurable(sdkModel, sdkModificator);
sdkModel.addListener(new SdkModel.Listener() {
public void sdkAdded(Sdk sdk) {
if (sdk.getSdkType().equals(JavaSdk.getInstance())) {
c.addJavaSdk(sdk);
}
}
public void beforeSdkRemove(Sdk sdk) {
if (sdk.getSdkType().equals(JavaSdk.getInstance())) {
c.removeJavaSdk(sdk);
}
}
public void sdkChanged(Sdk sdk, String previousName) {
if (sdk.getSdkType().equals(JavaSdk.getInstance())) {
c.updateJavaSdkList(sdk, previousName);
}
}
public void sdkHomeSelected(final Sdk sdk, final String newSdkHome) {
if (sdk.getSdkType().equals(AndroidSdkType.getInstance())) {
c.internalJdkUpdate(sdk);
}
}
});
return c;
return new AndroidSdkConfigurable(sdkModel, sdkModificator);
}
public void saveAdditionalData(SdkAdditionalData data, Element e) {
+1 -28
View File
@@ -406,34 +406,7 @@ public class IdeaJdk extends SdkType implements JavaSdkType {
}
public AdditionalDataConfigurable createAdditionalDataConfigurable(final SdkModel sdkModel, SdkModificator sdkModificator) {
final IdeaJdkConfigurable jdkConfigurable = new IdeaJdkConfigurable(sdkModel, sdkModificator);
sdkModel.addListener(new SdkModel.Listener() {
public void sdkAdded(Sdk sdk) {
if (sdk.getSdkType().equals(JavaSdk.getInstance())) {
jdkConfigurable.addJavaSdk(sdk);
}
}
public void beforeSdkRemove(Sdk sdk) {
if (sdk.getSdkType().equals(JavaSdk.getInstance())) {
jdkConfigurable.removeJavaSdk(sdk);
}
}
public void sdkChanged(Sdk sdk, String previousName) {
if (sdk.getSdkType().equals(JavaSdk.getInstance())) {
jdkConfigurable.updateJavaSdkList(sdk, previousName);
}
}
public void sdkHomeSelected(final Sdk sdk, final String newSdkHome) {
if (sdk.getSdkType() instanceof IdeaJdk) {
jdkConfigurable.internalJdkUpdate(sdk);
}
}
});
return jdkConfigurable;
return new IdeaJdkConfigurable(sdkModel, sdkModificator);
}
@Nullable
@@ -21,10 +21,7 @@ import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.projectRoots.AdditionalDataConfigurable;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.projectRoots.SdkModel;
import com.intellij.openapi.projectRoots.SdkModificator;
import com.intellij.openapi.projectRoots.*;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.io.FileUtil;
@@ -64,10 +61,37 @@ public class IdeaJdkConfigurable implements AdditionalDataConfigurable {
private final SdkModel mySdkModel;
private final SdkModificator mySdkModificator;
private boolean myFreeze = false;
private final SdkModel.Listener myListener;
public IdeaJdkConfigurable(final SdkModel sdkModel, final SdkModificator sdkModificator) {
mySdkModel = sdkModel;
mySdkModificator = sdkModificator;
myListener = new SdkModel.Listener() {
public void sdkAdded(Sdk sdk) {
if (sdk.getSdkType().equals(JavaSdk.getInstance())) {
addJavaSdk(sdk);
}
}
public void beforeSdkRemove(Sdk sdk) {
if (sdk.getSdkType().equals(JavaSdk.getInstance())) {
removeJavaSdk(sdk);
}
}
public void sdkChanged(Sdk sdk, String previousName) {
if (sdk.getSdkType().equals(JavaSdk.getInstance())) {
updateJavaSdkList(sdk, previousName);
}
}
public void sdkHomeSelected(final Sdk sdk, final String newSdkHome) {
if (sdk.getSdkType() instanceof IdeaJdk) {
internalJdkUpdate(sdk);
}
}
};
mySdkModel.addListener(myListener);
}
private void updateJdkList() {
@@ -157,7 +181,7 @@ public class IdeaJdkConfigurable implements AdditionalDataConfigurable {
return wholePanel;
}
public void internalJdkUpdate(final Sdk sdk) {
private void internalJdkUpdate(final Sdk sdk) {
final Sdk javaSdk = ((Sandbox)sdk.getSdkAdditionalData()).getJavaSdk();
if (myJdksModel.getIndexOf(javaSdk) == -1) {
myJdksModel.addElement(javaSdk);
@@ -216,17 +240,18 @@ public class IdeaJdkConfigurable implements AdditionalDataConfigurable {
}
public void disposeUIResources() {
mySdkModel.removeListener(myListener);
}
public void addJavaSdk(final Sdk sdk) {
private void addJavaSdk(final Sdk sdk) {
myJdksModel.addElement(sdk);
}
public void removeJavaSdk(final Sdk sdk) {
private void removeJavaSdk(final Sdk sdk) {
myJdksModel.removeElement(sdk);
}
public void updateJavaSdkList(Sdk sdk, String previousName) {
private void updateJavaSdkList(Sdk sdk, String previousName) {
final Sdk[] sdks = mySdkModel.getSdks();
for (Sdk currentSdk : sdks) {
if (currentSdk.getSdkType() instanceof IdeaJdk){