/* * 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 "JNIUtilities.h" #import #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)); }