/hg/icedtea-web: Unsigned applet warning dialog abstracted and g...

aazores at icedtea.classpath.org aazores at icedtea.classpath.org
Mon Mar 3 08:38:01 PST 2014


changeset 61bfad46e9cc in /hg/icedtea-web
details: http://icedtea.classpath.org/hg/icedtea-web?cmd=changeset;node=61bfad46e9cc
author: Andrew Azores <aazores at redhat.com>
date: Mon Mar 03 11:36:14 2014 -0500

	Unsigned applet warning dialog abstracted and generalized

	UnsignedAppletTrustWarningPanel logic moved into new abstract parent class
	AppTrustWarningPanel for reusability.
	* netx/net/sourceforge/jnlp/security/AppTrustWarningDialog.java: new class
	* netx/net/sourceforge/jnlp/security/AppTrustWarningPanel.java: new class
	* netx/net/sourceforge/jnlp/security/UnsignedAppletTrustWarningPanel.java:
	major refactor into subclass of AppTrustWarningPanel
	* netx/net/sourceforge/jnlp/security/SecurityDialogs.java:
	(UnsignedWarningAction) references changed to AppSigningWarningAction
	* netx/net/sourceforge/jnlp/security/UnsignedAppletTrustWarningDialog.java: same
	* tests/netx/unit/net/sourceforge/jnlp/security/AppTrustWarningPanelTest.java:
	new tests for AppTrustWarningPanel
	* netx/net/sourceforge/jnlp/security/appletextendedsecurity/ExecuteUnsignedApplet.java:
	renamed, changed all references
	* netx/net/sourceforge/jnlp/security/appletextendedsecurity/ExecuteAppletAction.java:
	(ExecuteUnsignedApplet) renamed to this
	* netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletActionTableModel.java:
	(ExecuteAppletAction) changed references
	* netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel.java:
	(ExecuteAppletAction) changed references
	* netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletActionEntry.java:
	(ExecuteAppletAction) changed references
	* netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java:
	(ExecuteAppletAction) changed references
	* netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageExtendedImpl.java:
	(ExecuteAppletAction) changed references
	* netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImpl.java:
	(ExecuteAppletAction) changed references


diffstat:

 ChangeLog                                                                                                   |   30 +
 netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletActionTableModel.java                                  |    8 +-
 netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel.java                                |   38 +-
 netx/net/sourceforge/jnlp/security/AppTrustWarningDialog.java                                               |   68 ++
 netx/net/sourceforge/jnlp/security/AppTrustWarningPanel.java                                                |  321 ++++++++++
 netx/net/sourceforge/jnlp/security/SecurityDialog.java                                                      |    2 +-
 netx/net/sourceforge/jnlp/security/SecurityDialogs.java                                                     |   11 +-
 netx/net/sourceforge/jnlp/security/UnsignedAppletTrustWarningDialog.java                                    |   10 +-
 netx/net/sourceforge/jnlp/security/UnsignedAppletTrustWarningPanel.java                                     |  280 +-------
 netx/net/sourceforge/jnlp/security/appletextendedsecurity/ExecuteAppletAction.java                          |   90 ++
 netx/net/sourceforge/jnlp/security/appletextendedsecurity/ExecuteUnsignedApplet.java                        |   90 --
 netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletActionEntry.java                    |   10 +-
 netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java              |   57 +-
 netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageExtendedImpl.java |    6 +-
 netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImpl.java         |    6 +-
 tests/netx/unit/net/sourceforge/jnlp/security/AppTrustWarningPanelTest.java                                 |  130 ++++
 16 files changed, 755 insertions(+), 402 deletions(-)

diffs (truncated from 1554 to 500 lines):

