/hg/icedtea-web: Added "File - New" action to PolicyEditor

aazores at icedtea.classpath.org aazores at icedtea.classpath.org
Thu Jul 31 20:24:47 UTC 2014


changeset b2bbab17c25b in /hg/icedtea-web
details: http://icedtea.classpath.org/hg/icedtea-web?cmd=changeset;node=b2bbab17c25b
author: Andrew Azores <aazores at redhat.com>
date: Thu Jul 31 16:24:31 2014 -0400

	Added "File - New" action to PolicyEditor

	2014-07-31  Andrew Azores  <aazores at redhat.com>

		Added "File - New" action to PolicyEditor
		* netx/net/sourceforge/jnlp/resources/Messages.properties (PETitle):
		PolicyEditor, not Policy Editor.
		(PETitleWithPath): new message used for PolicyEditor window title bar
		(PETitleWithChangesMade): same
		(PENewMenuItem): new message
		(PEAddCodebaseItem): added ellipsis
		(PEPasteCodebaseItem): same
		(PENewMenuItemMnemonic): new message
		(PEAddCodebaseItemAccelerator): C-S-n rather than just C-n
		(PENewMenuItemAccelerator): new message, C-n
		* netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: added
		"New" item to "File" menu.
		(setFile): new method.
		(newButtonAction): new field
		(openButtonAction): "save changes made" dialog extracted into new method
		(promptOnSaveChangesMade): new method
		(setParentWindowTitle): new method
		(getWindowTitleForStatus): new method
		(getFile): new method
		(createMenuBar): added New item to File menu
		(removeCodebase): add setChangesMade call
		* netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorController.java
		(openAndParsePolicyFile): use setPerformingIO rather than direct access
		(savePolicyFile): same
		* netx/net/sourceforge/jnlp/security/policyeditor/PolicyFileModel.java
		(setFile): allow null file to facilitate "new file" without a location set
		(saveFile): set new fileWatcher every time, not only if file was
		previously null


diffstat:

 ChangeLog                                                                   |   32 ++
 NEWS                                                                        |    1 +
 netx/net/sourceforge/jnlp/resources/Messages.properties                     |   13 +-
 netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java           |  143 ++++++++-
 netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorController.java |    8 +-
 netx/net/sourceforge/jnlp/security/policyeditor/PolicyFileModel.java        |    5 +-
 6 files changed, 165 insertions(+), 37 deletions(-)

diffs (396 lines):

diff -r 51d839dd6052 -r b2bbab17c25b ChangeLog
--- a/ChangeLog	Thu Jul 31 09:15:31 2014 -0400
+++ b/ChangeLog	Thu Jul 31 16:24:31 2014 -0400
@@ -1,3 +1,35 @@
+2014-07-31  Andrew Azores  <aazores at redhat.com>
+
+	Added "File - New" action to PolicyEditor
+	* netx/net/sourceforge/jnlp/resources/Messages.properties (PETitle):
+	PolicyEditor, not Policy Editor.
+	(PETitleWithPath): new message used for PolicyEditor window title bar
+	(PETitleWithChangesMade): same
+	(PENewMenuItem): new message
+	(PEAddCodebaseItem): added ellipsis
+	(PEPasteCodebaseItem): same
+	(PENewMenuItemMnemonic): new message
+	(PEAddCodebaseItemAccelerator): C-S-n rather than just C-n
+	(PENewMenuItemAccelerator): new message, C-n
+	* netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java: added
+	"New" item to "File" menu.
+	(setFile): new method.
+	(newButtonAction): new field
+	(openButtonAction): "save changes made" dialog extracted into new method
+	(promptOnSaveChangesMade): new method
+	(setParentWindowTitle): new method
+	(getWindowTitleForStatus): new method
+	(getFile): new method
+	(createMenuBar): added New item to File menu
+	(removeCodebase): add setChangesMade call
+	* netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorController.java
+	(openAndParsePolicyFile): use setPerformingIO rather than direct access
+	(savePolicyFile): same
+	* netx/net/sourceforge/jnlp/security/policyeditor/PolicyFileModel.java
+	(setFile): allow null file to facilitate "new file" without a location set
+	(saveFile): set new fileWatcher every time, not only if file was
+	previously null
+
 2014-07-30  Andrew Azores  <aazores at redhat.com>
 			Lukasz Dracz  <ldracz at redhat.com>
 
diff -r 51d839dd6052 -r b2bbab17c25b NEWS
--- a/NEWS	Thu Jul 31 09:15:31 2014 -0400
+++ b/NEWS	Thu Jul 31 16:24:31 2014 -0400
@@ -32,6 +32,7 @@
   - Fixed bug where clicking "Cancel" on the "Save before Exiting" dialog could result in the editor
     exiting without saving changes
   - Keyboard accelerators and mnemonics greatly improved
