Add empty panel shown when no certificate is selected like in TaskRepositoriesConfigurable. Tree builder is correctly reinitialized in reset(). Change grow policy of warning message in form.

This commit is contained in:
Mikhail Golubev
2014-02-06 17:00:28 +04:00
parent f826ab85f4
commit 7eb4cd3fb2
4 changed files with 74 additions and 32 deletions
@@ -63,7 +63,26 @@
<border type="none">
<title-color color="-16777216"/>
</border>
<children/>
<children>
<grid id="2c4f3" binding="myEmptyPanel" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints>
<card name="Card1"/>
</constraints>
<properties/>
<border type="none"/>
<children>
<component id="fa818" class="com.intellij.ui.components.JBLabel">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="0" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="No certificate selected"/>
</properties>
</component>
</children>
</grid>
</children>
</grid>
<component id="3a890" class="com.intellij.openapi.ui.Splitter">
<constraints>
@@ -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<X509Certificate> myCertificates;
private CertificateTreeBuilder myTreeBuilder = new CertificateTreeBuilder(myTree);
private Set<X509Certificate> myCertificates = new HashSet<X509Certificate>();
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<X509Certificate> original = myTrustManager.getCertificates();
myTreeBuilder = new CertificateTreeBuilder(myTree, original);
myCertificates = new HashSet<X509Certificate>(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);
}
});
}
@@ -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<String, CertificateWrapper> myCertificates = new MultiMap<String, CertificateWrapper>();
public CertificateTreeBuilder(@NotNull Tree tree, @NotNull Collection<X509Certificate> certificates) {
for (X509Certificate certificate : certificates) {
addCertificate(certificate);
}
public CertificateTreeBuilder(@NotNull Tree tree) {
init(tree, new DefaultTreeModel(new DefaultMutableTreeNode()), new MyTreeStructure(), new Comparator<NodeDescriptor>() {
@Override
public int compare(NodeDescriptor o1, NodeDescriptor o2) {
@@ -58,6 +54,21 @@ public class CertificateTreeBuilder extends AbstractTreeBuilder {
initRootNode();
}
public void reset(@NotNull Collection<X509Certificate> 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<X509Certificate> getSelectedCertificates() {
Set<X509Certificate> selected = new HashSet<X509Certificate>();
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<X509Certificate> getSelectedCertificates(boolean addFromOrganization) {
Set<X509Certificate> selected = getSelectedElements(X509Certificate.class);
if (addFromOrganization) {
for (String s : getSelectedElements(String.class)) {
selected.addAll(getCertificatesByOrganization(s));
}
}
return selected;
}
@Nullable
public X509Certificate getFirstSelectedCertificate() {
Set<X509Certificate> certificates = getSelectedCertificates();
public X509Certificate getFirstSelectedCertificate(boolean addFromOrganization) {
Set<X509Certificate> certificates = getSelectedCertificates(addFromOrganization);
return certificates.isEmpty() ? null : certificates.iterator().next();
}
@@ -49,7 +49,7 @@
<properties>
<contentType value="text/html"/>
<opaque value="false"/>
<text value="&lt;html&gt;&#10; &lt;head&gt;&#10; &#10; &lt;/head&gt;&#10; &lt;body&gt;&#10; &lt;/body&gt;&#10;&lt;/html&gt;&#10;"/>
<text value="&lt;html&gt;&#10; &lt;head&gt;&#10;&#10; &lt;/head&gt;&#10; &lt;body&gt;&#10; &lt;p style=&quot;margin-top: 0&quot;&gt;&#10; &#10; &lt;/p&gt;&#10; &lt;/body&gt;&#10;&lt;/html&gt;&#10;"/>
</properties>
</component>
</children>
@@ -61,7 +61,7 @@
</vspacer>
<component id="7dcbe" class="javax.swing.JLabel" binding="myWarningSign">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="2" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value=""/>
@@ -69,7 +69,7 @@
</component>
<component id="192db" class="javax.swing.JTextPane" binding="myMessagePane">
<constraints>
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="6" hsize-policy="6" anchor="0" fill="3" indent="0" use-parent-layout="false">
<grid row="0" column="1" row-span="1" col-span="1" vsize-policy="2" hsize-policy="6" anchor="0" fill="3" indent="0" use-parent-layout="false">
<preferred-size width="150" height="50"/>
</grid>
</constraints>