Milán Major

netscape-revival

1 branch
Code

sun-java/awt.bad/macos/MScrollbarPeer.cp

//##############################################################################
//##############################################################################
//
//	File:		MScrollbarPeer.cp
//	Author:		Dan Clifford
//	
//	Copyright © 1995-1996, Netscape Communications Corporation
//
//##############################################################################
//##############################################################################
#pragma mark INCLUDES

#include <Types.h>
#include <Memory.h>
#include <LStdControl.h>

extern "C" {

#include <stdlib.h>
#include "native.h"
#include "typedefs_md.h"
#include "java_awt_Color.h"
#include "java_awt_Font.h"
#include "java_awt_Scrollbar.h"
#include "java_awt_Component.h"
#include "sun_awt_macos_MScrollbarPeer.h"
#include "sun_awt_macos_MComponentPeer.h"

};

#include "MScrollbarPeer.h"
#include "MCanvasPeer.h"
#include "MToolkit.h"

//##############################################################################
//##############################################################################
#pragma mark MComponenPeer SCROLLBAR ACTION PROC
#pragma mark -

MScrollbarPeer		*gCurrentScrollbar = NULL;
Boolean				gFirstTimeThroughAction = false;

pascal void ScrollbarPeerActionProc(ControlRef theControl, ControlPartCode partCode);

#if GENERATINGCFM
RoutineDescriptor 	gScrollbarPeerActionProcRD = BUILD_ROUTINE_DESCRIPTOR(uppControlActionProcInfo, &ScrollbarPeerActionProc);
#else
#define gScrollbarPeerActionProcRD ScrollbarPeerActionProc
#endif

pascal void ScrollbarPeerActionProc(ControlRef theControl, ControlPartCode partCode)
{
	Hsun_awt_macos_MScrollbarPeer		*scrollbarPeerHandle = (Hsun_awt_macos_MScrollbarPeer *)PaneToPeer(gCurrentScrollbar);
	Classsun_awt_macos_MScrollbarPeer	*scrollbarPeer = unhand(scrollbarPeerHandle);
	StPortOriginState					savedPortInfo(gCurrentScrollbar->GetMacPort());

	switch (partCode) {
	
		case kControlUpButtonPart:
			gCurrentScrollbar->SetValue(gCurrentScrollbar->GetValue() - scrollbarPeer->mLineIncrement);
			MToolkitExecutJavaDynamicMethod(scrollbarPeerHandle, "lineUp", "(I)V", gCurrentScrollbar->GetValue());
			break;
	
		case kControlDownButtonPart:
			gCurrentScrollbar->SetValue(gCurrentScrollbar->GetValue() + scrollbarPeer->mLineIncrement);
			MToolkitExecutJavaDynamicMethod(scrollbarPeerHandle, "lineDown", "(I)V", gCurrentScrollbar->GetValue());
			break;
	
		case kControlPageUpPart:
			gCurrentScrollbar->SetValue(gCurrentScrollbar->GetValue() - scrollbarPeer->mPageIncrement);
			MToolkitExecutJavaDynamicMethod(scrollbarPeerHandle, "pageUp", "(I)V", gCurrentScrollbar->GetValue());
			break;
	
		case kControlPageDownPart:
			gCurrentScrollbar->SetValue(gCurrentScrollbar->GetValue() + scrollbarPeer->mPageIncrement);
			MToolkitExecutJavaDynamicMethod(scrollbarPeerHandle, "pageDown", "(I)V", gCurrentScrollbar->GetValue());
			break;
			
		default:		
			break;
			
	}

	//	Make sure that we invalidate our current view so that PowerPlant
	//	does not get confused with our extra clipping.
	
	LView::OutOfFocus(NULL);
	
	if (gFirstTimeThroughAction) {
		int64	sleepTime;
		gFirstTimeThroughAction = false;
		LL_I2L(sleepTime, 500);
		PR_Sleep(sleepTime);
	}
	
}

//##############################################################################
//##############################################################################
#pragma mark MComponenPeer IMPLEMENTATION
#pragma mark -


MScrollbarPeer::
MScrollbarPeer(struct SPaneInfo &newScrollbarInfo, UInt32 value, UInt32 min, UInt32 max):
	LStdControl(newScrollbarInfo, msg_Nothing, 0, 0, 0, scrollBarProc, 0, "\p", 0)

{
	SetValue(value);
	SetMinValue(min);
	SetMaxValue(max);
	
	SetActionProc(&gScrollbarPeerActionProcRD);
	
}

MScrollbarPeer::
~MScrollbarPeer()
{
	DisposeJavaDataForPane(this);
}

void 
MScrollbarPeer::HotSpotResult(Int16 inHotSpot)
{
	switch (inHotSpot) {
			
		case kControlIndicatorPart:
			MToolkitExecutJavaDynamicMethod(PaneToPeer(this), "dragAbsolute", "(I)V", GetValue());
			break;
	
		default:		
			break;
			
	}
	
	inherited::HotSpotResult(inHotSpot);
	
}


