osxcontrol.cpp

来自「这是VCF框架的代码」· C++ 代码 · 共 945 行 · 第 1/2 页

CPP
945
字号
//OSXControl.cpp/*Copyright 2000-2004 The VCF Project.Please see License.txt in the top level directorywhere you installed the VCF.*/#include "vcf/ApplicationKit/ApplicationKit.h"#include "vcf/ApplicationKit/ApplicationKitPrivate.h"#include "vcf/ApplicationKit/OSXControl.h"#include "vcf/ApplicationKit/WindowPeer.h"#include "vcf/ApplicationKit/OSXLightweightControl.h"#include "vcf/ApplicationKit/OSXWindow.h"#include "vcf/ApplicationKit/OSXCursorPeer.h"class OSXControlView : public TView {public:		OSXControlView( HIViewRef inControl ):		TView(inControl){			}		virtual ~OSXControlView() {		}	virtual OSStatus Initialize( TCarbonEvent& inEvent ) {		OSStatus res = TView::Initialize( inEvent );				return res;	}			virtual UInt32 GetBehaviors() {		return TView::GetBehaviors() | kHIViewAllowsSubviews | kHIViewDoesNotUseSpecialParts;            //kControlSupportsEmbedding | kControlSupportsFocus |            //kControlWantsActivate | kControlHandlesTracking |            //kControlGetsFocusOnClick | kControlSupportsClickActivation;	}			virtual ControlPartCode HitTest( const HIPoint& inWhere ) {		ControlPartCode		part;				// Is the mouse in the view?		if ( CGRectContainsPoint( Bounds(), inWhere ) )			part = 1;		else			part = kControlNoPart;				return part;	}										virtual ControlKind GetKind() {		const ControlKind result = { 'OSXv', 'OSXc' };			return result;	}		virtual OSStatus GetRegion( ControlPartCode inPart, RgnHandle outRgn ) {		OSStatus			err = noErr;		TRect				bounds;		Rect				qdBounds;				if ( inPart == kControlContentMetaPart				|| inPart == kControlStructureMetaPart				/* || inPart == kControlOpaqueRegionMetaPart */ )		{			bounds = Bounds();			qdBounds = bounds;					RectRgn( outRgn, &qdBounds );		}				return err;	}	virtual void Draw( RgnHandle inLimitRgn, CGContextRef inContext, GrafPtr port ) {		}	protected:};namespace VCF {static const EventTypeSpec osxHIViewEvents[] ={	{ kEventClassCommand, kEventCommandProcess },	{ kEventClassCommand, kEventCommandUpdateStatus },		{ kEventClassControl, kEventControlInitialize },	{ kEventClassControl, kEventControlDraw },	{ kEventClassControl, kEventControlHitTest },	{ kEventClassControl, kEventControlGetPartRegion },	{ kEventClassControl, kEventControlGetData },	{ kEventClassControl, kEventControlSetData },	{ kEventClassControl, kEventControlGetOptimalBounds },	{ kEventClassControl, kEventControlBoundsChanged },	{ kEventClassControl, kEventControlTrack },	{ kEventClassControl, kEventControlGetSizeConstraints },	{ kEventClassControl, kEventControlHit },	{ kEventClassControl, kEventControlOwningWindowChanged },		{ kEventClassKeyboard, kEventRawKeyDown },	{ kEventClassKeyboard, kEventRawKeyUp },	{ kEventClassControl, kEventControlHiliteChanged },	{ kEventClassControl, kEventControlActivate },	{ kEventClassControl, kEventControlDeactivate },	{ kEventClassControl, kEventControlValueFieldChanged },	{ kEventClassControl, kEventControlTitleChanged },	{ kEventClassControl, kEventControlEnabledStateChanged },	{ kEventClassControl, kEventControlOwningWindowChanged },    { kEventClassControl, kEventControlSetFocusPart }    };OSXControl::OSXControl( Control* control ):	hiView_(NULL),	control_(control),	handlerRef_(NULL),	mouseState_(OSXControl::msNoState){	lastMousePt_.h = 0;	lastMousePt_.v = 0;}OSXControl::~OSXControl(){}OSHandleID OSXControl::getHandleID(){	return (OSHandleID) hiView_;}EventHandlerUPP OSXControl::getEventHandlerUPP(){    static EventHandlerUPP result = NULL;    if ( NULL == result ) {        result = NewEventHandlerUPP( OSXControl::handleOSXEvents );    }    return result;}OSXControl* OSXControl::getControlFromControlRef( ControlRef control ){	OSXControl* result = NULL;		if ( noErr != GetControlProperty( control, VCF_PROPERTY_CREATOR, 									  VCF_PROPERTY_CONTROL_VAL, 									  sizeof(OSXControl*), NULL, &result ) ) {		result = NULL;	}	return result;}OSStatus OSXControl::installStdControlHandler(){	VCF_ASSERT( hiView_ != NULL );		return InstallEventHandler( GetControlEventTarget( hiView_ ), 							OSXControl::getEventHandlerUPP(),							sizeof(osxHIViewEvents) / sizeof(EventTypeSpec), 							osxHIViewEvents, 							this, 							&handlerRef_ );}void OSXControl::create( Control* owningControl ){	TRect bounds(0,0,0,0);		if ( noErr == ViewCreator<OSXControlView>::create( &hiView_, bounds, NULL ) ) {				control_ = owningControl;		OSXControl* thisPtr = this;		SetControlProperty( hiView_, 							VCF_PROPERTY_CREATOR, 							VCF_PROPERTY_CONTROL_VAL, 							sizeof(thisPtr), 							&thisPtr );		OSStatus err = installStdControlHandler();		if ( err != noErr ) {			throw RuntimeException( MAKE_ERROR_MSG_2("InstallEventHandler failed for OSXControl!") );		}	}	else {		throw RuntimeException( MAKE_ERROR_MSG_2("OSXControl failed to be created!") );	}}void OSXControl::destroyControl(){}void OSXControl::setBounds( Rect* rect ){	TRect r( rect->left_, rect->top_, rect->getWidth(), rect->getHeight() );		HIViewSetFrame( hiView_, r );}bool OSXControl::beginSetBounds( const ulong32& numberOfChildren ){	return true;}void OSXControl::endSetBounds(){}Rect OSXControl::getBounds(){	Rect result;		HIRect		frame;		HIViewGetFrame( hiView_, &frame );		TRect r = frame;		result.setRect( r.origin.x, r.origin.y, r.origin.x + r.size.width, r.origin.y + r.size.height ); 		return result;}void OSXControl::setVisible( const bool& visible ){	HIViewSetVisible( hiView_, visible );}bool OSXControl::getVisible(){	return IsControlVisible(hiView_) ? true : false;}Control* OSXControl::getControl(){	return control_;}void OSXControl::setControl( Control* component ){	control_ = component;}void OSXControl::setCursor( Cursor* cursor ){	if (NULL == cursor) {		return;	}		OSXCursorPeer *peer = (OSXCursorPeer*)cursor->getPeer();		if (NULL == peer) {		return;	}		if (peer->isSystemCursor()){		SetThemeCursor(peer->getCursorID());	}	}void OSXControl::setParent( Control* parent ){	Frame* windowParent = NULL;		if ( parent->isLightWeight() ) {		OSXLightweightControl* lwPeer = dynamic_cast<OSXLightweightControl*>(parent->getPeer());		if ( NULL != lwPeer ) {			Control* lwParent = lwPeer->getHeavyWeightParent();			if ( NULL != lwParent ) {				windowParent = dynamic_cast<Frame*>(lwParent);			}		}	}	else {		windowParent = dynamic_cast<Frame*>(parent);	}			if ( NULL != windowParent ) { 		OSXWindow* osxWnd = dynamic_cast<OSXWindow*>(windowParent->getPeer());		WindowRef wnd = (WindowRef) osxWnd->getHandleID();				ControlRef contentView = osxWnd->getRootControl();									OSStatus err = HIViewAddSubview( contentView, hiView_ );			}	else {		ControlRef parentControlRef = (ControlRef)parent->getPeer()->getHandleID();		OSStatus err = HIViewAddSubview( parentControlRef, hiView_ );		if ( err != noErr ) {			StringUtils::traceWithArgs( Format("HIViewAddSubview failed, err: %d\n") % err );		}	}}Control* OSXControl::getParent(){	Control* result = NULL;	HIViewRef parentRef = HIViewGetSuperview( hiView_ );			OSXControl* parentPeer = OSXControl::getControlFromControlRef( parentRef );	if ( NULL != parentPeer ) {		result = parentPeer->getControl();	}		return result;}bool OSXControl::isFocused(){	WindowRef wnd = GetControlOwner( hiView_ );	ControlRef focusedControl = NULL;	GetKeyboardFocus( wnd, &focusedControl );			return ( hiView_ == focusedControl ) ? true : false;}void OSXControl::setFocused(){    EventModifiers mods = 0;	HIViewAdvanceFocus( hiView_, mods );    }bool OSXControl::isEnabled(){	return IsControlEnabled( hiView_ ) ? true : false;}void OSXControl::setEnabled( const bool& enabled ){	if ( enabled ) {		EnableControl( hiView_ );	}	else {		DisableControl( hiView_ );	}}void OSXControl::setFont( Font* font ){	String fontName = font->getName();		SInt16 iFONDNumber = 0;    Str255 pStr;    CopyCStringToPascal( fontName.empty() ? "Arial" : fontName.ansi_c_str(), pStr );	iFONDNumber = FMGetFontFamilyFromName( pStr );		ControlFontStyleRec fontRec = {0};	fontRec.flags = kControlUseForeColorMask | kControlUseFontMask | kControlUseSizeMask | kControlUseFaceMask;	fontRec.font = iFONDNumber;	fontRec.size = font->getPointSize();	if ( font->getBold() ) {		fontRec.style |= 1;	}		if ( font->getItalic() ) {		fontRec.style |= 2;	}		if ( font->getUnderlined() ) {		fontRec.style |= 4;	}		Color* color = font->getColor();	color->getRGB16( fontRec.foreColor.red, fontRec.foreColor.green, fontRec.foreColor.blue );	SetControlFontStyle( hiView_, &fontRec );	}void OSXControl::repaint( Rect* repaintRect, const bool& immediately ){	HIViewSetNeedsDisplay( hiView_, true );}void OSXControl::keepMouseEvents(){}void OSXControl::releaseMouseEvents(){}void OSXControl::translateToScreenCoords( Point* pt ){	HIPoint tmpPt;	tmpPt.x = pt->x_;	tmpPt.y = pt->y_;		HIViewConvertPoint( &tmpPt, hiView_, NULL );	::Rect r;	GetWindowBounds( GetControlOwner(hiView_), kWindowStructureRgn, &r );	tmpPt.x += r.left;	tmpPt.y += r.top;		pt->x_ = tmpPt.x;	pt->y_ = tmpPt.y;	}void OSXControl::translateFromScreenCoords( Point* pt ){	HIPoint tmpPt;	tmpPt.x = pt->x_;	tmpPt.y = pt->y_;	::Rect r;	GetWindowBounds( GetControlOwner(hiView_), kWindowStructureRgn, &r );	tmpPt.x -= r.left;	tmpPt.y -= r.top;		HIViewConvertPoint( &tmpPt, NULL, hiView_ );			pt->x_ = tmpPt.x;	pt->y_ = tmpPt.y;}OSStatus OSXControl::handleOSXEvents(EventHandlerCallRef nextHandler, EventRef theEvent, void* userData){	OSXControl* control = (OSXControl*)userData;        return control->handleOSXEvent( nextHandler, theEvent );}void OSXControl::setBorder( Border* border ){	//cause the control to repaint itself!	repaint(NULL,false);}OSStatus OSXControl::handleWrappedControlHitTest( EventRef theEvent ){	GetEventParameter( theEvent, kEventParamMouseLocation, typeQDPoint, NULL,					   sizeof (lastMousePt_), NULL, &lastMousePt_);		OSXEventMsg msg( theEvent, control_ );		Event* mouseMove = UIToolkit::createEventFromNativeOSEventData( &msg );	if ( NULL != mouseMove ) {		control_->handleEvent( mouseMove );		mouseMove->free();	}		return noErr;}OSStatus OSXControl::handleWrappedControlTrack( EventRef theEvent ){	//first fire off a mouse down event!	mouseState_ = OSXControl::msDown;			OSXEventMsg msg( theEvent, control_ );

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?