/*
 * Copyright (c) 2011, 2012, 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.
 */

#import <JavaNativeFoundation/JavaNativeFoundation.h>
#import <JavaRuntimeSupport/JavaRuntimeSupport.h>

#import "apple_laf_JRSUIConstants.h"
#import "apple_laf_JRSUIConstants_Key.h"
#import "apple_laf_JRSUIConstants_AlignmentVertical.h"
#import "apple_laf_JRSUIConstants_AlignmentHorizontal.h"
#import "apple_laf_JRSUIConstants_Animating.h"
#import "apple_laf_JRSUIConstants_ArrowsOnly.h"
#import "apple_laf_JRSUIConstants_BooleanValue.h"
#import "apple_laf_JRSUIConstants_Direction.h"
#import "apple_laf_JRSUIConstants_Focused.h"
#import "apple_laf_JRSUIConstants_FrameOnly.h"
#import "apple_laf_JRSUIConstants_IndicatorOnly.h"
#import "apple_laf_JRSUIConstants_NoIndicator.h"
#import "apple_laf_JRSUIConstants_NothingToScroll.h"
#import "apple_laf_JRSUIConstants_Orientation.h"
#import "apple_laf_JRSUIConstants_ScrollBarPart.h"
#import "apple_laf_JRSUIConstants_SegmentPosition.h"
#import "apple_laf_JRSUIConstants_SegmentTrailingSeparator.h"
#import "apple_laf_JRSUIConstants_SegmentLeadingSeparator.h"
#import "apple_laf_JRSUIConstants_ShowArrows.h"
#import "apple_laf_JRSUIConstants_Size.h"
#import "apple_laf_JRSUIConstants_State.h"
#import "apple_laf_JRSUIConstants_Variant.h"
#import "apple_laf_JRSUIConstants_Widget.h"
#import "apple_laf_JRSUIConstants_WindowType.h"
#import "apple_laf_JRSUIConstants_WindowTitleBarSeparator.h"
#import "apple_laf_JRSUIConstants_WindowClipCorners.h"

#import "JRSUIConstantSync.h"


static CFTypeRef widgetKey = NULL;
static CFTypeRef stateKey = NULL;
static CFTypeRef sizeKey = NULL;
static CFTypeRef directionKey = NULL;
static CFTypeRef orientationKey = NULL;
static CFTypeRef verticalAlignmentKey = NULL;
static CFTypeRef horizontalAlignmentKey = NULL;
static CFTypeRef positionKey = NULL;
static CFTypeRef pressedPartKey = NULL;
static CFTypeRef variantKey = NULL;
static CFTypeRef windowTypeKey = NULL;
static CFTypeRef focusedKey = NULL;
static CFTypeRef indicatorOnlyKey = NULL;
static CFTypeRef noIndicatorKey = NULL;
static CFTypeRef nothingToScrollKey = NULL;
static CFTypeRef arrowsOnlyKey = NULL;
static CFTypeRef frameOnlyKey = NULL;
static CFTypeRef segmentTrailingSeparatorKey = NULL;
static CFTypeRef segmentLeadingSeparatorKey = NULL;
static CFTypeRef windowFrameDrawClippedKey = NULL;
static CFTypeRef windowFrameDrawTitleSeparatorKey = NULL;
static CFTypeRef maximumValueKey = NULL;
static CFTypeRef valueKey = NULL;
static CFTypeRef animationStartTimeKey = NULL;
static CFTypeRef animationTimeKey = NULL;


#define JRS_CONSTANT(clazz, constant)                                \
    kJRSUI_ ## clazz ## _ ## constant

#define JNI_CONSTANT(clazz, constant)                                \
    apple_laf_JRSUIConstants_ ## clazz ## __ ## constant

#define CONSTANT_CHECK(clazz, constant)                                \
    JRS_CONSTANT(clazz, constant) == JNI_CONSTANT(clazz, constant)

#define CONSISTENCY_CHECK(clazz, constant)                            \
    if ( !CONSTANT_CHECK(clazz, constant) ) return NO;

