/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