/*
 * Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/*
 * A class to manage firing Accessibility events to Windows AT
 */

#include "AccessBridgeDebug.h"
#include "AccessBridgeEventHandler.h"
#include "AccessBridgePackages.h"
#include "WinAccessBridge.h"

DEBUG_CODE(extern HWND theDialogWindow);
extern "C" {
DEBUG_CODE(void AppendToCallInfo(const char *s));
}


// -----------------------------

/**
 * Initialization.  Set all callbacks to null
 */
AccessBridgeEventHandler::AccessBridgeEventHandler() {
    javaEventMask = 0;
    accessibilityEventMask = 0;

    propertyChangeFP = (AccessBridge_PropertyChangeFP) NULL;
    javaShutdownFP = (AccessBridge_JavaShutdownFP) NULL;
    focusGainedFP = (AccessBridge_FocusGainedFP) NULL;
    focusLostFP = (AccessBridge_FocusLostFP) NULL;
    caretUpdateFP = (AccessBridge_CaretUpdateFP) NULL;
    mouseClickedFP = (AccessBridge_MouseClickedFP) NULL;
    mouseEnteredFP = (AccessBridge_MouseEnteredFP) NULL;
    mouseExitedFP = (AccessBridge_MouseExitedFP) NULL;
    mousePressedFP = (AccessBridge_MousePressedFP) NULL;
    mouseReleasedFP = (AccessBridge_MouseReleasedFP) NULL;
    menuCanceledFP = (AccessBridge_MenuCanceledFP) NULL;
    menuDeselectedFP = (AccessBridge_MenuDeselectedFP) NULL;
    menuSelectedFP = (AccessBridge_MenuSelectedFP) NULL;
    popupMenuCanceledFP = (AccessBridge_PopupMenuCanceledFP) NULL;
    popupMenuWillBecomeInvisibleFP = (AccessBridge_PopupMenuWillBecomeInvisibleFP) NULL;
    popupMenuWillBecomeVisibleFP = (AccessBridge_PopupMenuWillBecomeVisibleFP) NULL;

    propertyNameChangeFP = (AccessBridge_PropertyNameChangeFP) NULL;
    propertyDescriptionChangeFP = (AccessBridge_PropertyDescriptionChangeFP) NULL;
    propertyStateChangeFP = (AccessBridge_PropertyStateChangeFP) NULL;
    propertyValueChangeFP = (AccessBridge_PropertyValueChangeFP) NULL;
    propertySelectionChangeFP = (AccessBridge_PropertySelectionChangeFP) NULL;
    propertyTextChangeFP = (AccessBridge_PropertyTextChangeFP) NULL;
    propertyCaretChangeFP = (AccessBridge_PropertyCaretChangeFP) NULL;
    propertyVisibleDataChangeFP = (AccessBridge_PropertyVisibleDataChangeFP) NULL;
    propertyChildChangeFP = (AccessBridge_PropertyChildChangeFP) NULL;
    propertyActiveDescendentChangeFP = (AccessBridge_PropertyActiveDescendentChangeFP) NULL;

    propertyTableModelChangeFP = (AccessBridge_PropertyTableModelChangeFP) NULL;

}

/**
 * Destruction.
 */
AccessBridgeEventHandler::~AccessBridgeEventHandler() {
}


// ------------ Event handling methods

#define SET_JAVA_EVENT_FP(function, eventFP, callbackFP, eventConstant) \
    void AccessBridgeEventHandler::function(eventFP fp, WinAccessBridge *wab) { \
        callbackFP = fp; \
        if (fp != (eventFP) 0) { \
            javaEventMask |= eventConstant; \
            wab->addJavaEventNotification(eventConstant); \
        } else { \
            javaEventMask &= (0xFFFFFFFF - eventConstant); \
            wab->removeJavaEventNotification(eventConstant); \
        } \
    }

