CaRMtl/rene/gui/KeyboardController.java
2018-09-04 22:51:42 -04:00

159 lines
4.3 KiB
Java

/*
Copyright 2006 Rene Grothmann, modified by Eric Hakenholz
This file is part of C.a.R. software.
C.a.R. is a 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, version 3 of the License.
C.a.R. 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 rene.gui;
import java.awt.Component;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class KeyboardController implements KeyListener {
/** Macro and programs key pressed */
boolean Escape = false;
/** Note, if the next entry should be ignored or not */
boolean IgnoreTyped = false;
/** The type of the recent command key (1..5) */
int CommandType = 0;
/** The component, which we are listening to. */
Component C = null;
/** The primary and secondary KeyboardInterface */
KeyboardInterface Primary = null, Secondary = null;
public synchronized void keyPressed(final KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SHIFT)
return;
if (e.getKeyCode() == KeyEvent.VK_CONTROL)
return;
if (e.getKeyCode() == KeyEvent.VK_ALT)
return;
if (old(e))
return;
final String s = Keyboard.findKey(e, CommandType);
// System.out.println(Escape+" "+CommandType+" "+s);
IgnoreTyped = false;
if (s.startsWith("command.")) {
if (s.equals("command.escape")) {
Escape = !Escape;
} else
try {
CommandType = Integer.parseInt(s.substring(8));
Escape = false;
} catch (final Exception ex) {
CommandType = 0;
}
IgnoreTyped = true;
} else if (s.startsWith("charkey.")) {
keyboardCommand(e, s);
IgnoreTyped = true;
Escape = false;
CommandType = 0;
} else if (Escape) {
final char c = e.getKeyChar();
IgnoreTyped = true;
keyboardEscape(e, c);
Escape = false;
} else if (!s.equals("")) {
keyboardCommand(e, s);
IgnoreTyped = false;
Escape = false;
CommandType = 0;
} else if (!e.isActionKey()) {
if (!Global.getParameter("keyboard.compose", true)) {
keyboardChar(e, e.getKeyChar());
Escape = false;
CommandType = 0;
} else {
Escape = false;
CommandType = 0;
}
}
}
public void keyTyped(final KeyEvent e) {
if (!Global.getParameter("keyboard.compose", true))
return;
// System.out.println("key typed "+IgnoreTyped+" "+e);
if (IgnoreTyped)
return;
IgnoreTyped = false;
keyboardChar(e, e.getKeyChar());
Escape = false;
CommandType = 0;
}
public void keyReleased(final KeyEvent e) {
}
public void keyboardCommand(final KeyEvent e, final String command) { // System.out.println(command);
if (Primary == null || !Primary.keyboardCommand(e, command))
if (Secondary != null)
Secondary.keyboardCommand(e, command);
}
public void keyboardEscape(final KeyEvent e, final char c) { // System.out.println("escape "+c);
if (Primary == null || !Primary.keyboardEscape(e, c))
if (Secondary != null)
Secondary.keyboardEscape(e, c);
}
public void keyboardChar(final KeyEvent e, final char c) { // System.out.println(""+c);
if (Primary == null || !Primary.keyboardChar(e, c))
if (Secondary != null)
Secondary.keyboardChar(e, c);
}
boolean scaled = false; // scaled already
long scale; // the scaling in milliseconds
/**
* Test for old keys. This algorithm uses the difference between event time
* and system time. However, one needs to scale this first, since in Linux
* both timers do not agree.
*/
boolean old(final KeyEvent e) {
if (!scaled) {
scaled = true;
scale = System.currentTimeMillis() - e.getWhen();
return false;
}
final long delay = System.currentTimeMillis() - e.getWhen() - scale;
if (delay > 10000)
return false; // function does not work!
return (delay > 200);
}
public void listenTo(final Component c) {
if (C != null)
C.removeKeyListener(this);
C = c;
if (C != null)
C.addKeyListener(this);
}
public void setPrimary(final KeyboardInterface i) {
Primary = i;
}
public void setSecondary(final KeyboardInterface i) {
Secondary = i;
}
}