diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 0a6d124c..34d186af 100644 Binary files a/diylc/diylc-library/lib/diylc-core.jar and b/diylc/diylc-library/lib/diylc-core.jar differ diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index 0a6d124c..34d186af 100644 Binary files a/diylc/diylc-swing/lib/diylc-core.jar and b/diylc/diylc-swing/lib/diylc-core.jar differ diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java index 5a789c7c..1d0629d4 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java @@ -19,15 +19,22 @@ import java.awt.event.ComponentEvent; import java.awt.event.KeyEvent; import java.awt.image.VolatileImage; import java.util.EnumSet; +import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; import java.util.Set; import javax.swing.AbstractAction; import javax.swing.JComponent; import javax.swing.KeyStroke; +import org.apache.log4j.Logger; import org.diylc.appframework.miscutils.ConfigurationManager; +import org.diylc.common.ComponentType; import org.diylc.common.DrawOption; +import org.diylc.common.IBlockProcessor.InvalidBlockException; import org.diylc.common.IPlugInPort; +import org.diylc.swing.plugins.tree.TreePanel; /** * GUI class used to draw onto. @@ -38,6 +45,8 @@ public class CanvasPanel extends JComponent implements Autoscroll { private static final long serialVersionUID = 1L; + private static final Logger LOG = Logger.getLogger(CanvasPlugin.class); + private IPlugInPort plugInPort; private Image bufferImage; @@ -53,6 +62,8 @@ public class CanvasPanel extends JComponent implements Autoscroll { // DrawOption.SELECTION, DrawOption.ZOOM, DrawOption.ANTIALIASING, // DrawOption.CONTROL_POINTS); + private HashMap componentTypeCache; + public CanvasPanel(IPlugInPort plugInPort) { super(); this.plugInPort = plugInPort; @@ -70,6 +81,17 @@ public class CanvasPanel extends JComponent implements Autoscroll { bufferImage = null; } + public HashMap getComponentTypeCache() { + if (componentTypeCache == null) { + componentTypeCache = new HashMap(); + for (Entry> entry : this.plugInPort.getComponentTypes().entrySet()) { + for (ComponentType type : entry.getValue()) + componentTypeCache.put(type.getInstanceClass().getCanonicalName(), type); + } + } + return componentTypeCache; + } + private void initializeDnD() { // Initialize drag source recognizer. DragSource.getDefaultDragSource().createDefaultDragGestureRecognizer(this, @@ -80,6 +102,21 @@ public class CanvasPanel extends JComponent implements Autoscroll { private void initializeActions() { getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "clearSlot"); + for (int i = 1; i <= 12; i++) { + final int x = i; + getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_F1 + i - 1, 0), + "functionKey" + i); + getActionMap().put("functionKey" + i, new AbstractAction() { + + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + functionKeyPressed(x); + } + }); + } + getActionMap().put("clearSlot", new AbstractAction() { private static final long serialVersionUID = 1L; @@ -91,6 +128,35 @@ public class CanvasPanel extends JComponent implements Autoscroll { }); } + @SuppressWarnings("unchecked") + protected void functionKeyPressed(int i) { + HashMap shortcutMap = + (HashMap) ConfigurationManager.getInstance().readObject(TreePanel.COMPONENT_SHORTCUT_KEY, null); + if (shortcutMap == null) + return; + String typeName = shortcutMap.get("F" + i); + if (typeName == null) + return; + if (typeName.startsWith("block:")) { + String blockName = typeName.substring(6); + try { + plugInPort.loadBlock(blockName); + } catch (InvalidBlockException e) { + LOG.error("Could not find block assigned to shortcut: " + blockName); + } + } else { + ComponentType type = getComponentTypeCache().get(typeName); + if (type == null) { + LOG.error("Could not find type: " + typeName); + return; + } + this.plugInPort.setNewComponentTypeSlot(type, null); + } + + // hack: fake mouse movement to repaint + this.plugInPort.mouseMoved(getMousePosition(), false, false, false); + } + protected void createBufferImage() { if (USE_HARDWARE_ACCELLERATION) { bufferImage = screenGraphicsConfiguration.createCompatibleVolatileImage(getWidth(), getHeight()); diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/tree/TreePanel.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/tree/TreePanel.java index c5f2e93c..3a9b59b6 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/tree/TreePanel.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/tree/TreePanel.java @@ -9,6 +9,7 @@ import java.awt.Graphics2D; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.MouseAdapter; @@ -17,12 +18,16 @@ import java.awt.event.MouseListener; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import javax.swing.AbstractAction; import javax.swing.Icon; +import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; @@ -60,6 +65,8 @@ public class TreePanel extends JPanel { private static final Logger LOG = Logger.getLogger(TreePanel.class); + public static final String COMPONENT_SHORTCUT_KEY = "componentShortcuts"; + private DefaultTreeModel treeModel; private JTree tree; private JScrollPane treeScroll; @@ -312,9 +319,78 @@ public class TreePanel extends JPanel { Payload payload = (Payload) selectedNode.getUserObject(); - ComponentType componentType = payload.getComponentType(); + final ComponentType componentType = payload.getComponentType(); + + final String identifier = + componentType == null ? "block:" + payload.toString() : componentType.getInstanceClass() + .getCanonicalName(); + + JMenu shortcutSubmenu = new JMenu("Assign Shortcut"); + final JMenuItem noneItem = new JMenuItem("None"); + noneItem.addActionListener(new ActionListener() { + + @SuppressWarnings("unchecked") + @Override + public void actionPerformed(ActionEvent e) { + HashMap map = + (HashMap) ConfigurationManager.getInstance().readObject(COMPONENT_SHORTCUT_KEY, null); + if (map == null) + map = new HashMap(); + + Iterator> it = map.entrySet().iterator(); + while (it.hasNext()) { + Entry item = it.next(); + if (item.getValue().equals(identifier)) + it.remove(); + } + + ConfigurationManager.getInstance().writeValue(COMPONENT_SHORTCUT_KEY, map); + + TreePanel.this.invalidate(); + TreePanel.this.repaint(); + } + + }); + + shortcutSubmenu.add(noneItem); + + for (int i = 1; i <= 12; i++) { + final JMenuItem item = new JMenuItem("F" + i); + item.addActionListener(new ActionListener() { + + @SuppressWarnings("unchecked") + @Override + public void actionPerformed(ActionEvent e) { + HashMap map = + (HashMap) ConfigurationManager.getInstance().readObject(COMPONENT_SHORTCUT_KEY, + null); + if (map == null) + map = new HashMap(); + + if (map.containsKey(item.getText())) + map.remove(item.getText()); + + Iterator> it = map.entrySet().iterator(); + while (it.hasNext()) { + Entry item = it.next(); + if (item.getValue().equals(identifier)) + it.remove(); + } + + map.put(item.getText(), identifier); + + ConfigurationManager.getInstance().writeValue(COMPONENT_SHORTCUT_KEY, map); + + TreePanel.this.invalidate(); + TreePanel.this.repaint(); + } + }); + shortcutSubmenu.add(item); + } + if (componentType != null) { popup.add(new SelectAllAction(plugInPort)); + popup.add(shortcutSubmenu); popup.add(new JSeparator()); List