1 /*
   2  * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 /*
  27  * A class to manage firing Accessibility events to Windows AT
  28  */
  29 
  30 #include "AccessBridgeDebug.h"
  31 #include "AccessBridgeEventHandler.h"
  32 #include "AccessBridgePackages.h"
  33 #include "WinAccessBridge.h"
  34 
  35 DEBUG_CODE(extern HWND theDialogWindow);
  36 extern "C" {
  37 DEBUG_CODE(void AppendToCallInfo(char *s));
  38 }
  39 
  40 
  41 // -----------------------------
  42 
  43 /**
  44  * Initialization.  Set all callbacks to null
  45  */
  46 AccessBridgeEventHandler::AccessBridgeEventHandler() {
  47     javaEventMask = 0;
  48     accessibilityEventMask = 0;
  49 
  50     propertyChangeFP = (AccessBridge_PropertyChangeFP) NULL;
  51     javaShutdownFP = (AccessBridge_JavaShutdownFP) NULL;
  52     focusGainedFP = (AccessBridge_FocusGainedFP) NULL;
  53     focusLostFP = (AccessBridge_FocusLostFP) NULL;
  54     caretUpdateFP = (AccessBridge_CaretUpdateFP) NULL;
  55     mouseClickedFP = (AccessBridge_MouseClickedFP) NULL;
  56     mouseEnteredFP = (AccessBridge_MouseEnteredFP) NULL;
  57     mouseExitedFP = (AccessBridge_MouseExitedFP) NULL;
  58     mousePressedFP = (AccessBridge_MousePressedFP) NULL;
  59     mouseReleasedFP = (AccessBridge_MouseReleasedFP) NULL;
  60     menuCanceledFP = (AccessBridge_MenuCanceledFP) NULL;
  61     menuDeselectedFP = (AccessBridge_MenuDeselectedFP) NULL;
  62     menuSelectedFP = (AccessBridge_MenuSelectedFP) NULL;
  63     popupMenuCanceledFP = (AccessBridge_PopupMenuCanceledFP) NULL;
  64     popupMenuWillBecomeInvisibleFP = (AccessBridge_PopupMenuWillBecomeInvisibleFP) NULL;
  65     popupMenuWillBecomeVisibleFP = (AccessBridge_PopupMenuWillBecomeVisibleFP) NULL;
  66 
  67     propertyNameChangeFP = (AccessBridge_PropertyNameChangeFP) NULL;
  68     propertyDescriptionChangeFP = (AccessBridge_PropertyDescriptionChangeFP) NULL;
  69     propertyStateChangeFP = (AccessBridge_PropertyStateChangeFP) NULL;
  70     propertyValueChangeFP = (AccessBridge_PropertyValueChangeFP) NULL;
  71     propertySelectionChangeFP = (AccessBridge_PropertySelectionChangeFP) NULL;
  72     propertyTextChangeFP = (AccessBridge_PropertyTextChangeFP) NULL;
  73     propertyCaretChangeFP = (AccessBridge_PropertyCaretChangeFP) NULL;
  74     propertyVisibleDataChangeFP = (AccessBridge_PropertyVisibleDataChangeFP) NULL;
  75     propertyChildChangeFP = (AccessBridge_PropertyChildChangeFP) NULL;
  76     propertyActiveDescendentChangeFP = (AccessBridge_PropertyActiveDescendentChangeFP) NULL;
  77 
  78     propertyTableModelChangeFP = (AccessBridge_PropertyTableModelChangeFP) NULL;
  79 
  80 }
  81 
  82 /**
  83  * Destruction.
  84  */
  85 AccessBridgeEventHandler::~AccessBridgeEventHandler() {
  86 }
  87 
  88 
  89 // ------------ Event handling methods
  90 
  91 #define SET_JAVA_EVENT_FP(function, eventFP, callbackFP, eventConstant) \
  92     void AccessBridgeEventHandler::function(eventFP fp, WinAccessBridge *wab) { \
  93         callbackFP = fp; \
  94         if (fp != (eventFP) 0) { \
  95             javaEventMask |= eventConstant; \
  96             wab->addJavaEventNotification(eventConstant); \
  97         } else { \
  98             javaEventMask &= (0xFFFFFFFF - eventConstant); \
  99             wab->removeJavaEventNotification(eventConstant); \
 100         } \
 101     }
 102 
 103 SET_JAVA_EVENT_FP(setPropertyChangeFP, AccessBridge_PropertyChangeFP, propertyChangeFP, cPropertyChangeEvent)
 104 SET_JAVA_EVENT_FP(setJavaShutdownFP, AccessBridge_JavaShutdownFP, javaShutdownFP, cJavaShutdownEvent)
 105 SET_JAVA_EVENT_FP(setFocusGainedFP, AccessBridge_FocusGainedFP, focusGainedFP, cFocusGainedEvent)
 106 SET_JAVA_EVENT_FP(setFocusLostFP, AccessBridge_FocusLostFP, focusLostFP, cFocusLostEvent)
 107 SET_JAVA_EVENT_FP(setCaretUpdateFP, AccessBridge_CaretUpdateFP, caretUpdateFP, cCaretUpdateEvent)
 108 SET_JAVA_EVENT_FP(setMouseClickedFP, AccessBridge_MouseClickedFP, mouseClickedFP, cMouseClickedEvent)
 109 SET_JAVA_EVENT_FP(setMouseEnteredFP, AccessBridge_MouseEnteredFP, mouseEnteredFP, cMouseEnteredEvent)
 110 SET_JAVA_EVENT_FP(setMouseExitedFP, AccessBridge_MouseExitedFP, mouseExitedFP, cMouseExitedEvent)
 111 SET_JAVA_EVENT_FP(setMousePressedFP, AccessBridge_MousePressedFP, mousePressedFP, cMousePressedEvent)
 112 SET_JAVA_EVENT_FP(setMouseReleasedFP, AccessBridge_MouseReleasedFP, mouseReleasedFP, cMouseReleasedEvent)
 113 SET_JAVA_EVENT_FP(setMenuCanceledFP, AccessBridge_MenuCanceledFP, menuCanceledFP, cMenuCanceledEvent)
 114 SET_JAVA_EVENT_FP(setMenuDeselectedFP, AccessBridge_MenuDeselectedFP, menuDeselectedFP, cMenuDeselectedEvent)
 115 SET_JAVA_EVENT_FP(setMenuSelectedFP, AccessBridge_MenuSelectedFP, menuSelectedFP, cMenuSelectedEvent)
 116 SET_JAVA_EVENT_FP(setPopupMenuCanceledFP, AccessBridge_PopupMenuCanceledFP, popupMenuCanceledFP, cPopupMenuCanceledEvent)
 117 SET_JAVA_EVENT_FP(setPopupMenuWillBecomeInvisibleFP, AccessBridge_PopupMenuWillBecomeInvisibleFP, popupMenuWillBecomeInvisibleFP, cPopupMenuWillBecomeInvisibleEvent)
 118 SET_JAVA_EVENT_FP(setPopupMenuWillBecomeVisibleFP, AccessBridge_PopupMenuWillBecomeVisibleFP, popupMenuWillBecomeVisibleFP, cPopupMenuWillBecomeVisibleEvent)
 119 
 120 #define SET_ACCESSIBILITY_EVENT_FP(function, eventFP, callbackFP, eventConstant) \
 121     void AccessBridgeEventHandler::function(eventFP fp, WinAccessBridge *wab) { \
 122         callbackFP = fp; \
 123         if (fp != (eventFP) 0) { \
 124             accessibilityEventMask |= eventConstant; \
 125             wab->addAccessibilityEventNotification(eventConstant); \
 126         } else { \
 127             accessibilityEventMask &= (0xFFFFFFFF - eventConstant); \
 128             wab->removeAccessibilityEventNotification(eventConstant); \
 129         } \
 130     }
 131 
 132 
 133 SET_ACCESSIBILITY_EVENT_FP(setPropertyNameChangeFP, AccessBridge_PropertyNameChangeFP, propertyNameChangeFP, cPropertyNameChangeEvent)
 134 SET_ACCESSIBILITY_EVENT_FP(setPropertyDescriptionChangeFP, AccessBridge_PropertyDescriptionChangeFP, propertyDescriptionChangeFP, cPropertyDescriptionChangeEvent)
 135 SET_ACCESSIBILITY_EVENT_FP(setPropertyStateChangeFP, AccessBridge_PropertyStateChangeFP, propertyStateChangeFP, cPropertyStateChangeEvent)
 136 SET_ACCESSIBILITY_EVENT_FP(setPropertyValueChangeFP, AccessBridge_PropertyValueChangeFP, propertyValueChangeFP, cPropertyValueChangeEvent)
 137 SET_ACCESSIBILITY_EVENT_FP(setPropertySelectionChangeFP, AccessBridge_PropertySelectionChangeFP, propertySelectionChangeFP, cPropertySelectionChangeEvent)
 138 SET_ACCESSIBILITY_EVENT_FP(setPropertyTextChangeFP, AccessBridge_PropertyTextChangeFP, propertyTextChangeFP, cPropertyTextChangeEvent)
 139 SET_ACCESSIBILITY_EVENT_FP(setPropertyCaretChangeFP, AccessBridge_PropertyCaretChangeFP, propertyCaretChangeFP, cPropertyCaretChangeEvent)
 140 SET_ACCESSIBILITY_EVENT_FP(setPropertyVisibleDataChangeFP, AccessBridge_PropertyVisibleDataChangeFP, propertyVisibleDataChangeFP, cPropertyVisibleDataChangeEvent)
 141 SET_ACCESSIBILITY_EVENT_FP(setPropertyChildChangeFP, AccessBridge_PropertyChildChangeFP, propertyChildChangeFP, cPropertyChildChangeEvent)
 142 SET_ACCESSIBILITY_EVENT_FP(setPropertyActiveDescendentChangeFP, AccessBridge_PropertyActiveDescendentChangeFP, propertyActiveDescendentChangeFP, cPropertyActiveDescendentChangeEvent)
 143 
 144 SET_ACCESSIBILITY_EVENT_FP(setPropertyTableModelChangeFP, AccessBridge_PropertyTableModelChangeFP, propertyTableModelChangeFP, cPropertyTableModelChangeEvent)
 145 
 146 
 147 /**
 148  * propertyChange - extends the Java method call to Windows:
 149  *   propertyChange(PropertyChangeEvent e, )
 150  *
 151  * Note: PropertyChangeEvent object passed in is a globalReference;
 152  *       It is critical that releaseJavaObject() be called
 153  *       on the PropertyChangeEvent once it is no longer needed,
 154  *       otherwise the JavaVM/JNI will suffer memory leaks
 155  *
 156  */
 157 void
 158 AccessBridgeEventHandler::firePropertyChange(long vmID,
 159                                              JOBJECT64 event, JOBJECT64 source,
 160                                              wchar_t *property, wchar_t *oldName,
 161                                              wchar_t *newName) {
 162     DEBUG_CODE(char debugBuf[255]);
 163 #ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
 164     DEBUG_CODE(sprintf(debugBuf, "\r\nCalling firePropertyChange(%p, %p):\r\n", event, source));
 165 #else // JOBJECT64 is jlong (64 bit)
 166     DEBUG_CODE(sprintf(debugBuf, "\r\nCalling firePropertyChange(%016I64X, %016I64X):\r\n", event, source));
 167 #endif
 168     DEBUG_CODE(AppendToCallInfo(debugBuf));
 169 
 170     if (propertyChangeFP != (AccessBridge_PropertyChangeFP) 0) {
 171         propertyChangeFP(vmID, event, source, property, oldName, newName);
 172     } else {
 173         DEBUG_CODE(AppendToCallInfo("[ERROR]: propertyChangeFP == 0"));
 174     }
 175 }
 176 
 177 
 178 /**
 179  * FIRE_EVENT - macro for all fireXXX methods (which
 180  *   all are basically identical to one another...)
 181  *
 182  * Note: the event and source objects passed in are globalReferences;
 183  *       It is critical that releaseJavaObject() be called
 184  *       on them once they are no longer needed, otherwise
 185  *       the JavaVM/JNI will suffer memory leaks
 186  *
 187  */
 188 #ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
 189 const char fireEventDebugString[] = "[INFO]: In AccessBridgeEventHandler::%s(%p, %p); vmID = %X\r\n";
 190 #else // JOBJECT64 is jlong (64 bit)
 191 const char fireEventDebugString[] = "[INFO]: In AccessBridgeEventHandler::%s(%016I64X, %016I64X); vmID = %X\r\n";
 192 #endif
 193 
 194 #define FIRE_EVENT(method, FPprototype, eventFP) \
 195     void AccessBridgeEventHandler::method(long vmID, JOBJECT64 event, JOBJECT64 source) { \
 196         DEBUG_CODE(char debugBuf[255]); \
 197         DEBUG_CODE(sprintf(debugBuf, fireEventDebugString, #method, event, source, vmID)); \
 198         DEBUG_CODE(AppendToCallInfo(debugBuf)); \
 199         if (eventFP != (FPprototype) 0) { \
 200             eventFP(vmID, event, source); \
 201         } else { \
 202             DEBUG_CODE(AppendToCallInfo("[ERROR]: eventFP == 0")); \
 203         } \
 204     }
 205 
 206     void AccessBridgeEventHandler::fireJavaShutdown(long vmID) {
 207         DEBUG_CODE(char debugBuf[255]);
 208         DEBUG_CODE(sprintf(debugBuf, "[INFO]: Calling fireJavaShutdown; vmID = %X\r\n", vmID));
 209         DEBUG_CODE(AppendToCallInfo(debugBuf));
 210         if (javaShutdownFP != (AccessBridge_JavaShutdownFP) 0) {
 211             javaShutdownFP(vmID);
 212         } else {
 213             DEBUG_CODE(AppendToCallInfo("[ERROR]:  javaShutdownFP == 0"));
 214         }
 215     }
 216 
 217 FIRE_EVENT(fireFocusGained, AccessBridge_FocusGainedFP, focusGainedFP)
 218 FIRE_EVENT(fireFocusLost, AccessBridge_FocusLostFP, focusLostFP)
 219 FIRE_EVENT(fireCaretUpdate, AccessBridge_CaretUpdateFP, caretUpdateFP)
 220 FIRE_EVENT(fireMouseClicked, AccessBridge_MouseClickedFP, mouseClickedFP)
 221 FIRE_EVENT(fireMouseEntered, AccessBridge_MouseEnteredFP, mouseEnteredFP)
 222 FIRE_EVENT(fireMouseExited, AccessBridge_MouseExitedFP, mouseExitedFP)
 223 FIRE_EVENT(fireMousePressed, AccessBridge_MousePressedFP, mousePressedFP)
 224 FIRE_EVENT(fireMouseReleased, AccessBridge_MouseReleasedFP, mouseReleasedFP)
 225 FIRE_EVENT(fireMenuCanceled, AccessBridge_MenuCanceledFP, menuCanceledFP)
 226 FIRE_EVENT(fireMenuDeselected, AccessBridge_MenuDeselectedFP, menuDeselectedFP)
 227 FIRE_EVENT(fireMenuSelected, AccessBridge_MenuSelectedFP, menuSelectedFP)
 228 FIRE_EVENT(firePopupMenuCanceled, AccessBridge_PopupMenuCanceledFP, popupMenuCanceledFP)
 229 FIRE_EVENT(firePopupMenuWillBecomeInvisible, AccessBridge_PopupMenuWillBecomeInvisibleFP, popupMenuWillBecomeInvisibleFP)
 230 FIRE_EVENT(firePopupMenuWillBecomeVisible, AccessBridge_PopupMenuWillBecomeVisibleFP, popupMenuWillBecomeVisibleFP)
 231 
 232 
 233 /**
 234  * FIRE_PROPERTY_CHANGE - macro for all fireXXX methods (which
 235  *   all are basically identical to one another...
 236  *
 237  * Note: the event and source objects passed in are globalReferences;
 238  *       It is critical that releaseJavaObject() be called
 239  *       on them once they are no longer needed, otherwise
 240  *       the JavaVM/JNI will suffer memory leaks
 241  *
 242  */
 243 #ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
 244 const char firePropertyChangeDebugString[] = "[INFO]: In AccessBridgeEventHandler::%s, Firing a no-param property change (%p, %p):\r\n";
 245 #else // JOBJECT64 is jlong (64 bit)
 246 const char firePropertyChangeDebugString[] = "[INFO]: In AccessBridgeEventHandler::%s, Firing a no-param property change (%016I64X, %016I64X):\r\n";
 247 #endif
 248 
 249 #define FIRE_PROPERTY_CHANGE(method, FPprototype, eventFP) \
 250     void AccessBridgeEventHandler::method(long vmID, JOBJECT64 event, JOBJECT64 source) { \
 251         DEBUG_CODE(char debugBuf[255]); \
 252         DEBUG_CODE(sprintf(debugBuf, firePropertyChangeDebugString, #method, event, source)); \
 253         DEBUG_CODE(AppendToCallInfo(debugBuf)); \
 254         if (eventFP != (FPprototype) 0) { \
 255             eventFP(vmID, event, source); \
 256         } else { \
 257             DEBUG_CODE(AppendToCallInfo("[ERROR]:  eventFP == 0")); \
 258         } \
 259     }
 260 
 261 /**
 262  * FIRE_STRING_PROPERTY_CHANGE - macro for all firePropertyXXXChange methods
 263  *   that have strings as the old/new values
 264 
 265  * Note: the event and source objects passed in are globalReferences;
 266  *       It is critical that releaseJavaObject() be called
 267  *       on them once they are no longer needed, otherwise
 268  *       the JavaVM/JNI will suffer memory leaks
 269  *
 270  */
 271 #ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
 272 const char fireStringPropertyChangeDebugString[] = "[INFO]: In AccessBridgeEventHandler::%s, Firing a string property change (%p, %p, %ls, %ls):\r\n";
 273 #else // JOBJECT64 is jlong (64 bit)
 274 const char fireStringPropertyChangeDebugString[] = "[INFO]: In AccessBridgeEventHandler::%s, Firing a string property change (%016I64X, %016I64X, %ls, %ls):\r\n";
 275 #endif
 276 
 277 #define FIRE_STRING_PROPERTY_CHANGE(method, FPprototype, eventFP, oldValue, newValue) \
 278     void AccessBridgeEventHandler::method(long vmID, JOBJECT64 event, JOBJECT64 source, \
 279                                           wchar_t *oldValue, wchar_t *newValue) { \
 280         DEBUG_CODE(char debugBuf[255]); \
 281         DEBUG_CODE(sprintf(debugBuf, fireStringPropertyChangeDebugString, #method, event, source, oldValue, newValue)); \
 282         DEBUG_CODE(AppendToCallInfo(debugBuf)); \
 283         if (eventFP != (FPprototype) 0) { \
 284             eventFP(vmID, event, source, oldValue, newValue); \
 285         } else { \
 286             DEBUG_CODE(AppendToCallInfo("[ERROR]:  eventFP == 0\r\n")); \
 287         } \
 288     }
 289 
 290 /**
 291  * FIRE_INT_PROPERTY_CHANGE - macro for all firePropertyXXXChange methods
 292  *   that have ints as the old/new values
 293  *
 294  * Note: the event and source objects passed in are globalReferences;
 295  *       It is critical that releaseJavaObject() be called
 296  *       on them once they are no longer needed, otherwise
 297  *       the JavaVM/JNI will suffer memory leaks
 298  *
 299  */
 300 #ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
 301 const char fireIntPropertyChangeDebugString[] = "[INFO]: In AccessBridgeEventHandler::%s, Firing an int property change (%p, %p, %d, %d):\r\n";
 302 #else // JOBJECT64 is jlong (64 bit)
 303 const char fireIntPropertyChangeDebugString[] = "[INFO]: In AccessBridgeEventHandler::%s, Firing an int property change (%016I64X, %016I64X, %d, %d):\r\n";
 304 #endif
 305 
 306 #define FIRE_INT_PROPERTY_CHANGE(method, FPprototype, eventFP) \
 307     void AccessBridgeEventHandler::method(long vmID, JOBJECT64 event, JOBJECT64 source,  \
 308                                           int oldValue, int newValue) { \
 309         DEBUG_CODE(char debugBuf[255]); \
 310         DEBUG_CODE(sprintf(debugBuf, fireIntPropertyChangeDebugString, #method, event, source, oldValue, newValue)); \
 311         DEBUG_CODE(AppendToCallInfo(debugBuf)); \
 312         if (eventFP != (FPprototype) 0) { \
 313             eventFP(vmID, event, source, oldValue, newValue); \
 314         } else { \
 315             DEBUG_CODE(AppendToCallInfo("[ERROR]: eventFP == 0\r\n")); \
 316         } \
 317     }
 318 
 319 /**
 320  * FIRE_AC_PROPERTY_CHANGE - macro for all firePropertyXXXChange methods
 321  *   that have jobjects (AccessibleContexts) as the old/new values
 322  *
 323  * Note: the event and source objects passed in are globalReferences;
 324  *       It is critical that releaseJavaObject() be called
 325  *       on them once they are no longer needed, otherwise
 326  *       the JavaVM/JNI will suffer memory leaks
 327  *
 328  */
 329 #ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
 330 const char fireACPropertyChangeDebugString[] = "[INFO]: In AccessBridgeEventHandler::%s, Firing an AC property change (%p, %p, %p, %p):\r\n";
 331 #else // JOBJECT64 is jlong (64 bit)
 332 const char fireACPropertyChangeDebugString[] = "[INFO]: In AccessBridgeEventHandler::%s, Firing an AC property change (%016I64X, %016I64X, %016I64X, %016I64X):\r\n";
 333 #endif
 334 
 335 #define FIRE_AC_PROPERTY_CHANGE(method, FPprototype, eventFP) \
 336     void AccessBridgeEventHandler::method(long vmID, JOBJECT64 event, JOBJECT64 source,  \
 337                                           JOBJECT64 oldValue, JOBJECT64 newValue) { \
 338         DEBUG_CODE(char debugBuf[255]); \
 339         DEBUG_CODE(sprintf(debugBuf, fireACPropertyChangeDebugString, #method, event, source, oldValue, newValue)); \
 340         DEBUG_CODE(AppendToCallInfo(debugBuf)); \
 341         if (eventFP != (FPprototype) 0) { \
 342             eventFP(vmID, event, source, oldValue, newValue); \
 343         } else { \
 344             DEBUG_CODE(AppendToCallInfo("[ERROR]:  eventFP == 0\r\n")); \
 345         } \
 346     }
 347 
 348 FIRE_STRING_PROPERTY_CHANGE(firePropertyNameChange,
 349                             AccessBridge_PropertyNameChangeFP,
 350                             propertyNameChangeFP, oldName, newName)
 351 FIRE_STRING_PROPERTY_CHANGE(firePropertyDescriptionChange,
 352                             AccessBridge_PropertyDescriptionChangeFP,
 353                             propertyDescriptionChangeFP,
 354                             oldDescription, newDescription)
 355 FIRE_STRING_PROPERTY_CHANGE(firePropertyStateChange,
 356                             AccessBridge_PropertyStateChangeFP,
 357                             propertyStateChangeFP, oldState, newState)
 358 FIRE_STRING_PROPERTY_CHANGE(firePropertyValueChange,
 359                             AccessBridge_PropertyValueChangeFP,
 360                             propertyValueChangeFP, oldValue, newValue)
 361 FIRE_PROPERTY_CHANGE(firePropertySelectionChange,
 362                      AccessBridge_PropertySelectionChangeFP,
 363                      propertySelectionChangeFP)
 364 FIRE_PROPERTY_CHANGE(firePropertyTextChange,
 365                      AccessBridge_PropertyTextChangeFP,
 366                      propertyTextChangeFP);
 367 FIRE_INT_PROPERTY_CHANGE(firePropertyCaretChange,
 368                          AccessBridge_PropertyCaretChangeFP,
 369                          propertyCaretChangeFP)
 370 FIRE_PROPERTY_CHANGE(firePropertyVisibleDataChange,
 371                      AccessBridge_PropertyVisibleDataChangeFP,
 372                      propertyVisibleDataChangeFP)
 373 FIRE_AC_PROPERTY_CHANGE(firePropertyChildChange,
 374                         AccessBridge_PropertyChildChangeFP,
 375                         propertyChildChangeFP)
 376 FIRE_AC_PROPERTY_CHANGE(firePropertyActiveDescendentChange,
 377                         AccessBridge_PropertyActiveDescendentChangeFP,
 378                         propertyActiveDescendentChangeFP)
 379 
 380 FIRE_STRING_PROPERTY_CHANGE(firePropertyTableModelChange,
 381                      AccessBridge_PropertyTableModelChangeFP,
 382                      propertyTableModelChangeFP, oldValue, newValue)