#define ASSIGN_KEY(key)                                                \
    key ## Key = JRSUIGetKey(JRS_CONSTANT(Key, key));                \
    if (key ## Key == NULL) return NO;

#define ASSIGN_KEY_IF_EXISTS(key, constant)                          \
    key ## Key = JRSUIGetKey(constant);

static BOOL init_and_check_constant_coherency() {
    ASSIGN_KEY(widget);
    ASSIGN_KEY(state);
    ASSIGN_KEY(size);
    ASSIGN_KEY(direction);
    ASSIGN_KEY(orientation);
    ASSIGN_KEY(verticalAlignment);
    ASSIGN_KEY(horizontalAlignment);
    ASSIGN_KEY(position);
    ASSIGN_KEY(pressedPart);
    ASSIGN_KEY(variant);
    ASSIGN_KEY(windowType);
    ASSIGN_KEY(focused);
    ASSIGN_KEY(indicatorOnly);
    ASSIGN_KEY(noIndicator);
    ASSIGN_KEY(nothingToScroll);
    ASSIGN_KEY(arrowsOnly);
    ASSIGN_KEY(frameOnly);
    ASSIGN_KEY(segmentTrailingSeparator);
    ASSIGN_KEY_IF_EXISTS(segmentLeadingSeparator, 29); // kJRSUI_Key_segmentLeadingSeparator = 29
    ASSIGN_KEY(windowFrameDrawClipped);
    ASSIGN_KEY(windowFrameDrawTitleSeparator);
    ASSIGN_KEY(maximumValue);
    ASSIGN_KEY(value);
    ASSIGN_KEY(animationStartTime);
    ASSIGN_KEY(animationTime);

    CONSISTENCY_CHECK(Key, value);
    CONSISTENCY_CHECK(Key, thumbProportion);
    CONSISTENCY_CHECK(Key, thumbStart);
    CONSISTENCY_CHECK(Key, animationFrame);
    CONSISTENCY_CHECK(Key, windowTitleBarHeight);

    CONSISTENCY_CHECK(Widget, background);
    CONSISTENCY_CHECK(Widget, buttonBevel);
    CONSISTENCY_CHECK(Widget, buttonBevelInset);
    CONSISTENCY_CHECK(Widget, buttonBevelRound);
    CONSISTENCY_CHECK(Widget, buttonCheckBox);
    CONSISTENCY_CHECK(Widget, buttonComboBox);
    CONSISTENCY_CHECK(Widget, buttonComboBoxInset);
    CONSISTENCY_CHECK(Widget, buttonDisclosure);
    CONSISTENCY_CHECK(Widget, buttonListHeader);
    CONSISTENCY_CHECK(Widget, buttonLittleArrows);
    CONSISTENCY_CHECK(Widget, buttonPopDown);
    CONSISTENCY_CHECK(Widget, buttonPopDownInset);
    CONSISTENCY_CHECK(Widget, buttonPopDownSquare);
    CONSISTENCY_CHECK(Widget, buttonPopUp);
    CONSISTENCY_CHECK(Widget, buttonPopUpInset);
    CONSISTENCY_CHECK(Widget, buttonPopUpSquare);
    CONSISTENCY_CHECK(Widget, buttonPush);
    CONSISTENCY_CHECK(Widget, buttonPushScope);
    CONSISTENCY_CHECK(Widget, buttonPushScope2);
    CONSISTENCY_CHECK(Widget, buttonPushTextured);
    CONSISTENCY_CHECK(Widget, buttonPushInset);
    CONSISTENCY_CHECK(Widget, buttonPushInset2);
    CONSISTENCY_CHECK(Widget, buttonRadio);
    CONSISTENCY_CHECK(Widget, buttonRound);
    CONSISTENCY_CHECK(Widget, buttonRoundHelp);
    CONSISTENCY_CHECK(Widget, buttonRoundInset);
    CONSISTENCY_CHECK(Widget, buttonRoundInset2);
    CONSISTENCY_CHECK(Widget, buttonSearchFieldCancel);
    CONSISTENCY_CHECK(Widget, buttonSearchFieldFind);
    CONSISTENCY_CHECK(Widget, buttonSegmented);
    CONSISTENCY_CHECK(Widget, buttonSegmentedInset);
    CONSISTENCY_CHECK(Widget, buttonSegmentedInset2);
    CONSISTENCY_CHECK(Widget, buttonSegmentedSCurve);
    CONSISTENCY_CHECK(Widget, buttonSegmentedTextured);
    CONSISTENCY_CHECK(Widget, buttonSegmentedToolbar);
    CONSISTENCY_CHECK(Widget, dial);
    CONSISTENCY_CHECK(Widget, disclosureTriangle);
    CONSISTENCY_CHECK(Widget, dividerGrabber);
    CONSISTENCY_CHECK(Widget, dividerSeparatorBar);
    CONSISTENCY_CHECK(Widget, dividerSplitter);
    CONSISTENCY_CHECK(Widget, focus);
    CONSISTENCY_CHECK(Widget, frameGroupBox);
    CONSISTENCY_CHECK(Widget, frameGroupBoxSecondary);
    CONSISTENCY_CHECK(Widget, frameListBox);
    CONSISTENCY_CHECK(Widget, framePlacard);
    CONSISTENCY_CHECK(Widget, frameTextField);
    CONSISTENCY_CHECK(Widget, frameTextFieldRound);
    CONSISTENCY_CHECK(Widget, frameWell);
    CONSISTENCY_CHECK(Widget, growBox);
    CONSISTENCY_CHECK(Widget, growBoxTextured);
    CONSISTENCY_CHECK(Widget, gradient);
    CONSISTENCY_CHECK(Widget, menu);
    CONSISTENCY_CHECK(Widget, menuItem);
    CONSISTENCY_CHECK(Widget, menuBar);
    CONSISTENCY_CHECK(Widget, menuTitle);
    CONSISTENCY_CHECK(Widget, progressBar);
    CONSISTENCY_CHECK(Widget, progressIndeterminateBar);
    CONSISTENCY_CHECK(Widget, progressRelevance);
    CONSISTENCY_CHECK(Widget, progressSpinner);
    CONSISTENCY_CHECK(Widget, scrollBar);
    CONSISTENCY_CHECK(Widget, scrollColumnSizer);
    CONSISTENCY_CHECK(Widget, slider);
    CONSISTENCY_CHECK(Widget, sliderThumb);
    CONSISTENCY_CHECK(Widget, synchronization);
    CONSISTENCY_CHECK(Widget, tab);
    CONSISTENCY_CHECK(Widget, titleBarCloseBox);
    CONSISTENCY_CHECK(Widget, titleBarCollapseBox);
    CONSISTENCY_CHECK(Widget, titleBarZoomBox);
    CONSISTENCY_CHECK(Widget, titleBarToolbarButton);
    CONSISTENCY_CHECK(Widget, toolbarItemWell);
    CONSISTENCY_CHECK(Widget, windowFrame);

    CONSISTENCY_CHECK(State, active);
    CONSISTENCY_CHECK(State, inactive);
    CONSISTENCY_CHECK(State, disabled);
    CONSISTENCY_CHECK(State, pressed);
    CONSISTENCY_CHECK(State, pulsed);
    CONSISTENCY_CHECK(State, rollover);
    CONSISTENCY_CHECK(State, drag);

    CONSISTENCY_CHECK(Size, mini);
    CONSISTENCY_CHECK(Size, small);
    CONSISTENCY_CHECK(Size, regular);
    CONSISTENCY_CHECK(Size, large);

    CONSISTENCY_CHECK(Direction, none);
    CONSISTENCY_CHECK(Direction, up);
    CONSISTENCY_CHECK(Direction, down);
    CONSISTENCY_CHECK(Direction, left);
    CONSISTENCY_CHECK(Direction, right);
    CONSISTENCY_CHECK(Direction, north);
    CONSISTENCY_CHECK(Direction, south);
    CONSISTENCY_CHECK(Direction, east);
    CONSISTENCY_CHECK(Direction, west);

    CONSISTENCY_CHECK(Orientation, horizontal);
    CONSISTENCY_CHECK(Orientation, vertical);

    CONSISTENCY_CHECK(AlignmentHorizontal, left);
    CONSISTENCY_CHECK(AlignmentHorizontal, center);
    CONSISTENCY_CHECK(AlignmentHorizontal, right);

    CONSISTENCY_CHECK(AlignmentVertical, top);
    CONSISTENCY_CHECK(AlignmentVertical, center);
    CONSISTENCY_CHECK(AlignmentVertical, bottom);

    CONSISTENCY_CHECK(SegmentPosition, first);
    CONSISTENCY_CHECK(SegmentPosition, middle);
    CONSISTENCY_CHECK(SegmentPosition, last);
    CONSISTENCY_CHECK(SegmentPosition, only);

    CONSISTENCY_CHECK(ScrollBarPart, none);
    CONSISTENCY_CHECK(ScrollBarPart, thumb);
    CONSISTENCY_CHECK(ScrollBarPart, arrowMin);
    CONSISTENCY_CHECK(ScrollBarPart, arrowMax);
    CONSISTENCY_CHECK(ScrollBarPart, arrowMaxInside);
    CONSISTENCY_CHECK(ScrollBarPart, arrowMinInside);
    CONSISTENCY_CHECK(ScrollBarPart, trackMin);
    CONSISTENCY_CHECK(ScrollBarPart, trackMax);

    CONSISTENCY_CHECK(Variant, menuGlyph);
    CONSISTENCY_CHECK(Variant, menuPopup);
    CONSISTENCY_CHECK(Variant, menuPulldown);
    CONSISTENCY_CHECK(Variant, menuHierarchical);
    CONSISTENCY_CHECK(Variant, gradientListBackgroundEven);
    CONSISTENCY_CHECK(Variant, gradientListBackgroundOdd);
    CONSISTENCY_CHECK(Variant, gradientSideBar);
    CONSISTENCY_CHECK(Variant, gradientSideBarSelection);
    CONSISTENCY_CHECK(Variant, gradientSideBarFocusedSelection);

    CONSISTENCY_CHECK(WindowType, document);
    CONSISTENCY_CHECK(WindowType, utility);
    CONSISTENCY_CHECK(WindowType, titlelessUtility);

    return YES;
}

static CFBooleanRef get_boolean_value_for(jbyte value) {
    return (value != 0) ? kCFBooleanTrue : kCFBooleanFalse;
}

static CFNumberRef get_boolean_number_value_for(jbyte value) {
    static CFNumberRef zero = NULL;
    static CFNumberRef one = NULL;

    if (!zero) {
        double zeroVal = 0.0;
        zero = CFNumberCreate(NULL, kCFNumberDoubleType, &zeroVal);
        double oneVal = 1.0;
        one = CFNumberCreate(NULL, kCFNumberDoubleType, &oneVal);
    }

    return (value != 0) ? one : zero;
}

BOOL _InitializeJRSProperties() {
    static BOOL initialized = NO;
    static BOOL coherent = NO;

    if (!initialized) {
        coherent = init_and_check_constant_coherency();
        initialized = YES;
    }

    return coherent;
}

#define MASK(property) \
    apple_laf_JRSUIConstants_ ## property ## _MASK

#define SHIFT(property) \
    apple_laf_JRSUIConstants_ ## property ## _SHIFT

#define IF_CHANGED_SET_USING(property, setter)                        \
{                                                                    \
    jlong value = (newProperties & MASK(property));                    \
    if ((value - (oldProperties & MASK(property))) != 0L) {            \
        setter(control, value >> SHIFT(property));                    \
    }                                                                \
}

#define IF_CHANGED_SET_KEYED_BOOLEAN(property, key, getter)            \
{                                                                    \
    jlong value = (newProperties & MASK(property));                    \
    if ((value - (oldProperties & MASK(property))) != 0L) {            \
        CFTypeRef cfValue = getter(value >> SHIFT(property));        \
        if (cfValue) {                                                \
            JRSUIControlSetValueByKey(control, key, cfValue);        \
        }                                                            \
    }                                                                \
}

#define IF_KEY_EXISTS_DO(key, operation)                             \
{                                                                    \
    if (key != NULL) {                                               \
        operation;                                                   \
    }                                                                \
}

jint _SyncEncodedProperties(JRSUIControlRef control, jlong oldProperties, jlong newProperties) {
    if (!_InitializeJRSProperties()) abort();

    IF_CHANGED_SET_USING(Widget, JRSUIControlSetWidget);
    IF_CHANGED_SET_USING(State, JRSUIControlSetState);
    IF_CHANGED_SET_USING(Size, JRSUIControlSetSize);
    IF_CHANGED_SET_USING(Direction, JRSUIControlSetDirection);
    IF_CHANGED_SET_USING(Orientation, JRSUIControlSetOrientation);
    IF_CHANGED_SET_USING(AlignmentVertical, JRSUIControlSetAlignmentVertical);
    IF_CHANGED_SET_USING(AlignmentHorizontal, JRSUIControlSetAlignmentHorizontal);
    IF_CHANGED_SET_USING(SegmentPosition, JRSUIControlSetSegmentPosition);
    IF_CHANGED_SET_USING(ScrollBarPart, JRSUIControlSetScrollBarPart);
    IF_CHANGED_SET_USING(Variant, JRSUIControlSetVariant);
    IF_CHANGED_SET_USING(WindowType, JRSUIControlSetWindowType);
    IF_CHANGED_SET_USING(ShowArrows, JRSUIControlSetShowArrows);

    IF_CHANGED_SET_KEYED_BOOLEAN(Focused, focusedKey, get_boolean_value_for);
    IF_CHANGED_SET_KEYED_BOOLEAN(IndicatorOnly, indicatorOnlyKey, get_boolean_value_for);
    IF_CHANGED_SET_KEYED_BOOLEAN(NoIndicator, noIndicatorKey, get_boolean_value_for);
    IF_CHANGED_SET_KEYED_BOOLEAN(ArrowsOnly, arrowsOnlyKey, get_boolean_value_for);
    IF_CHANGED_SET_KEYED_BOOLEAN(FrameOnly, frameOnlyKey, get_boolean_value_for);
    IF_CHANGED_SET_KEYED_BOOLEAN(SegmentTrailingSeparator, segmentTrailingSeparatorKey, get_boolean_value_for);
    IF_KEY_EXISTS_DO(segmentLeadingSeparatorKey, IF_CHANGED_SET_KEYED_BOOLEAN(SegmentLeadingSeparator, segmentLeadingSeparatorKey, get_boolean_value_for));
    IF_CHANGED_SET_KEYED_BOOLEAN(NothingToScroll, nothingToScrollKey, get_boolean_value_for);
    IF_CHANGED_SET_KEYED_BOOLEAN(WindowTitleBarSeparator, windowFrameDrawTitleSeparatorKey, get_boolean_value_for);
    IF_CHANGED_SET_KEYED_BOOLEAN(WindowClipCorners, windowFrameDrawClippedKey, get_boolean_value_for);
    IF_CHANGED_SET_KEYED_BOOLEAN(BooleanValue, valueKey, get_boolean_number_value_for);

    { // animation is special: keep setting while true
        jlong value = (newProperties & MASK(Animating));
        Boolean animating = value != 0L;
        Boolean changed = ((oldProperties & MASK(Animating)) - value) != 0L;
        if (animating || changed) {
            JRSUIControlSetAnimating(control, animating);
        }
    }

    return 0;
}


/*
 * Class:     apple_laf_JRSUIConstants
 * Method:    getPtrForConstant
 * Signature: (I)J
 */
JNIEXPORT jlong JNICALL Java_apple_laf_JRSUIConstants_getPtrForConstant
(JNIEnv *env, jclass clazz, jint constant){
    return ptr_to_jlong(JRSUIGetKey(constant));
}
