blob: 1edba6d7262812af1b1fb803c7349ff38105f95c [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
package org.openoffice.accessibility;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.awt.XKeyHandler;
import org.openoffice.java.accessibility.AccessibleKeyBinding;
import org.openoffice.java.accessibility.Build;
import java.awt.*;
import java.awt.event.KeyEvent;
import javax.accessibility.*;
public class KeyHandler extends Component implements XKeyHandler, java.awt.KeyEventDispatcher {
EventQueue eventQueue;
public class VCLKeyEvent extends KeyEvent implements Runnable {
boolean consumed = true;
public VCLKeyEvent(Component c, int id, int modifiers, int keyCode, char keyChar) {
super(c, id, System.currentTimeMillis(), modifiers, keyCode, keyChar);
}
public void run() {
// This is a no-op ..
}
public void setConsumed(boolean b) {
consumed = b;
}
public boolean isConsumed() {
return consumed;
}
}
public KeyHandler() {
eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
java.awt.KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this);
}
/** This method is called by the current KeyboardFocusManager requesting that this KeyEventDispatcher
* dispatch the specified event on its behalf
*/
public boolean dispatchKeyEvent(java.awt.event.KeyEvent e) {
if (e instanceof VCLKeyEvent) {
VCLKeyEvent event = (VCLKeyEvent) e;
event.setConsumed(false);
return true;
}
return false;
}
/** Handler for KeyPressed events */
public boolean keyPressed(com.sun.star.awt.KeyEvent event) {
// try {
VCLKeyEvent vke = new VCLKeyEvent(this, KeyEvent.KEY_PRESSED,
AccessibleKeyBinding.convertModifiers(event.Modifiers),
AccessibleKeyBinding.convertKeyCode(event.KeyCode),
event.KeyChar != 0 ? event.KeyChar : KeyEvent.CHAR_UNDEFINED);
eventQueue.postEvent(vke);
// VCL events for TABs have empty KeyChar
if (event.KeyCode == com.sun.star.awt.Key.TAB ) {
event.KeyChar = '\t';
}
// Synthesize KEY_TYPED event to emulate Java behavior
if (event.KeyChar != 0) {
eventQueue.postEvent(new VCLKeyEvent(this,
KeyEvent.KEY_TYPED,
AccessibleKeyBinding.convertModifiers(event.Modifiers),
KeyEvent.VK_UNDEFINED,
event.KeyChar));
}
// Wait until the key event is processed
return false;
// eventQueue.invokeAndWait(vke);
// return vke.isConsumed();
// } catch(java.lang.InterruptedException e) {
// return false;
// } catch(java.lang.reflect.InvocationTargetException e) {
// return false;
// }
}
/** Handler for KeyReleased events */
public boolean keyReleased(com.sun.star.awt.KeyEvent event) {
// try {
VCLKeyEvent vke = new VCLKeyEvent(this, KeyEvent.KEY_RELEASED,
AccessibleKeyBinding.convertModifiers(event.Modifiers),
AccessibleKeyBinding.convertKeyCode(event.KeyCode),
event.KeyChar != 0 ? event.KeyChar : KeyEvent.CHAR_UNDEFINED);
eventQueue.postEvent(vke);
// Wait until the key event is processed
return false;
// eventQueue.invokeAndWait(vke);
// return vke.isConsumed();
// } catch(java.lang.InterruptedException e) {
// return false;
// } catch(java.lang.reflect.InvocationTargetException e) {
// return false;
// }
}
public void disposing(com.sun.star.lang.EventObject event) {
java.awt.KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(this);
}
}