diff -r ededca6b0659 -r 61bfad46e9cc ChangeLog
--- a/ChangeLog	Fri Feb 28 16:45:24 2014 -0500
+++ b/ChangeLog	Mon Mar 03 11:36:14 2014 -0500
@@ -1,3 +1,33 @@
+2014-03-03  Andrew Azores  <aazores at redhat.com>
+
+	UnsignedAppletTrustWarningPanel logic moved into new abstract parent class
+	AppTrustWarningPanel for reusability.
+	* netx/net/sourceforge/jnlp/security/AppTrustWarningDialog.java: new class
+	* netx/net/sourceforge/jnlp/security/AppTrustWarningPanel.java: new class
+	* netx/net/sourceforge/jnlp/security/UnsignedAppletTrustWarningPanel.java:
+	major refactor into subclass of AppTrustWarningPanel
+	* netx/net/sourceforge/jnlp/security/SecurityDialogs.java:
+	(UnsignedWarningAction) references changed to AppSigningWarningAction
+	* netx/net/sourceforge/jnlp/security/UnsignedAppletTrustWarningDialog.java: same
+	* tests/netx/unit/net/sourceforge/jnlp/security/AppTrustWarningPanelTest.java:
+	new tests for AppTrustWarningPanel
+	* netx/net/sourceforge/jnlp/security/appletextendedsecurity/ExecuteUnsignedApplet.java:
+	renamed, changed all references
+	* netx/net/sourceforge/jnlp/security/appletextendedsecurity/ExecuteAppletAction.java:
+	(ExecuteUnsignedApplet) renamed to this
+	* netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletActionTableModel.java:
+	(ExecuteAppletAction) changed references
+	* netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel.java:
+	(ExecuteAppletAction) changed references
+	* netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletActionEntry.java:
+	(ExecuteAppletAction) changed references
+	* netx/net/sourceforge/jnlp/security/appletextendedsecurity/UnsignedAppletTrustConfirmation.java:
+	(ExecuteAppletAction) changed references
+	* netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageExtendedImpl.java:
+	(ExecuteAppletAction) changed references
+	* netx/net/sourceforge/jnlp/security/appletextendedsecurity/impl/UnsignedAppletActionStorageImpl.java:
+	(ExecuteAppletAction) changed references
+
 2014-02-28  Andrew Azores  <aazores at redhat.com>
 
 	Added "Sandbox" button to CertWarning dialogs, allowing signed applets
diff -r ededca6b0659 -r 61bfad46e9cc netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletActionTableModel.java
--- a/netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletActionTableModel.java	Fri Feb 28 16:45:24 2014 -0500
+++ b/netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletActionTableModel.java	Mon Mar 03 11:36:14 2014 -0500
@@ -39,7 +39,7 @@
 import javax.swing.event.TableModelEvent;
 import javax.swing.table.AbstractTableModel;
 import net.sourceforge.jnlp.runtime.Translator;
-import net.sourceforge.jnlp.security.appletextendedsecurity.ExecuteUnsignedApplet;
+import net.sourceforge.jnlp.security.appletextendedsecurity.ExecuteAppletAction;
 import net.sourceforge.jnlp.security.appletextendedsecurity.UnsignedAppletActionEntry;
 import net.sourceforge.jnlp.security.appletextendedsecurity.UrlRegEx;
 import net.sourceforge.jnlp.security.appletextendedsecurity.impl.UnsignedAppletActionStorageExtendedImpl;
