# HG changeset patch # Parent 2f16e046e6447a82aa660b0672703dbe940696f6 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 @@ -67,6 +67,16 @@ import javax.swing.Action; import javax.swing.JFileChooser; import javax.swing.KeyStroke; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; import org.netbeans.core.options.keymap.api.KeyStrokeUtils; import org.netbeans.core.options.keymap.api.ShortcutAction; import org.netbeans.core.options.keymap.spi.KeymapManager; @@ -77,9 +87,12 @@ import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.loaders.DataObject; +import org.openide.util.Exceptions; import org.openide.util.NbBundle; import org.openide.util.Utilities; import org.openide.windows.WindowManager; +import org.w3c.dom.Document; +import org.w3c.dom.Element; public class ExportShortcutsAction { @@ -199,60 +212,70 @@ } try { - StringBuffer sb = new StringBuffer (); - - Attribs attribs = new Attribs (true); - XMLStorage.generateFolderStart (sb, "html", attribs, ""); - XMLStorage.generateFolderStart (sb, "body", attribs, " "); - attribs.add ("border", "1"); - attribs.add ("cellpadding", "1"); - attribs.add ("cellspacing", "0"); - XMLStorage.generateFolderStart (sb, "table", attribs, " "); - attribs = new Attribs (true); - - // print header of table - XMLStorage.generateFolderStart (sb, "tr", attribs, " "); - XMLStorage.generateFolderStart (sb, "td", attribs, " "); - XMLStorage.generateFolderStart (sb, "h2", attribs, " "); - sb.append ("Action Name"); - XMLStorage.generateFolderEnd (sb, "h2", " "); - XMLStorage.generateFolderEnd (sb, "td", " "); - for (String profile: keymaps.keySet ()) { - XMLStorage.generateFolderStart (sb, "td", attribs, " "); - XMLStorage.generateFolderStart (sb, "h2", attribs, " "); - sb.append (profile); - XMLStorage.generateFolderEnd (sb, "h2", " "); - XMLStorage.generateFolderEnd (sb, "td", " "); - } + DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); + Document doc = docBuilder.newDocument(); - // print body of table - exportShortcutsToHTML2 (keymapModel, sb, keymaps, displayHumanReadibleShortcuts); + Element html = doc.createElement("html"); + doc.appendChild(html); + Element head = doc.createElement("head"); + html.appendChild(head); + Element title = doc.createElement("title"); + head.appendChild(title); - XMLStorage.generateFolderEnd (sb, "table", " "); - XMLStorage.generateFolderEnd (sb, "body", " "); - XMLStorage.generateFolderEnd (sb, "html", ""); + Element style = doc.createElement("style"); + // give a with to the div + int width = 310 * (keymaps.keySet().size() + 1 ); + // embed style in html + // value from wiki css of netbeans + style.appendChild(doc.createTextNode("body {font-family:Arial,Helvetica;}\n" + + "h2 {color:#EE6B00;font-size:small;padding-left:10px;padding-top:10px;}\n" + + ".actioname {width:300px;}\n" + + ".profile {width:300px;}\n" + + "table {border-radius:2px;margin-left:auto;margin-right:auto;padding-bottom:10px;}\n" + + "th {background-color:#cad7f0;color:black;}\n" + + "tr:nth-child(odd) {color:#333333;background-color:#F2F2F2}\n" + + "tr:nth-child(even) {color:#333333;background-color:#FAFAFA}\n" + + "div {background-color:#eaeaea;border-radius:5px;width:"+width+"}" + + ".error {background-color:red;}")); + head.appendChild(style); + Element body = doc.createElement("body"); + html.appendChild(body); + + // print data on div and table per category + // div for maybe hidding a category by a kind of javascript + exportShortcutsToHTML2 (keymapModel, body, keymaps, displayHumanReadibleShortcuts); + + FileObject fo = FileUtil.createData ( FileUtil.getConfigRoot (), "shortcuts.html" ); FileLock fileLock = fo.lock (); - try (OutputStream outputStream = fo.getOutputStream (fileLock); - OutputStreamWriter writer = new OutputStreamWriter (outputStream)){ - writer.write (sb.toString ()); - writer.close (); + try (OutputStream outputStream = fo.getOutputStream(fileLock); + OutputStreamWriter writer = new OutputStreamWriter(outputStream)) { + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + Transformer transformer = transformerFactory.newTransformer(); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + DOMSource source = new DOMSource(doc); + StreamResult result = new StreamResult(writer); + transformer.transform(source, result); - if (fo.canRead() && displayHumanReadibleShortcuts) { - //open generated HTML in external browser - HtmlBrowser.URLDisplayer.getDefault().showURLExternal(fo.toURL()); - } - } catch (IOException ex) { - ErrorManager.getDefault ().notify (ex); + + if (fo.canRead() && displayHumanReadibleShortcuts) { + //open generated HTML in external browser + HtmlBrowser.URLDisplayer.getDefault().showURLExternal(fo.toURL()); + } + } catch (IOException | TransformerConfigurationException ex) { + ErrorManager.getDefault().notify(ex); + } catch (TransformerException ex) { + ErrorManager.getDefault().notify(ex); } finally { - fileLock.releaseLock (); + fileLock.releaseLock(); } - } catch (IOException ex) { + } catch (IOException | ParserConfigurationException ex) { ErrorManager.getDefault ().notify (ex); } } @@ -262,29 +285,46 @@ */ private static void exportShortcutsToHTML2 ( KeymapModel keymapModel, - StringBuffer sb, + Element sb, Map>> keymaps, boolean displayHumanReadibleShortcuts ) { - List categories = new ArrayList (keymapModel.getActionCategories ()); + List categories = new ArrayList<> (keymapModel.getActionCategories ()); Collections.sort (categories); - Attribs attribs = new Attribs (true); - for (String category: categories) { - - // print category title - XMLStorage.generateFolderStart (sb, "tr", attribs, " "); - attribs.add ("colspan", Integer.toString (keymaps.size () + 1)); - attribs.add ("rowspan", "1"); - XMLStorage.generateFolderStart (sb, "td", attribs, " "); - attribs = new Attribs (true); - XMLStorage.generateFolderStart (sb, "h3", attribs, " "); - sb.append (category); - XMLStorage.generateFolderEnd (sb, "h3", " "); - XMLStorage.generateFolderEnd (sb, "td", " "); - XMLStorage.generateFolderEnd (sb, "tr", " "); - - // print body of one category - exportShortcutsToHTML3 (sb, keymapModel, category, keymaps, displayHumanReadibleShortcuts); + Document doc = sb.getOwnerDocument(); + for (String category : categories) { + + if (!category.isEmpty()) { + // print title + + Element div = doc.createElement("div"); + sb.appendChild(div); + Element h2 = doc.createElement("h2"); + + div.appendChild(h2); + h2.appendChild(doc.createTextNode(category)); + + // print table header + Element table = doc.createElement("table"); + div.appendChild(table); + + Element headerTR = doc.createElement("tr"); + table.appendChild(headerTR); + + Element headerTD = doc.createElement("th"); + headerTD.setAttribute("class", "actioname"); + headerTR.appendChild(headerTD); + headerTD.appendChild(doc.createTextNode("Action Name")); + for (String profile : keymaps.keySet()) { + Element headerProfileTD = doc.createElement("th"); + headerProfileTD.setAttribute("class", "profile"); + headerTR.appendChild(headerProfileTD); + headerProfileTD.appendChild(doc.createTextNode(profile)); + } + + // print data + exportShortcutsToHTML3(table, keymapModel, category, keymaps, displayHumanReadibleShortcuts); + } } } @@ -292,7 +332,7 @@ * Writes body of given category. */ private static void exportShortcutsToHTML3 ( - StringBuffer sb, + Element sb, KeymapModel keymapModel, String category, Map>> keymaps, @@ -301,7 +341,7 @@ Set actions = keymapModel.getActions (category); // sort actions - Map sortedActions = new TreeMap (); + Map sortedActions = new TreeMap<> (); for (ShortcutAction action: actions) { sortedActions.put ( action.getDisplayName (), @@ -310,27 +350,37 @@ } // print actions - Attribs attribs = new Attribs (true); - for (Map.Entry entry: sortedActions.entrySet()) { + Document doc = sb.getOwnerDocument(); + + for (Map.Entry entry : sortedActions.entrySet()) { String actionName = entry.getKey(); ShortcutAction action = entry.getValue(); + Element headerTR = doc.createElement("tr"); + sb.appendChild(headerTR); + Element headerTD = doc.createElement("td"); + headerTR.appendChild(headerTD); + headerTD.appendChild(doc.createTextNode(actionName)); + if (actionName.isEmpty()) { + // actionName empty make table cell red + headerTD.setAttribute("class", "error"); + } + // print action name to the first column + for (String profile : keymaps.keySet()) { + Map> keymap = keymaps.get(profile); + Set shortcuts = keymap.get(action); + Element headerProfileTD = doc.createElement("td"); + headerTR.appendChild(headerProfileTD); - // print action name to the first column - XMLStorage.generateFolderStart (sb, "tr", attribs, " "); - XMLStorage.generateFolderStart (sb, "td", attribs, " "); - sb.append (actionName); - XMLStorage.generateFolderEnd (sb, "td", " "); - - for (String profile: keymaps.keySet ()) { - Map> keymap = keymaps.get (profile); - Set shortcuts = keymap.get (action); + StringBuffer sb1 = new StringBuffer(); + printShortcuts(shortcuts, sb1, displayHumanReadibleShortcuts); + headerProfileTD.appendChild(doc.createTextNode(sb1.toString())); + // for testing different diplay where only action with shortcut are shown + boolean hideEmpty = false; + if (hideEmpty && sb1.toString().equals("-")) { + headerTR.setAttribute("style", "display:none"); + } + } - XMLStorage.generateFolderStart (sb, "td", attribs, " "); - printShortcuts (shortcuts, sb, displayHumanReadibleShortcuts); - XMLStorage.generateFolderEnd (sb, "td", " "); - } - - XMLStorage.generateFolderEnd (sb, "tr", " "); } }