blob: 04f463e642ceb2d6e059c909ce12c837625bfea5 [file] [log] [blame]
/*
* Copyright (c) 1996, 2014, 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.
*/
#include "awt_ScrollPane.h"
#include "awt_Container.h"
#include "awt_Insets.h"
#include "awt_Panel.h"
#include "awt_Scrollbar.h" // static #defines
#include "awt_Toolkit.h"
#include "awt_Window.h"
#include <java_awt_Adjustable.h>
#include <java_awt_ScrollPane.h>
#include <java_awt_ScrollPaneAdjustable.h>
#include <java_awt_event_AdjustmentEvent.h>
/* IMPORTANT! Read the README.JNI file for notes on JNI converted AWT code.
*/
/***********************************************************************/
// struct for _GetOffset() method
struct GetOffsetStruct {
jobject scrollpane;
jint orient;
};
// struct for _SetScrollPos() method
struct SetScrollPosStruct {
jobject scrollpane;
jint x, y;
};
// struct for _SetSpans() method
struct SetSpansStruct {
jobject scrollpane;
jint parentWidth;
jint parentHeight;
jint childWidth;
jint childHeight;
};
/************************************************************************
* AwtScrollPane fields
*/
jfieldID AwtScrollPane::scrollbarDisplayPolicyID;
jfieldID AwtScrollPane::hAdjustableID;
jfieldID AwtScrollPane::vAdjustableID;
jfieldID AwtScrollPane::unitIncrementID;
jfieldID AwtScrollPane::blockIncrementID;
jmethodID AwtScrollPane::postScrollEventID;
/************************************************************************
* AwtScrollPane methods
*/
AwtScrollPane::AwtScrollPane() {
}
LPCTSTR AwtScrollPane::GetClassName() {
return TEXT("SunAwtScrollPane");
}
/* Create a new AwtScrollPane object and window. */
AwtScrollPane* AwtScrollPane::Create(jobject self, jobject parent)
{
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
jobject target = NULL;
AwtScrollPane* c = NULL;
try {
if (env->EnsureLocalCapacity(1) < 0) {
return NULL;
}
PDATA pData;
AwtComponent* awtParent;
JNI_CHECK_PEER_GOTO(parent, done);
awtParent = (AwtComponent*)pData;
JNI_CHECK_NULL_GOTO(awtParent, "null awtParent", done);
target = env->GetObjectField(self, AwtObject::targetID);
JNI_CHECK_NULL_GOTO(target, "null target", done);
c = new AwtScrollPane();
{
DWORD style = WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
jint scrollbarDisplayPolicy =
env->GetIntField(target, scrollbarDisplayPolicyID);
if (scrollbarDisplayPolicy
== java_awt_ScrollPane_SCROLLBARS_ALWAYS) {
style |= WS_HSCROLL | WS_VSCROLL;
}
DWORD exStyle = WS_EX_CLIENTEDGE;
if (GetRTL()) {
exStyle |= WS_EX_RIGHT | WS_EX_LEFTSCROLLBAR;
if (GetRTLReadingOrder())
exStyle |= WS_EX_RTLREADING;
}
jint x = env->GetIntField(target, AwtComponent::xID);
jint y = env->GetIntField(target, AwtComponent::yID);
jint width = env->GetIntField(target, AwtComponent::widthID);
jint height = env->GetIntField(target, AwtComponent::heightID);
c->CreateHWnd(env, L"", style, exStyle,
x, y, width, height,
awtParent->GetHWnd(),
reinterpret_cast<HMENU>(static_cast<INT_PTR>(
awtParent->CreateControlID())),
::GetSysColor(COLOR_WINDOWTEXT),
::GetSysColor(COLOR_WINDOW),
self);
}
} catch (...) {
env->DeleteLocalRef(target);
throw;
}
done:
env->DeleteLocalRef(target);
return c;
}
void AwtScrollPane::SetInsets(JNIEnv *env)
{
RECT outside;
RECT inside;
::GetWindowRect(GetHWnd(), &outside);
::GetClientRect(GetHWnd(), &inside);
::MapWindowPoints(GetHWnd(), 0, (LPPOINT)&inside, 2);
if (env->EnsureLocalCapacity(1) < 0) {
return;
}
jobject insets =
(env)->GetObjectField(GetPeer(env), AwtPanel::insets_ID);
DASSERT(!safe_ExceptionOccurred(env));
if (insets != NULL && (inside.top-outside.top) != 0) {
(env)->SetIntField(insets, AwtInsets::topID, inside.top - outside.top);
(env)->SetIntField(insets, AwtInsets::leftID, inside.left - outside.left);
(env)->SetIntField(insets, AwtInsets::bottomID, outside.bottom - inside.bottom);
(env)->SetIntField(insets, AwtInsets::rightID, outside.right - inside.right);
}
env->DeleteLocalRef(insets);
}
void AwtScrollPane::SetScrollInfo(int orient, int max, int page,
BOOL disableNoScroll)
{
DTRACE_PRINTLN4("AwtScrollPane::SetScrollInfo %d, %d, %d, %d", orient, max, page, disableNoScroll);
SCROLLINFO si;
int posBefore;
int posAfter;
posBefore = GetScrollPos(orient);
si.cbSize = sizeof(SCROLLINFO);
si.nMin = 0;
si.nMax = max;
si.fMask = SIF_RANGE;
if (disableNoScroll) {
si.fMask |= SIF_DISABLENOSCROLL;
}
if (page > 0) {
si.fMask |= SIF_PAGE;
si.nPage = page;
}
::SetScrollInfo(GetHWnd(), orient, &si, TRUE);
// scroll position may have changed when thumb is at the end of the bar
// and the page size changes
posAfter = GetScrollPos(orient);
if (posBefore != posAfter) {
if(max==0 && posAfter==0) {
// Caller used nMin==nMax idiom to hide scrollbar.
// On the new themes (Windows XP, Vista) this would reset
// scroll position to zero ("just inside the range") (6404832).
//
PostScrollEvent(orient, SB_THUMBPOSITION, posBefore);
}else{
PostScrollEvent(orient, SB_THUMBPOSITION, posAfter);
}
}
}
void AwtScrollPane::RecalcSizes(int parentWidth, int parentHeight,
int childWidth, int childHeight)
{
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
if (env->EnsureLocalCapacity(2) < 0) {
return;
}
/* Determine border width without scrollbars. */
int horzBorder = ::GetSystemMetrics(SM_CXEDGE);;
int vertBorder = ::GetSystemMetrics(SM_CYEDGE);;
parentWidth -= (horzBorder * 2);
parentHeight -= (vertBorder * 2);
/* Enable each scrollbar as needed. */
jobject target = AwtObject::GetTarget(env);
jint policy = env->GetIntField(target,
AwtScrollPane::scrollbarDisplayPolicyID);
BOOL needsHorz=(policy == java_awt_ScrollPane_SCROLLBARS_ALWAYS ||
(policy == java_awt_ScrollPane_SCROLLBARS_AS_NEEDED &&
childWidth > parentWidth));
if (needsHorz) {
parentHeight -= ::GetSystemMetrics(SM_CYHSCROLL);
}
BOOL needsVert=(policy == java_awt_ScrollPane_SCROLLBARS_ALWAYS ||
(policy ==java_awt_ScrollPane_SCROLLBARS_AS_NEEDED &&
childHeight > parentHeight));
if (needsVert) {
parentWidth -= ::GetSystemMetrics(SM_CXVSCROLL);
}
/*
* Since the vertical scrollbar may have reduced the parent width
* enough to now require a horizontal scrollbar, we need to
* recalculate the horizontal metrics and scrollbar boolean.
*/
if (!needsHorz) {
needsHorz = (policy == java_awt_ScrollPane_SCROLLBARS_ALWAYS ||
(policy == java_awt_ScrollPane_SCROLLBARS_AS_NEEDED &&
childWidth > parentWidth));
if (needsHorz) {
parentHeight -= ::GetSystemMetrics(SM_CYHSCROLL);
}
}
/* Now set ranges -- setting the min and max the same disables them. */
if (needsHorz) {
jobject hAdj =
env->GetObjectField(target, AwtScrollPane::hAdjustableID);
env->SetIntField(hAdj, AwtScrollPane::blockIncrementID, parentWidth);
SetScrollInfo(SB_HORZ, childWidth - 1, parentWidth,
(policy == java_awt_ScrollPane_SCROLLBARS_ALWAYS));
env->DeleteLocalRef(hAdj);
} else {
SetScrollInfo(SB_HORZ, 0, 0,
(policy == java_awt_ScrollPane_SCROLLBARS_ALWAYS));
}
if (needsVert) {
jobject vAdj =
env->GetObjectField(target, AwtScrollPane::vAdjustableID);
env->SetIntField(vAdj, AwtScrollPane::blockIncrementID, parentHeight);
SetScrollInfo(SB_VERT, childHeight - 1, parentHeight,
(policy == java_awt_ScrollPane_SCROLLBARS_ALWAYS));
env->DeleteLocalRef(vAdj);
} else {
SetScrollInfo(SB_VERT, 0, 0,
(policy == java_awt_ScrollPane_SCROLLBARS_ALWAYS));
}
env->DeleteLocalRef(target);
}
void AwtScrollPane::Reshape(int x, int y, int w, int h)
{
AwtComponent::Reshape(x, y, w, h);
}
void AwtScrollPane::Show(JNIEnv *env)
{
SetInsets(env);
SendMessage(WM_AWT_COMPONENT_SHOW);
}
void AwtScrollPane::PostScrollEvent(int orient, int scrollCode, int pos) {
if (scrollCode == SB_ENDSCROLL) {
return;
}
// convert Windows scroll bar ident to peer ident
jint jorient;
if (orient == SB_VERT) {
jorient = java_awt_Adjustable_VERTICAL;
} else if (orient == SB_HORZ) {
jorient = java_awt_Adjustable_HORIZONTAL;
} else {
DASSERT(FALSE);
return;
}
// convert Windows scroll code to adjustment type and isAdjusting status
jint jscrollcode;
jboolean jadjusting = JNI_FALSE;
SCROLLINFO si;
switch (scrollCode) {
case SB_LINEUP:
jscrollcode = java_awt_event_AdjustmentEvent_UNIT_DECREMENT;
break;
case SB_LINEDOWN:
jscrollcode = java_awt_event_AdjustmentEvent_UNIT_INCREMENT;
break;
case SB_PAGEUP:
jscrollcode = java_awt_event_AdjustmentEvent_BLOCK_DECREMENT;
break;
case SB_PAGEDOWN:
jscrollcode = java_awt_event_AdjustmentEvent_BLOCK_INCREMENT;
break;
case SB_TOP:
jscrollcode = java_awt_event_AdjustmentEvent_TRACK;
ZeroMemory(&si, sizeof(si));
si.cbSize = sizeof(si);
si.fMask = SIF_RANGE;
::GetScrollInfo(GetHWnd(), orient, &si);
pos = si.nMin;
break;
case SB_BOTTOM:
jscrollcode = java_awt_event_AdjustmentEvent_TRACK;
ZeroMemory(&si, sizeof(si));
si.cbSize = sizeof(si);
si.fMask = SIF_RANGE;
::GetScrollInfo(GetHWnd(), orient, &si);
pos = si.nMax;
break;
case SB_THUMBTRACK:
jscrollcode = java_awt_event_AdjustmentEvent_TRACK;
jadjusting = JNI_TRUE;
break;
case SB_THUMBPOSITION:
jscrollcode = java_awt_event_AdjustmentEvent_TRACK;
break;
default:
DASSERT(FALSE);
return;
}
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
env->CallVoidMethod(GetPeer(env), AwtScrollPane::postScrollEventID,
jorient, jscrollcode, (jint)pos, jadjusting);
DASSERT(!safe_ExceptionOccurred(env));
}
MsgRouting
AwtScrollPane::WmNcHitTest(UINT x, UINT y, LRESULT& retVal)
{
if (::IsWindow(AwtWindow::GetModalBlocker(AwtComponent::GetTopLevelParentForWindow(GetHWnd())))) {
retVal = HTCLIENT;
return mrConsume;
}
return AwtCanvas::WmNcHitTest(x, y, retVal);
}
MsgRouting AwtScrollPane::WmVScroll(UINT scrollCode, UINT pos, HWND hScrollPane)
{
// While user scrolls using tracker, SCROLLINFO.nPos is not changed, SCROLLINFO.nTrackPos is changed instead.
int dragP = scrollCode == SB_THUMBPOSITION || scrollCode == SB_THUMBTRACK;
int newPos = GetScrollPos(SB_VERT);
if ( dragP ) {
SCROLLINFO si;
ZeroMemory(&si, sizeof(si));
si.cbSize = sizeof(si);
si.fMask = SIF_TRACKPOS;
::GetScrollInfo(GetHWnd(), SB_VERT, &si);
newPos = si.nTrackPos;
}
PostScrollEvent(SB_VERT, scrollCode, newPos);
return mrConsume;
}
MsgRouting AwtScrollPane::WmHScroll(UINT scrollCode, UINT pos, HWND hScrollPane)
{
// While user scrolls using tracker, SCROLLINFO.nPos is not changed, SCROLLINFO.nTrackPos is changed instead.
int dragP = scrollCode == SB_THUMBPOSITION || scrollCode == SB_THUMBTRACK;
int newPos = GetScrollPos(SB_HORZ);
if ( dragP ) {
SCROLLINFO si;
ZeroMemory(&si, sizeof(si));
si.cbSize = sizeof(si);
si.fMask = SIF_TRACKPOS;
::GetScrollInfo(GetHWnd(), SB_HORZ, &si);
newPos = si.nTrackPos;
}
PostScrollEvent(SB_HORZ, scrollCode, newPos);
return mrConsume;
}
MsgRouting AwtScrollPane::HandleEvent(MSG *msg, BOOL synthetic)
{
// SunAwtScrollPane control doesn't cause activation on mouse/key events,
// so we can safely (for synthetic focus) pass them to the system proc.
return AwtComponent::HandleEvent(msg, synthetic);
}
int AwtScrollPane::GetScrollPos(int orient)
{
SCROLLINFO si;
ZeroMemory(&si, sizeof(si));
si.cbSize = sizeof(si);
si.fMask = SIF_POS;
::GetScrollInfo(GetHWnd(), orient, &si);
return si.nPos;
}
jint AwtScrollPane::_GetOffset(void *param)
{
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
GetOffsetStruct *gos = (GetOffsetStruct *)param;
jobject self = gos->scrollpane;
jint orient = gos->orient;
jint result = 0;
AwtScrollPane *s = NULL;
PDATA pData;
JNI_CHECK_PEER_GOTO(self, ret);
s = (AwtScrollPane *)pData;
if (::IsWindow(s->GetHWnd()))
{
DTRACE_PRINTLN2("%x: WScrollPanePeer.getOffset(%d)", self, orient);
s->VerifyState();
int nBar = (orient == java_awt_Adjustable_HORIZONTAL) ? SB_HORZ : SB_VERT;
result = s->GetScrollPos(nBar);
}
ret:
env->DeleteGlobalRef(self);
delete gos;
return result;
}
void AwtScrollPane::_SetInsets(void *param)
{
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
jobject self = (jobject)param;
AwtScrollPane *s = NULL;
PDATA pData;
JNI_CHECK_PEER_GOTO(self, ret);
s = (AwtScrollPane *)pData;
if (::IsWindow(s->GetHWnd()))
{
DTRACE_PRINTLN1("%x: WScrollPanePeer.setInsets()", self);
s->SetInsets(env);
s->VerifyState();
}
ret:
env->DeleteGlobalRef(self);
}
void AwtScrollPane::_SetScrollPos(void *param)
{
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
SetScrollPosStruct *spss = (SetScrollPosStruct *)param;
jobject self = spss->scrollpane;
jint x = spss->x;
jint y = spss->y;
AwtScrollPane *s = NULL;
PDATA pData;
JNI_CHECK_PEER_GOTO(self, ret);
s = (AwtScrollPane *)pData;
if (::IsWindow(s->GetHWnd()))
{
DTRACE_PRINTLN3("%x: WScrollPanePeer.setScrollPosition(%d, %d)", self, x, y);
SCROLLINFO si;
ZeroMemory(&si, sizeof(si));
si.fMask = SIF_POS;
si.cbSize = sizeof(si);
// set x
si.nPos = x;
::SetScrollInfo(s->GetHWnd(), SB_HORZ, &si, TRUE);
// set y
si.nPos = y;
::SetScrollInfo(s->GetHWnd(), SB_VERT, &si, TRUE);
}
ret:
env->DeleteGlobalRef(self);
delete spss;
}
void AwtScrollPane::_SetSpans(void *param)
{
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
SetSpansStruct *sss = (SetSpansStruct *)param;
jobject self = sss->scrollpane;
jint parentWidth = sss->parentWidth;
jint parentHeight = sss->parentHeight;
jint childWidth = sss->childWidth;
jint childHeight = sss->childHeight;
AwtScrollPane *s = NULL;
PDATA pData;
JNI_CHECK_PEER_GOTO(self, ret);
s = (AwtScrollPane *)pData;
if (::IsWindow(s->GetHWnd()))
{
DTRACE_PRINTLN5("%x: WScrollPanePeer.setSpans(%d, %d, %d, %d)", self,
parentWidth, parentHeight, childWidth, childHeight);
s->RecalcSizes(parentWidth, parentHeight, childWidth, childHeight);
s->VerifyState();
}
ret:
env->DeleteGlobalRef(self);
delete sss;
}
#ifdef DEBUG
void AwtScrollPane::VerifyState()
{
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
if (env->EnsureLocalCapacity(3) < 0) {
return;
}
if (AwtToolkit::GetInstance().VerifyComponents() == FALSE) {
return;
}
if (m_callbacksEnabled == FALSE) {
/* Component is not fully setup yet. */
return;
}
AwtComponent::VerifyState();
jobject target = AwtObject::GetTarget(env);
jobject child = JNU_CallMethodByName(env, NULL, GetPeer(env),
"getScrollSchild",
"()Ljava/awt/Component;").l;
DASSERT(!safe_ExceptionOccurred(env));
if (child != NULL) {
jobject childPeer =
(env)->GetObjectField(child, AwtComponent::peerID);
PDATA pData;
JNI_CHECK_PEER_RETURN(childPeer);
AwtComponent* awtChild = (AwtComponent *)pData;
/* Verify child window is positioned correctly. */
RECT rect, childRect;
::GetClientRect(GetHWnd(), &rect);
::MapWindowPoints(GetHWnd(), 0, (LPPOINT)&rect, 2);
::GetWindowRect(awtChild->GetHWnd(), &childRect);
DASSERT(childRect.left <= rect.left && childRect.top <= rect.top);
env->DeleteLocalRef(childPeer);
}
env->DeleteLocalRef(target);
env->DeleteLocalRef(child);
}
#endif
/************************************************************************
* ScrollPane native methods
*/
extern "C" {
/*
* Class: java_awt_ScrollPane
* Method: initIDs
* Signature: ()V
*/
JNIEXPORT void JNICALL
Java_java_awt_ScrollPane_initIDs(JNIEnv *env, jclass cls)
{
TRY;
AwtScrollPane::scrollbarDisplayPolicyID =
env->GetFieldID(cls, "scrollbarDisplayPolicy", "I");
DASSERT(AwtScrollPane::scrollbarDisplayPolicyID != NULL);
CHECK_NULL(AwtScrollPane::scrollbarDisplayPolicyID);
AwtScrollPane::hAdjustableID =
env->GetFieldID(cls, "hAdjustable", "Ljava/awt/ScrollPaneAdjustable;");
DASSERT(AwtScrollPane::hAdjustableID != NULL);
CHECK_NULL(AwtScrollPane::hAdjustableID);
AwtScrollPane::vAdjustableID =
env->GetFieldID(cls, "vAdjustable", "Ljava/awt/ScrollPaneAdjustable;");
DASSERT(AwtScrollPane::vAdjustableID != NULL);
CATCH_BAD_ALLOC;
}
} /* extern "C" */
/************************************************************************
* ScrollPaneAdjustable native methods
*/
extern "C" {
/*
* Class: java_awt_ScrollPaneAdjustable
* Method: initIDs
* Signature: ()V
*/
JNIEXPORT void JNICALL
Java_java_awt_ScrollPaneAdjustable_initIDs(JNIEnv *env, jclass cls)
{
TRY;
AwtScrollPane::unitIncrementID = env->GetFieldID(cls,"unitIncrement", "I");
DASSERT(AwtScrollPane::unitIncrementID != NULL);
CHECK_NULL(AwtScrollPane::unitIncrementID);
AwtScrollPane::blockIncrementID =
env->GetFieldID(cls,"blockIncrement", "I");
DASSERT(AwtScrollPane::blockIncrementID != NULL);
CATCH_BAD_ALLOC;
}
} /* extern "C" */
/************************************************************************
* ScrollPanePeer native methods
*/
extern "C" {
JNIEXPORT void JNICALL
Java_sun_awt_windows_WScrollPanePeer_initIDs(JNIEnv *env, jclass cls)
{
TRY;
AwtScrollPane::postScrollEventID =
env->GetMethodID(cls, "postScrollEvent", "(IIIZ)V");
DASSERT(AwtScrollPane::postScrollEventID != NULL);
CATCH_BAD_ALLOC;
}
/*
* Class: sun_awt_windows_WScrollPanePeer
* Method: create
* Signature: (Lsun/awt/windows/WComponentPeer;)V
*/
JNIEXPORT void JNICALL
Java_sun_awt_windows_WScrollPanePeer_create(JNIEnv *env, jobject self,
jobject parent)
{
TRY;
DTRACE_PRINTLN2("%x: WScrollPanePeer.create(%x)", self, parent);
PDATA pData;
JNI_CHECK_PEER_RETURN(parent);
AwtToolkit::CreateComponent(self, parent,
(AwtToolkit::ComponentFactory)
AwtScrollPane::Create);
JNI_CHECK_PEER_CREATION_RETURN(self);
((AwtScrollPane*)pData)->VerifyState();
CATCH_BAD_ALLOC;
}
/*
* Class: sun_awt_windows_WScrollPanePeer
* Method: getOffset
* Signature: (I)I
*/
JNIEXPORT jint JNICALL
Java_sun_awt_windows_WScrollPanePeer_getOffset(JNIEnv *env, jobject self,
jint orient)
{
TRY;
GetOffsetStruct *gos = new GetOffsetStruct;
gos->scrollpane = env->NewGlobalRef(self);
gos->orient = orient;
return static_cast<jint>(reinterpret_cast<INT_PTR>(AwtToolkit::GetInstance().SyncCall(
(void *(*)(void *))AwtScrollPane::_GetOffset, gos)));
// global ref and gos are deleted in _GetOffset()
CATCH_BAD_ALLOC_RET(0);
}
/*
* Class: sun_awt_windows_WScrollPanePeer
* Method: setInsets
* Signature: ()V
*/
JNIEXPORT void JNICALL
Java_sun_awt_windows_WScrollPanePeer_setInsets(JNIEnv *env, jobject self)
{
TRY
AwtToolkit::GetInstance().SyncCall(AwtScrollPane::_SetInsets,
env->NewGlobalRef(self));
// global ref is deleted in _SetInsets()
CATCH_BAD_ALLOC;
}
/*
* Class: sun_awt_windows_WScrollPanePeer
* Method: setScrollPosition
* Signature: (II)V
*/
JNIEXPORT void JNICALL
Java_sun_awt_windows_WScrollPanePeer_setScrollPosition(JNIEnv *env,
jobject self,
jint x, jint y)
{
TRY;
SetScrollPosStruct *ssps = new SetScrollPosStruct;
ssps->scrollpane = env->NewGlobalRef(self);
ssps->x = x;
ssps->y = y;
AwtToolkit::GetInstance().SyncCall(AwtScrollPane::_SetScrollPos, ssps);
// global ref and ssps are deleted in _SetScrollPos()
CATCH_BAD_ALLOC;
}
/*
* Class: sun_awt_windows_WScrollPanePeer
* Method: _getHScrollbarHeight
* Signature: ()I
*/
JNIEXPORT jint JNICALL
Java_sun_awt_windows_WScrollPanePeer__1getHScrollbarHeight(JNIEnv *env,
jobject self)
{
TRY;
DTRACE_PRINTLN1("%x: WScrollPanePeer._getHScrollbarHeight()", self);
return ::GetSystemMetrics(SM_CYHSCROLL);
CATCH_BAD_ALLOC_RET(0);
}
/*
* Class: sun_awt_windows_WScrollPanePeer
* Method: _getVScrollbarWidth
* Signature: ()I
*/
JNIEXPORT jint JNICALL
Java_sun_awt_windows_WScrollPanePeer__1getVScrollbarWidth(JNIEnv *env,
jobject self)
{
TRY;
DTRACE_PRINTLN1("%x: WScrollPanePeer._getVScrollbarHeight()", self);
return ::GetSystemMetrics(SM_CXVSCROLL);
CATCH_BAD_ALLOC_RET(0);
}
/*
* Class: sun_awt_windows_WScrollPanePeer
* Method: setSpans
* Signature: (IIII)V
*/
JNIEXPORT void JNICALL
Java_sun_awt_windows_WScrollPanePeer_setSpans(JNIEnv *env, jobject self,
jint parentWidth,
jint parentHeight,
jint childWidth,
jint childHeight)
{
TRY;
SetSpansStruct *sss = new SetSpansStruct;
sss->scrollpane = env->NewGlobalRef(self);
sss->parentWidth = parentWidth;
sss->parentHeight = parentHeight;
sss->childWidth = childWidth;
sss->childHeight = childHeight;
AwtToolkit::GetInstance().SyncCall(AwtScrollPane::_SetSpans, sss);
// global ref and sss are deleted in _SetSpans
CATCH_BAD_ALLOC;
}
} /* extern "C" */