@@ -75,7 +75,7 @@
     @Override
     public Class<?> getColumnClass(int columnIndex) {
         if (columnIndex == 0) {
-            return ExecuteUnsignedApplet.class;
+            return ExecuteAppletAction.class;
         }
         if (columnIndex == 1) {
             return Date.class;
@@ -145,7 +145,7 @@
         int i = getRowCount()-1;
         String s = "\\Qhttp://localhost:80/\\E.*";
         back.add(new UnsignedAppletActionEntry(
-                ExecuteUnsignedApplet.NEVER,
+                ExecuteAppletAction.NEVER,
                 new Date(),
                 new UrlRegEx(s),
                 new UrlRegEx(s),
@@ -174,7 +174,7 @@
         fireTableRowsDeleted(0, i);
     }
 
-    void removeByBehaviour(ExecuteUnsignedApplet unsignedAppletAction) {
+    void removeByBehaviour(ExecuteAppletAction unsignedAppletAction) {
         int i = getRowCount()-1;
         if (i<0){
             return;
diff -r ededca6b0659 -r 61bfad46e9cc netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel.java
--- a/netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel.java	Fri Feb 28 16:45:24 2014 -0500
+++ b/netx/net/sourceforge/jnlp/controlpanel/UnsignedAppletsTrustingListPanel.java	Mon Mar 03 11:36:14 2014 -0500
@@ -75,7 +75,7 @@
 import net.sourceforge.jnlp.config.DeploymentConfiguration;
 import net.sourceforge.jnlp.runtime.Translator;
 import net.sourceforge.jnlp.security.appletextendedsecurity.AppletSecurityLevel;
-import net.sourceforge.jnlp.security.appletextendedsecurity.ExecuteUnsignedApplet;
+import net.sourceforge.jnlp.security.appletextendedsecurity.ExecuteAppletAction;
 import net.sourceforge.jnlp.security.appletextendedsecurity.ExtendedAppletSecurityHelp;
 import net.sourceforge.jnlp.security.appletextendedsecurity.UnsignedAppletActionEntry;
 import net.sourceforge.jnlp.security.appletextendedsecurity.UrlRegEx;
@@ -520,16 +520,16 @@
             removeSelectedFromTable(currentTable);
         }
         if (deleteTypeComboBox.getSelectedIndex() == 1) {
-            removeByBehaviour(ExecuteUnsignedApplet.ALWAYS);
+            removeByBehaviour(ExecuteAppletAction.ALWAYS);
         }
         if (deleteTypeComboBox.getSelectedIndex() == 2) {
-            removeByBehaviour(ExecuteUnsignedApplet.NEVER);
+            removeByBehaviour(ExecuteAppletAction.NEVER);
         }
         if (deleteTypeComboBox.getSelectedIndex() == 3) {
-            removeByBehaviour(ExecuteUnsignedApplet.YES);
+            removeByBehaviour(ExecuteAppletAction.YES);
         }
         if (deleteTypeComboBox.getSelectedIndex() == 4) {
-            removeByBehaviour(ExecuteUnsignedApplet.NO);
+            removeByBehaviour(ExecuteAppletAction.NO);
         }
         if (deleteTypeComboBox.getSelectedIndex() == 5) {
             removeAllItemsFromTable(currentTable, customModel);
@@ -701,7 +701,7 @@
             public TableCellEditor getCellEditor(int row, int column) {
                 int columnx = convertColumnIndexToModel(column);
                 if (columnx == 0) {
-                    return new DefaultCellEditor(new JComboBox(new ExecuteUnsignedApplet[]{ExecuteUnsignedApplet.ALWAYS, ExecuteUnsignedApplet.NEVER, ExecuteUnsignedApplet.YES, ExecuteUnsignedApplet.NO}));
+                    return new DefaultCellEditor(new JComboBox(new ExecuteAppletAction[]{ExecuteAppletAction.ALWAYS, ExecuteAppletAction.NEVER, ExecuteAppletAction.YES, ExecuteAppletAction.NO}));
                 }
                 if (columnx == 2) {
                     column = convertColumnIndexToModel(column);
@@ -758,7 +758,7 @@
 
     }
 
-    private void removeByBehaviour(ExecuteUnsignedApplet unsignedAppletAction) {
+    private void removeByBehaviour(ExecuteAppletAction unsignedAppletAction) {
         UnsignedAppletActionEntry[] items = currentModel.back.toArray();
         if (askBeforeActionCheckBox.isSelected()) {
             List<UnsignedAppletActionEntry> toBeDeleted = new ArrayList<UnsignedAppletActionEntry>();
@@ -904,16 +904,16 @@
 
             @Override
             public boolean include(Entry<? extends UnsignedAppletActionTableModel, ? extends Integer> entry) {
-                ExecuteUnsignedApplet o = (ExecuteUnsignedApplet) entry.getModel().getValueAt(entry.getIdentifier(), 0);
-                return (o.equals(ExecuteUnsignedApplet.ALWAYS) || o.equals(ExecuteUnsignedApplet.NEVER));
+                ExecuteAppletAction o = (ExecuteAppletAction) entry.getModel().getValueAt(entry.getIdentifier(), 0);
+                return (o.equals(ExecuteAppletAction.ALWAYS) || o.equals(ExecuteAppletAction.NEVER));
             }
         }
 
         private static final class ShowPermanentA extends MyCommonSorter {
             @Override
             public boolean include(Entry<? extends UnsignedAppletActionTableModel, ? extends Integer> entry) {
-                ExecuteUnsignedApplet o = (ExecuteUnsignedApplet) entry.getModel().getValueAt(entry.getIdentifier(), 0);
-                return (o.equals(ExecuteUnsignedApplet.ALWAYS));
+                ExecuteAppletAction o = (ExecuteAppletAction) entry.getModel().getValueAt(entry.getIdentifier(), 0);
+                return (o.equals(ExecuteAppletAction.ALWAYS));
             }
         }
 
@@ -921,8 +921,8 @@
 
             @Override
             public boolean include(Entry<? extends UnsignedAppletActionTableModel, ? extends Integer> entry) {
-                ExecuteUnsignedApplet o = (ExecuteUnsignedApplet) entry.getModel().getValueAt(entry.getIdentifier(), 0);
-                return (o.equals(ExecuteUnsignedApplet.NEVER));
+                ExecuteAppletAction o = (ExecuteAppletAction) entry.getModel().getValueAt(entry.getIdentifier(), 0);
+                return (o.equals(ExecuteAppletAction.NEVER));
             }
         }
 
@@ -930,8 +930,8 @@
 
             @Override
             public boolean include(Entry<? extends UnsignedAppletActionTableModel, ? extends Integer> entry) {
-                ExecuteUnsignedApplet o = (ExecuteUnsignedApplet) entry.getModel().getValueAt(entry.getIdentifier(), 0);
-                return (o.equals(ExecuteUnsignedApplet.YES) || o.equals(ExecuteUnsignedApplet.NO));
+                ExecuteAppletAction o = (ExecuteAppletAction) entry.getModel().getValueAt(entry.getIdentifier(), 0);
+                return (o.equals(ExecuteAppletAction.YES) || o.equals(ExecuteAppletAction.NO));
             }
         }
 
@@ -939,8 +939,8 @@
 
             @Override
             public boolean include(Entry<? extends UnsignedAppletActionTableModel, ? extends Integer> entry) {
-                ExecuteUnsignedApplet o = (ExecuteUnsignedApplet) entry.getModel().getValueAt(entry.getIdentifier(), 0);
-                return (o.equals(ExecuteUnsignedApplet.YES));
+                ExecuteAppletAction o = (ExecuteAppletAction) entry.getModel().getValueAt(entry.getIdentifier(), 0);
+                return (o.equals(ExecuteAppletAction.YES));
             }
            
             
@@ -950,8 +950,8 @@
 
             @Override
             public boolean include(Entry<? extends UnsignedAppletActionTableModel, ? extends Integer> entry) {
-                ExecuteUnsignedApplet o = (ExecuteUnsignedApplet) entry.getModel().getValueAt(entry.getIdentifier(), 0);
-                return (o.equals(ExecuteUnsignedApplet.NO));
+                ExecuteAppletAction o = (ExecuteAppletAction) entry.getModel().getValueAt(entry.getIdentifier(), 0);
+                return (o.equals(ExecuteAppletAction.NO));
             }
             
         }
diff -r ededca6b0659 -r 61bfad46e9cc netx/net/sourceforge/jnlp/security/AppTrustWarningDialog.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/netx/net/sourceforge/jnlp/security/AppTrustWarningDialog.java	Mon Mar 03 11:36:14 2014 -0500
@@ -0,0 +1,68 @@
+/* Copyright (C) 2013 Red Hat, Inc.
+
+This file is part of IcedTea.
+
+IcedTea is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation, version 2.
+
+IcedTea is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with IcedTea; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version.
+ */
+
+package net.sourceforge.jnlp.security;
+
+import net.sourceforge.jnlp.JNLPFile;
+import net.sourceforge.jnlp.security.AppTrustWarningPanel.ActionChoiceListener;
+import net.sourceforge.jnlp.security.AppTrustWarningPanel.AppSigningWarningAction;
+
+/**
+ * A panel that confirms that the user is OK with unsigned code running.
+ */
+public class AppTrustWarningDialog extends SecurityDialogPanel {
+
+    private AppTrustWarningDialog(final SecurityDialog dialog) {
+        super(dialog);
+    }
+
+    public static AppTrustWarningDialog unsigned(final SecurityDialog dialog, final JNLPFile file) {
+        final AppTrustWarningDialog warningDialog = new AppTrustWarningDialog(dialog);
+        warningDialog.add(new UnsignedAppletTrustWarningPanel(file, warningDialog.getActionChoiceListener()));
+        return warningDialog;
+    }
+
+    private ActionChoiceListener getActionChoiceListener() {
+        return new ActionChoiceListener() {
+            @Override
+            public void actionChosen(final AppSigningWarningAction action) {
+                parent.setValue(action);
+                parent.dispose();
+            }
+        };
+    }
+
+}
diff -r ededca6b0659 -r 61bfad46e9cc netx/net/sourceforge/jnlp/security/AppTrustWarningPanel.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/netx/net/sourceforge/jnlp/security/AppTrustWarningPanel.java	Mon Mar 03 11:36:14 2014 -0500
@@ -0,0 +1,321 @@
+/* Copyright (C) 2013 Red Hat, Inc.
+
+This file is part of IcedTea.
+
+IcedTea is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation, version 2.
+
+IcedTea is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with IcedTea; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version.
+ */
+
+package net.sourceforge.jnlp.security;
+
+import static net.sourceforge.jnlp.runtime.Translator.R;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Font;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.BorderFactory;
+import javax.swing.BoxLayout;
+import javax.swing.ButtonGroup;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.SwingConstants;
+
+import net.sourceforge.jnlp.JNLPFile;
+import net.sourceforge.jnlp.PluginBridge;
+import net.sourceforge.jnlp.security.appletextendedsecurity.ExecuteAppletAction;
+import net.sourceforge.jnlp.security.appletextendedsecurity.ExtendedAppletSecurityHelp;
+import net.sourceforge.jnlp.util.ScreenFinder;
+
+/*
+ * This class is meant to provide a common layout and functionality for warning dialogs
+ * that appear when the user needs to confirm the running of applets/applications.
+ * Subclasses include UnsignedAppletTrustWarningPanel, for unsigned plugin applets, and
+ * PartiallySignedAppTrustWarningPanel, for partially signed JNLP applications as well as
+ * plugin applets. New implementations should be added to the unit test at
+ * unit/net/sourceforge/jnlp/security/AppTrustWarningPanelTest
+ */
+public abstract class AppTrustWarningPanel extends JPanel {
+
+    /*
+     * Details of decided action.
+     */
+    public static class AppSigningWarningAction {
+        private ExecuteAppletAction action;
+        private boolean applyToCodeBase;
+
+        public AppSigningWarningAction(ExecuteAppletAction action,
+                boolean applyToCodeBase) {
+            this.action = action;
+            this.applyToCodeBase = applyToCodeBase;
+        }
+
+        public ExecuteAppletAction getAction() {
+            return action;
+        }
+
+        public boolean rememberForCodeBase() {
+            return applyToCodeBase;
+        }
+    }
+
+    /*
+     * Callback for when action is decided.
+     */
+    public static interface ActionChoiceListener {
+        void actionChosen(AppSigningWarningAction action);
+    }
+
+    protected int PANE_WIDTH = 500;
+
+    protected int TOP_PANEL_HEIGHT = 60;
+    protected int INFO_PANEL_HEIGHT = 140;
+    protected int INFO_PANEL_HINT_HEIGHT = 25;
+    protected int QUESTION_PANEL_HEIGHT = 35;
+
+    private JButton allowButton;
+    private JButton rejectButton;
+    private JButton helpButton;
+    private JCheckBox permanencyCheckBox;
+    private JRadioButton applyToAppletButton;
+    private JRadioButton applyToCodeBaseButton;
+
+    protected JNLPFile file;
+
+    private ActionChoiceListener actionChoiceListener;
+
+    /*
+     * Subclasses should call addComponents() IMMEDIATELY after calling the super() constructor!
+     */
+    public AppTrustWarningPanel(JNLPFile file, ActionChoiceListener actionChoiceListener) {
+        this.file = file;
+        this.actionChoiceListener = actionChoiceListener;
+    }
+
+    /*
+     * Provides an image to be displayed near the upper left corner of the dialog.
+     */
+    protected abstract ImageIcon getInfoImage();
+
+    /*
+     * Provides a short description of why the dialog is appearing. The message is expected to be HTML-formatted.
+     */
+    protected abstract String getTopPanelText();
+
+    /*
+     * Provides in-depth information on why the dialog is appearing. The message is expected to be HTML-formatted.
+     */
+    protected abstract String getInfoPanelText();
+
+    /*
+     * This provides the text for the final prompt to the user. The message is expected to be HTML formatted.
+     * The user's action is a direct response to this question.
+     */
+    protected abstract String getQuestionPanelText();
+
+    public JButton getAllowButton() {
+        return allowButton;
+    }
+
+    public JButton getRejectButton() {
+        return rejectButton;
+    }
+
+    protected static String htmlWrap(String text) {
+        return "<html>" + text + "</html>";
+    }
+
+    private void setupTopPanel() {
+        final String topLabelText = getTopPanelText();
+
+        JLabel topLabel = new JLabel(topLabelText, getInfoImage(),
+                SwingConstants.LEFT);
+        topLabel.setFont(new Font(topLabel.getFont().toString(), Font.BOLD, 12));
+
+        JPanel topPanel = new JPanel(new BorderLayout());
+        topPanel.setBackground(Color.WHITE);
+        topPanel.add(topLabel, BorderLayout.CENTER);
+        topPanel.setPreferredSize(new Dimension(PANE_WIDTH, TOP_PANEL_HEIGHT));
+        topPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
+
+        add(topPanel);
+    }
+
+    private void setupInfoPanel() {
+        String infoLabelText = getInfoPanelText();
+        int panelHeight = INFO_PANEL_HEIGHT + INFO_PANEL_HINT_HEIGHT;
+
+        JLabel infoLabel = new JLabel(infoLabelText);
+        JPanel infoPanel = new JPanel(new BorderLayout());
+        infoPanel.add(infoLabel, BorderLayout.CENTER);
+        infoPanel.setPreferredSize(new Dimension(PANE_WIDTH, panelHeight));
+        infoPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
+
+        add(infoPanel);
+    }
+
+    private void setupQuestionsPanel() {
+        JPanel questionPanel = new JPanel(new BorderLayout());
+
+        final String questionPanelText = getQuestionPanelText();
+        questionPanel.add(new JLabel(questionPanelText), BorderLayout.EAST);
+
+        questionPanel.setPreferredSize(new Dimension(PANE_WIDTH, QUESTION_PANEL_HEIGHT));
+        questionPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10));
+
+        add(questionPanel);
+    }
+
+    private JPanel createMatchOptionsPanel() {
+        JPanel matchOptionsPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+
+        ButtonGroup group = new ButtonGroup();
+        applyToAppletButton = new JRadioButton(R("SRememberAppletOnly"));
+        applyToAppletButton.setSelected(true);
+        applyToAppletButton.setEnabled(false); // Start disabled until 'Remember this option' is selected
+
+        applyToCodeBaseButton = new JRadioButton(htmlWrap(R("SRememberCodebase", file.getCodeBase())));
+        applyToCodeBaseButton.setEnabled(false);
+
+        group.add(applyToAppletButton);
+        group.add(applyToCodeBaseButton);
+
+        matchOptionsPanel.add(applyToAppletButton);
+        matchOptionsPanel.add(applyToCodeBaseButton);
+
+        return matchOptionsPanel;
+    }
+
+    private JPanel createCheckBoxPanel() {
+        JPanel checkBoxPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
+
+        permanencyCheckBox = new JCheckBox(htmlWrap(R("SRememberOption")));
+        permanencyCheckBox.addActionListener(permanencyListener());
+        checkBoxPanel.add(permanencyCheckBox);


More information about the distro-pkg-dev mailing list