blob: 96c9860bbb7916c50c827de4695603d228cf9656 [file] [log] [blame]
/*
* 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));
}