# This patch file was generated by NetBeans IDE # Following Index: paths are relative to: D:\workspace\nb73-src\main # This patch can be applied using context Tools: Patch action on respective folder. # It uses platform neutral UTF-8 encoding and \n newlines. # Above lines and this line are ignored by the patching process. Index: options.keymap/src/org/netbeans/modules/options/keymap/Bundle.properties --- options.keymap/src/org/netbeans/modules/options/keymap/Bundle.properties Base (BASE) +++ options.keymap/src/org/netbeans/modules/options/keymap/Bundle.properties Locally Modified (Based On LOCAL) @@ -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=Print... +KeymapPanel.btnPrintAsHTML.toolTipText=Generate a printable HTML-file for the current keymap-profile and open it in the HTML-Browser. Index: options.keymap/src/org/netbeans/modules/options/keymap/ExportShortcutsAction.java --- options.keymap/src/org/netbeans/modules/options/keymap/ExportShortcutsAction.java Base (BASE) +++ options.keymap/src/org/netbeans/modules/options/keymap/ExportShortcutsAction.java Locally Modified (Based On LOCAL) @@ -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 { @@ -150,7 +157,7 @@ {putValue (Action.NAME, loc ("CTL_Export_Shortcuts_to_HTML_Action"));} public void actionPerformed (ActionEvent e) { - exportShortcutsToHTML (); + exportShortcutsOfAllProfilesToHTML (); } }; @@ -160,13 +167,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) @@ -201,7 +219,7 @@ } // print body of table - exportShortcutsToHTML2 (keymapModel, sb, keymaps); + exportShortcutsToHTML2 (keymapModel, sb, keymaps, displayHumanReadibleShortcuts); XMLStorage.generateFolderEnd (sb, "table", " "); XMLStorage.generateFolderEnd (sb, "body", " "); @@ -217,11 +235,18 @@ OutputStreamWriter writer = new OutputStreamWriter (outputStream); writer.write (sb.toString ()); writer.close (); - } catch (IOException ex) { + + if (fo.canRead()) { + //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); } @@ -233,7 +258,8 @@ private static void exportShortcutsToHTML2 ( KeymapModel keymapModel, StringBuffer sb, - Map>> keymaps + Map>> keymaps, + boolean displayHumanReadibleShortcuts ) { List categories = new ArrayList (keymapModel.getActionCategories ()); Collections.sort (categories); @@ -253,7 +279,7 @@ XMLStorage.generateFolderEnd (sb, "tr", " "); // print body of one category - exportShortcutsToHTML3 (sb, keymapModel, category, keymaps); + exportShortcutsToHTML3 (sb, keymapModel, category, keymaps, displayHumanReadibleShortcuts); } } @@ -264,7 +290,8 @@ StringBuffer sb, KeymapModel keymapModel, String category, - Map>> keymaps + Map>> keymaps, + boolean displayHumanReadibleShortcuts ) { Set actions = keymapModel.getActions (category); @@ -294,7 +321,7 @@ Set shortcuts = keymap.get (action); XMLStorage.generateFolderStart (sb, "td", attribs, " "); - printShortcuts (shortcuts, sb); + printShortcuts (shortcuts, sb, displayHumanReadibleShortcuts); XMLStorage.generateFolderEnd (sb, "td", " "); } @@ -302,7 +329,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; @@ -310,11 +337,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 (", "); } } + /** + * Copy from org.netbeans.modules.options.keymap.ProfilesPanel.portableRepresentationToShortcut(java.lang.String):java.lang.String + * @param portable + * @return + */ + 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 void generateLayersXML ( LayersBridge layersBridge, Map> categoryToActions Index: options.keymap/src/org/netbeans/modules/options/keymap/KeymapPanel.form --- options.keymap/src/org/netbeans/modules/options/keymap/KeymapPanel.form Base (BASE) +++ options.keymap/src/org/netbeans/modules/options/keymap/KeymapPanel.form Locally Modified (Based On LOCAL) @@ -20,7 +20,7 @@ - + @@ -31,8 +31,10 @@ - + + + @@ -63,6 +65,7 @@ + @@ -298,5 +301,18 @@ + + + + + + + + + + + + + Index: options.keymap/src/org/netbeans/modules/options/keymap/KeymapPanel.java --- options.keymap/src/org/netbeans/modules/options/keymap/KeymapPanel.java Base (BASE) +++ options.keymap/src/org/netbeans/modules/options/keymap/KeymapPanel.java Locally Modified (Based On LOCAL) @@ -484,6 +484,7 @@ 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(); lProfile.setLabelFor(cbProfile); org.openide.awt.Mnemonics.setLocalizedText(lProfile, org.openide.util.NbBundle.getMessage(KeymapPanel.class, "CTL_Keymap_Name")); // NOI18N @@ -550,6 +551,14 @@ 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); + } + }); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( @@ -558,18 +567,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() + .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) - .addComponent(manageButton)))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(manageButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(btnPrintAsHTML)))) .addGroup(layout.createSequentialGroup() .addGap(0, 0, Short.MAX_VALUE) .addComponent(searchLabel) @@ -595,7 +606,8 @@ .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) + .addComponent(btnPrintAsHTML)) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(18, 18, 18) @@ -642,10 +654,17 @@ 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;