SET_JAVA_EVENT_FP(setPropertyChangeFP, AccessBridge_PropertyChangeFP, propertyChangeFP, cPropertyChangeEvent)
SET_JAVA_EVENT_FP(setJavaShutdownFP, AccessBridge_JavaShutdownFP, javaShutdownFP, cJavaShutdownEvent)
SET_JAVA_EVENT_FP(setFocusGainedFP, AccessBridge_FocusGainedFP, focusGainedFP, cFocusGainedEvent)
SET_JAVA_EVENT_FP(setFocusLostFP, AccessBridge_FocusLostFP, focusLostFP, cFocusLostEvent)
SET_JAVA_EVENT_FP(setCaretUpdateFP, AccessBridge_CaretUpdateFP, caretUpdateFP, cCaretUpdateEvent)
SET_JAVA_EVENT_FP(setMouseClickedFP, AccessBridge_MouseClickedFP, mouseClickedFP, cMouseClickedEvent)
SET_JAVA_EVENT_FP(setMouseEnteredFP, AccessBridge_MouseEnteredFP, mouseEnteredFP, cMouseEnteredEvent)
SET_JAVA_EVENT_FP(setMouseExitedFP, AccessBridge_MouseExitedFP, mouseExitedFP, cMouseExitedEvent)
SET_JAVA_EVENT_FP(setMousePressedFP, AccessBridge_MousePressedFP, mousePressedFP, cMousePressedEvent)
SET_JAVA_EVENT_FP(setMouseReleasedFP, AccessBridge_MouseReleasedFP, mouseReleasedFP, cMouseReleasedEvent)
SET_JAVA_EVENT_FP(setMenuCanceledFP, AccessBridge_MenuCanceledFP, menuCanceledFP, cMenuCanceledEvent)
SET_JAVA_EVENT_FP(setMenuDeselectedFP, AccessBridge_MenuDeselectedFP, menuDeselectedFP, cMenuDeselectedEvent)
SET_JAVA_EVENT_FP(setMenuSelectedFP, AccessBridge_MenuSelectedFP, menuSelectedFP, cMenuSelectedEvent)
SET_JAVA_EVENT_FP(setPopupMenuCanceledFP, AccessBridge_PopupMenuCanceledFP, popupMenuCanceledFP, cPopupMenuCanceledEvent)
SET_JAVA_EVENT_FP(setPopupMenuWillBecomeInvisibleFP, AccessBridge_PopupMenuWillBecomeInvisibleFP, popupMenuWillBecomeInvisibleFP, cPopupMenuWillBecomeInvisibleEvent)
SET_JAVA_EVENT_FP(setPopupMenuWillBecomeVisibleFP, AccessBridge_PopupMenuWillBecomeVisibleFP, popupMenuWillBecomeVisibleFP, cPopupMenuWillBecomeVisibleEvent)

#define SET_ACCESSIBILITY_EVENT_FP(function, eventFP, callbackFP, eventConstant) \
    void AccessBridgeEventHandler::function(eventFP fp, WinAccessBridge *wab) { \
        callbackFP = fp; \
        if (fp != (eventFP) 0) { \
            accessibilityEventMask |= eventConstant; \
            wab->addAccessibilityEventNotification(eventConstant); \
        } else { \
            accessibilityEventMask &= (0xFFFFFFFF - eventConstant); \
            wab->removeAccessibilityEventNotification(eventConstant); \
        } \
    }


