osxdragdroppeer.cpp
来自「这是VCF框架的代码」· C++ 代码 · 共 230 行
CPP
230 行
//OSXDragDropPeer.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/OSXDragDropPeer.h"using namespace VCF; OSXDragDropPeer::OSXDragDropPeer(): dragSrc_(NULL), dataObj_(NULL), actionType_((DragActionType)0){ }OSXDragDropPeer::~OSXDragDropPeer(){ }DragActionType OSXDragDropPeer::startDragDrop( DataObject* cdo ){ dataObj_ = cdo; //init pasteboard CFRefObject<PasteboardRef> pasteboard; if ( noErr != PasteboardCreate( kPasteboardUniqueName, &pasteboard ) ) { throw RuntimeException( MAKE_ERROR_MSG_2("PasteboardCreate Failed to create pasteboard with kPasteboardUniqueName.") ); } PasteboardClear( pasteboard ); PasteboardSynchronize( pasteboard ); //transfer data CFTextString flavor; Enumerator<String>* dataTypes = cdo->getSupportedDataTypes(); while ( dataTypes->hasMoreElements() ) { CFTextString type; type = dataTypes->nextElement(); /* if ( type == STRING_DATA_TYPE ) { flavor = CFSTR("com.apple.traditional-mac-plain-text"); } else if ( type == RTF_DATA_TYPE ) { flavor = CFSTR(""); } else if ( type == INTEGER_DATA_TYPE ) { //flavor = kUTTypeRTF; } else if ( type == OBJECT_DATA_TYPE ) { //flavor = kUTTypeRTF; } else if ( type == FILE_DATA_TYPE ) { flavor = CFSTR(""); } else if ( type == BYTE_STREAM_DATA_TYPE ) { //flavor = kUTTypeFileURL; } else if ( type == IMAGE_DATA_TYPE ) { flavor = CFSTR(""); //assume PNG for default image type } else if ( type == COMPONENT_DATA_TYPE ) { //we need a custom type!!! //flavor = kUTTypePlainText; //assume PNG for default image type } */ flavor = UTTypeCreatePreferredIdentifierForTag( kUTTagClassMIMEType, type, NULL ); BasicOutputStream memStream; if ( cdo->saveToStream( type, &memStream ) ) { memStream.seek( 0, stSeekFromStart ); CFRefObject<CFDataRef> dataRef = CFDataCreate( NULL, (const UInt8*)memStream.getBuffer(), memStream.getSize() ); if ( noErr != PasteboardPutItemFlavor( pasteboard, cdo, flavor, dataRef, 0 ) ) { throw RuntimeException( MAKE_ERROR_MSG_2("PasteboardPutItemFlavor failed to add new data.") ); } } } //now prep for the drag DragRef drag; ::Point trackPoint,localPoint; RgnHandle theRegion, insetRegion; if ( noErr != NewDragWithPasteboard( pasteboard, &drag ) ) { throw RuntimeException( MAKE_ERROR_MSG_2("NewDragWithPasteboard failed to create a new drag ref.") ); } //adjust the track point by retreiving the //global mouse coordinates GetGlobalMouse( &trackPoint ); localPoint.h = trackPoint.h; localPoint.v = trackPoint.v; GlobalToLocal( &localPoint ); //init the region to use - setup a 10X10 square that will just outline a box theRegion = NewRgn(); insetRegion = NewRgn(); SetRectRgn( theRegion, localPoint.h - 10, localPoint.v - 10, localPoint.h + 10, localPoint.v + 10 ); CopyRgn( theRegion, insetRegion ); InsetRgn( insetRegion, 1, 1 ); DiffRgn(theRegion, insetRegion, theRegion ); DisposeRgn( insetRegion ); //set callbacks here SetDragInputProc( drag, OSXDragDropPeer::DragInputFunction, this ); //now init a fake EventRecord to pass to TrackDrag EventRecord fakeEvent; fakeEvent.what = mouseDown; fakeEvent.message = 0; fakeEvent.when = TickCount(); fakeEvent.where.h = localPoint.h; fakeEvent.where.v = localPoint.v; fakeEvent.modifiers = 0; OSStatus err = TrackDrag( drag, &fakeEvent, theRegion ); DisposeRgn( theRegion ); DisposeDrag( drag ); SetThemeCursor( kThemeArrowCursor ); return actionType_;}void OSXDragDropPeer::setActionType( const VCF::DragActionType& actionType ){ actionType_ = actionType;}void OSXDragDropPeer::setDragSource( VCF::DragSource* dragSource ){ dragSrc_ = dragSource;}OSErr OSXDragDropPeer::DragInputFunction ( ::Point * mouse, SInt16 * modifiers, void * dragInputRefCon, DragRef theDrag){ OSXDragDropPeer* peer = (OSXDragDropPeer*)dragInputRefCon; DragSourceEvent event(peer->dragSrc_, peer->dataObj_); event.setType( DragSource::DRAG_CANCONTINUE ); event.setActionType( peer->dragSrc_->getActionType() ); peer->dragSrc_->SourceCanContinueDragOp.fireEvent( &event ); DragSourceEvent event2(peer->dragSrc_, peer->dataObj_); event2.setType( DragSource::DRAG_GIVEFEEDBACK ); event2.setActionType( peer->dragSrc_->getActionType() ); peer->dragSrc_->SourceGiveFeedback.fireEvent( &event2 ); switch ( event2.getAction() ) { case daNone : { SetThemeCursor( kThemeNotAllowedCursor ); } break; case daCopy : { SetThemeCursor( kThemeCopyArrowCursor ); } break; case daMove : { SetThemeCursor( kThemeClosedHandCursor ); } break; case daLink : { SetThemeCursor( kThemeAliasArrowCursor ); } break; } return noErr;}/***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.2 2005/12/04 20:58:32 ddiego*more osx impl work. foundationkit is mostly complete now.**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.3 2005/06/27 03:28:54 ddiego*more osx work.**Revision 1.1.2.2 2005/06/23 01:26:55 ddiego*build updates**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 + -
显示快捷键?