/* * Freeplane - mind map editor * Copyright (C) 2011 dimitry * * This file author is dimitry * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.freeplane.features.help; import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.Enumeration; import javax.swing.JEditorPane; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.tree.DefaultMutableTreeNode; import org.freeplane.core.resources.ResourceController; import org.freeplane.core.ui.AFreeplaneAction; import org.freeplane.core.ui.MenuBuilder; import org.freeplane.core.ui.components.FreeplaneMenuBar; import org.freeplane.core.util.HtmlUtils; import org.freeplane.core.util.MenuUtils; import org.freeplane.core.util.MenuUtils.MenuEntry; import org.freeplane.core.util.TextUtils; import org.freeplane.features.mode.Controller; import org.freeplane.features.mode.ModeController; import org.freeplane.features.mode.mindmapmode.MModeController; /** * @author Dimitry Polivaev * Sep 27, 2011 */ public class HotKeyInfoAction extends AFreeplaneAction{ public HotKeyInfoAction() { super("HotKeyInfoAction"); } /** * */ private static final long serialVersionUID = 1L; // ========================================================================== // format accelerator map as html text // ========================================================================== private String formatAsHtml(final Enumeration<DefaultMutableTreeNode> children) { final StringBuilder builder = new StringBuilder(); builder.append("<html><head><style type=\"text/css\">" // //doesn't work: + " table { margin: 1px 0px; border-spacing: 0px; }"// + " h1 { background-color: #B5C8DB; margin-bottom: 0px; margin-top: 1ex; }"// + " h2 { background-color: #B5C8DB; margin-bottom: 0px; margin-top: 1ex; }"// + " h3 { background-color: #B5C8DB; margin-bottom: 0px; margin-top: 1ex; }"// + "</head><body width=\"600\">"); appendAsHtml(builder, children, "", 2); builder.append("</body></html>"); return builder.toString(); } private void appendAsHtml(final StringBuilder builder, final Enumeration<DefaultMutableTreeNode> children, final String title, final int level) { if(! title.equals("")) builder.append("<h").append(level).append('>').append(title).append("</h").append(level).append('>'); appendChildrenAsHtml(builder, children, title, level); } @SuppressWarnings("unchecked") private void appendChildrenAsHtml(final StringBuilder builder, final Enumeration<DefaultMutableTreeNode> children, final String title, final int level) { final ArrayList<MenuEntry> menuEntries = new ArrayList<MenuEntry>(); final ArrayList<DefaultMutableTreeNode> submenus = new ArrayList<DefaultMutableTreeNode>(); // sort and divide while (children.hasMoreElements()) { final DefaultMutableTreeNode node = children.nextElement(); if (node.isLeaf()) { menuEntries.add((MenuEntry) node.getUserObject()); } else { submenus.add(node); } } // actions if (!menuEntries.isEmpty()) { builder.append("<table cellspacing=\"0\" cellpadding=\"0\">"); for (final MenuEntry entry : menuEntries) { final String keystroke = entry.getKeyStroke() == null ? "" // : MenuUtils.formatKeyStroke(entry.getKeyStroke()); builder.append(el("tr", el("td", entry.getLabel() + " ") + el("td", keystroke) + el("td", entry.getToolTipText()))); } builder.append("</table>"); } // submenus for (final DefaultMutableTreeNode node : submenus) { final String subtitle = (level > 2 ? title + "→" : "") + String.valueOf(node.getUserObject()); appendAsHtml(builder, node.children(), subtitle, level + 1); } } private String el(final String name, final String content) { return HtmlUtils.element(name, content); } @SuppressWarnings("unchecked") public void actionPerformed(ActionEvent e) { // use the MModeController for the mindmap mode menu if possible - the browse menu doesn't have much entries! final ModeController modeController = ResourceController.getResourceController().isApplet() ? Controller .getCurrentModeController() : MModeController.getMModeController(); final MenuBuilder menuBuilder = modeController.getUserInputListenerFactory().getMenuBuilder(); final DefaultMutableTreeNode menuEntryTree = MenuUtils.createAcceleratebleMenuEntryTree( FreeplaneMenuBar.MENU_BAR_PREFIX, menuBuilder); final String title = TextUtils.getText("hot_keys_table"); final String html = formatAsHtml(menuEntryTree.children()); JEditorPane refPane = new JEditorPane("text/html", html); refPane.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, false); refPane.setCaretPosition(0); refPane.setEditable(false); final Dimension preferredSize = refPane.getPreferredSize(); JScrollPane scrollPane = new JScrollPane(refPane, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); scrollPane.setPreferredSize(new Dimension(preferredSize.width, 600)); JOptionPane.showMessageDialog((Component) e.getSource(), scrollPane, title, JOptionPane.INFORMATION_MESSAGE); } }