osxwindow.cpp

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

CPP
1,149
字号
//OSXWindow.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/OSXWindow.h"#include "vcf/ApplicationKit/OSXControl.h"#include "vcf/ApplicationKit/OSXCursorPeer.h"class WndSwitchPort {public:	WndSwitchPort( WindowRef ptr ) :current(GetWindowPort(ptr)){		GetPort( &old );		if ( old != current ) {			//make switch			SetPort( current ) ;		}	}	~WndSwitchPort() {		if ( old != current ) {			//make switch			SetPort( old ) ;		}	}	operator GrafPtr () {		return current;	}private:	GrafPtr current;	GrafPtr old;	WndSwitchPort( const WndSwitchPort& rhs );	WndSwitchPort& operator=(const WndSwitchPort& rhs );};namespace VCF {OSXWindow::OSXWindow():	windowRef_(0),	control_(NULL),	handlerRef_(NULL),	internalClose_(false),	mouseTrackRef_(NULL),	currentMouseBtn_(0),	contentViewHandlerRef_(NULL){}OSXWindow::OSXWindow( Control* control, Control* owner ):	windowRef_(0),	control_(control),	handlerRef_(NULL),	internalClose_(false),	mouseTrackRef_(NULL),	currentMouseBtn_(0),	contentViewHandlerRef_(NULL){}OSXWindow::~OSXWindow(){}EventHandlerUPP OSXWindow::getEventHandlerUPP(){	static EventHandlerUPP result = NULL;	if ( NULL == result ) {		result = NewEventHandlerUPP( OSXWindow::handleOSXEvents );	}	return result;}WindowAttributes OSXWindow::getCreationWinAttrs(){	return kWindowCloseBoxAttribute | kWindowFullZoomAttribute | kWindowCollapseBoxAttribute |			  kWindowResizableAttribute | kWindowCloseBoxAttribute | kWindowCompositingAttribute |			  kWindowStandardHandlerAttribute | kWindowLiveResizeAttribute | kWindowInWindowMenuAttribute;}WindowClass OSXWindow::getCreationWinClass(){	return kDocumentWindowClass;}void OSXWindow::create( Control* owningControl ){	WindowAttributes attrs=getCreationWinAttrs();// = kWindowCompositingAttribute | kWindowStandardHandlerAttribute;		::Rect bounds = {0,0,0,0};	OSStatus err = CreateNewWindow( getCreationWinClass(), attrs, &bounds, &windowRef_ );	if ( noErr != err ) {		throw RuntimeException( MAKE_ERROR_MSG_2("CreateNewWindow() failed!") );	}	else {		OSXWindow* thisPtr = this;		err = SetWindowProperty( windowRef_, 								VCF_PROPERTY_CREATOR, 								VCF_PROPERTY_WINDOW_VAL, 								sizeof(OSXWindow*), 								&thisPtr );		if ( noErr != err ) {			throw RuntimeException( MAKE_ERROR_MSG_2("SetWindowProperty() failed!") );		}				SetThemeWindowBackground( windowRef_, kThemeBrushSheetBackgroundTransparent, true );		static EventTypeSpec eventsToHandle[] ={		                    // { kEventClassWindow, kEventWindowGetIdealSize },		                    { kEventClassCommand, kEventCommandProcess },		                    //{ kEventClassCommand, kEventCommandUpdateStatus },		                    { kEventClassWindow, kEventWindowClose },		                    { kEventClassWindow, kEventWindowActivated },		                    { kEventClassWindow, kEventWindowDeactivated },		                    { kEventClassWindow, kEventWindowFocusAcquired },		                    { kEventClassWindow, kEventWindowFocusRelinquish },		                    { kEventClassWindow, kEventWindowDrawContent },		                    { kEventClassMouse, kEventMouseDown },		                    { kEventClassMouse, kEventMouseUp },		                    { kEventClassMouse, kEventMouseMoved },		                    { kEventClassMouse, kEventMouseDragged },		                    { kEventClassMouse, kEventMouseEntered },		                    { kEventClassMouse, kEventMouseExited },		                    { kEventClassMouse, kEventMouseWheelMoved },		                    { kEventClassKeyboard, kEventRawKeyDown },		                    { kEventClassKeyboard, kEventRawKeyUp },		                    { kEventClassWindow, kEventWindowBoundsChanged } };		    InstallWindowEventHandler( windowRef_,		                               OSXWindow::getEventHandlerUPP(),		                               sizeof(eventsToHandle)/sizeof(eventsToHandle[0]),		                               eventsToHandle,		                               this,		                               &handlerRef_ );								static EventTypeSpec contentViewEvents[] ={ { kEventClassControl, kEventControlDraw } };				ControlRef root = getRootControl();		InstallEventHandler( GetControlEventTarget( root ), 							OSXWindow::wndContentViewHandler,							sizeof(contentViewEvents) / sizeof(EventTypeSpec), 							contentViewEvents, 							this, 							&contentViewHandlerRef_ );				UIToolkit::postEvent( new GenericEventHandler<Control>( owningControl, &Control::handleEvent ),						new VCF::ComponentEvent( owningControl, Component::COMPONENT_CREATED ),	true );			}}void OSXWindow::destroyControl(){	//StringUtils::trace( "OSXWindow::destroyControl\n" );	//VCF::ComponentEvent event( control_, Component::COMPONENT_DELETED );	//control_->handleEvent( &event );	DisposeWindow( windowRef_ );	StringUtils::traceWithArgs( Format("windowRef_: %p, destroyed\n") % windowRef_ );	//DisposeRgn( mouseTrackRgn_ );	ReleaseMouseTrackingRegion( mouseTrackRef_ );		windowRef_ = NULL;}String OSXWindow::getText(){	VCF::String result;	CFStringRef wndTitle;	CopyWindowTitleAsCFString( windowRef_, &wndTitle );	CFTextString text;	text = wndTitle;	result = text;	return result;}void OSXWindow::setText( const String& text ){	CFTextString wndTitle;	wndTitle = text;	SetWindowTitleWithCFString( windowRef_, wndTitle );}void OSXWindow::setBounds( Rect* rect ){	OSXRect r = rect;	SetWindowBounds( windowRef_, kWindowStructureRgn, r );		if ( NULL != mouseTrackRef_ ) {		ReleaseMouseTrackingRegion( mouseTrackRef_ );	}		GetWindowBounds( windowRef_, kWindowContentRgn, r );			::Rect rgnRect = r;	RgnHandle rgn = NewRgn();	SetRectRgn( rgn, rgnRect.left, rgnRect.top, rgnRect.right, rgnRect.bottom );			MouseTrackingRegionID id;	id.signature = VCF_WINDOW_MOUSE_RGN;	id.id = (SInt32)this;			OSStatus err = CreateMouseTrackingRegion( windowRef_, rgn, NULL, kMouseTrackingOptionsLocalClip,												  id, this, NULL, &mouseTrackRef_ );	if ( noErr == err ) {		RetainMouseTrackingRegion( mouseTrackRef_ );		err = SetMouseTrackingRegionEnabled( mouseTrackRef_, TRUE );	}				DisposeRgn( rgn );				/*	if ( !IsWindowVisible( windowRef_ ) ) {		//send an artificial size event!		if ( !control_->isDestroying() ) {			StringUtils::trace( "Sending artificial size event!" );			VCF::Size sz( rect->getWidth(), rect->getHeight() );			ControlEvent event( control_, sz );										control_->handleEvent( &event );		}							}	*/}bool OSXWindow::beginSetBounds( const ulong32& numberOfChildren ){	return true;}void OSXWindow::endSetBounds(){}Rect OSXWindow::getBounds(){	OSXRect r;	GetWindowBounds( windowRef_, kWindowStructureRgn, r );	VCF::Rect result = r;	return result;}void OSXWindow::setVisible( const bool& visible ){	if ( !visible ) {		HideWindow( windowRef_ );	}	else {		bool doResize = false;		if ( !IsWindowVisible( windowRef_ ) ) {			doResize = true;		}				ShowWindow( windowRef_ );			if ( doResize ) {			control_->getContainer()->resizeChildren( NULL );		}		repaint( NULL,false );	}}bool OSXWindow::getVisible(){	return IsWindowVisible( windowRef_ ) ? true : false;}Control* OSXWindow::getControl(){	return control_;}void OSXWindow::setControl( Control* control ){	control_ = control;}void OSXWindow::setCursor( Cursor* cursor ){	if (NULL == cursor) {		return;	}		OSXCursorPeer *peer = (OSXCursorPeer*)cursor->getPeer();		if (NULL == peer) {		return;	}		if (peer->isSystemCursor()){		SetThemeCursor(peer->getCursorID());	}}void OSXWindow::setParent( Control* parent ){}Control* OSXWindow::getParent(){	return NULL;}bool OSXWindow::isFocused(){	WindowRef wndRef = GetUserFocusWindow();	return (wndRef == windowRef_) ? true : false;}void OSXWindow::setFocused(){	SetUserFocusWindow( windowRef_ );}bool OSXWindow::isEnabled(){	return IsWindowActive( windowRef_ ) ? true : false;}void OSXWindow::setEnabled( const bool& enabled ){	ActivateWindow( windowRef_, enabled ? TRUE : FALSE );}void OSXWindow::setFont( Font* font ){}void OSXWindow::repaint( Rect* repaintRect, const bool& immediately ){	OSXRect r;	if ( NULL == repaintRect ) {		r = getClientBounds();	}	else {		r = repaintRect;	}	HIViewSetNeedsDisplay( getRootControl(), true );	//InvalWindowRect( windowRef_, r );}void OSXWindow::keepMouseEvents(){}void OSXWindow::releaseMouseEvents(){}void OSXWindow::setBorder( Border* border ){	//cause the window to repaint itself!!!	HIViewSetNeedsDisplay( getRootControl(), true );}void OSXWindow::translateToScreenCoords( Point* pt ){	WndSwitchPort port(windowRef_);	::Point point;	point.h = pt->x_;	point.v = pt->y_;	LocalToGlobal( &point );	pt->x_ = point.h;	pt->y_ = point.v;}void OSXWindow::translateFromScreenCoords( Point* pt ){	WndSwitchPort port(windowRef_);	::Point point;	point.h = pt->x_;	point.v = pt->y_;	GlobalToLocal( &point );	pt->x_ = point.h;	pt->y_ = point.v;}Rect OSXWindow::getClientBounds(){	::Rect r;	GetWindowBounds( windowRef_, kWindowContentRgn, &r );	WndSwitchPort port(windowRef_);	::Point pt;	pt.h = r.left;	pt.v = r.top;	VCF::Rect result;	GlobalToLocal(&pt);	result.left_ = pt.h;	result.top_ = pt.v;	pt.h = r.right;	pt.v = r.bottom;	GlobalToLocal(&pt);	result.right_ = pt.h;	result.bottom_ = pt.v;	return result;}void  OSXWindow::setClientBounds( Rect* bounds ){	OSXRect r = bounds;	SetWindowBounds( windowRef_, kWindowContentRgn, r );}void OSXWindow::close(){	if ( !internalClose_ ){		internalClose_ = true;		Application* app = Application::getRunningInstance();		if ( NULL != app ){			Window* mainWindow = app->getMainWindow();			if ( mainWindow == getControl() ){				//::PostMessage( hwnd_, WM_QUIT, 0, 0 );			}		}	}		EventRef closeWindowEvent = NULL;		OSStatus err = CreateEvent( NULL,	                          kEventClassWindow,	                          kEventWindowClose,	                          0,	                          kEventAttributeUserEvent,	                          &closeWindowEvent );		err = SetEventParameter( closeWindowEvent, kEventParamDirectObject,	                         typeWindowRef, sizeof(WindowRef), &windowRef_ );	//SendEventToEventTarget( closeWindowEvent, GetWindowEventTarget(parent) );		//CFRelease( result );		PostEventToQueue( GetCurrentEventQueue(), closeWindowEvent, kEventPriorityStandard );}void OSXWindow::setFrameStyle( const FrameStyleType& frameStyle ){}void OSXWindow::setFrameTopmost( const bool& isTopmost ){}bool OSXWindow::isMaximized(){	return IsWindowInStandardState( windowRef_, NULL, NULL ) ? true : false;}void OSXWindow::setMaximized( const bool maximised ){	if ( maximised ) {		ZoomWindow( windowRef_, inZoomOut, true );	}	else {		ZoomWindow( windowRef_, inZoomIn, false );	}}bool OSXWindow::isMinimized(){	return IsWindowCollapsed( windowRef_ ) ? true : false;}void OSXWindow::setMinimized( const bool& minimized ){	CollapseWindow( windowRef_, minimized );}void OSXWindow::restore(){}void OSXWindow::setIconImage( Image* icon ){}OSStatus OSXWindow::handleOSXEvent(  EventHandlerCallRef nextHandler, EventRef theEvent ){	OSStatus result = eventNotHandledErr;		Event* vcfEvent = NULL;		OSXEventMsg msg( theEvent, control_ );	//Event* vcfEvent = UIToolkit::createEventFromNativeOSEventData( &msg );	UInt32 whatHappened = GetEventKind (theEvent);	UInt32 attributes = 0;   		if ( GetEventClass( theEvent ) !=  kEventClassMouse ) {		OSXEventMsg msg( theEvent, control_ );		vcfEvent = UIToolkit::createEventFromNativeOSEventData( &msg );	}	switch ( GetEventClass( theEvent ) ) {		case kEventClassMouse : {			::Point mousePos;			GetEventParameter( theEvent, kEventParamMouseLocation, typeQDPoint, NULL,			                   sizeof (mousePos), NULL, &mousePos);			VCF::Point pt( mousePos.h , 						   mousePos.v );			switch( whatHappened ) {				case kEventMouseMoved : {										result = CallNextEventHandler( nextHandler, theEvent );										//try and discover the control this event is over. if 					//getControlForMouseEvent() returns NULL then use the

⌨️ 快捷键说明

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