mirror of
https://github.com/openjdk/jdk.git
synced 2026-05-26 21:38:10 +00:00
387 lines
16 KiB
Objective-C
387 lines
16 KiB
Objective-C
/*
|
|
* 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 <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));
|
|
}
|