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

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