SET_ACCESSIBILITY_EVENT_FP(setPropertyNameChangeFP, AccessBridge_PropertyNameChangeFP, propertyNameChangeFP, cPropertyNameChangeEvent)
SET_ACCESSIBILITY_EVENT_FP(setPropertyDescriptionChangeFP, AccessBridge_PropertyDescriptionChangeFP, propertyDescriptionChangeFP, cPropertyDescriptionChangeEvent)
SET_ACCESSIBILITY_EVENT_FP(setPropertyStateChangeFP, AccessBridge_PropertyStateChangeFP, propertyStateChangeFP, cPropertyStateChangeEvent)
SET_ACCESSIBILITY_EVENT_FP(setPropertyValueChangeFP, AccessBridge_PropertyValueChangeFP, propertyValueChangeFP, cPropertyValueChangeEvent)
SET_ACCESSIBILITY_EVENT_FP(setPropertySelectionChangeFP, AccessBridge_PropertySelectionChangeFP, propertySelectionChangeFP, cPropertySelectionChangeEvent)
SET_ACCESSIBILITY_EVENT_FP(setPropertyTextChangeFP, AccessBridge_PropertyTextChangeFP, propertyTextChangeFP, cPropertyTextChangeEvent)
SET_ACCESSIBILITY_EVENT_FP(setPropertyCaretChangeFP, AccessBridge_PropertyCaretChangeFP, propertyCaretChangeFP, cPropertyCaretChangeEvent)
SET_ACCESSIBILITY_EVENT_FP(setPropertyVisibleDataChangeFP, AccessBridge_PropertyVisibleDataChangeFP, propertyVisibleDataChangeFP, cPropertyVisibleDataChangeEvent)
SET_ACCESSIBILITY_EVENT_FP(setPropertyChildChangeFP, AccessBridge_PropertyChildChangeFP, propertyChildChangeFP, cPropertyChildChangeEvent)
SET_ACCESSIBILITY_EVENT_FP(setPropertyActiveDescendentChangeFP, AccessBridge_PropertyActiveDescendentChangeFP, propertyActiveDescendentChangeFP, cPropertyActiveDescendentChangeEvent)

SET_ACCESSIBILITY_EVENT_FP(setPropertyTableModelChangeFP, AccessBridge_PropertyTableModelChangeFP, propertyTableModelChangeFP, cPropertyTableModelChangeEvent)


/**
 * propertyChange - extends the Java method call to Windows:
 *   propertyChange(PropertyChangeEvent e, )
 *
 * Note: PropertyChangeEvent object passed in is a globalReference;
 *       It is critical that releaseJavaObject() be called
 *       on the PropertyChangeEvent once it is no longer needed,
 *       otherwise the JavaVM/JNI will suffer memory leaks
 *
 */
void
AccessBridgeEventHandler::firePropertyChange(long vmID,
                                             JOBJECT64 event, JOBJECT64 source,
                                             wchar_t *property, wchar_t *oldName,
                                             wchar_t *newName) {
    DEBUG_CODE(char debugBuf[255]);
#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
    DEBUG_CODE(snprintf(debugBuf, sizeof(debugBuf), "\r\nCalling firePropertyChange(%p, %p):\r\n", event, source));
#else // JOBJECT64 is jlong (64 bit)
    DEBUG_CODE(snprintf(debugBuf, sizeof(debugBuf), "\r\nCalling firePropertyChange(%016I64X, %016I64X):\r\n", event, source));
#endif
    DEBUG_CODE(AppendToCallInfo(debugBuf));

    if (propertyChangeFP != (AccessBridge_PropertyChangeFP) 0) {
        propertyChangeFP(vmID, event, source, property, oldName, newName);
    } else {
        DEBUG_CODE(AppendToCallInfo("[ERROR]: propertyChangeFP == 0"));
    }
}


/**
 * FIRE_EVENT - macro for all fireXXX methods (which
 *   all are basically identical to one another...)
 *
 * Note: the event and source objects passed in are globalReferences;
 *       It is critical that releaseJavaObject() be called
 *       on them once they are no longer needed, otherwise
 *       the JavaVM/JNI will suffer memory leaks
 *
 */
#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
const char fireEventDebugString[] = "[INFO]: In AccessBridgeEventHandler::%s(%p, %p); vmID = %X\r\n";
#else // JOBJECT64 is jlong (64 bit)
const char fireEventDebugString[] = "[INFO]: In AccessBridgeEventHandler::%s(%016I64X, %016I64X); vmID = %X\r\n";
#endif

