package com.baselet.gwt.client.view.widgets; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import com.baselet.gwt.client.keyboard.Shortcut; import com.baselet.gwt.client.keyboard.Shortcut.Category; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Event.NativePreviewEvent; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTML; public class ShortcutDialogBox extends MyPopupPanel { private static class TableBuilder { SafeHtmlBuilder builder = new SafeHtmlBuilder(); int i = 0; public TableBuilder() { builder.appendHtmlConstant("<table style='border-spacing: 0px;'><tbody>"); } public void append(Shortcut shortcut) { String color = i++ % 2 != 0 ? "white" : "#E5E4E2"; builder.appendHtmlConstant("<tr style='background-color:" + color + "'><td style='padding-right:0.7em'>" + shortcut.getShortcut() + "</td><td style='width:100%'>" + shortcut.getDescription() + "</td></tr>"); } public HTML toHTML() { builder.appendHtmlConstant("</tbody></table>"); return new HTML(builder.toSafeHtml()); } } private static ShortcutDialogBox instance = new ShortcutDialogBox(); public static ShortcutDialogBox getInstance() { instance.setWidth("30em"); return instance; } public ShortcutDialogBox() { super(true, Type.POPUP); setHeader("Keyboard Shortcuts"); Shortcut[] values = Shortcut.values(); Map<Shortcut.Category, TableBuilder> map = new HashMap<Shortcut.Category, TableBuilder>(); for (Shortcut.Category c : Shortcut.Category.values()) { map.put(c, new TableBuilder()); } for (Shortcut shortcut : values) { map.get(shortcut.getCategory()).append(shortcut); } FlowPanel panel = new FlowPanel(); boolean first = true; for (Shortcut.Category c : Arrays.asList(Category.values())) { String additional = ""; if (!first) { additional = "padding-top:0.5em;margin-top:0.5em;border-top:1px solid;"; } String header = "<div style='font-weight:bold;" + additional + "'>" + c.getHeader() + "</div>"; first = false; panel.add(new HTML(header)); panel.add(map.get(c).toHTML()); } setWidget(panel); } /** * pressing ESC closes the dialogbox */ @Override protected void onPreviewNativeEvent(NativePreviewEvent event) { super.onPreviewNativeEvent(event); if (event.getTypeInt() == Event.ONKEYDOWN && event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ESCAPE) { hide(); } } }