Boolean 
MScrollbarPeer::TrackHotSpot(Int16 inHotSpot, Point inPoint)
{
	Boolean result;
	gCurrentScrollbar = this;
	valueChanged = false;
	result = inherited::TrackHotSpot(inHotSpot, inPoint);
	FocusDraw();
	Draw(NULL);
	return inHotSpot;
}

Boolean 
MScrollbarPeer::FocusDraw()
{
	Boolean	shouldRefocus = ShouldRefocusAWTPane(this);
	Boolean  result = false;
	gInPaneFocusDraw = true;
	result = inherited::FocusDraw();
	gInPaneFocusDraw = false;
	if (shouldRefocus && result)
		PreparePeerGrafPort(PaneToPeer(this), NULL);
	return result;
}


//##############################################################################
//##############################################################################


void sun_awt_macos_MScrollbarPeer_create(struct Hsun_awt_macos_MScrollbarPeer *scrollbarPeerHandle, struct Hsun_awt_macos_MComponentPeer *hostPeerHandle)
{
	Classsun_awt_macos_MScrollbarPeer	*scrollbarPeer = (Classsun_awt_macos_MScrollbarPeer*)unhand(scrollbarPeerHandle);
	Classjava_awt_Scrollbar				*scrollbarTarget = (Classjava_awt_Scrollbar*)unhand(scrollbarPeer->target);
	LView								*superView = (LView *)PeerToPane(hostPeerHandle);
	struct SPaneInfo					newScrollbarInfo;
	long								currentValue, 
										scrollMin,
										scrollMax;

	memset(&newScrollbarInfo, 0, sizeof(newScrollbarInfo));
	
	newScrollbarInfo.paneID 		= 0xCAFE;
	newScrollbarInfo.visible 		= triState_Off;
	newScrollbarInfo.enabled 		= triState_Off;
	newScrollbarInfo.left			= scrollbarTarget->x;
	newScrollbarInfo.top			= scrollbarTarget->y;
	newScrollbarInfo.width			= scrollbarTarget->width;
	newScrollbarInfo.height			= scrollbarTarget->height;

	newScrollbarInfo.userCon 		= (UInt32)scrollbarPeerHandle;
	newScrollbarInfo.superView		= superView;
	
	currentValue					= scrollbarTarget->value;
	scrollMin						= scrollbarTarget->minimum;
	scrollMax						= scrollbarTarget->maximum;
	
	MScrollbarPeer *scrollbarPane = NULL;
	
	try {
		scrollbarPane = new MScrollbarPeer(newScrollbarInfo, currentValue, scrollMin, scrollMax);
	}
	catch (...) {
		SignalError(0, JAVAPKG "OutOfMemoryError", 0);
		return;
	}

	scrollbarPane->SetValue(scrollbarTarget->value);
	
	scrollbarPane->Enable();

	scrollbarPeer->mOwnerPane = (long)scrollbarPane;
	scrollbarPeer->mLineIncrement = 1;
	scrollbarPeer->mPageIncrement = 10;

	ClearCachedAWTRefocusPane();

}

void sun_awt_macos_MScrollbarPeer_setValue(struct Hsun_awt_macos_MScrollbarPeer *scrollbarPeerHandle, SInt32 value)
{
	MScrollbarPeer *scrollbarPane = (MScrollbarPeer *)PeerToPane((Hsun_awt_macos_MComponentPeer *)scrollbarPeerHandle);
	if (scrollbarPane == NULL)
		return;
	scrollbarPane->SetValue(value);
}

void sun_awt_macos_MScrollbarPeer_setValues(struct Hsun_awt_macos_MScrollbarPeer *scrollbarPeerHandle, SInt32 value, SInt32 visible, SInt32 minimum, SInt32 maximum)
{
	MScrollbarPeer *scrollbarPane = (MScrollbarPeer *)PeerToPane((Hsun_awt_macos_MComponentPeer *)scrollbarPeerHandle);
	if (scrollbarPane == NULL)
		return;
	scrollbarPane->SetValue(value);
	scrollbarPane->SetMinValue(minimum);
	scrollbarPane->SetMaxValue(maximum);
}

void sun_awt_macos_MScrollbarPeer_setLineIncrement(struct Hsun_awt_macos_MScrollbarPeer *scrollbarPeerHandle, SInt32 value)
{
	Classsun_awt_macos_MScrollbarPeer 	*scrollbarPeer = unhand(scrollbarPeerHandle);
	if (scrollbarPeer == NULL)
		return;
	scrollbarPeer->mLineIncrement = value;
}

void sun_awt_macos_MScrollbarPeer_setPageIncrement(struct Hsun_awt_macos_MScrollbarPeer *scrollbarPeerHandle, SInt32 value)
{
	Classsun_awt_macos_MScrollbarPeer 	*scrollbarPeer = unhand(scrollbarPeerHandle);
	if (scrollbarPeer == NULL)
		return;
	scrollbarPeer->mPageIncrement = value;
}