diff --git a/java/idea-ui/src/com/intellij/jarRepository/settings/RemoteRepositoriesConfigurable.java b/java/idea-ui/src/com/intellij/jarRepository/settings/RemoteRepositoriesConfigurable.java index 4653910175f3..eaa0821937ed 100644 --- a/java/idea-ui/src/com/intellij/jarRepository/settings/RemoteRepositoriesConfigurable.java +++ b/java/idea-ui/src/com/intellij/jarRepository/settings/RemoteRepositoriesConfigurable.java @@ -28,9 +28,9 @@ import com.intellij.openapi.ui.InputValidator; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.CollectionListModel; +import com.intellij.ui.ListCellRendererWrapper; import com.intellij.ui.ListUtil; import com.intellij.ui.components.JBList; -import com.intellij.util.SmartList; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -38,7 +38,9 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.MalformedURLException; import java.net.URL; -import java.util.*; +import java.util.Collections; +import java.util.List; +import java.util.UUID; public class RemoteRepositoriesConfigurable extends BaseConfigurable implements SearchableConfigurable, Configurable.NoScroll { @@ -50,7 +52,7 @@ public class RemoteRepositoriesConfigurable extends BaseConfigurable implements private JButton myRemoveServiceButton; private JButton myTestServiceButton; - private JBList myJarRepositoryList; + private JBList myJarRepositoryList; private JButton myAddRepoButton; private JButton myEditRepoButton; private JButton myRemoveRepoButton; @@ -59,7 +61,7 @@ public class RemoteRepositoriesConfigurable extends BaseConfigurable implements private final Project myProject; private final CollectionListModel myServicesModel = new CollectionListModel<>(); - private final CollectionListModel myReposModel = new CollectionListModel<>(); + private final CollectionListModel myReposModel = new CollectionListModel<>(); public RemoteRepositoriesConfigurable(Project project) { myProject = project; @@ -76,21 +78,18 @@ public class RemoteRepositoriesConfigurable extends BaseConfigurable implements } private boolean isRepoListModified() { - final List urls = new SmartList<>(); - for (RemoteRepositoryDescription repository : RemoteRepositoriesConfiguration.getInstance(myProject).getRepositories()) { - urls.add(repository.getUrl()); - } - return !myReposModel.getItems().equals(urls); + final List repos = RemoteRepositoriesConfiguration.getInstance(myProject).getRepositories(); + return !myReposModel.getItems().equals(repos); } private void configControls() { setupListControls( myServiceList, myServicesModel, myAddServiceButton, myEditServiceButton, myRemoveServiceButton, - "Artifactory or Nexus Service URL", "Service URL", "No services" + "Artifactory or Nexus Service URL", "Service URL", "No services", DataAdapter.STRING_ADAPTER ); setupListControls( myJarRepositoryList, myReposModel, myAddRepoButton, myEditRepoButton, myRemoveRepoButton, - "Maven Repository URL", "maven Repository URL", "No remote repositories" + "Maven Repository URL", "maven Repository URL", "No remote repositories", DataAdapter.REPOSITORY_DESCRIPTION_ADAPTER ); ListUtil.disableWhenNoSelection(myTestServiceButton, myServiceList); @@ -133,25 +132,71 @@ public class RemoteRepositoriesConfigurable extends BaseConfigurable implements }); } - private static void setupListControls(final JBList list, - final CollectionListModel model, - final JButton addButton, - final JButton editButton, - final JButton removeButton, - final String modificationDialogTitle, - final String modificationDialogHint, - final String emptyListHint) { + private interface DataAdapter { + DataAdapter STRING_ADAPTER = new DataAdapter() { + @Override + public String toPresentation(String s) { + return s; + } + + @Override + public String create(String s) { + return s; + } + + @Override + public String change(String current, String changes) { + return changes; + } + }; + + DataAdapter REPOSITORY_DESCRIPTION_ADAPTER = new DataAdapter() { + @Override + public String toPresentation(RemoteRepositoryDescription description) { + return description.getUrl(); + } + + @Override + public RemoteRepositoryDescription create(String url) { + final UUID uuid = UUID.randomUUID(); + return new RemoteRepositoryDescription(uuid.toString(), uuid.toString(), url); + } + + @Override + public RemoteRepositoryDescription change(RemoteRepositoryDescription current, String url) { + return new RemoteRepositoryDescription(current.getId(), current.getName(), url); + } + }; + Presentation toPresentation(Data data); + Data create(Presentation presentation); + Data change(Data current, Presentation changes); + } + + private static void setupListControls(final JBList list, + final CollectionListModel model, + final JButton addButton, + final JButton editButton, + final JButton removeButton, + final String modificationDialogTitle, + final String modificationDialogHint, + final String emptyListHint, DataAdapter adapter) { list.setModel(model); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + list.setCellRenderer(new ListCellRendererWrapper() { + @Override + public void customize(JList list, T value, int index, boolean selected, boolean hasFocus) { + setText(adapter.toPresentation(value)); + } + }); addButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - final String value = list.getSelectedValue(); + final T value = list.getSelectedValue(); final String text = Messages.showInputDialog( - modificationDialogTitle, "Add" + " " + modificationDialogHint, Messages.getQuestionIcon(), value == null ? "https://" : value, new URLInputVaslidator() + modificationDialogTitle, "Add" + " " + modificationDialogHint, Messages.getQuestionIcon(), value == null ? "https://" : adapter.toPresentation(value), new URLInputVaslidator() ); if (StringUtil.isNotEmpty(text)) { - model.add(text); + model.add(adapter.create(text)); list.setSelectedValue(text, true); } } @@ -160,11 +205,12 @@ public class RemoteRepositoriesConfigurable extends BaseConfigurable implements @Override public void actionPerformed(ActionEvent e) { final int index = list.getSelectedIndex(); + final T element = model.getElementAt(index); final String text = Messages.showInputDialog( - modificationDialogTitle, "Edit" + " " + modificationDialogHint, Messages.getQuestionIcon(), model.getElementAt(index), new URLInputVaslidator() + modificationDialogTitle, "Edit" + " " + modificationDialogHint, Messages.getQuestionIcon(), adapter.toPresentation(element), new URLInputVaslidator() ); if (StringUtil.isNotEmpty(text)) { - model.setElementAt(text, index); + model.setElementAt(adapter.change(element, text), index); } } }); @@ -194,23 +240,7 @@ public class RemoteRepositoriesConfigurable extends BaseConfigurable implements public void apply() throws ConfigurationException { MavenRepositoryServicesManager.getInstance(myProject).setUrls(myServicesModel.getItems()); - - final Map defaultRepos = new HashMap<>(); - for (RemoteRepositoryDescription repository : RemoteRepositoryDescription.DEFAULT_REPOSITORIES) { - defaultRepos.put(repository.getUrl(), repository); - } - final List descriptions = new SmartList<>(); - for (String url : myReposModel.getItems()) { - final RemoteRepositoryDescription def = defaultRepos.get(url); - if (def != null) { - descriptions.add(def); - } - else { - final UUID uuid = UUID.randomUUID(); - descriptions.add(new RemoteRepositoryDescription(uuid.toString(), uuid.toString(), url)); - } - } - RemoteRepositoriesConfiguration.getInstance(myProject).setRepositories(descriptions); + RemoteRepositoriesConfiguration.getInstance(myProject).setRepositories(myReposModel.getItems()); } public void reset() { @@ -224,12 +254,7 @@ public class RemoteRepositoriesConfigurable extends BaseConfigurable implements } private void resetReposModel(final List repositories) { - myReposModel.removeAll(); - final List repos = new SmartList<>(); - for (RemoteRepositoryDescription description : repositories) { - repos.add(description.getUrl()); - } - myReposModel.add(repos); + myReposModel.replaceAll(repositories); } public void disposeUIResources() {