+  - "File - New" allows editing a new policy without first selecting the file to save to
 * Temporary Permissions in security dialog now multi-selectable and based on PolicyEditor permissions
 
 New in release 1.5 (2014-XX-XX):
diff -r 51d839dd6052 -r b2bbab17c25b netx/net/sourceforge/jnlp/resources/Messages.properties
--- a/netx/net/sourceforge/jnlp/resources/Messages.properties	Thu Jul 31 09:15:31 2014 -0400
+++ b/netx/net/sourceforge/jnlp/resources/Messages.properties	Thu Jul 31 16:24:31 2014 -0400
@@ -498,7 +498,9 @@
 PEHelpFlag=Print this message and exit
 PEFileFlag=Specify a policyfile path to open
 PECodebaseFlag=Specify (a) codebase URL(s) to add and/or focus in the editor
-PETitle=Policy Editor
+PETitle=PolicyEditor
+PETitleWithPath=PolicyEditor - {0}
+PETitleWithChangesMade={0} *
 PEReadProps=Read system properties
 PEReadPropsDetail=Allow applets to read system properties such as your username and home directory location
 PEWriteProps=Write system properties
@@ -558,16 +560,17 @@
 PECheckboxLabel=Permissions
 PECodebaseLabel=Codebases
 PEFileMenu=File
+PENewMenuItem=New
 PEOpenMenuItem=Open...
 PESaveMenuItem=Save
 PESaveAsMenuItem=Save As...
 PEExitMenuItem=Exit
 PECodebaseMenu=Codebase
-PEAddCodebaseItem=Add new
+PEAddCodebaseItem=Add New...
 PERemoveCodebaseItem=Remove
 PERenameCodebaseItem=Rename
 PECopyCodebaseItem=Copy
-PEPasteCodebaseItem=Paste
+PEPasteCodebaseItem=Paste...
 PECopyCodebaseToClipboardItem=Copy URL to clipboard
 PERenameCodebase=Rename codebase to:
 PEPasteCodebase=Paste copied codebase as:
@@ -636,6 +639,7 @@
 PEAddCodebaseItemMnemonic=N
 PERemoveCodebaseMnemonic=R
 PERemoveCodebaseItemMnemonic=R
+PENewMenuItemMnemonic=N
 PEOpenMenuItemMnemonic=O
 PESaveMenuItemMnemonic=S
 PEExitMenuItemMnemonic=X
@@ -649,8 +653,9 @@
 PEPolicyEditorHelpItemMnemonic=H
 
 # See javax.swing.KeyStroke.getKeyStroke(String)
-PEAddCodebaseItemAccelerator=control N
+PEAddCodebaseItemAccelerator=control shift N
 PERemoveCodebaseItemAccelerator=DELETE
+PENewMenuItemAccelerator=control N
 PEOpenMenuItemAccelerator=control O
 PESaveMenuItemAccelerator=control S
 PESaveAsMenuItemAccelerator=control shift S
diff -r 51d839dd6052 -r b2bbab17c25b netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java
--- a/netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java	Thu Jul 31 09:15:31 2014 -0400
+++ b/netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java	Thu Jul 31 16:24:31 2014 -0400
@@ -184,7 +184,7 @@
     private Set<CustomPermission> customPermissionsClipboard = null;
 
     private final ActionListener okButtonAction, addCodebaseButtonAction,
-            removeCodebaseButtonAction, openButtonAction, saveAsButtonAction, viewCustomButtonAction,
+            removeCodebaseButtonAction, newButtonAction, openButtonAction, saveAsButtonAction, viewCustomButtonAction,
             renameCodebaseButtonAction, copyCodebaseButtonAction, pasteCodebaseButtonAction, copyCodebaseToClipboardButtonAction,
             policyEditorHelpButtonAction, aboutPolicyEditorButtonAction;
     private ActionListener closeButtonAction;
@@ -238,12 +238,9 @@
             checkboxMap.put(perm, box);
         }
 
+        setFile(filepath);
         if (filepath != null) {
-            policyEditorController.setFile(new File(filepath));
             openAndParsePolicyFile();
-        } else {
-            resetCodebases();
-            addNewCodebase("");
         }
         setChangesMade(false);
 
@@ -256,7 +253,7 @@
                 if (policyEditorController.getFile() == null) {
                     final int choice = fileChooser.showOpenDialog(PolicyEditor.this);
                     if (choice == JFileChooser.APPROVE_OPTION) {
-                        policyEditorController.setFile(fileChooser.getSelectedFile());
+                        PolicyEditor.this.setFile(fileChooser.getSelectedFile().getAbsolutePath());
                     }
                 }
 
