/*
* Copyright (C) 2008 IsmAvatar <IsmAvatar@gmail.com>
* Copyright (C) 2007, 2008 Clam <clamisgood@gmail.com>
*
* This file is part of LateralGM.
* LateralGM is free software and comes with ABSOLUTELY NO WARRANTY.
* See LICENSE for details.
*/
package org.lateralgm.components;
import static javax.swing.GroupLayout.PREFERRED_SIZE;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JTextField;
import org.lateralgm.components.impl.EventNode;
import org.lateralgm.main.Prefs;
import org.lateralgm.messages.Messages;
import org.lateralgm.resources.sub.Event;
import org.lateralgm.resources.sub.MainEvent;
import org.lateralgm.subframes.EventFrame;
import org.lateralgm.subframes.GmObjectFrame;
public class EventKeySelector extends JPanel implements ActionListener
{
private static final long serialVersionUID = 1L;
public EventKeyInput text;
public JButton button;
public JPopupMenu menu;
public EventFrame par;
public int parMethod;
public int parEvent;
public GmObjectFrame parFrame;
public EventNode parNode;
public JMenu submenu;
public EventKeySelector(EventFrame parent, int width)
{
super();
GroupLayout l = new GroupLayout(this);
setLayout(l);
par = parent;
parMethod = 0;
text = new EventKeyInput(parent);
button = new JButton();
button.addMouseListener(new MListener());
menu = new JPopupMenu();
populateMenu(menu);
l.setHorizontalGroup(l.createSequentialGroup()
/**/.addContainerGap(20,20)
/**/.addComponent(text,PREFERRED_SIZE,width - 40,Integer.MAX_VALUE)
/**/.addComponent(button,PREFERRED_SIZE,20,PREFERRED_SIZE));
l.setVerticalGroup(l.createParallelGroup()
/**/.addComponent(text,PREFERRED_SIZE,20,PREFERRED_SIZE)
/**/.addComponent(button,PREFERRED_SIZE,19,PREFERRED_SIZE));
}
public EventKeySelector(EventFrame parent, int event, MouseEvent e, GmObjectFrame f, EventNode n)
{
par = parent;
parMethod = 1;
parEvent = event;
parFrame = f;
parNode = n;
JPopupMenu rightmenu = new JPopupMenu();
populateMenu(rightmenu);
if (!isEnabled()) return;
rightmenu.show(e.getComponent(),e.getX(),e.getY());
}
public void populateMenu(JPopupMenu menu)
{
add(menu,KeyEvent.VK_LEFT);
add(menu,KeyEvent.VK_RIGHT);
add(menu,KeyEvent.VK_UP);
add(menu,KeyEvent.VK_DOWN);
menu.addSeparator();
add(menu,KeyEvent.VK_CONTROL);
add(menu,KeyEvent.VK_ALT);
add(menu,KeyEvent.VK_SHIFT);
add(menu,KeyEvent.VK_SPACE);
add(menu,KeyEvent.VK_ENTER);
menu.addSeparator();
submenu = new JMenu(Messages.getString("EventKeySelector.KEYPAD")); //$NON-NLS-1$
for (int i = KeyEvent.VK_NUMPAD0; i <= KeyEvent.VK_NUMPAD9; i++)
addSub(submenu,i);
submenu.addSeparator();
addSub(submenu,KeyEvent.VK_DIVIDE);
addSub(submenu,KeyEvent.VK_MULTIPLY);
addSub(submenu,KeyEvent.VK_MINUS);
addSub(submenu,KeyEvent.VK_ADD);
addSub(submenu,KeyEvent.VK_DECIMAL);
menu.add(submenu);
submenu = new JMenu(Messages.getString("EventKeySelector.DIGITS")); //$NON-NLS-1$
for (int i = KeyEvent.VK_0; i <= KeyEvent.VK_9; i++)
addSub(submenu,i);
menu.add(submenu);
submenu = new JMenu(Messages.getString("EventKeySelector.LETTERS")); //$NON-NLS-1$
for (int i = KeyEvent.VK_A; i <= KeyEvent.VK_Z; i++)
addSub(submenu,i);
menu.add(submenu);
submenu = new JMenu(Messages.getString("EventKeySelector.FUNCTION_KEYS")); //$NON-NLS-1$
for (int i = KeyEvent.VK_F1; i <= KeyEvent.VK_F12; i++)
addSub(submenu,i);
menu.add(submenu);
submenu = new JMenu(Messages.getString("EventKeySelector.OTHERS")); //$NON-NLS-1$
addSub(submenu,KeyEvent.VK_BACK_SPACE);
addSub(submenu,KeyEvent.VK_ESCAPE);
addSub(submenu,KeyEvent.VK_HOME);
addSub(submenu,KeyEvent.VK_END);
addSub(submenu,KeyEvent.VK_PAGE_UP);
addSub(submenu,KeyEvent.VK_PAGE_DOWN);
addSub(submenu,KeyEvent.VK_DELETE);
addSub(submenu,KeyEvent.VK_INSERT);
menu.add(submenu);
menu.addSeparator();
add(menu,0);
add(menu,1);
}
public void add(JPopupMenu menu, int key)
{
JMenuItem mi = new KeyMenuItem(Event.getGmKeyCode(key));
menu.add(mi);
mi.addActionListener(this);
}
public void addSub(JMenu menu, int key)
{
JMenuItem mi = new KeyMenuItem(Event.getGmKeyCode(key));
menu.add(mi);
mi.addActionListener(this);
}
public void setSelectedGmKey(int key)
{
text.setSelectedGmKey(key);
}
public void actionPerformed(ActionEvent e)
{
Object o = e.getSource();
if (!(o instanceof KeyMenuItem)) return;
switch (parMethod)
{
case 0:
setSelectedGmKey(((KeyMenuItem) o).gmKey);
break;
case 1:
if (parFrame != null)
{
parFrame.functionEvent(parEvent,((KeyMenuItem) o).gmKey,parNode.other,null);
parFrame.toTop();
}
break;
}
}
public static class EventKeyInput extends JTextField
{
private static final long serialVersionUID = 1L;
public EventFrame parent;
private int selectedKey = -1;
public EventKeyInput(EventFrame parent)
{
this.parent = parent;
setFocusTraversalKeysEnabled(false);
setDragEnabled(false);
}
public void setSelectedGmKey(int key)
{
selectedKey = key;
setText(Event.getGmKeyName(key));
if (parent.selectedNode != null) switch (parent.selectedNode.mainId)
{
case MainEvent.EV_KEYBOARD:
case MainEvent.EV_KEYPRESS:
case MainEvent.EV_KEYRELEASE:
parent.selectedNode.eventId = selectedKey;
break;
default:
}
}
public void processKeyEvent(KeyEvent e)
{
if (e.getID() == KeyEvent.KEY_PRESSED)
{
int key = Event.getGmKeyCode(e.getKeyCode());
if (Event.KEYS.contains(key))
setSelectedGmKey(key);
else if (key == Prefs.eventKeyInputAddKey)
{
GmObjectFrame f = parent.linkedFrame == null ? null : parent.linkedFrame.get();
if (f != null && Event.KEYS.contains(selectedKey))
{
f.addEvent(new Event(parent.selectedNode.mainId,selectedKey));
}
}
}
}
}
private class MListener extends MouseAdapter
{
public void mouseClicked(MouseEvent e)
{
if (!isEnabled()) return;
menu.show(e.getComponent(),e.getX(),e.getY());
}
}
public static class KeyMenuItem extends JMenuItem
{
private static final long serialVersionUID = 1L;
public final int gmKey;
public KeyMenuItem(int gmKey)
{
super(Event.getGmKeyName(gmKey));
this.gmKey = gmKey;
}
}
}