|
Packit |
ffe0d2 |
/*
|
|
Packit |
ffe0d2 |
* Java ATK Wrapper for GNOME
|
|
Packit |
ffe0d2 |
* Copyright (C) 2009 Sun Microsystems Inc.
|
|
Packit |
ffe0d2 |
* Copyright (C) 2015 Magdalen Berns <m.berns@thismagpie.com>
|
|
Packit |
ffe0d2 |
*
|
|
Packit |
ffe0d2 |
* This library is free software; you can redistribute it and/or
|
|
Packit |
ffe0d2 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit |
ffe0d2 |
* License as published by the Free Software Foundation; either
|
|
Packit |
ffe0d2 |
* version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
ffe0d2 |
*
|
|
Packit |
ffe0d2 |
* This library is distributed in the hope that it will be useful,
|
|
Packit |
ffe0d2 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
ffe0d2 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
ffe0d2 |
* Lesser General Public License for more details.
|
|
Packit |
ffe0d2 |
*
|
|
Packit |
ffe0d2 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
ffe0d2 |
* License along with this library; if not, write to the Free Software
|
|
Packit |
ffe0d2 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit |
ffe0d2 |
*/
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
package org.GNOME.Accessibility;
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
import java.awt.*;
|
|
Packit |
ffe0d2 |
import java.awt.event.*;
|
|
Packit |
ffe0d2 |
import java.beans.*;
|
|
Packit |
ffe0d2 |
import java.io.*;
|
|
Packit |
ffe0d2 |
import javax.accessibility.*;
|
|
Packit |
ffe0d2 |
import java.awt.Toolkit;
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
public class AtkWrapper {
|
|
Packit |
ffe0d2 |
static boolean accessibilityEnabled = false;
|
|
Packit |
ffe0d2 |
static {
|
|
Packit |
ffe0d2 |
try {
|
|
Packit |
ffe0d2 |
Process p = Runtime.getRuntime().exec("@XPROP@ -root");
|
|
Packit |
ffe0d2 |
BufferedReader b = new BufferedReader(new InputStreamReader (p.getInputStream ()));
|
|
Packit |
ffe0d2 |
String result;
|
|
Packit |
ffe0d2 |
while ((result = b.readLine()) != null) {
|
|
Packit |
ffe0d2 |
if (result.indexOf("AT_SPI_IOR") >= 0 || result.indexOf("AT_SPI_BUS") >= 0) {
|
|
Packit |
ffe0d2 |
System.loadLibrary("atk-wrapper");
|
|
Packit |
ffe0d2 |
if (AtkWrapper.initNativeLibrary())
|
|
Packit |
ffe0d2 |
accessibilityEnabled = true;
|
|
Packit |
ffe0d2 |
break;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
} catch (Exception e) {
|
|
Packit |
ffe0d2 |
e.printStackTrace();
|
|
Packit |
ffe0d2 |
e.getCause();
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
/**
|
|
Packit |
ffe0d2 |
* winAdapter
|
|
Packit |
ffe0d2 |
*
|
|
Packit |
ffe0d2 |
* <http://docs.oracle.com/javase/8/docs/api/java/awt/event/WindowAdapter.html>
|
|
Packit |
ffe0d2 |
* <http://docs.oracle.com/javase/8/docs/api/java/awt/event/WindowEvent.html>
|
|
Packit |
ffe0d2 |
*/
|
|
Packit |
ffe0d2 |
final WindowAdapter winAdapter = new WindowAdapter() {
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
/**
|
|
Packit |
ffe0d2 |
* windowActivated:
|
|
Packit |
ffe0d2 |
* Invoked when a Window becomes the active Window.
|
|
Packit |
ffe0d2 |
* Only a Frame or a Dialog can be the active Window. The
|
|
Packit |
ffe0d2 |
* native windowing system may denote the active Window
|
|
Packit |
ffe0d2 |
* or its children with special decorations, such as a
|
|
Packit |
ffe0d2 |
* highlighted title bar. The active Window is always either
|
|
Packit |
ffe0d2 |
* the focused Window, or the first Frame or Dialog that is
|
|
Packit |
ffe0d2 |
* an owner of the focused Window.
|
|
Packit |
ffe0d2 |
* @param e A WindowEvent object
|
|
Packit |
ffe0d2 |
*/
|
|
Packit |
ffe0d2 |
public void windowActivated(WindowEvent e) {
|
|
Packit |
ffe0d2 |
Object o = e.getSource();
|
|
Packit |
ffe0d2 |
if ( o instanceof javax.accessibility.Accessible ) {
|
|
Packit |
ffe0d2 |
AccessibleContext ac = ((javax.accessibility.Accessible)o).getAccessibleContext();
|
|
Packit |
ffe0d2 |
AtkWrapper.windowActivate(ac);
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
/**
|
|
Packit |
ffe0d2 |
* windowDeactivated:
|
|
Packit |
ffe0d2 |
* Invoked when a Window is no longer the active Window.
|
|
Packit |
ffe0d2 |
* Only a Frame or a Dialog can be the active Window. The
|
|
Packit |
ffe0d2 |
* native windowing system may denote the active Window
|
|
Packit |
ffe0d2 |
* or its children with special decorations, such as a
|
|
Packit |
ffe0d2 |
* highlighted title bar. The active Window is always either
|
|
Packit |
ffe0d2 |
* the focused Window, or the first Frame or Dialog that is
|
|
Packit |
ffe0d2 |
* an owner of the focused Window.
|
|
Packit |
ffe0d2 |
* @param e A WindowEvent object
|
|
Packit |
ffe0d2 |
*/
|
|
Packit |
ffe0d2 |
public void windowDeactivated(WindowEvent e) {
|
|
Packit |
ffe0d2 |
Object o = e.getSource();
|
|
Packit |
ffe0d2 |
if (o instanceof javax.accessibility.Accessible) {
|
|
Packit |
ffe0d2 |
AccessibleContext ac = ((javax.accessibility.Accessible)o).getAccessibleContext();
|
|
Packit |
ffe0d2 |
AtkWrapper.windowDeactivate(ac);
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
/**
|
|
Packit |
ffe0d2 |
* windowStateChanged:
|
|
Packit |
ffe0d2 |
* Invoked when a window state is changed.
|
|
Packit |
ffe0d2 |
*
|
|
Packit |
ffe0d2 |
* @param e A WindowEvent object
|
|
Packit |
ffe0d2 |
*/
|
|
Packit |
ffe0d2 |
public void windowStateChanged(WindowEvent e) {
|
|
Packit |
ffe0d2 |
Object o = e.getSource();
|
|
Packit |
ffe0d2 |
if (o instanceof javax.accessibility.Accessible) {
|
|
Packit |
ffe0d2 |
AccessibleContext ac = ((javax.accessibility.Accessible)o).getAccessibleContext();
|
|
Packit |
ffe0d2 |
AtkWrapper.windowStateChange(ac);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
if( (e.getNewState() & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH ) {
|
|
Packit |
ffe0d2 |
AtkWrapper.windowMaximize(ac);
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
/**
|
|
Packit |
ffe0d2 |
* windowDeiconified:
|
|
Packit |
ffe0d2 |
* Invoked when a window is deiconified.
|
|
Packit |
ffe0d2 |
* @param e A WindowEvent instance
|
|
Packit |
ffe0d2 |
*/
|
|
Packit |
ffe0d2 |
public void windowDeiconified(WindowEvent e) {
|
|
Packit |
ffe0d2 |
Object o = e.getSource();
|
|
Packit |
ffe0d2 |
if (o instanceof javax.accessibility.Accessible) {
|
|
Packit |
ffe0d2 |
AccessibleContext ac = ((javax.accessibility.Accessible)o).getAccessibleContext();
|
|
Packit |
ffe0d2 |
AtkWrapper.windowRestore(ac);
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
/**
|
|
Packit |
ffe0d2 |
* windowIconified:
|
|
Packit |
ffe0d2 |
* Invoked when a window is iconified.
|
|
Packit |
ffe0d2 |
* @param e A WindowEvent instance
|
|
Packit |
ffe0d2 |
*/
|
|
Packit |
ffe0d2 |
public void windowIconified(WindowEvent e) {
|
|
Packit |
ffe0d2 |
Object o = e.getSource();
|
|
Packit |
ffe0d2 |
if (o instanceof javax.accessibility.Accessible) {
|
|
Packit |
ffe0d2 |
AccessibleContext ac = ((javax.accessibility.Accessible)o).getAccessibleContext();
|
|
Packit |
ffe0d2 |
AtkWrapper.windowMinimize(ac);
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
/**
|
|
Packit |
ffe0d2 |
* windowOpened
|
|
Packit |
ffe0d2 |
* @param e A WindowEvent object
|
|
Packit |
ffe0d2 |
*/
|
|
Packit |
ffe0d2 |
public void windowOpened(WindowEvent e) {
|
|
Packit |
ffe0d2 |
Object o = e.getSource();
|
|
Packit |
ffe0d2 |
if ( o instanceof javax.accessibility.Accessible ) {
|
|
Packit |
ffe0d2 |
boolean isToplevel = isToplevel(o);
|
|
Packit |
ffe0d2 |
AccessibleContext ac = ((javax.accessibility.Accessible)o).getAccessibleContext();
|
|
Packit |
ffe0d2 |
AtkWrapper.windowOpen(ac, isToplevel);
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
/**
|
|
Packit |
ffe0d2 |
* windowClosed:
|
|
Packit |
ffe0d2 |
* Invoked when a window has been closed.
|
|
Packit |
ffe0d2 |
* @param e A WindowEvent object
|
|
Packit |
ffe0d2 |
*/
|
|
Packit |
ffe0d2 |
public void windowClosed(WindowEvent e) {
|
|
Packit |
ffe0d2 |
Object o = e.getSource();
|
|
Packit |
ffe0d2 |
if (o instanceof javax.accessibility.Accessible) {
|
|
Packit |
ffe0d2 |
boolean isToplevel = isToplevel(o);
|
|
Packit |
ffe0d2 |
AccessibleContext ac = ((javax.accessibility.Accessible)o).getAccessibleContext();
|
|
Packit |
ffe0d2 |
AtkWrapper.windowClose(ac, isToplevel);
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
/**
|
|
Packit |
ffe0d2 |
* windowClosing:
|
|
Packit |
ffe0d2 |
* Invoked when a window is in the process of being closed.
|
|
Packit |
ffe0d2 |
* @param e A WindowEvent object
|
|
Packit |
ffe0d2 |
*/
|
|
Packit |
ffe0d2 |
public void windowClosing(WindowEvent e) {
|
|
Packit |
ffe0d2 |
Object o = e.getSource();
|
|
Packit |
ffe0d2 |
if (o instanceof javax.accessibility.Accessible) {
|
|
Packit |
ffe0d2 |
boolean isToplevel = isToplevel(o);
|
|
Packit |
ffe0d2 |
AccessibleContext ac = ((javax.accessibility.Accessible)o).getAccessibleContext();
|
|
Packit |
ffe0d2 |
AtkWrapper.windowClose(ac, isToplevel);
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
/**
|
|
Packit |
ffe0d2 |
* windowGainedFocus:
|
|
Packit |
ffe0d2 |
* Invoked when the Window is set to be the focused Window,
|
|
Packit |
ffe0d2 |
* which means that the Window, or one of its subcomponents,
|
|
Packit |
ffe0d2 |
* will receive keyboard events.
|
|
Packit |
ffe0d2 |
* @param e A WindowEvent object
|
|
Packit |
ffe0d2 |
*/
|
|
Packit |
ffe0d2 |
public void windowGainedFocus(WindowEvent e) {
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
public void windowLostFocus(WindowEvent e) {
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}; // Close WindowAdapter brace
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
/**
|
|
Packit |
ffe0d2 |
* isToplevel
|
|
Packit |
ffe0d2 |
* @param o an instance
|
|
Packit |
ffe0d2 |
* @return true if instance is of a window, frame or dialogue object
|
|
Packit |
ffe0d2 |
* false otherwise.
|
|
Packit |
ffe0d2 |
*/
|
|
Packit |
ffe0d2 |
public static boolean isToplevel(Object o) {
|
|
Packit |
ffe0d2 |
boolean isToplevel = false;
|
|
Packit |
ffe0d2 |
if (o instanceof java.awt.Window ||
|
|
Packit |
ffe0d2 |
o instanceof java.awt.Frame ||
|
|
Packit |
ffe0d2 |
o instanceof java.awt.Dialog) {
|
|
Packit |
ffe0d2 |
isToplevel = true;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
return isToplevel;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
final AWTEventListener globalListener = new AWTEventListener() {
|
|
Packit |
ffe0d2 |
private boolean firstEvent = true;
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
public void eventDispatched(AWTEvent e) {
|
|
Packit |
ffe0d2 |
if (firstEvent && accessibilityEnabled) {
|
|
Packit |
ffe0d2 |
firstEvent = false;
|
|
Packit |
ffe0d2 |
try {
|
|
Packit |
ffe0d2 |
AtkWrapper.loadAtkBridge();
|
|
Packit |
ffe0d2 |
} catch (Exception ex) {
|
|
Packit |
ffe0d2 |
ex.printStackTrace();
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
if(e instanceof WindowEvent) {
|
|
Packit |
ffe0d2 |
switch( e.getID() ) {
|
|
Packit |
ffe0d2 |
case WindowEvent.WINDOW_OPENED:
|
|
Packit |
ffe0d2 |
Window win = ((WindowEvent)e).getWindow();
|
|
Packit |
ffe0d2 |
win.addWindowListener(winAdapter);
|
|
Packit |
ffe0d2 |
win.addWindowStateListener(winAdapter);
|
|
Packit |
ffe0d2 |
win.addWindowFocusListener(winAdapter);
|
|
Packit |
ffe0d2 |
break;
|
|
Packit |
ffe0d2 |
case WindowEvent.WINDOW_LOST_FOCUS:
|
|
Packit |
ffe0d2 |
AtkWrapper.dispatchFocusEvent(null);
|
|
Packit |
ffe0d2 |
break;
|
|
Packit |
ffe0d2 |
default:
|
|
Packit |
ffe0d2 |
break;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
} else if(e instanceof ContainerEvent ) {
|
|
Packit |
ffe0d2 |
switch( e.getID() ) {
|
|
Packit |
ffe0d2 |
case ContainerEvent.COMPONENT_ADDED:
|
|
Packit |
ffe0d2 |
{
|
|
Packit |
ffe0d2 |
java.awt.Component c = ((ContainerEvent)e).getChild();
|
|
Packit |
ffe0d2 |
if (c instanceof javax.accessibility.Accessible) {
|
|
Packit |
ffe0d2 |
AccessibleContext ac = ((javax.accessibility.Accessible)c).getAccessibleContext();
|
|
Packit |
ffe0d2 |
AtkWrapper.componentAdded(ac);
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
break;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
case ContainerEvent.COMPONENT_REMOVED:
|
|
Packit |
ffe0d2 |
{
|
|
Packit |
ffe0d2 |
java.awt.Component c = ((ContainerEvent)e).getChild();
|
|
Packit |
ffe0d2 |
if (c instanceof javax.accessibility.Accessible) {
|
|
Packit |
ffe0d2 |
AccessibleContext ac = ((javax.accessibility.Accessible)c).getAccessibleContext();
|
|
Packit |
ffe0d2 |
AtkWrapper.componentRemoved(ac);
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
break;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
default:
|
|
Packit |
ffe0d2 |
break;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
} else if(e instanceof FocusEvent) {
|
|
Packit |
ffe0d2 |
switch(e.getID()) {
|
|
Packit |
ffe0d2 |
case FocusEvent.FOCUS_GAINED:
|
|
Packit |
ffe0d2 |
AtkWrapper.dispatchFocusEvent(e.getSource());
|
|
Packit |
ffe0d2 |
break;
|
|
Packit |
ffe0d2 |
default:
|
|
Packit |
ffe0d2 |
break;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
};
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
static AccessibleContext oldSourceContext = null;
|
|
Packit |
ffe0d2 |
static AccessibleContext savedSourceContext= null;
|
|
Packit |
ffe0d2 |
static AccessibleContext oldPaneContext = null;
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
/**
|
|
Packit |
ffe0d2 |
* dispatchFocusEvent
|
|
Packit |
ffe0d2 |
* @param eventSource An instance of the event source object.
|
|
Packit |
ffe0d2 |
*/
|
|
Packit |
ffe0d2 |
static void dispatchFocusEvent(Object eventSource) {
|
|
Packit |
ffe0d2 |
if (eventSource == null) {
|
|
Packit |
ffe0d2 |
oldSourceContext = null;
|
|
Packit |
ffe0d2 |
return;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
AccessibleContext ctx;
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
try {
|
|
Packit |
ffe0d2 |
if (eventSource instanceof AccessibleContext) {
|
|
Packit |
ffe0d2 |
ctx = (AccessibleContext)eventSource;
|
|
Packit |
ffe0d2 |
} else if (eventSource instanceof javax.accessibility.Accessible) {
|
|
Packit |
ffe0d2 |
ctx = ((javax.accessibility.Accessible)eventSource).getAccessibleContext();
|
|
Packit |
ffe0d2 |
} else {
|
|
Packit |
ffe0d2 |
return;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
if (ctx == oldSourceContext) {
|
|
Packit |
ffe0d2 |
return;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
if (oldSourceContext != null) {
|
|
Packit |
ffe0d2 |
AccessibleRole role = oldSourceContext.getAccessibleRole();
|
|
Packit |
ffe0d2 |
if (role == AccessibleRole.MENU || role == AccessibleRole.MENU_ITEM) {
|
|
Packit |
ffe0d2 |
String jrootpane = "javax.swing.JRootPane$AccessibleJRootPane";
|
|
Packit |
ffe0d2 |
String name = ctx.getClass().getName();
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
if (jrootpane.compareTo(name) == 0) {
|
|
Packit |
ffe0d2 |
oldPaneContext = ctx;
|
|
Packit |
ffe0d2 |
return;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
savedSourceContext = ctx;
|
|
Packit |
ffe0d2 |
} else if (oldPaneContext == ctx) {
|
|
Packit |
ffe0d2 |
ctx = savedSourceContext;
|
|
Packit |
ffe0d2 |
} else {
|
|
Packit |
ffe0d2 |
savedSourceContext = ctx;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
oldSourceContext = ctx;
|
|
Packit |
ffe0d2 |
AccessibleRole role = ctx.getAccessibleRole();
|
|
Packit |
ffe0d2 |
if (role == AccessibleRole.PAGE_TAB_LIST) {
|
|
Packit |
ffe0d2 |
AccessibleSelection accSelection = ctx.getAccessibleSelection();
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
if (accSelection != null && accSelection.getAccessibleSelectionCount() > 0) {
|
|
Packit |
ffe0d2 |
Object child = accSelection.getAccessibleSelection(0);
|
|
Packit |
ffe0d2 |
if (child instanceof AccessibleContext) {
|
|
Packit |
ffe0d2 |
ctx = (AccessibleContext)child;
|
|
Packit |
ffe0d2 |
} else if (child instanceof javax.accessibility.Accessible) {
|
|
Packit |
ffe0d2 |
ctx = ((javax.accessibility.Accessible)child).getAccessibleContext();
|
|
Packit |
ffe0d2 |
} else {
|
|
Packit |
ffe0d2 |
return;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
focusNotify(ctx);
|
|
Packit |
ffe0d2 |
} catch (Exception e) {
|
|
Packit |
ffe0d2 |
e.printStackTrace();
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
final Toolkit toolkit = Toolkit.getDefaultToolkit();
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
static PropertyChangeListener propertyChangeListener = new PropertyChangeListener() {
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
/**
|
|
Packit |
ffe0d2 |
* propertyChange:
|
|
Packit |
ffe0d2 |
* @param e An instance of the PropertyChangeEvent object.
|
|
Packit |
ffe0d2 |
*/
|
|
Packit |
ffe0d2 |
public void propertyChange(PropertyChangeEvent e) {
|
|
Packit |
ffe0d2 |
Object o = e.getSource();
|
|
Packit |
ffe0d2 |
AccessibleContext ac;
|
|
Packit |
ffe0d2 |
if (o instanceof AccessibleContext) {
|
|
Packit |
ffe0d2 |
ac = (AccessibleContext)o;
|
|
Packit |
ffe0d2 |
} else if (o instanceof javax.accessibility.Accessible) {
|
|
Packit |
ffe0d2 |
ac = ((javax.accessibility.Accessible)o).getAccessibleContext();
|
|
Packit |
ffe0d2 |
} else {
|
|
Packit |
ffe0d2 |
return;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
Object oldValue = e.getOldValue();
|
|
Packit |
ffe0d2 |
Object newValue = e.getNewValue();
|
|
Packit |
ffe0d2 |
String propertyName = e.getPropertyName();
|
|
Packit |
ffe0d2 |
if( propertyName.equals(AccessibleContext.ACCESSIBLE_CARET_PROPERTY) ) {
|
|
Packit |
ffe0d2 |
Object[] args = new Object[1];
|
|
Packit |
ffe0d2 |
args[0] = newValue;
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
emitSignal(ac, AtkSignal.TEXT_CARET_MOVED, args);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
} else if( propertyName.equals(AccessibleContext.ACCESSIBLE_TEXT_PROPERTY) ) {
|
|
Packit |
ffe0d2 |
if (newValue == null) {
|
|
Packit |
ffe0d2 |
return;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
if (newValue instanceof Integer) {
|
|
Packit |
ffe0d2 |
Object[] args = new Object[1];
|
|
Packit |
ffe0d2 |
args[0] = newValue;
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
emitSignal(ac, AtkSignal.TEXT_PROPERTY_CHANGED, args);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
/*
|
|
Packit |
ffe0d2 |
if (oldValue == null && newValue != null) { //insertion event
|
|
Packit |
ffe0d2 |
if (!(newValue instanceof AccessibleTextSequence)) {
|
|
Packit |
ffe0d2 |
return;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
AccessibleTextSequence newSeq = (AccessibleTextSequence)newValue;
|
|
Packit |
ffe0d2 |
Object[] args = new Object[2];
|
|
Packit |
ffe0d2 |
args[0] = new Integer(newSeq.startIndex);
|
|
Packit |
ffe0d2 |
args[1] = new Integer(newSeq.endIndex - newSeq.startIndex);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
emitSignal(ac, AtkSignal.TEXT_PROPERTY_CHANGED_INSERT, args);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
} else if (oldValue != null && newValue == null) { //deletion event
|
|
Packit |
ffe0d2 |
if (!(oldValue instanceof AccessibleTextSequence)) {
|
|
Packit |
ffe0d2 |
return;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
AccessibleTextSequence oldSeq = (AccessibleTextSequence)oldValue;
|
|
Packit |
ffe0d2 |
Object[] args = new Object[2];
|
|
Packit |
ffe0d2 |
args[0] = new Integer(oldSeq.startIndex);
|
|
Packit |
ffe0d2 |
args[1] = new Integer(oldSeq.endIndex - oldSeq.startIndex);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
emitSignal(ac, AtkSignal.TEXT_PROPERTY_CHANGED_DELETE, args);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
} else if (oldValue != null && newValue != null) { //replacement event
|
|
Packit |
ffe0d2 |
//It seems ATK does not support "replace" currently
|
|
Packit |
ffe0d2 |
return;
|
|
Packit |
ffe0d2 |
}*/
|
|
Packit |
ffe0d2 |
} else if( propertyName.equals(AccessibleContext.ACCESSIBLE_CHILD_PROPERTY) ) {
|
|
Packit |
ffe0d2 |
if (oldValue == null && newValue != null) { //child added
|
|
Packit |
ffe0d2 |
AccessibleContext child_ac;
|
|
Packit |
ffe0d2 |
if (newValue instanceof javax.accessibility.Accessible) {
|
|
Packit |
ffe0d2 |
child_ac = ((javax.accessibility.Accessible)newValue).getAccessibleContext();
|
|
Packit |
ffe0d2 |
} else {
|
|
Packit |
ffe0d2 |
return;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
Object[] args = new Object[2];
|
|
Packit |
ffe0d2 |
args[0] = new Integer(child_ac.getAccessibleIndexInParent());
|
|
Packit |
ffe0d2 |
args[1] = child_ac;
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
emitSignal(ac, AtkSignal.OBJECT_CHILDREN_CHANGED_ADD, args);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
} else if (oldValue != null && newValue == null) { //child removed
|
|
Packit |
ffe0d2 |
AccessibleContext child_ac;
|
|
Packit |
ffe0d2 |
if (oldValue instanceof javax.accessibility.Accessible) {
|
|
Packit |
ffe0d2 |
child_ac = ((javax.accessibility.Accessible)oldValue).getAccessibleContext();
|
|
Packit |
ffe0d2 |
} else {
|
|
Packit |
ffe0d2 |
return;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
Object[] args = new Object[2];
|
|
Packit |
ffe0d2 |
args[0] = new Integer(child_ac.getAccessibleIndexInParent());
|
|
Packit |
ffe0d2 |
args[1] = child_ac;
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
emitSignal(ac, AtkSignal.OBJECT_CHILDREN_CHANGED_REMOVE, args);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
} else if( propertyName.equals(AccessibleContext.ACCESSIBLE_ACTIVE_DESCENDANT_PROPERTY) ) {
|
|
Packit |
ffe0d2 |
AccessibleContext child_ac;
|
|
Packit |
ffe0d2 |
if (newValue instanceof javax.accessibility.Accessible) {
|
|
Packit |
ffe0d2 |
child_ac = ((javax.accessibility.Accessible)newValue).getAccessibleContext();
|
|
Packit |
ffe0d2 |
} else {
|
|
Packit |
ffe0d2 |
return;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
Object[] args = new Object[1];
|
|
Packit |
ffe0d2 |
args[0] = child_ac;
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
emitSignal(ac, AtkSignal.OBJECT_ACTIVE_DESCENDANT_CHANGED, args);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
} else if( propertyName.equals(AccessibleContext.ACCESSIBLE_SELECTION_PROPERTY) ) {
|
|
Packit |
ffe0d2 |
boolean isTextEvent = false;
|
|
Packit |
ffe0d2 |
AccessibleRole role = ac.getAccessibleRole();
|
|
Packit |
ffe0d2 |
if ((role == AccessibleRole.TEXT) ||
|
|
Packit |
ffe0d2 |
role.toDisplayString(java.util.Locale.US).equalsIgnoreCase("paragraph")) {
|
|
Packit |
ffe0d2 |
isTextEvent = true;
|
|
Packit |
ffe0d2 |
} else if (role == AccessibleRole.MENU_BAR) {
|
|
Packit |
ffe0d2 |
dispatchFocusEvent(o);
|
|
Packit |
ffe0d2 |
} else if (role == AccessibleRole.PAGE_TAB_LIST) {
|
|
Packit |
ffe0d2 |
AccessibleSelection selection = ac.getAccessibleSelection();
|
|
Packit |
ffe0d2 |
if (selection != null &&
|
|
Packit |
ffe0d2 |
selection.getAccessibleSelectionCount() > 0) {
|
|
Packit |
ffe0d2 |
java.lang.Object child = selection.getAccessibleSelection(0);
|
|
Packit |
ffe0d2 |
dispatchFocusEvent(child);
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
if (!isTextEvent) {
|
|
Packit |
ffe0d2 |
emitSignal(ac, AtkSignal.OBJECT_SELECTION_CHANGED, null);
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
} else if( propertyName.equals(AccessibleContext.ACCESSIBLE_VISIBLE_DATA_PROPERTY) ) {
|
|
Packit |
ffe0d2 |
//emitSignal(ac, AtkSignal.OBJECT_VISIBLE_DATA_CHANGED, null);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
}else if( propertyName.equals(AccessibleContext.ACCESSIBLE_ACTION_PROPERTY) ) {
|
|
Packit |
ffe0d2 |
Object[] args = new Object[2];
|
|
Packit |
ffe0d2 |
args[0] = oldValue;
|
|
Packit |
ffe0d2 |
args[1] = newValue;
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
emitSignal(ac, AtkSignal.OBJECT_PROPERTY_CHANGE_ACCESSIBLE_ACTIONS, args);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
}else if( propertyName.equals(AccessibleContext.ACCESSIBLE_VALUE_PROPERTY) ) {
|
|
Packit |
ffe0d2 |
if (oldValue instanceof Number && newValue instanceof Number) {
|
|
Packit |
ffe0d2 |
Object[] args = new Object[2];
|
|
Packit |
ffe0d2 |
args[0] = new Double(((Number)oldValue).doubleValue());
|
|
Packit |
ffe0d2 |
args[1] = new Double(((Number)newValue).doubleValue());
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
emitSignal(ac, AtkSignal.OBJECT_PROPERTY_CHANGE_ACCESSIBLE_VALUE, args);
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
} else if(propertyName.equals(AccessibleContext.ACCESSIBLE_DESCRIPTION_PROPERTY)) {
|
|
Packit |
ffe0d2 |
emitSignal(ac, AtkSignal.OBJECT_PROPERTY_CHANGE_ACCESSIBLE_DESCRIPTION, null);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
} else if(propertyName.equals(AccessibleContext.ACCESSIBLE_NAME_PROPERTY)) {
|
|
Packit |
ffe0d2 |
emitSignal(ac, AtkSignal.OBJECT_PROPERTY_CHANGE_ACCESSIBLE_NAME, null);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
} else if(propertyName.equals(AccessibleContext.ACCESSIBLE_HYPERTEXT_OFFSET)) {
|
|
Packit |
ffe0d2 |
emitSignal(ac, AtkSignal.OBJECT_PROPERTY_CHANGE_ACCESSIBLE_HYPERTEXT_OFFSET, null);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
} else if(propertyName.equals(AccessibleContext.ACCESSIBLE_TABLE_MODEL_CHANGED)) {
|
|
Packit |
ffe0d2 |
emitSignal(ac, AtkSignal.TABLE_MODEL_CHANGED, null);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
} else if( propertyName.equals(AccessibleContext.ACCESSIBLE_TABLE_CAPTION_CHANGED)) {
|
|
Packit |
ffe0d2 |
emitSignal(ac, AtkSignal.OBJECT_PROPERTY_CHANGE_ACCESSIBLE_TABLE_CAPTION, null);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
} else if(propertyName.equals(AccessibleContext.ACCESSIBLE_TABLE_SUMMARY_CHANGED)) {
|
|
Packit |
ffe0d2 |
emitSignal(ac, AtkSignal.OBJECT_PROPERTY_CHANGE_ACCESSIBLE_TABLE_SUMMARY, null);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
} else if(propertyName.equals(AccessibleContext.ACCESSIBLE_TABLE_COLUMN_HEADER_CHANGED)) {
|
|
Packit |
ffe0d2 |
emitSignal(ac, AtkSignal.OBJECT_PROPERTY_CHANGE_ACCESSIBLE_TABLE_COLUMN_HEADER, null);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
} else if(propertyName.equals(AccessibleContext.ACCESSIBLE_TABLE_COLUMN_DESCRIPTION_CHANGED) ) {
|
|
Packit |
ffe0d2 |
emitSignal(ac, AtkSignal.OBJECT_PROPERTY_CHANGE_ACCESSIBLE_TABLE_COLUMN_DESCRIPTION, null);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
} else if(propertyName.equals(AccessibleContext.ACCESSIBLE_TABLE_ROW_HEADER_CHANGED)) {
|
|
Packit |
ffe0d2 |
emitSignal(ac, AtkSignal.OBJECT_PROPERTY_CHANGE_ACCESSIBLE_TABLE_ROW_HEADER, null);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
} else if(propertyName.equals(AccessibleContext.ACCESSIBLE_TABLE_ROW_DESCRIPTION_CHANGED)) {
|
|
Packit |
ffe0d2 |
emitSignal(ac, AtkSignal.OBJECT_PROPERTY_CHANGE_ACCESSIBLE_TABLE_ROW_DESCRIPTION, null);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
} else if(propertyName.equals(AccessibleContext.ACCESSIBLE_STATE_PROPERTY)) {
|
|
Packit |
ffe0d2 |
javax.accessibility.Accessible parent = ac.getAccessibleParent();
|
|
Packit |
ffe0d2 |
javax.accessibility.AccessibleRole role = ac.getAccessibleRole();
|
|
Packit |
ffe0d2 |
javax.accessibility.AccessibleRole parent_role = null;
|
|
Packit |
ffe0d2 |
if (parent != null) {
|
|
Packit |
ffe0d2 |
parent_role = parent.getAccessibleContext().getAccessibleRole();
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
if (role != null) {
|
|
Packit |
ffe0d2 |
if (newValue == javax.accessibility.AccessibleState.FOCUSED ||
|
|
Packit |
ffe0d2 |
newValue == javax.accessibility.AccessibleState.SELECTED) {
|
|
Packit |
ffe0d2 |
dispatchFocusEvent(o);
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
AccessibleState state;
|
|
Packit |
ffe0d2 |
boolean value = false;
|
|
Packit |
ffe0d2 |
if (newValue != null) {
|
|
Packit |
ffe0d2 |
state = (AccessibleState)newValue;
|
|
Packit |
ffe0d2 |
value = true;
|
|
Packit |
ffe0d2 |
} else {
|
|
Packit |
ffe0d2 |
state = (AccessibleState)oldValue;
|
|
Packit |
ffe0d2 |
value = false;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
if (state == AccessibleState.COLLAPSED) {
|
|
Packit |
ffe0d2 |
state = AccessibleState.EXPANDED;
|
|
Packit |
ffe0d2 |
value = false;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
if(parent instanceof javax.swing.JComboBox && oldValue ==
|
|
Packit |
ffe0d2 |
javax.accessibility.AccessibleState.VISIBLE) {
|
|
Packit |
ffe0d2 |
objectStateChange(ac, AccessibleState.SHOWING, value);
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
objectStateChange(ac, state, value);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
if (parent instanceof javax.swing.JComboBox && newValue ==
|
|
Packit |
ffe0d2 |
javax.accessibility.AccessibleState.VISIBLE && oldValue == null) {
|
|
Packit |
ffe0d2 |
objectStateChange(ac, AccessibleState.SHOWING, value);
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
};
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
public static void registerPropertyChangeListener(AccessibleContext ac) {
|
|
Packit |
ffe0d2 |
if (ac != null) {
|
|
Packit |
ffe0d2 |
try {
|
|
Packit |
ffe0d2 |
ac.addPropertyChangeListener(propertyChangeListener);
|
|
Packit |
ffe0d2 |
} catch (Exception e){
|
|
Packit |
ffe0d2 |
e.printStackTrace();
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
public native static boolean initNativeLibrary();
|
|
Packit |
ffe0d2 |
public native static void loadAtkBridge();
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
public native static void focusNotify(javax.accessibility.AccessibleContext ac);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
public native static void windowOpen(javax.accessibility.AccessibleContext ac,
|
|
Packit |
ffe0d2 |
boolean isToplevel);
|
|
Packit |
ffe0d2 |
public native static void windowClose(javax.accessibility.AccessibleContext ac,
|
|
Packit |
ffe0d2 |
boolean isToplevel);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
public native static void windowMinimize(javax.accessibility.AccessibleContext ac);
|
|
Packit |
ffe0d2 |
public native static void windowMaximize(javax.accessibility.AccessibleContext ac);
|
|
Packit |
ffe0d2 |
public native static void windowRestore(javax.accessibility.AccessibleContext ac);
|
|
Packit |
ffe0d2 |
public native static void windowActivate(javax.accessibility.AccessibleContext ac);
|
|
Packit |
ffe0d2 |
public native static void windowDeactivate(javax.accessibility.AccessibleContext ac);
|
|
Packit |
ffe0d2 |
public native static void windowStateChange(javax.accessibility.AccessibleContext ac);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
public native static void emitSignal(javax.accessibility.AccessibleContext ac, int id, Object[] args);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
public native static void objectStateChange(javax.accessibility.AccessibleContext ac,
|
|
Packit |
ffe0d2 |
java.lang.Object state, boolean value);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
public native static void componentAdded(javax.accessibility.AccessibleContext ac);
|
|
Packit |
ffe0d2 |
public native static void componentRemoved(javax.accessibility.AccessibleContext ac);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
public native static boolean dispatchKeyEvent(AtkKeyEvent e);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
public static void printLog(String str) {
|
|
Packit |
ffe0d2 |
System.out.println(str);
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
public AtkWrapper() {
|
|
Packit |
ffe0d2 |
if (!accessibilityEnabled)
|
|
Packit |
ffe0d2 |
return;
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
toolkit.addAWTEventListener(globalListener,
|
|
Packit |
ffe0d2 |
AWTEvent.WINDOW_EVENT_MASK |
|
|
Packit |
ffe0d2 |
AWTEvent.FOCUS_EVENT_MASK |
|
|
Packit |
ffe0d2 |
AWTEvent.CONTAINER_EVENT_MASK);
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
toolkit.getSystemEventQueue().push(new EventQueue() {
|
|
Packit |
ffe0d2 |
boolean previousPressConsumed = false;
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
public void dispatchEvent(AWTEvent e) {
|
|
Packit |
ffe0d2 |
if (e instanceof KeyEvent) {
|
|
Packit |
ffe0d2 |
if (e.getID() == KeyEvent.KEY_PRESSED) {
|
|
Packit |
ffe0d2 |
boolean isConsumed = AtkWrapper.dispatchKeyEvent(new AtkKeyEvent((KeyEvent)e));
|
|
Packit |
ffe0d2 |
if (isConsumed) {
|
|
Packit |
ffe0d2 |
previousPressConsumed = true;
|
|
Packit |
ffe0d2 |
return;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
} else if (e.getID() == KeyEvent.KEY_TYPED) {
|
|
Packit |
ffe0d2 |
if (previousPressConsumed) {
|
|
Packit |
ffe0d2 |
return;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
} else if (e.getID() == KeyEvent.KEY_RELEASED) {
|
|
Packit |
ffe0d2 |
boolean isConsumed = AtkWrapper.dispatchKeyEvent(new AtkKeyEvent((KeyEvent)e));
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
previousPressConsumed = false;
|
|
Packit |
ffe0d2 |
if (isConsumed) {
|
|
Packit |
ffe0d2 |
return;
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
super.dispatchEvent(e);
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
});
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
|
|
Packit |
ffe0d2 |
public static void main(String args[]) {
|
|
Packit |
ffe0d2 |
new AtkWrapper();
|
|
Packit |
ffe0d2 |
}
|
|
Packit |
ffe0d2 |
}
|