From 3984bda4ae998ce915aba9c6f48aeb68681cfcd3 Mon Sep 17 00:00:00 2001 From: Eugene Petrenko Date: Mon, 13 Jan 2020 16:41:19 +0100 Subject: [PATCH] rework dependency from ProjectSdksModel in SdkListPresenter, make SdkList* classes final GitOrigin-RevId: f8f5514538b0044d27483110560633d3d658c700 --- .../roots/ui/configuration/JdkComboBox.java | 14 +--------- .../roots/ui/configuration/SdkComboBox.kt | 5 +--- .../roots/ui/configuration/SdkListModel.java | 26 +++++++++++++------ .../ui/configuration/SdkListModelBuilder.java | 4 +-- .../ui/configuration/SdkListPresenter.java | 26 ++++++------------- .../roots/ui/configuration/SdkPopupFactory.kt | 13 +++------- 6 files changed, 34 insertions(+), 54 deletions(-) diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JdkComboBox.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JdkComboBox.java index 4852ae19cdd0..2ba06770b6f2 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JdkComboBox.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JdkComboBox.java @@ -92,19 +92,7 @@ public class JdkComboBox extends SdkComboBoxBase { onNewSdkAdded.consume(sdk); } }; - setRenderer(new SdkListPresenter(sdkModel) { - @NotNull - @Override - protected SdkListModel getModel() { - return ((JdkComboBoxModel)JdkComboBox.this.getModel()).myInnerModel; - } - - @Override - protected boolean showProgressIcon() { - return JdkComboBox.this.isPopupVisible(); - } - }.forType(JdkComboBox::unwrapItem)); - + setRenderer(new SdkListPresenter(() -> ((JdkComboBoxModel)this.getModel()).myInnerModel).forType(JdkComboBox::unwrapItem)); reloadModel(); } diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkComboBox.kt b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkComboBox.kt index 8eb485ed6ae2..b9995da28be5 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkComboBox.kt +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkComboBox.kt @@ -45,10 +45,7 @@ class SdkComboBox(model: SdkComboBoxModel) : SdkComboBoxBase(model. init { setModel(model) - setRenderer(object : SdkListPresenter(this.model.sdksModel) { - override fun getModel(): SdkListModel = this@SdkComboBox.model.listModel - override fun showProgressIcon() = true - }) + setRenderer(SdkListPresenter { this@SdkComboBox.model.listModel }) addPopupMenuListener(ModelReloadProvider()) reloadModel() } diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkListModel.java b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkListModel.java index b9f83aa7b9e4..f4e5b1f44bcc 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkListModel.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkListModel.java @@ -6,6 +6,7 @@ import com.google.common.collect.ImmutableMap; import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.ui.ComboBoxPopupState; +import com.intellij.util.Producer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -14,14 +15,23 @@ import java.util.List; import static com.intellij.openapi.roots.ui.configuration.SdkListItem.*; -public class SdkListModel extends AbstractListModel implements ComboBoxPopupState { +public final class SdkListModel extends AbstractListModel implements ComboBoxPopupState { private final boolean myIsSearching; private final ImmutableList myItems; + private final Producer myGetProjectSdk; private final ImmutableMap mySeparators; - public SdkListModel(boolean isSearching, @NotNull List items) { + @NotNull + public static SdkListModel emptyModel() { + return new SdkListModel(false, ImmutableList.of(), () -> null); + } + + SdkListModel(boolean isSearching, + @NotNull List items, + @NotNull Producer getProjectSdk) { myIsSearching = isSearching; myItems = ImmutableList.copyOf(items); + myGetProjectSdk = getProjectSdk; boolean myFirstSepSet = false; boolean mySuggestedSep = false; @@ -50,6 +60,11 @@ public class SdkListModel extends AbstractListModel implements Comb mySeparators = sep.build(); } + @Nullable + Sdk resolveProjectSdk() { + return myGetProjectSdk.produce(); + } + @Override public int getSize() { return myItems.size(); @@ -65,7 +80,7 @@ public class SdkListModel extends AbstractListModel implements Comb @Override public SdkListModel onChosen(SdkListItem selectedValue) { if (!(selectedValue instanceof GroupItem)) return null; - return new SdkListModel(myIsSearching, ((GroupItem)selectedValue).mySubItems); + return new SdkListModel(myIsSearching, ((GroupItem)selectedValue).mySubItems, myGetProjectSdk); } @Override @@ -73,11 +88,6 @@ public class SdkListModel extends AbstractListModel implements Comb return selectedValue instanceof GroupItem; } - @NotNull - public SdkListModel buildSubModel(@NotNull GroupItem group) { - return new SdkListModel(myIsSearching, group.mySubItems); - } - public boolean isSearching() { return myIsSearching; } diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkListModelBuilder.java b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkListModelBuilder.java index c3af5c915773..0f5aea124332 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkListModelBuilder.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkListModelBuilder.java @@ -27,7 +27,7 @@ import java.util.Map; import java.util.Objects; import java.util.stream.Stream; -public class SdkListModelBuilder { +public final class SdkListModelBuilder { @Nullable private final Project myProject; @NotNull private final ProjectSdksModel mySdkModel; @NotNull private final Condition mySdkFilter; @@ -135,7 +135,7 @@ public class SdkListModelBuilder { newModel.add(item); } - return new SdkListModel(myIsSdkDetectorInProgress, newModel.build()); + return new SdkListModel(myIsSdkDetectorInProgress, newModel.build(), () -> mySdkModel.getProjectSdk()); } private boolean isApplicableSuggestedItem(@NotNull SuggestedItem item) { diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkListPresenter.java b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkListPresenter.java index 7d6e46b97a84..28bc286b2ed4 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkListPresenter.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkListPresenter.java @@ -9,12 +9,12 @@ import com.intellij.openapi.projectRoots.SdkType; import com.intellij.openapi.roots.ui.SdkAppearanceService; import com.intellij.openapi.roots.ui.configuration.SdkListItem.GroupItem; import com.intellij.openapi.roots.ui.configuration.SdkListItem.SdkItem; -import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectSdksModel; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.*; import com.intellij.ui.components.JBLabel; import com.intellij.util.Function; import com.intellij.util.IconUtil; +import com.intellij.util.Producer; import com.intellij.util.ui.EmptyIcon; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -26,24 +26,14 @@ import java.util.Objects; import static com.intellij.openapi.roots.ui.configuration.SdkListItem.*; -public abstract class SdkListPresenter extends ColoredListCellRenderer { +public final class SdkListPresenter extends ColoredListCellRenderer { private static final Icon EMPTY_ICON = EmptyIcon.create(1, 16); + @NotNull private final Producer myGetModel; - @NotNull - private final ProjectSdksModel mySdkModel; - - protected SdkListPresenter(@NotNull ProjectSdksModel sdkModel) { - mySdkModel = sdkModel; + public SdkListPresenter(@NotNull Producer getSdkListModel) { + myGetModel = getSdkListModel; } - @NotNull - protected abstract SdkListModel getModel(); - - protected boolean showProgressIcon() { - return true; - } - - @NotNull public ListCellRenderer forType(@NotNull Function unwrap) { return new ListCellRenderer() { @@ -79,12 +69,12 @@ public abstract class SdkListPresenter extends ColoredListCellRenderer { value -> myModelBuilder.processSelectedElement(popup.popupOwner, value, @@ -365,16 +365,11 @@ internal class PlatformSdkPopupFactory : SdkPopupFactory { } private class SdkListItemContext( - private val myProject: Project?, - mySdksModel: ProjectSdksModel + private val myProject: Project? ) : ComboBoxPopup.Context { - var myModel = SdkListModel(true, emptyList()) + var myModel = SdkListModel.emptyModel() - private val myRenderer = object : SdkListPresenter(mySdksModel) { - override fun getModel(): SdkListModel { - return myModel - } - } + private val myRenderer = SdkListPresenter { myModel } override fun getProject() = myProject override fun getMaximumRowCount() = 30