diff --git a/platform/platform-api/src/com/intellij/util/net/ssl/CertificateConfigurable.form b/platform/platform-api/src/com/intellij/util/net/ssl/CertificateConfigurable.form index 9d488f181bf2..ae7b2783d583 100644 --- a/platform/platform-api/src/com/intellij/util/net/ssl/CertificateConfigurable.form +++ b/platform/platform-api/src/com/intellij/util/net/ssl/CertificateConfigurable.form @@ -63,7 +63,26 @@ - + + + + + + + + + + + + + + + + + + + + diff --git a/platform/platform-api/src/com/intellij/util/net/ssl/CertificateConfigurable.java b/platform/platform-api/src/com/intellij/util/net/ssl/CertificateConfigurable.java index c18310ddd6fb..e3ae024e4d7b 100644 --- a/platform/platform-api/src/com/intellij/util/net/ssl/CertificateConfigurable.java +++ b/platform/platform-api/src/com/intellij/util/net/ssl/CertificateConfigurable.java @@ -17,6 +17,7 @@ import com.intellij.util.Consumer; import com.intellij.util.containers.HashSet; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -37,6 +38,7 @@ import static com.intellij.util.net.ssl.ConfirmingTrustManager.MutableTrustManag */ public class CertificateConfigurable implements SearchableConfigurable, Configurable.NoScroll, CertificateListener { private static final FileTypeDescriptor CERTIFICATE_DESCRIPTOR = new FileTypeDescriptor("Choose Certificate", ".crt", ".cer", ".pem"); + @NonNls public static final String EMPTY_PANEL = "empty.panel"; private JPanel myRootPanel; private JBCheckBox myCheckHostname; @@ -44,11 +46,12 @@ public class CertificateConfigurable implements SearchableConfigurable, Configur private JPanel myCertificatesListPanel; private JPanel myDetailsPanel; + private JPanel myEmptyPanel; private MutableTrustManager myTrustManager; private Tree myTree = new Tree(); - private CertificateTreeBuilder myTreeBuilder; - private Set myCertificates; + private CertificateTreeBuilder myTreeBuilder = new CertificateTreeBuilder(myTree); + private Set myCertificates = new HashSet(); public CertificateConfigurable() { @@ -94,13 +97,12 @@ public class CertificateConfigurable implements SearchableConfigurable, Configur @Override public void run(AnActionButton button) { // allow to delete several certificates at once - for (X509Certificate certificate : myTreeBuilder.getSelectedCertificates()) { + for (X509Certificate certificate : myTreeBuilder.getSelectedCertificates(true)) { myCertificates.remove(certificate); myTreeBuilder.removeCertificate(certificate); } if (myCertificates.isEmpty()) { - myDetailsPanel.removeAll(); - myDetailsPanel.repaint(); + showCard(EMPTY_PANEL); } else { myTreeBuilder.selectFirstCertificate(); @@ -111,17 +113,20 @@ public class CertificateConfigurable implements SearchableConfigurable, Configur myTree.addTreeSelectionListener(new TreeSelectionListener() { @Override public void valueChanged(TreeSelectionEvent e) { - X509Certificate certificate = myTreeBuilder.getFirstSelectedCertificate(); + X509Certificate certificate = myTreeBuilder.getFirstSelectedCertificate(true); if (certificate != null) { - String uniqueName = getCardName(certificate); - ((CardLayout)myDetailsPanel.getLayout()).show(myDetailsPanel, uniqueName); + showCard(getCardName(certificate)); } } }); myCertificatesListPanel.add(decorator.createPanel(), BorderLayout.CENTER); } - private void addCertificatePanel(X509Certificate certificate) { + private void showCard(@NotNull String cardName) { + ((CardLayout)myDetailsPanel.getLayout()).show(myDetailsPanel, cardName); + } + + private void addCertificatePanel(@NotNull X509Certificate certificate) { String uniqueName = getCardName(certificate); JPanel infoPanel = new CertificateInfoPanel(certificate); UIUtil.addInsets(infoPanel, UIUtil.PANEL_REGULAR_INSETS); @@ -130,7 +135,7 @@ public class CertificateConfigurable implements SearchableConfigurable, Configur myDetailsPanel.add(scrollPane, uniqueName); } - private static String getCardName(X509Certificate certificate) { + private static String getCardName(@NotNull X509Certificate certificate) { return certificate.getSubjectX500Principal().getName(); } @@ -201,13 +206,23 @@ public class CertificateConfigurable implements SearchableConfigurable, Configur @Override public void reset() { List original = myTrustManager.getCertificates(); - myTreeBuilder = new CertificateTreeBuilder(myTree, original); - myCertificates = new HashSet(original); + myTreeBuilder.reset(original); + + myCertificates.clear(); + myCertificates.addAll(original); + + myDetailsPanel.removeAll(); + myDetailsPanel.add(myEmptyPanel, EMPTY_PANEL); // fill lower panel with cards for (X509Certificate certificate : original) { addCertificatePanel(certificate); } + + if (!myCertificates.isEmpty()) { + myTreeBuilder.selectFirstCertificate(); + } + CertificatesManager.Config state = CertificatesManager.getInstance().getState(); myCheckHostname.setSelected(state.checkHostname); myCheckValidityPeriod.setSelected(state.checkValidity); @@ -226,8 +241,8 @@ public class CertificateConfigurable implements SearchableConfigurable, Configur if (!myCertificates.contains(certificate)) { myCertificates.add(certificate); myTreeBuilder.addCertificate(certificate); + addCertificatePanel(certificate); } - addCertificatePanel(certificate); } }); } diff --git a/platform/platform-api/src/com/intellij/util/net/ssl/CertificateTreeBuilder.java b/platform/platform-api/src/com/intellij/util/net/ssl/CertificateTreeBuilder.java index bf952d7097e5..0d1141bf0998 100644 --- a/platform/platform-api/src/com/intellij/util/net/ssl/CertificateTreeBuilder.java +++ b/platform/platform-api/src/com/intellij/util/net/ssl/CertificateTreeBuilder.java @@ -10,7 +10,6 @@ import com.intellij.ui.treeStructure.Tree; import com.intellij.util.ArrayUtil; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.containers.HashSet; import com.intellij.util.containers.MultiMap; import com.intellij.util.ui.tree.TreeUtil; import org.jetbrains.annotations.NotNull; @@ -37,10 +36,7 @@ public class CertificateTreeBuilder extends AbstractTreeBuilder { private final MultiMap myCertificates = new MultiMap(); - public CertificateTreeBuilder(@NotNull Tree tree, @NotNull Collection certificates) { - for (X509Certificate certificate : certificates) { - addCertificate(certificate); - } + public CertificateTreeBuilder(@NotNull Tree tree) { init(tree, new DefaultTreeModel(new DefaultMutableTreeNode()), new MyTreeStructure(), new Comparator() { @Override public int compare(NodeDescriptor o1, NodeDescriptor o2) { @@ -58,6 +54,21 @@ public class CertificateTreeBuilder extends AbstractTreeBuilder { initRootNode(); } + public void reset(@NotNull Collection certificates) { + myCertificates.clear(); + for (X509Certificate certificate : certificates) { + addCertificate(certificate); + } + // expand organization nodes at the same time + //initRootNode(); + queueUpdateFrom(RootDescriptor.ROOT, true).doWhenDone(new Runnable() { + @Override + public void run() { + CertificateTreeBuilder.this.expandAll(null); + } + }); + } + public void addCertificate(@NotNull X509Certificate certificate) { CertificateWrapper wrapper = new CertificateWrapper(certificate); myCertificates.putValue(wrapper.getSubjectField(ORGANIZATION), wrapper); @@ -105,22 +116,19 @@ public class CertificateTreeBuilder extends AbstractTreeBuilder { * @return - selected certificates */ @NotNull - public Set getSelectedCertificates() { - Set selected = new HashSet(); - for (Object o : getSelectedElements()) { - if (o instanceof CertificateWrapper) { - selected.add(((CertificateWrapper)o).getCertificate()); - } - else if (o instanceof String) { - selected.addAll(getCertificatesByOrganization((String)o)); + public Set getSelectedCertificates(boolean addFromOrganization) { + Set selected = getSelectedElements(X509Certificate.class); + if (addFromOrganization) { + for (String s : getSelectedElements(String.class)) { + selected.addAll(getCertificatesByOrganization(s)); } } return selected; } @Nullable - public X509Certificate getFirstSelectedCertificate() { - Set certificates = getSelectedCertificates(); + public X509Certificate getFirstSelectedCertificate(boolean addFromOrganization) { + Set certificates = getSelectedCertificates(addFromOrganization); return certificates.isEmpty() ? null : certificates.iterator().next(); } diff --git a/platform/platform-api/src/com/intellij/util/net/ssl/CertificateWarningDialog.form b/platform/platform-api/src/com/intellij/util/net/ssl/CertificateWarningDialog.form index 5a28836fb8ba..3421747cd043 100644 --- a/platform/platform-api/src/com/intellij/util/net/ssl/CertificateWarningDialog.form +++ b/platform/platform-api/src/com/intellij/util/net/ssl/CertificateWarningDialog.form @@ -49,7 +49,7 @@ - + @@ -61,7 +61,7 @@ - + @@ -69,7 +69,7 @@ - +