#define FIRE_EVENT(method, FPprototype, eventFP) \
    void AccessBridgeEventHandler::method(long vmID, JOBJECT64 event, JOBJECT64 source) { \
        DEBUG_CODE(char debugBuf[255]); \
        DEBUG_CODE(snprintf(debugBuf, sizeof(debugBuf), fireEventDebugString, #method, event, source, vmID)); \
        DEBUG_CODE(AppendToCallInfo(debugBuf)); \
        if (eventFP != (FPprototype) 0) { \
            eventFP(vmID, event, source); \
        } else { \
            DEBUG_CODE(AppendToCallInfo("[ERROR]: eventFP == 0")); \
        } \
    }

    void AccessBridgeEventHandler::fireJavaShutdown(long vmID) {
        DEBUG_CODE(char debugBuf[255]);
        DEBUG_CODE(snprintf(debugBuf, sizeof(debugBuf), "[INFO]: Calling fireJavaShutdown; vmID = %X\r\n", vmID));
        DEBUG_CODE(AppendToCallInfo(debugBuf));
        if (javaShutdownFP != (AccessBridge_JavaShutdownFP) 0) {
            javaShutdownFP(vmID);
        } else {
            DEBUG_CODE(AppendToCallInfo("[ERROR]:  javaShutdownFP == 0"));
        }
    }

FIRE_EVENT(fireFocusGained, AccessBridge_FocusGainedFP, focusGainedFP)
FIRE_EVENT(fireFocusLost, AccessBridge_FocusLostFP, focusLostFP)
FIRE_EVENT(fireCaretUpdate, AccessBridge_CaretUpdateFP, caretUpdateFP)
FIRE_EVENT(fireMouseClicked, AccessBridge_MouseClickedFP, mouseClickedFP)
FIRE_EVENT(fireMouseEntered, AccessBridge_MouseEnteredFP, mouseEnteredFP)
FIRE_EVENT(fireMouseExited, AccessBridge_MouseExitedFP, mouseExitedFP)
FIRE_EVENT(fireMousePressed, AccessBridge_MousePressedFP, mousePressedFP)
FIRE_EVENT(fireMouseReleased, AccessBridge_MouseReleasedFP, mouseReleasedFP)
FIRE_EVENT(fireMenuCanceled, AccessBridge_MenuCanceledFP, menuCanceledFP)
FIRE_EVENT(fireMenuDeselected, AccessBridge_MenuDeselectedFP, menuDeselectedFP)
FIRE_EVENT(fireMenuSelected, AccessBridge_MenuSelectedFP, menuSelectedFP)
FIRE_EVENT(firePopupMenuCanceled, AccessBridge_PopupMenuCanceledFP, popupMenuCanceledFP)
FIRE_EVENT(firePopupMenuWillBecomeInvisible, AccessBridge_PopupMenuWillBecomeInvisibleFP, popupMenuWillBecomeInvisibleFP)
FIRE_EVENT(firePopupMenuWillBecomeVisible, AccessBridge_PopupMenuWillBecomeVisibleFP, popupMenuWillBecomeVisibleFP)


/**
 * FIRE_PROPERTY_CHANGE - macro for all fireXXX methods (which
 *   all are basically identical to one another...
 *
 * Note: the event and source objects passed in are globalReferences;
 *       It is critical that releaseJavaObject() be called
 *       on them once they are no longer needed, otherwise
 *       the JavaVM/JNI will suffer memory leaks
 *
 */
#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
const char firePropertyChangeDebugString[] = "[INFO]: In AccessBridgeEventHandler::%s, Firing a no-param property change (%p, %p):\r\n";
#else // JOBJECT64 is jlong (64 bit)
const char firePropertyChangeDebugString[] = "[INFO]: In AccessBridgeEventHandler::%s, Firing a no-param property change (%016I64X, %016I64X):\r\n";
#endif

#define FIRE_PROPERTY_CHANGE(method, FPprototype, eventFP) \
    void AccessBridgeEventHandler::method(long vmID, JOBJECT64 event, JOBJECT64 source) { \
        DEBUG_CODE(char debugBuf[255]); \
        DEBUG_CODE(snprintf(debugBuf, sizeof(debugBuf), firePropertyChangeDebugString, #method, event, source)); \
        DEBUG_CODE(AppendToCallInfo(debugBuf)); \
        if (eventFP != (FPprototype) 0) { \
            eventFP(vmID, event, source); \
        } else { \
            DEBUG_CODE(AppendToCallInfo("[ERROR]:  eventFP == 0")); \
        } \
    }

/**
 * FIRE_STRING_PROPERTY_CHANGE - macro for all firePropertyXXXChange methods
 *   that have strings as the old/new values

 * Note: the event and source objects passed in are globalReferences;
 *       It is critical that releaseJavaObject() be called
 *       on them once they are no longer needed, otherwise
 *       the JavaVM/JNI will suffer memory leaks
 *
 */
#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
const char fireStringPropertyChangeDebugString[] = "[INFO]: In AccessBridgeEventHandler::%s, Firing a string property change (%p, %p, %ls, %ls):\r\n";
#else // JOBJECT64 is jlong (64 bit)
const char fireStringPropertyChangeDebugString[] = "[INFO]: In AccessBridgeEventHandler::%s, Firing a string property change (%016I64X, %016I64X, %ls, %ls):\r\n";
#endif

#define FIRE_STRING_PROPERTY_CHANGE(method, FPprototype, eventFP, oldValue, newValue) \
    void AccessBridgeEventHandler::method(long vmID, JOBJECT64 event, JOBJECT64 source, \
                                          wchar_t *oldValue, wchar_t *newValue) { \
        DEBUG_CODE(char debugBuf[255]); \
        DEBUG_CODE(snprintf(debugBuf, sizeof(debugBuf), fireStringPropertyChangeDebugString, #method, event, source, oldValue, newValue)); \
        DEBUG_CODE(AppendToCallInfo(debugBuf)); \
        if (eventFP != (FPprototype) 0) { \
            eventFP(vmID, event, source, oldValue, newValue); \
        } else { \
            DEBUG_CODE(AppendToCallInfo("[ERROR]:  eventFP == 0\r\n")); \
        } \
    }

/**
 * FIRE_INT_PROPERTY_CHANGE - macro for all firePropertyXXXChange methods
 *   that have ints as the old/new values
 *
 * Note: the event and source objects passed in are globalReferences;
 *       It is critical that releaseJavaObject() be called
 *       on them once they are no longer needed, otherwise
 *       the JavaVM/JNI will suffer memory leaks
 *
 */
#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
const char fireIntPropertyChangeDebugString[] = "[INFO]: In AccessBridgeEventHandler::%s, Firing an int property change (%p, %p, %d, %d):\r\n";
#else // JOBJECT64 is jlong (64 bit)
const char fireIntPropertyChangeDebugString[] = "[INFO]: In AccessBridgeEventHandler::%s, Firing an int property change (%016I64X, %016I64X, %d, %d):\r\n";
#endif

#define FIRE_INT_PROPERTY_CHANGE(method, FPprototype, eventFP) \
    void AccessBridgeEventHandler::method(long vmID, JOBJECT64 event, JOBJECT64 source,  \
                                          int oldValue, int newValue) { \
        DEBUG_CODE(char debugBuf[255]); \
        DEBUG_CODE(snprintf(debugBuf, sizeof(debugBuf), fireIntPropertyChangeDebugString, #method, event, source, oldValue, newValue)); \
        DEBUG_CODE(AppendToCallInfo(debugBuf)); \
        if (eventFP != (FPprototype) 0) { \
            eventFP(vmID, event, source, oldValue, newValue); \
        } else { \
            DEBUG_CODE(AppendToCallInfo("[ERROR]: eventFP == 0\r\n")); \
        } \
    }

/**
 * FIRE_AC_PROPERTY_CHANGE - macro for all firePropertyXXXChange methods
 *   that have jobjects (AccessibleContexts) as the old/new values
 *
 * Note: the event and source objects passed in are globalReferences;
 *       It is critical that releaseJavaObject() be called
 *       on them once they are no longer needed, otherwise
 *       the JavaVM/JNI will suffer memory leaks
 *
 */
#ifdef ACCESSBRIDGE_ARCH_LEGACY // JOBJECT64 is jobject (32 bit pointer)
const char fireACPropertyChangeDebugString[] = "[INFO]: In AccessBridgeEventHandler::%s, Firing an AC property change (%p, %p, %p, %p):\r\n";
#else // JOBJECT64 is jlong (64 bit)
const char fireACPropertyChangeDebugString[] = "[INFO]: In AccessBridgeEventHandler::%s, Firing an AC property change (%016I64X, %016I64X, %016I64X, %016I64X):\r\n";
#endif

#define FIRE_AC_PROPERTY_CHANGE(method, FPprototype, eventFP) \
    void AccessBridgeEventHandler::method(long vmID, JOBJECT64 event, JOBJECT64 source,  \
                                          JOBJECT64 oldValue, JOBJECT64 newValue) { \
        DEBUG_CODE(char debugBuf[255]); \
        DEBUG_CODE(snprintf(debugBuf, sizeof(debugBuf), fireACPropertyChangeDebugString, #method, event, source, oldValue, newValue)); \
        DEBUG_CODE(AppendToCallInfo(debugBuf)); \
        if (eventFP != (FPprototype) 0) { \
            eventFP(vmID, event, source, oldValue, newValue); \
        } else { \
            DEBUG_CODE(AppendToCallInfo("[ERROR]:  eventFP == 0\r\n")); \
        } \
    }

FIRE_STRING_PROPERTY_CHANGE(firePropertyNameChange,
                            AccessBridge_PropertyNameChangeFP,
                            propertyNameChangeFP, oldName, newName)
FIRE_STRING_PROPERTY_CHANGE(firePropertyDescriptionChange,
                            AccessBridge_PropertyDescriptionChangeFP,
                            propertyDescriptionChangeFP,
                            oldDescription, newDescription)
FIRE_STRING_PROPERTY_CHANGE(firePropertyStateChange,
                            AccessBridge_PropertyStateChangeFP,
                            propertyStateChangeFP, oldState, newState)
FIRE_STRING_PROPERTY_CHANGE(firePropertyValueChange,
                            AccessBridge_PropertyValueChangeFP,
                            propertyValueChangeFP, oldValue, newValue)
FIRE_PROPERTY_CHANGE(firePropertySelectionChange,
                     AccessBridge_PropertySelectionChangeFP,
                     propertySelectionChangeFP)
FIRE_PROPERTY_CHANGE(firePropertyTextChange,
                     AccessBridge_PropertyTextChangeFP,
                     propertyTextChangeFP);
FIRE_INT_PROPERTY_CHANGE(firePropertyCaretChange,
                         AccessBridge_PropertyCaretChangeFP,
                         propertyCaretChangeFP)
FIRE_PROPERTY_CHANGE(firePropertyVisibleDataChange,
                     AccessBridge_PropertyVisibleDataChangeFP,
                     propertyVisibleDataChangeFP)
FIRE_AC_PROPERTY_CHANGE(firePropertyChildChange,
                        AccessBridge_PropertyChildChangeFP,
                        propertyChildChangeFP)
FIRE_AC_PROPERTY_CHANGE(firePropertyActiveDescendentChange,
                        AccessBridge_PropertyActiveDescendentChangeFP,
                        propertyActiveDescendentChangeFP)

FIRE_STRING_PROPERTY_CHANGE(firePropertyTableModelChange,
                     AccessBridge_PropertyTableModelChangeFP,
                     propertyTableModelChangeFP, oldValue, newValue)
