changeset 951:fcb9dcf1c83c

PolicyEditor can be made modal. * netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: (PolicyEditorWindow) new interface to facilitate PolicyEditor as a Window rather than Panel. (PolicyEditorFrame, PolicyEditorDialog) PolicyEditorWindow implementations. (getPolicyEditorFrame, getPolicyEditorWindow) new methods to get frame or dialog implementations. (setComponentMnemonic) made static. (preparePolicyEditorWindow) common setup for frame and dialog implementations. * netx/net/sourceforge/jnlp/controlpanel/PolicyPanel.java: refactor to use PolicyEditorWindow * netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java: same * netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PartiallySignedAppTrustWarningPanel.java same * netx/net/sourceforge/jnlp/util/FileUtils.java: (showReadOnlyDialog, showCouldNotOpenFileDialog, showCouldNotOpenFilePathDialog, showCouldNotOpenDialog) use Component rather than JFrame
author Andrew Azores <aazores@redhat.com>
date Wed, 26 Mar 2014 11:02:00 -0400
parents 689447c4d6bd
children ca18850addad
files ChangeLog netx/net/sourceforge/jnlp/controlpanel/PolicyPanel.java netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PartiallySignedAppTrustWarningPanel.java netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java netx/net/sourceforge/jnlp/util/FileUtils.java
diffstat 6 files changed, 236 insertions(+), 55 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Wed Mar 26 10:45:46 2014 -0400
+++ b/ChangeLog	Wed Mar 26 11:02:00 2014 -0400
@@ -1,3 +1,25 @@
+2014-03-26  Andrew Azores  <aazores@redhat.com>
+            Jiri Vanek  <jvanek@redhat.com>
+
+	PolicyEditor can be made modal.
+	* netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java:
+	(PolicyEditorWindow) new interface to facilitate PolicyEditor as a Window
+	rather than Panel. (PolicyEditorFrame, PolicyEditorDialog)
+	PolicyEditorWindow implementations. (getPolicyEditorFrame,
+	getPolicyEditorWindow) new methods to get frame or dialog implementations.
+	(setComponentMnemonic) made static. (preparePolicyEditorWindow) common
+	setup for frame and dialog implementations.
+	* netx/net/sourceforge/jnlp/controlpanel/PolicyPanel.java: refactor to use
+	PolicyEditorWindow
+	* netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java:
+	same
+	* netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PartiallySignedAppTrustWarningPanel.java
+	same
+	* netx/net/sourceforge/jnlp/util/FileUtils.java: (showReadOnlyDialog,
+	showCouldNotOpenFileDialog, showCouldNotOpenFilePathDialog,
+	showCouldNotOpenDialog) use Component rather than JFrame
+
+
 2014-03-26  Andrew Azores  <aazores@redhat.com>
 
 	Added many new permissions for PolicyEditor
--- a/netx/net/sourceforge/jnlp/controlpanel/PolicyPanel.java	Wed Mar 26 10:45:46 2014 -0400
+++ b/netx/net/sourceforge/jnlp/controlpanel/PolicyPanel.java	Wed Mar 26 11:02:00 2014 -0400
@@ -54,12 +54,12 @@
 import javax.swing.JButton;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
-import javax.swing.JOptionPane;
 import javax.swing.JTextField;
 import javax.swing.SwingUtilities;
 
 import net.sourceforge.jnlp.config.DeploymentConfiguration;
 import net.sourceforge.jnlp.security.policyeditor.PolicyEditor;
+import net.sourceforge.jnlp.security.policyeditor.PolicyEditor.PolicyEditorWindow;
 import net.sourceforge.jnlp.util.FileUtils;
 import net.sourceforge.jnlp.util.FileUtils.OpenFileResult;
 import net.sourceforge.jnlp.util.logging.OutputController;
