osxdroptargetpeer.cpp

来自「这是VCF框架的代码」· C++ 代码 · 共 265 行

CPP
265
字号
//OSXDropTargetPeer.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/OSXDropTargetPeer.h"#include "vcf/ApplicationKit/OSXClipboard.h"using namespace VCF;OSXDropTargetPeer::OSXDropTargetPeer():	dropTarget_(NULL),	eventHandlerRef_(NULL),	currentDataObj_(NULL){	}OSXDropTargetPeer::~OSXDropTargetPeer(){	}void OSXDropTargetPeer::registerTarget( Control* control ){	static EventTypeSpec dropTargetEvents[] =			{				{ kEventClassControl, kEventControlDragEnter },				{ kEventClassControl, kEventControlDragWithin },				{ kEventClassControl, kEventControlDragLeave },				{ kEventClassControl, kEventControlDragReceive }			};				ControlRef ctrlRef = (ControlRef) control->getPeer()->getHandleID();		InstallEventHandler(GetControlEventTarget(ctrlRef), OSXDropTargetPeer::handleDropTargetEvents, 						sizeof(dropTargetEvents)/sizeof(EventTypeSpec), 						dropTargetEvents, this, &eventHandlerRef_ );							SetControlDragTrackingEnabled( ctrlRef, true );	SetAutomaticControlDragTrackingEnabledForWindow( GetControlOwner(ctrlRef), true );}void OSXDropTargetPeer::unregisterTarget( Control* control ){	RemoveEventHandler( eventHandlerRef_ );	ControlRef ctrlRef = (ControlRef) control->getPeer()->getHandleID();	SetControlDragTrackingEnabled( ctrlRef, false );}VCF::DropTarget* OSXDropTargetPeer::getDropTarget(){	return dropTarget_;}void OSXDropTargetPeer::setDropTarget( VCF::DropTarget* dropTarget ){	dropTarget_ = dropTarget;}void OSX_ShowDragCursor( DragActionType action ) {	switch ( action ) {		case daNone : {			SetThemeCursor(  kThemeNotAllowedCursor );		}		break;				case daCopy : {			SetThemeCursor(  kThemeCopyArrowCursor );		}		break;				case daMove : {			SetThemeCursor(  kThemeArrowCursor );		}		break;				case daLink : {			SetThemeCursor(  kThemeAliasArrowCursor );		}		break;	}}	OSStatus OSXDropTargetPeer::handleDropTargetEvents (EventHandlerCallRef inHandlerCallRef, EventRef inEvent, void *inUserData){	OSStatus result = eventNotHandledErr;			StringUtils::trace( "OSXDropTargetPeer::handleDropTargetEvents" );		OSXDropTargetPeer* peer = (OSXDropTargetPeer*)inUserData;	VCF::DropTarget* target = peer->getDropTarget();		EventClass	eventClass = GetEventClass( inEvent );	EventKind	eventKind = GetEventKind( inEvent );	::Point mousePos;	GetEventParameter( inEvent, kEventParamMouseLocation, typeQDPoint, NULL,                                sizeof (mousePos), NULL, &mousePos);									VCF::Point dragPt( mousePos.h ,						   mousePos.v );						   	UInt32 keyboardModifier = 0;	GetEventParameter( inEvent, kEventParamKeyModifiers, typeUInt32, NULL,                                sizeof (keyboardModifier), NULL, &keyboardModifier);		DragActionType action = daNone;																if ( (keyboardModifier & cmdKey) && (keyboardModifier & optionKey) ) {		//link		action = daLink;    }	else if ( keyboardModifier & optionKey ) {		//copy		action = daCopy;	}	else {		//move		action = daMove;	}		switch( eventClass ) {		case kEventClassControl : {			switch ( eventKind ) {				case kEventControlDragEnter : {										PasteboardRef   pasteboard;					DragRef drag = NULL;					GetEventParameter( inEvent, kEventParamDragRef, typeDragRef, NULL,                                sizeof (drag), NULL, &drag);													if ( noErr == GetDragPasteboard( drag, &pasteboard ) ) {						peer->currentDataObj_ = new VCF::DataObject();						OSXClipboard::initDataObjectFromPasteBoard( pasteboard, peer->currentDataObj_ );												VCF::DropTargetEvent event( target, peer->currentDataObj_ );												event.setType( DropTarget::DRAG_ENTERED );						event.setActionType( action );						event.setDropPoint( dragPt );						target->handleEvent( &event );												if ( event.getAction() == daNone ) {							result = eventNotHandledErr;						}						else {							Boolean val = true;							SetEventParameter( inEvent, kEventParamControlWouldAcceptDrop, typeBoolean,												sizeof(Boolean), &val );							result = noErr;						}												OSX_ShowDragCursor( event.getAction() );					}									}				break;								case kEventControlDragWithin : {															VCF::DropTargetEvent event( target, peer->currentDataObj_ );					event.setType( DropTarget::DRAGGING_OVER );					event.setDropPoint( dragPt );					event.setActionType( action );					target->handleEvent( &event );										OSX_ShowDragCursor( event.getAction() );										result = noErr;				}				break;								//this is the last event in the series				//clean up the currentDataObj_ instance				case kEventControlDragLeave : {										VCF::DropTargetEvent event( target, NULL );					event.setType( DropTarget::DRAG_LEFT );					target->handleEvent( &event );										if ( NULL != peer->currentDataObj_ ) {						peer->currentDataObj_->free();						peer->currentDataObj_ = NULL;					}										result = noErr;				}				break;								//clean up the currentDataObj_ instance				//recreate a new instance, this time with data				case kEventControlDragReceive : {														if ( NULL != peer->currentDataObj_ ) {						peer->currentDataObj_->free();						peer->currentDataObj_ = NULL;					}					DragRef drag = NULL;					GetEventParameter( inEvent, kEventParamDragRef, typeDragRef, NULL,                                sizeof (drag), NULL, &drag);													PasteboardRef   pasteboard;					if ( noErr == GetDragPasteboard( drag, &pasteboard ) ) {						peer->currentDataObj_ = OSXClipboard::createDataObjectFromPasteBoard( pasteboard );												VCF::DropTargetEvent event( target, peer->currentDataObj_ );												event.setType( DropTarget::DRAG_DROPPED );						target->handleEvent( &event );												if ( NULL != peer->currentDataObj_ ) {							peer->currentDataObj_->free();							peer->currentDataObj_ = NULL;						}												result = noErr;					}				}				break;			}		}		break;	}			return result;}/***CVS Log info*$Log$*Revision 1.3  2006/04/07 02:35:24  ddiego*initial checkin of merge from 0.6.9 dev branch.**Revision 1.2.2.3  2005/12/04 20:58:32  ddiego*more osx impl work. foundationkit is mostly complete now.**Revision 1.2.2.2  2005/11/30 05:31:35  ddiego*further osx drag-drop updates.**Revision 1.2.2.1  2005/11/27 23:55:44  ddiego*more osx updates.**Revision 1.2  2005/07/09 23:14:54  ddiego*merging in changes from devmain-0-6-7 branch.**Revision 1.1.2.2  2005/06/27 03:28:54  ddiego*more osx work.**Revision 1.1.2.1  2005/06/22 03:59:30  ddiego*added osx stub classes for peers***/

⌨️ 快捷键说明

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