Blame wrapper/org/GNOME/Accessibility/AtkWrapper.java.in

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
}