@@ -72,7 +72,7 @@
  */
 public class PolicyPanel extends NamedBorderPanel {
 
-    private PolicyEditor policyEditor = null;
+    private PolicyEditorWindow policyEditor = null;
 
     public PolicyPanel(final JFrame frame, final DeploymentConfiguration config) {
         super(R("CPHeadPolicy"), new GridBagLayout());
@@ -161,12 +161,12 @@
      * @param filePath a {@link String} representing the path to the file to be opened
      */
     private void launchSimplePolicyEditor(final String filePath) {
-        if (policyEditor == null || policyEditor.isClosed()) {
-            policyEditor = PolicyEditor.createInstance(filePath);
-            policyEditor.setVisible(true);
+        if (policyEditor == null || policyEditor.getPolicyEditor().isClosed()) {
+            policyEditor = PolicyEditor.getPolicyEditorFrame(filePath);
+            policyEditor.asWindow().setVisible(true);
         } else {
-            policyEditor.toFront();
-            policyEditor.repaint();
+            policyEditor.asWindow().toFront();
+            policyEditor.asWindow().repaint();
         }
     }
 
--- a/netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java	Wed Mar 26 10:45:46 2014 -0400
+++ b/netx/net/sourceforge/jnlp/security/dialogs/CertWarningPane.java	Wed Mar 26 11:02:00 2014 -0400
@@ -41,6 +41,7 @@
 
 import java.awt.BorderLayout;
 import java.awt.Color;
+import java.awt.Dialog.ModalityType;
 import java.awt.Dimension;
 import java.awt.FlowLayout;
 import java.awt.Font;
@@ -84,6 +85,7 @@
 import net.sourceforge.jnlp.security.SecurityDialogs.AccessType;
 import net.sourceforge.jnlp.security.SecurityUtil;
 import net.sourceforge.jnlp.security.policyeditor.PolicyEditor;
+import net.sourceforge.jnlp.security.policyeditor.PolicyEditor.PolicyEditorWindow;
 import net.sourceforge.jnlp.util.FileUtils;
 import net.sourceforge.jnlp.util.logging.OutputController;
 
@@ -109,7 +111,7 @@
     private JButton run, sandbox, advancedOptions, cancel, moreInfo;
     private boolean alwaysTrustSelected;
     private String bottomLabelWarningText;
-    private PolicyEditor policyEditor = null;
+    private PolicyEditorWindow policyEditor = null;
 
     public CertWarningPane(SecurityDialog x, CertVerifier certVerifier, SecurityDelegate securityDelegate) {
         super(x, certVerifier);
@@ -330,14 +332,15 @@
                 filepath = null;
             }
 
-            if (policyEditor == null || policyEditor.isClosed()) {
-                policyEditor = PolicyEditor.createInstance(filepath);
+            if (policyEditor == null || policyEditor.getPolicyEditor().isClosed()) {
+                policyEditor = PolicyEditor.getPolicyEditorDialog(filepath);
             } else {
-                policyEditor.toFront();
-                policyEditor.repaint();
+                policyEditor.asWindow().toFront();
+                policyEditor.asWindow().repaint();
             }
-            policyEditor.addNewCodebase(file.getCodeBase().toString());
-            policyEditor.setVisible(true);
+            policyEditor.setModalityType(ModalityType.DOCUMENT_MODAL);
+            policyEditor.getPolicyEditor().addNewCodebase(file.getCodeBase().toString());
+            policyEditor.asWindow().setVisible(true);
             policyMenu.setVisible(false);
         }
     }
--- a/netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PartiallySignedAppTrustWarningPanel.java	Wed Mar 26 10:45:46 2014 -0400
+++ b/netx/net/sourceforge/jnlp/security/dialogs/apptrustwarningpanel/PartiallySignedAppTrustWarningPanel.java	Wed Mar 26 11:02:00 2014 -0400
@@ -2,6 +2,7 @@
 
 import static net.sourceforge.jnlp.runtime.Translator.R;
 
+import java.awt.Dialog.ModalityType;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.MouseEvent;
@@ -25,6 +26,7 @@
 import net.sourceforge.jnlp.security.appletextendedsecurity.ExecuteAppletAction;
 import net.sourceforge.jnlp.security.appletextendedsecurity.UnsignedAppletTrustConfirmation;
 import net.sourceforge.jnlp.security.policyeditor.PolicyEditor;
+import net.sourceforge.jnlp.security.policyeditor.PolicyEditor.PolicyEditorWindow;
 import net.sourceforge.jnlp.tools.CertInformation;
 import net.sourceforge.jnlp.tools.JarCertVerifier;
 
@@ -34,7 +36,7 @@
     private final JButton sandboxButton;
     private final JButton advancedOptionsButton;
     private final JPopupMenu policyMenu;
-    private PolicyEditor policyEditor = null;
+    private PolicyEditorWindow policyEditor = null;
 
     public PartiallySignedAppTrustWarningPanel(JNLPFile file, ActionChoiceListener actionChoiceListener, SecurityDialog securityDialog) {
         super(file, actionChoiceListener);
@@ -175,14 +177,15 @@
                 filepath = null;
             }
 
-            if (policyEditor == null || policyEditor.isClosed()) {
-                policyEditor = PolicyEditor.createInstance(filepath);
+            if (policyEditor == null || policyEditor.getPolicyEditor().isClosed()) {
+                policyEditor = PolicyEditor.getPolicyEditorDialog(filepath);
             } else {
-                policyEditor.toFront();
-                policyEditor.repaint();
+                policyEditor.asWindow().toFront();
+                policyEditor.asWindow().repaint();
             }
-            policyEditor.addNewCodebase(file.getCodeBase().toString());
-            policyEditor.setVisible(true);
+            policyEditor.setModalityType(ModalityType.DOCUMENT_MODAL);
+            policyEditor.getPolicyEditor().addNewCodebase(file.getCodeBase().toString());
+            policyEditor.asWindow().setVisible(true);
             policyMenu.setVisible(false);
         }
     }
--- a/netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java	Wed Mar 26 10:45:46 2014 -0400
+++ b/netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java	Wed Mar 26 11:02:00 2014 -0400
@@ -36,10 +36,12 @@
 
 package net.sourceforge.jnlp.security.policyeditor;
 
+import java.awt.Dialog.ModalityType;
 import static net.sourceforge.jnlp.runtime.Translator.R;
 
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
+import java.awt.Window;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.KeyEvent;
@@ -73,6 +75,7 @@
 import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JComponent;
+import javax.swing.JDialog;
 import javax.swing.JFileChooser;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
@@ -81,7 +84,7 @@
 import javax.swing.JMenuBar;
 import javax.swing.JMenuItem;
 import javax.swing.JOptionPane;
-import javax.swing.JRootPane;
+import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.KeyStroke;
 import javax.swing.ListSelectionModel;
@@ -124,7 +127,7 @@
  * Comments will *not* be preserved when PolicyEditor next saves to the
  * file.
  */
-public class PolicyEditor extends JFrame {
+public class PolicyEditor extends JPanel {
 
     /**
      * Command line switch to print a help message.
@@ -161,7 +164,6 @@
     private final JList list = new JList(listModel);
     private final JButton okButton = new JButton(), closeButton = new JButton(),
             addCodebaseButton = new JButton(), removeCodebaseButton = new JButton();
-    private final JMenuBar menuBar = new JMenuBar();
     private final JFileChooser fileChooser;
     private CustomPolicyViewer cpViewer = null;
     private final WeakReference<PolicyEditor> weakThis = new WeakReference<PolicyEditor>(this);
@@ -295,21 +297,158 @@
         };
 
         setAccelerators();
-        setTitle(R("PETitle"));
 
         setupLayout();
         list.setSelectedIndex(0);
         updateCheckboxes("");
-        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+    }
 
-        addWindowListener(new WindowAdapter() {
+    private static void preparePolicyEditorWindow(final PolicyEditorWindow w, PolicyEditor e) {
+        w.setModalityType(ModalityType.MODELESS); //at least some default
+        w.setPolicyEditor(e);
+        w.setTitle(R("PETitle"));
+        w.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+        w.setJMenuBar(createMenuBar(w.asWindow(), w.getPolicyEditor()));
+        setupPolicyEditorWindow(w.asWindow(), w.getPolicyEditor());
+
+    }
+
+    private static void setupPolicyEditorWindow(final Window window, final PolicyEditor editor) {
+        window.add(editor);
+        window.pack();
+        editor.setVisible(true);
+
+        window.addWindowListener(new WindowAdapter() {
             @Override
             public void windowClosing(final WindowEvent e) {
-                quit();
+                editor.quit();
+                window.dispose();
+            }
+        });
+
+        editor.closeButton.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(final ActionEvent e) {
+                window.dispose();
             }
         });
     }
 
+    public static interface PolicyEditorWindow {
+
+        public void setTitle(String s);
+
+        public void setDefaultCloseOperation(int i);
+
+        public PolicyEditor getPolicyEditor();
+
+        public void setPolicyEditor(PolicyEditor e);
+
+        public void setJMenuBar(JMenuBar menu);
+
+        public Window asWindow();
+
+        public void setModalityType(ModalityType modalityType);
+    }
+
+    private static class PolicyEditorFrame extends JFrame implements PolicyEditorWindow {
+
+        private PolicyEditor editor;
+
+        private PolicyEditorFrame(final PolicyEditor editor) {
+            super();
+            preparePolicyEditorWindow((PolicyEditorWindow)this, editor);
+        }
+
+        @Override
+        public final void setTitle(String title) {
+            super.setTitle(title);
+        }
+
+        @Override
+        public final PolicyEditor getPolicyEditor() {
+            return editor;
+        }
+
+        @Override
+        public final void setPolicyEditor(PolicyEditor e) {
+            editor = e;
+        }
+
+        @Override
+        public final void setDefaultCloseOperation(int operation) {
+            super.setDefaultCloseOperation(operation);
+        }
+
+        @Override
+        public final void setJMenuBar(JMenuBar menu) {
+            super.setJMenuBar(menu);
+        }
+
+        @Override
+        public final Window asWindow() {
+            return this;
+        }
+
+        @Override
+        public void setModalityType(ModalityType type) {
+            //no op for frame
+        }
+    }
+
+    public static PolicyEditorWindow getPolicyEditorFrame(final String filepath) {
+        return new PolicyEditorFrame(new PolicyEditor(filepath));
+    }
+
+    private static class PolicyEditorDialog extends JDialog implements PolicyEditorWindow {
+
+        private PolicyEditor editor;
+
+        private PolicyEditorDialog(final PolicyEditor editor) {
+            super();
+            preparePolicyEditorWindow((PolicyEditorWindow)this, editor);
+        }
+
+        @Override
+        public final void setTitle(String title) {
+            super.setTitle(title);
+        }
+
+        @Override
+        public final PolicyEditor getPolicyEditor() {
+            return editor;
+        }
+
+        @Override
+        public final void setPolicyEditor(PolicyEditor e) {
+            editor = e;
+        }
+
+        @Override
+        public final void setDefaultCloseOperation(int operation) {
+            super.setDefaultCloseOperation(operation);
+        }
+
+        @Override
+        public final void setJMenuBar(JMenuBar menu) {
+            super.setJMenuBar(menu);
+        }
+
+        @Override
+        public final Window asWindow() {
+            return this;
+        }
+
+        @Override
+        public void setModalityType(ModalityType type) {
+            super.setModalityType(type);
+        }
+    }
+
+    public static PolicyEditorWindow getPolicyEditorDialog(final String filepath) {
+        return new PolicyEditorDialog(new PolicyEditor(filepath));
+    }
+
     private void setClosed() {
         closed = true;
     }
@@ -370,9 +509,8 @@
      */
     private void setAccelerator(final int trigger, final int modifiers, final Action action, final String identifier) {
         final KeyStroke key = KeyStroke.getKeyStroke(trigger, modifiers);
-        final JRootPane root = getRootPane();
-        root.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(key, identifier);
-        root.getActionMap().put(identifier, action);
+        this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(key, identifier);
+        this.getActionMap().put(identifier, action);
     }
 
     /**
@@ -454,7 +592,6 @@
         }
         weakThis.clear();
         setClosed();
-        dispose();
     }
 
     /**
@@ -649,7 +786,7 @@
      * @param component the component for which to set a mnemonic
      * @param mnemonic the mnemonic to set
      */
-    private void setComponentMnemonic(final AbstractButton component, final String mnemonic) {
+    private static void setComponentMnemonic(final AbstractButton component, final String mnemonic) {
         final int trig;
         try {
             trig = Integer.parseInt(mnemonic);
@@ -660,45 +797,61 @@
         component.setMnemonic(trig);
     }
 
-    /**
-     * Lay out all controls, tooltips, etc.
-     */
-    private void setupLayout() {
+    private static JMenuBar createMenuBar(final Window window, final PolicyEditor editor) {
+        final JMenuBar menuBar = new JMenuBar();
+
         final JMenu fileMenu = new JMenu(R("PEFileMenu"));
         setComponentMnemonic(fileMenu, R("PEFileMenuMnemonic"));
+
         final JMenuItem openItem = new JMenuItem(R("PEOpenMenuItem"));
         setComponentMnemonic(openItem, R("PEOpenMenuItemMnemonic"));
         openItem.setAccelerator(KeyStroke.getKeyStroke(openItem.getMnemonic(), ActionEvent.CTRL_MASK));
-        openItem.addActionListener(openButtonAction);
+        openItem.addActionListener(editor.openButtonAction);
         fileMenu.add(openItem);
+
         final JMenuItem saveItem = new JMenuItem(R("PESaveMenuItem"));
         setComponentMnemonic(saveItem, R("PESaveMenuItemMnemonic"));
         saveItem.setAccelerator(KeyStroke.getKeyStroke(saveItem.getMnemonic(), ActionEvent.CTRL_MASK));
-        saveItem.addActionListener(okButtonAction);
+        saveItem.addActionListener(editor.okButtonAction);
         fileMenu.add(saveItem);
+
         final JMenuItem saveAsItem = new JMenuItem(R("PESaveAsMenuItem"));
         setComponentMnemonic(saveAsItem, R("PESaveAsMenuItemMnemonic"));
         saveAsItem.setAccelerator(KeyStroke.getKeyStroke(saveAsItem.getMnemonic(), ActionEvent.CTRL_MASK));
-        saveAsItem.addActionListener(saveAsButtonAction);
+        saveAsItem.addActionListener(editor.saveAsButtonAction);
         fileMenu.add(saveAsItem);
+
         final JMenuItem exitItem = new JMenuItem(R("PEExitMenuItem"));
         setComponentMnemonic(exitItem, R("PEExitMenuItemMnemonic"));
         exitItem.setAccelerator(KeyStroke.getKeyStroke(exitItem.getMnemonic(), ActionEvent.CTRL_MASK));
-        exitItem.addActionListener(closeButtonAction);
+        exitItem.addActionListener(editor.closeButtonAction);
+        exitItem.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(final ActionEvent e) {
+                window.dispose();
+            }
+        });
         fileMenu.add(exitItem);
         menuBar.add(fileMenu);
 
         final JMenu viewMenu = new JMenu(R("PEViewMenu"));
         setComponentMnemonic(viewMenu, R("PEViewMenuMnemonic"));
+
         final JMenuItem customPermissionsItem = new JMenuItem(R("PECustomPermissionsItem"));
         setComponentMnemonic(customPermissionsItem, R("PECustomPermissionsItemMnemonic"));
         customPermissionsItem.setAccelerator(KeyStroke.getKeyStroke(customPermissionsItem.getMnemonic(), ActionEvent.ALT_MASK));
-        customPermissionsItem.addActionListener(viewCustomButtonAction);
+        customPermissionsItem.addActionListener(editor.viewCustomButtonAction);
 
         viewMenu.add(customPermissionsItem);
         menuBar.add(viewMenu);
-        this.setJMenuBar(menuBar);
+
+        return menuBar;
+    }
 
+    /**
+     * Lay out all controls, tooltips, etc.
+     */
+    private void setupLayout() {
         final JLabel checkboxLabel = new JLabel();
         checkboxLabel.setText(R("PECheckboxLabel"));
         checkboxLabel.setBorder(new EmptyBorder(2, 2, 2, 2));
@@ -796,7 +949,6 @@
         add(closeButton, cancelButtonConstraints);
 
         setMinimumSize(getPreferredSize());
-        pack();
     }
 
     /**
@@ -979,10 +1131,10 @@
                 }
                 final StringBuilder sb = new StringBuilder();
                 sb.append(AUTOGENERATED_NOTICE);
-                sb.append("\n/* Generated by PolicyEditor at " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
-                        .format(Calendar.getInstance().getTime()) + " */" + System.getProperty("line.separator"));
+                sb.append("\n/* Generated by PolicyEditor at ").append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
+                              .format(Calendar.getInstance().getTime())).append(" */").append(System.getProperty("line.separator"));
                 final Set<PolicyEditorPermissions> enabledPermissions = new HashSet<PolicyEditorPermissions>();
-                FileLock fileLock = null;
+                FileLock fileLock;
                 try {
                     fileLock = FileUtils.getFileLock(file.getAbsolutePath(), false, true);
                 } catch (final FileNotFoundException e) {
@@ -1098,12 +1250,12 @@
                     // maybe the user just forgot the -file flag, so try to open anyway
                     filepath = args[0];
                 }
-                final PolicyEditor editor = new PolicyEditor(filepath);
-                editor.setVisible(true);
+                final PolicyEditorWindow frame = getPolicyEditorFrame(filepath);
+                frame.asWindow().setVisible(true);
                 final String codebaseStr = argsMap.get(CODEBASE_FLAG);
                 if (codebaseStr != null) {
                     final String[] urls = codebaseStr.split(" ");
-                    editor.addNewCodebases(urls);
+                    frame.getPolicyEditor().addNewCodebases(urls);
                 }
             }
         });