@@ -287,28 +284,22 @@
         removeCodebaseButton.setText(R("PERemoveCodebase"));
         removeCodebaseButton.addActionListener(removeCodebaseButtonAction);
 
+        newButtonAction = new ActionListener() {
+            @Override
+            public void actionPerformed(final ActionEvent e) {
+                if (!promptOnSaveChangesMade(false)) return;
+                setFile(null);
+                setChangesMade(false);
+            }
+        };
+
         openButtonAction = new ActionListener() {
             @Override
             public void actionPerformed(final ActionEvent e) {
-                if (policyEditorController.changesMade()) {
-                    final int save = JOptionPane.showConfirmDialog(PolicyEditor.this, R("PESaveChanges"));
-                    if (save == JOptionPane.YES_OPTION) {
-                        if (policyEditorController.getFile() == null) {
-                            final int choice = fileChooser.showSaveDialog(PolicyEditor.this);
-                            if (choice == JFileChooser.APPROVE_OPTION) {
-                                policyEditorController.setFile(fileChooser.getSelectedFile());
-                            } else if (choice == JFileChooser.CANCEL_OPTION) {
-                                return;
-                            }
-                        }
-                        savePolicyFile();
-                    } else if (save == JOptionPane.CANCEL_OPTION) {
-                        return;
-                    }
-                }
+                if (!promptOnSaveChangesMade(true)) return;
                 final int choice = fileChooser.showOpenDialog(PolicyEditor.this);
                 if (choice == JFileChooser.APPROVE_OPTION) {
-                    policyEditorController.setFile(fileChooser.getSelectedFile());
+                    PolicyEditor.this.setFile(fileChooser.getSelectedFile().getAbsolutePath());
                     openAndParsePolicyFile();
                 }
             }
@@ -319,7 +310,7 @@
             public void actionPerformed(final ActionEvent e) {
                 final int choice = fileChooser.showSaveDialog(PolicyEditor.this);
                 if (choice == JFileChooser.APPROVE_OPTION) {
-                    policyEditorController.setFile(fileChooser.getSelectedFile());
+                    PolicyEditor.this.setFile(fileChooser.getSelectedFile().getAbsolutePath());
                     setChangesMade(true);
                     savePolicyFile();
                 }
@@ -429,6 +420,88 @@
         setupLayout();
     }
 
+    /**
+     *
+     * @param async use asynchronous saving, which displays a progress dialog, or use synchronous, which blocks the
+     *              EDT but allows for eg the on-disk file to be changed without resorting to a busy-wait loop
+     * @return false iff the user wishes to cancel the operation and keep the current editor state
+     */
+    private boolean promptOnSaveChangesMade(final boolean async) {
+        if (policyEditorController.changesMade()) {
+            final int save = JOptionPane.showConfirmDialog(this, R("PESaveChanges"));
+            if (save == JOptionPane.YES_OPTION) {
+                if (policyEditorController.getFile() == null) {
+                    final int choice = fileChooser.showSaveDialog(this);
+                    if (choice == JFileChooser.APPROVE_OPTION) {
+                        this.setFile(fileChooser.getSelectedFile().getAbsolutePath());
+                    } else if (choice == JFileChooser.CANCEL_OPTION) {
+                        return false;
+                    }
+                }
+                if (async) {
+                    savePolicyFile();
+                } else {
+                    try {
+                        policyEditorController.savePolicyFile();
+                    } catch (final IOException e) {
+                        showCouldNotSaveDialog();
+                    }
+                }
+            } else if (save == JOptionPane.CANCEL_OPTION) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public void setFile(final String filepath) {
+        if (filepath != null) {
+            policyEditorController.setFile(new File(filepath));
+        } else {
+            policyEditorController.setFile(null);
+            resetCodebases();
+            addNewCodebase("");
+        }
+        setParentWindowTitle(getWindowTitleForStatus());
+    }
+
+    private void setParentWindowTitle(final String title) {
+        invokeRunnableOrEnqueueLater(new Runnable() {
+            @Override
+            public void run() {
+                final Window parent = SwingUtilities.getWindowAncestor(PolicyEditor.this);
+                if (!(parent instanceof PolicyEditorWindow)) {
+                    return;
+                }
+                final PolicyEditorWindow window = (PolicyEditorWindow) parent;
+                window.setTitle(title);
+            }
+        });
+    }
+
+    private String getWindowTitleForStatus() {
+        final String filepath;
+        final File file = getFile();
+        if (file != null) {
+            filepath = file.getPath();
+        } else {
+            filepath = null;
+        }
+        final String titleAndPath;
+        if (filepath != null) {
+            titleAndPath = R("PETitleWithPath", filepath);
+        } else {
+            titleAndPath = R("PETitle");
+        }
+        final String result;
+        if (policyEditorController.changesMade()) {
+            result = R("PETitleWithChangesMade", titleAndPath);
+        } else {
+            result = titleAndPath;
+        }
+        return result;
+    }
+
     private String getSelectedCodebase() {
         final String codebase = list.getSelectedValue();
         if (codebase == null || codebase.isEmpty()) {
@@ -544,7 +617,7 @@
                 if (editor.policyEditorController.getFile() == null) {
                     final int choice = editor.fileChooser.showSaveDialog(window);
                     if (choice == JFileChooser.APPROVE_OPTION) {
-                        editor.policyEditorController.setFile(editor.fileChooser.getSelectedFile());
+                        editor.setFile(editor.fileChooser.getSelectedFile().getAbsolutePath());
                     } else if (choice == JFileChooser.CANCEL_OPTION) {
                         return;
                     }
@@ -681,6 +754,11 @@
         return true;
     }
 
+
+    public File getFile() {
+        return policyEditorController.getFile();
+    }
+
     /**
      * Display an input dialog, which will disappear when the user enters a valid URL
      * or when the user presses cancel. If an invalid URL is entered, the dialog reappears.
@@ -724,6 +802,7 @@
                 list.setSelectedIndex(fIndex);
             }
         });
+        setChangesMade(true);
     }
 
     /**
@@ -888,6 +967,12 @@
         final JMenu fileMenu = new JMenu(R("PEFileMenu"));
         setButtonMnemonic(fileMenu, R("PEFileMenuMnemonic"));
 
+        final JMenuItem newItem = new JMenuItem(R("PENewMenuItem"));
+        setButtonMnemonic(newItem, R("PENewMenuItemMnemonic"));
+        setMenuItemAccelerator(newItem, R("PENewMenuItemAccelerator"));
+        newItem.addActionListener(editor.newButtonAction);
+        fileMenu.add(newItem);
+
         final JMenuItem openItem = new JMenuItem(R("PEOpenMenuItem"));
         setButtonMnemonic(openItem, R("PEOpenMenuItemMnemonic"));
         setMenuItemAccelerator(openItem, R("PEOpenMenuItemAccelerator"));
@@ -1189,6 +1274,12 @@
 
     void setChangesMade(final boolean b) {
         policyEditorController.setChangesMade(b);
+        invokeRunnableOrEnqueueLater(new Runnable() {
+            @Override
+            public void run() {
+                setParentWindowTitle(getWindowTitleForStatus());
+            }
+        });
     }
 
     private void resetCodebases() {
@@ -1263,6 +1354,7 @@
                 addNewCodebase("");
                 progressIndicator.setVisible(false);
                 progressIndicator.dispose();
+                setChangesMade(false);
             }
         };
         openPolicyFileWorker.execute();
@@ -1313,6 +1405,7 @@
                 showChangesSavedDialog();
                 progressIndicator.setVisible(false);
                 progressIndicator.dispose();
+                setChangesMade(false);
             }
         };
         savePolicyFileWorker.execute();
diff -r 51d839dd6052 -r b2bbab17c25b netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorController.java
--- a/netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorController.java	Thu Jul 31 09:15:31 2014 -0400
+++ b/netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditorController.java	Thu Jul 31 16:24:31 2014 -0400
@@ -162,19 +162,19 @@
             OutputController.getLogger().log(e);
         }
 
-        performingIO = true;
+        setPerformingIO(true);
         policyFile.openAndParsePolicyFile();
 
         setChangesMade(false);
-        performingIO = false;
+        setPerformingIO(false);
     }
 
     public void savePolicyFile() throws FileNotFoundException, IOException {
-        performingIO = true;
+        setPerformingIO(true);
         policyFile.savePolicyFile();
 
         setChangesMade(false);
-        performingIO = false;
+        setPerformingIO(false);
     }
 
 }
diff -r 51d839dd6052 -r b2bbab17c25b netx/net/sourceforge/jnlp/security/policyeditor/PolicyFileModel.java
--- a/netx/net/sourceforge/jnlp/security/policyeditor/PolicyFileModel.java	Thu Jul 31 09:15:31 2014 -0400
+++ b/netx/net/sourceforge/jnlp/security/policyeditor/PolicyFileModel.java	Thu Jul 31 16:24:31 2014 -0400
@@ -81,7 +81,6 @@
     }
 
     void setFile(final File file) {
-        Objects.requireNonNull(file);
         this.file = file;
     }
 
@@ -196,9 +195,7 @@
         }
 
         FileUtils.saveFile(sb.toString(), file);
-        if (fileWatcher == null) {
-            fileWatcher = new MD5SumWatcher(file);
-        }
+        fileWatcher = new MD5SumWatcher(file);
         fileWatcher.update();
     }
 


More information about the distro-pkg-dev mailing list