diff --git a/options.keymap/nbproject/project.properties b/options.keymap/nbproject/project.properties --- a/options.keymap/nbproject/project.properties +++ b/options.keymap/nbproject/project.properties @@ -1,5 +1,5 @@ javac.compilerargs=-Xlint:unchecked -javac.source=1.6 +javac.source=1.7 javadoc.arch=${basedir}/arch.xml javadoc.apichanges=${basedir}/apichanges.xml diff --git a/options.keymap/src/org/netbeans/modules/options/keymap/Bundle.properties b/options.keymap/src/org/netbeans/modules/options/keymap/Bundle.properties --- a/options.keymap/src/org/netbeans/modules/options/keymap/Bundle.properties +++ b/options.keymap/src/org/netbeans/modules/options/keymap/Bundle.properties @@ -200,3 +200,5 @@ Import.failed.title=Import Keymap Profile KeymapPanel.waitLabel.text=Please wait while actions are collected KeymapPanel.actionProgress.string=Please wait while actions load +KeymapPanel.btnPrintAsHTML.text=Show as HTML +KeymapPanel.btnPrintAsHTML.toolTipText=Generate a printable HTML-file for the current keymap-profile and open it in the HTML-Browser. diff --git a/options.keymap/src/org/netbeans/modules/options/keymap/ExportShortcutsAction.java b/options.keymap/src/org/netbeans/modules/options/keymap/ExportShortcutsAction.java --- a/options.keymap/src/org/netbeans/modules/options/keymap/ExportShortcutsAction.java +++ b/options.keymap/src/org/netbeans/modules/options/keymap/ExportShortcutsAction.java @@ -53,25 +53,32 @@ import java.io.OutputStreamWriter; import java.io.Writer; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.StringTokenizer; import java.util.TreeMap; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JFileChooser; +import javax.swing.KeyStroke; +import org.netbeans.core.options.keymap.api.KeyStrokeUtils; import org.netbeans.core.options.keymap.api.ShortcutAction; import org.netbeans.core.options.keymap.spi.KeymapManager; import org.netbeans.modules.options.keymap.XMLStorage.Attribs; import org.openide.ErrorManager; +import org.openide.awt.HtmlBrowser; import org.openide.filesystems.FileLock; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.loaders.DataObject; import org.openide.util.NbBundle; +import org.openide.util.Utilities; import org.openide.windows.WindowManager; public class ExportShortcutsAction { @@ -157,7 +164,7 @@ {putValue (Action.NAME, loc ("CTL_Export_Shortcuts_to_HTML_Action"));} public void actionPerformed (ActionEvent e) { - exportShortcutsToHTML (); + exportShortcutsOfAllProfilesToHTML (); } }; @@ -167,13 +174,24 @@ // helper methods .......................................................... + public static void exportShortcutsOfProfileToHTML (String profile) { + final boolean showSystemSpecificShortcuts = true; + exportShortcutsToHTML(new KeymapModel(), Arrays.asList(profile), showSystemSpecificShortcuts); + } + + private static void exportShortcutsOfAllProfilesToHTML () { + KeymapModel keymapModel = new KeymapModel (); + List allProfiles = keymapModel.getProfiles (); + final boolean showSystemSpecificShortcuts = false; + exportShortcutsToHTML(keymapModel, allProfiles, showSystemSpecificShortcuts); + } - private static void exportShortcutsToHTML () { + + private static void exportShortcutsToHTML (KeymapModel keymapModel, Collection profiles, boolean displayHumanReadibleShortcuts) { // read all shortcuts to keymaps - KeymapModel keymapModel = new KeymapModel (); Map>> keymaps = new TreeMap>> (); - for (String profile: keymapModel.getProfiles ()) { + for (String profile: profiles) { keymaps.put ( profile, keymapModel.getKeymap (profile) @@ -208,7 +226,7 @@ } // print body of table - exportShortcutsToHTML2 (keymapModel, sb, keymaps); + exportShortcutsToHTML2 (keymapModel, sb, keymaps, displayHumanReadibleShortcuts); XMLStorage.generateFolderEnd (sb, "table", " "); XMLStorage.generateFolderEnd (sb, "body", " "); @@ -219,16 +237,21 @@ "shortcuts.html" ); FileLock fileLock = fo.lock (); - try { - OutputStream outputStream = fo.getOutputStream (fileLock); - OutputStreamWriter writer = new OutputStreamWriter (outputStream); + try (OutputStream outputStream = fo.getOutputStream (fileLock); + OutputStreamWriter writer = new OutputStreamWriter (outputStream)){ writer.write (sb.toString ()); writer.close (); - } catch (IOException ex) { + + if (fo.canRead() && displayHumanReadibleShortcuts) { + //open generated HTML in external browser + HtmlBrowser.URLDisplayer.getDefault().showURLExternal(fo.toURL()); + } + } catch (IOException ex) { ErrorManager.getDefault ().notify (ex); } finally { fileLock.releaseLock (); } + } catch (IOException ex) { ErrorManager.getDefault ().notify (ex); } @@ -240,7 +263,8 @@ private static void exportShortcutsToHTML2 ( KeymapModel keymapModel, StringBuffer sb, - Map>> keymaps + Map>> keymaps, + boolean displayHumanReadibleShortcuts ) { List categories = new ArrayList (keymapModel.getActionCategories ()); Collections.sort (categories); @@ -260,7 +284,7 @@ XMLStorage.generateFolderEnd (sb, "tr", " "); // print body of one category - exportShortcutsToHTML3 (sb, keymapModel, category, keymaps); + exportShortcutsToHTML3 (sb, keymapModel, category, keymaps, displayHumanReadibleShortcuts); } } @@ -271,7 +295,8 @@ StringBuffer sb, KeymapModel keymapModel, String category, - Map>> keymaps + Map>> keymaps, + boolean displayHumanReadibleShortcuts ) { Set actions = keymapModel.getActions (category); @@ -301,7 +326,7 @@ Set shortcuts = keymap.get (action); XMLStorage.generateFolderStart (sb, "td", attribs, " "); - printShortcuts (shortcuts, sb); + printShortcuts (shortcuts, sb, displayHumanReadibleShortcuts); XMLStorage.generateFolderEnd (sb, "td", " "); } @@ -309,7 +334,7 @@ } } - private static void printShortcuts (Set shortcuts, StringBuffer sb) { + private static void printShortcuts (Set shortcuts, StringBuffer sb, boolean displayHumanReadibleShortcuts) { if (shortcuts == null) { sb.append ('-'); return; @@ -317,11 +342,45 @@ Iterator it = shortcuts.iterator (); while (it.hasNext ()) { String shortcut = it.next (); - sb.append (shortcut); + if (displayHumanReadibleShortcuts) { + //show system specific shortcuts like CTRL-SHIFT-ALT + sb.append (portableRepresentationToShortcut(shortcut)); + } else { + //default: show portable shortcuts like D-O + sb.append (shortcut); + } if (it.hasNext ()) sb.append (", "); } } + /** + * Converts the portable shortcut representation to a human-readable shortcut + * @param portable portable representation (the storage format for shortcuts) + * @return human-readable string + */ + static String portableRepresentationToShortcut(String portable) { + assert portable != null : "The parameter must not be null"; //NOI18N + + StringBuilder buf = new StringBuilder(); + String delimiter = " "; //NOI18N + + for(StringTokenizer st = new StringTokenizer(portable, delimiter); st.hasMoreTokens();) { //NOI18N + String ks = st.nextToken().trim(); + + KeyStroke keyStroke = Utilities.stringToKey(ks); + + if (keyStroke != null) { + buf.append(KeyStrokeUtils.getKeyStrokeAsText(keyStroke)); + if (st.hasMoreTokens()) + buf.append(' '); + } else { + return null; + } + } + + return buf.toString(); + } + private static void generateLayersXML ( LayersBridge layersBridge, Map> categoryToActions diff --git a/options.keymap/src/org/netbeans/modules/options/keymap/KeymapPanel.form b/options.keymap/src/org/netbeans/modules/options/keymap/KeymapPanel.form --- a/options.keymap/src/org/netbeans/modules/options/keymap/KeymapPanel.form +++ b/options.keymap/src/org/netbeans/modules/options/keymap/KeymapPanel.form @@ -19,19 +19,22 @@ - - + + - - + + + + + @@ -50,7 +53,7 @@ - + @@ -58,11 +61,13 @@ - + - + + + @@ -298,5 +303,23 @@ + + + + + + + + + + + + + + + + + + diff --git a/options.keymap/src/org/netbeans/modules/options/keymap/KeymapPanel.java b/options.keymap/src/org/netbeans/modules/options/keymap/KeymapPanel.java --- a/options.keymap/src/org/netbeans/modules/options/keymap/KeymapPanel.java +++ b/options.keymap/src/org/netbeans/modules/options/keymap/KeymapPanel.java @@ -484,6 +484,8 @@ actionsTable = new KeymapTable(); filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0)); filler2 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 32767)); + btnPrintAsHTML = new javax.swing.JButton(); + jSeparator1 = new javax.swing.JSeparator(); lProfile.setLabelFor(cbProfile); org.openide.awt.Mnemonics.setLocalizedText(lProfile, org.openide.util.NbBundle.getMessage(KeymapPanel.class, "CTL_Keymap_Name")); // NOI18N @@ -550,6 +552,16 @@ actionsView.add(jScrollPane1, "actions"); + org.openide.awt.Mnemonics.setLocalizedText(btnPrintAsHTML, org.openide.util.NbBundle.getMessage(KeymapPanel.class, "KeymapPanel.btnPrintAsHTML.text")); // NOI18N + btnPrintAsHTML.setToolTipText(org.openide.util.NbBundle.getMessage(KeymapPanel.class, "KeymapPanel.btnPrintAsHTML.toolTipText")); // NOI18N + btnPrintAsHTML.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnPrintAsHTMLActionPerformed(evt); + } + }); + + jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -558,17 +570,20 @@ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(layout.createSequentialGroup() .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) - .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() .addComponent(spShortcuts, javax.swing.GroupLayout.PREFERRED_SIZE, 175, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(83, 83, 83) - .addComponent(filler1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, Short.MAX_VALUE)) - .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() + .addComponent(filler1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createSequentialGroup() .addComponent(lProfile) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(cbProfile, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(btnPrintAsHTML) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(manageButton)))) .addGroup(layout.createSequentialGroup() .addGap(0, 0, Short.MAX_VALUE) @@ -595,7 +610,9 @@ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lProfile) .addComponent(cbProfile, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addComponent(manageButton)) + .addComponent(manageButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(btnPrintAsHTML) + .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(18, 18, 18) @@ -642,15 +659,23 @@ searchPopup.show(); }//GEN-LAST:event_moreButtonActionPerformed + private void btnPrintAsHTMLActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnPrintAsHTMLActionPerformed + if (getMutableModel().getCurrentProfile()!=null){ + ExportShortcutsAction.exportShortcutsOfProfileToHTML(getMutableModel().getCurrentProfile()); + } + }//GEN-LAST:event_btnPrintAsHTMLActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JProgressBar actionProgress; private javax.swing.JTable actionsTable; private javax.swing.JPanel actionsView; + private javax.swing.JButton btnPrintAsHTML; private javax.swing.JComboBox cbProfile; private javax.swing.Box.Filler filler1; private javax.swing.Box.Filler filler2; private javax.swing.JPanel jPanel1; private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JSeparator jSeparator1; private javax.swing.JLabel lProfile; private javax.swing.JList liShortcuts; private javax.swing.JButton manageButton; diff --git a/options.keymap/src/org/netbeans/modules/options/keymap/ProfilesPanel.java b/options.keymap/src/org/netbeans/modules/options/keymap/ProfilesPanel.java --- a/options.keymap/src/org/netbeans/modules/options/keymap/ProfilesPanel.java +++ b/options.keymap/src/org/netbeans/modules/options/keymap/ProfilesPanel.java @@ -360,29 +360,6 @@ return buf.toString(); } - private static String portableRepresentationToShortcut(String portable) { - assert portable != null : "The parameter must not be null"; //NOI18N - - StringBuilder buf = new StringBuilder(); - String delimiter = " "; //NOI18N - - for(StringTokenizer st = new StringTokenizer(portable, delimiter); st.hasMoreTokens();) { //NOI18N - String ks = st.nextToken().trim(); - - KeyStroke keyStroke = Utilities.stringToKey(ks); - - if (keyStroke != null) { - buf.append(KeyStrokeUtils.getKeyStrokeAsText(keyStroke)); - if (st.hasMoreTokens()) - buf.append(' '); - } else { - return null; - } - } - - return buf.toString(); - } - private static JFileChooser getFileChooser() { final JFileChooser chooser = new JFileChooser(); XMLFileFilter filter = new XMLFileFilter(); @@ -425,7 +402,7 @@ NamedNodeMap attrs = childList.item(j).getAttributes(); if (attrs != null) { String sc = attrs.item(0).getNodeValue(); - shortcuts.add(portableRepresentationToShortcut(sc)); + shortcuts.add(ExportShortcutsAction.portableRepresentationToShortcut(sc)); } } if (sca == null) {