--- a/netx/net/sourceforge/jnlp/util/FileUtils.java	Wed Mar 26 10:45:46 2014 -0400
+++ b/netx/net/sourceforge/jnlp/util/FileUtils.java	Wed Mar 26 11:02:00 2014 -0400
@@ -16,8 +16,10 @@
 
 package net.sourceforge.jnlp.util;
 
+import java.awt.Component;
 import static net.sourceforge.jnlp.runtime.Translator.R;
 
+import java.awt.Window;
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.File;
@@ -30,7 +32,6 @@
 import java.io.OutputStreamWriter;
 import java.io.RandomAccessFile;
 import java.io.Writer;
-import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
 import java.nio.channels.FileLock;
 import java.security.DigestInputStream;
@@ -347,7 +348,7 @@
      * Show a dialog informing the user that the file is currently read-only
      * @param frame a {@link JFrame} to act as parent to this dialog
      */
-    public static void showReadOnlyDialog(final JFrame frame) {
+    public static void showReadOnlyDialog(final Component frame) {
         SwingUtilities.invokeLater(new Runnable() {
             @Override
             public void run() {
@@ -361,7 +362,7 @@
      * @param frame a {@link JFrame} to act as parent to this dialog
      * @param filePath a {@link String} representing the path to the file we failed to open
      */
-    public static void showCouldNotOpenFilepathDialog(final JFrame frame, final String filePath) {
+    public static void showCouldNotOpenFilepathDialog(final Component frame, final String filePath) {
         showCouldNotOpenDialog(frame, R("RCantOpenFile", filePath));
     }
 
@@ -371,7 +372,7 @@
      * @param filePath a {@link String} representing the path to the file we failed to open
      * @param reason a {@link OpenFileResult} specifying more precisely why we failed to open the file
      */
-    public static void showCouldNotOpenFileDialog(final JFrame frame, final String filePath, final OpenFileResult reason) {
+    public static void showCouldNotOpenFileDialog(final Component frame, final String filePath, final OpenFileResult reason) {
         final String message;
         switch (reason) {
             case CANT_CREATE:
@@ -396,7 +397,7 @@
      * @param filePath a {@link String} representing the path to the file we failed to open
      * @param message a {@link String} giving the specific reason the file could not be opened
      */
-    public static void showCouldNotOpenDialog(final JFrame frame, final String message) {
+    public static void showCouldNotOpenDialog(final Component frame, final String message) {
         SwingUtilities.invokeLater(new Runnable() {
             @Override
             public void run() {