⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dnd.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
///////////////////////////////////////////////////////////////////////////////// Name:        src/mac/classic/dnd.cpp// Purpose:     wxDropTarget, wxDropSource, wxDataObject implementation// Author:      Stefan Csomor// Modified by:// Created:     1998-01-01// RCS-ID:      $Id: dnd.cpp,v 1.10 2006/06/19 20:18:32 ABX Exp $// Copyright:   (c) 1998 Stefan Csomor// Licence:     wxWindows licence///////////////////////////////////////////////////////////////////////////////#include "wx/wxprec.h"#ifdef __BORLANDC__    #pragma hdrstop#endif#if wxUSE_DRAG_AND_DROP#include "wx/dnd.h"#ifndef WX_PRECOMP    #include "wx/app.h"    #include "wx/window.h"    #include "wx/toplevel.h"    #include "wx/gdicmn.h"#endif // WX_PRECOMP#include "wx/mac/private.h"// ----------------------------------------------------------------------------// global// ----------------------------------------------------------------------------void wxMacEnsureTrackingHandlersInstalled() ;typedef struct{    wxWindow* m_currentTargetWindow ;    wxDropTarget* m_currentTarget ;    wxDropSource* m_currentSource ;} MacTrackingGlobals ;MacTrackingGlobals gTrackingGlobals ;//----------------------------------------------------------------------------// wxDropTarget//----------------------------------------------------------------------------wxDropTarget::wxDropTarget( wxDataObject *data )            : wxDropTargetBase( data ){    wxMacEnsureTrackingHandlersInstalled() ;}wxDragResult wxDropTarget::OnDragOver( wxCoord WXUNUSED(x),                                       wxCoord WXUNUSED(y),                                       wxDragResult def ){    return CurrentDragHasSupportedFormat() ? def : wxDragNone;}bool wxDropTarget::OnDrop( wxCoord WXUNUSED(x), wxCoord WXUNUSED(y) ){    if (!m_dataObject)        return false;    return CurrentDragHasSupportedFormat() ;}wxDragResult wxDropTarget::OnData( wxCoord WXUNUSED(x), wxCoord WXUNUSED(y),                                   wxDragResult def ){    if (!m_dataObject)        return wxDragNone;    if (!CurrentDragHasSupportedFormat())        return wxDragNone;    return GetData() ? def : wxDragNone;}bool wxDropTarget::CurrentDragHasSupportedFormat(){    bool supported = false ;    if ( gTrackingGlobals.m_currentSource != NULL )    {        wxDataObject* data = gTrackingGlobals.m_currentSource->GetDataObject() ;        if ( data )        {            size_t formatcount = data->GetFormatCount() ;            wxDataFormat *array = new wxDataFormat[ formatcount  ];            data->GetAllFormats( array );            for (size_t i = 0; !supported && i < formatcount ; i++)            {                wxDataFormat format = array[i] ;                if ( m_dataObject->IsSupported( format ) )                {                    supported = true ;                    break ;                }            }            delete[] array ;        }    }    if ( !supported )    {        UInt16 items ;        OSErr result;        CountDragItems((DragReference)m_currentDrag, &items);        for (UInt16 index = 1; index <= items && supported == false ; ++index)        {            ItemReference theItem;            FlavorType theType ;            UInt16 flavors = 0 ;            GetDragItemReferenceNumber((DragReference)m_currentDrag, index, &theItem);            CountDragItemFlavors( (DragReference)m_currentDrag, theItem , &flavors ) ;            for ( UInt16 flavor = 1 ; flavor <= flavors ; ++flavor )            {                result = GetFlavorType((DragReference)m_currentDrag, theItem, flavor , &theType);                if ( m_dataObject->IsSupportedFormat( wxDataFormat( theType ) ) )                {                    supported = true ;                    break ;                }            }        }    }    return supported ;}bool wxDropTarget::GetData(){    if (!m_dataObject)        return false;    if ( !CurrentDragHasSupportedFormat() )        return false ;    bool transferred = false ;    if ( gTrackingGlobals.m_currentSource != NULL )    {        wxDataObject* data = gTrackingGlobals.m_currentSource->GetDataObject() ;        if ( data )        {            size_t formatcount = data->GetFormatCount() ;            wxDataFormat *array = new wxDataFormat[ formatcount  ];            data->GetAllFormats( array );            for (size_t i = 0; !transferred && i < formatcount ; i++)            {                wxDataFormat format = array[i] ;                if ( m_dataObject->IsSupported( format ) )                {                    int size = data->GetDataSize( format );                    transferred = true ;                    if (size == 0)                    {                        m_dataObject->SetData(format , 0 , 0 ) ;                    }                    else                    {                        char *d = new char[size];                        data->GetDataHere( format , (void*) d );                        m_dataObject->SetData( format , size , d ) ;                        delete[] d ;                    }                }            }            delete[] array ;        }    }    if ( !transferred )    {        UInt16 items ;        OSErr result;        bool firstFileAdded = false ;        CountDragItems((DragReference)m_currentDrag, &items);        for (UInt16 index = 1; index <= items; ++index)        {            ItemReference theItem;            FlavorType theType ;            UInt16 flavors = 0 ;            GetDragItemReferenceNumber((DragReference)m_currentDrag, index, &theItem);            CountDragItemFlavors( (DragReference)m_currentDrag, theItem , &flavors ) ;            for ( UInt16 flavor = 1 ; flavor <= flavors ; ++flavor )            {                result = GetFlavorType((DragReference)m_currentDrag, theItem, flavor , &theType);                wxDataFormat format(theType) ;                if ( m_dataObject->IsSupportedFormat( format ) )                {                    FlavorFlags theFlags;                    result = GetFlavorFlags((DragReference)m_currentDrag, theItem, theType, &theFlags);                    if (result == noErr)                    {                        Size dataSize ;                        Ptr theData ;                        GetFlavorDataSize((DragReference)m_currentDrag, theItem, theType, &dataSize);                        if ( theType == 'TEXT' )                        {                            // this increment is only valid for allocating, on the next GetFlavorData                            // call it is reset again to the original value                            dataSize++ ;                        }                        theData = new char[dataSize];                        GetFlavorData((DragReference)m_currentDrag, theItem, theType, (void*) theData, &dataSize, 0L);                        if( theType == 'TEXT' )                        {                            theData[dataSize]=0 ;                            wxString convert( theData , wxConvLocal ) ;                            m_dataObject->SetData( format, convert.length() * sizeof(wxChar), (const wxChar*) convert );                        }                        else if ( theType == kDragFlavorTypeHFS )                        {                            HFSFlavor* theFile = (HFSFlavor*) theData ;                            wxString name = wxMacFSSpec2MacFilename( &theFile->fileSpec ) ;                            if (  firstFileAdded )                                ((wxFileDataObject*)m_dataObject)->AddFile( name ) ;                            else                            {                                ((wxFileDataObject*)m_dataObject)->SetData( 0 , name.c_str() ) ;                                firstFileAdded = true ;                            }                        }                        else                        {                            m_dataObject->SetData( format, dataSize, theData );                        }                        delete[] theData;                    }                    break ;                }            }        }    }    return true ;}//-------------------------------------------------------------------------// wxDropSource//-------------------------------------------------------------------------//-----------------------------------------------------------------------------// drag requestwxDropSource::wxDropSource(wxWindow *win,                           const wxCursor &cursorCopy,                           const wxCursor &cursorMove,                           const wxCursor &cursorStop)            : wxDropSourceBase(cursorCopy, cursorMove, cursorStop){    wxMacEnsureTrackingHandlersInstalled() ;    m_window = win;}wxDropSource::wxDropSource(wxDataObject& data,                           wxWindow *win,                           const wxCursor &cursorCopy,                           const wxCursor &cursorMove,                           const wxCursor &cursorStop)            : wxDropSourceBase(cursorCopy, cursorMove, cursorStop){    wxMacEnsureTrackingHandlersInstalled() ;    SetData( data );    m_window = win;}wxDropSource::~wxDropSource(){}wxDragResult wxDropSource::DoDragDrop(int WXUNUSED(flags)){    wxASSERT_MSG( m_data, wxT("Drop source: no data") );    if (!m_data)        return (wxDragResult) wxDragNone;    if (m_data->GetFormatCount() == 0)        return (wxDragResult) wxDragNone;    OSErr result;    DragReference theDrag;    RgnHandle dragRegion;    if ((result = NewDrag(&theDrag)))    {        return wxDragNone ;    }    // add data to drag    size_t formatCount = m_data->GetFormatCount() ;    wxDataFormat *formats = new wxDataFormat[formatCount] ;    m_data->GetAllFormats( formats ) ;    ItemReference theItem = 1 ;    for ( size_t i = 0 ; i < formatCount ; ++i )    {        size_t dataSize = m_data->GetDataSize( formats[i] ) ;        Ptr dataPtr = new char[dataSize] ;        m_data->GetDataHere( formats[i] , dataPtr ) ;        OSType type = formats[i].GetFormatId() ;        if ( type == 'TEXT' )        {            dataSize-- ;

⌨️ 快捷键说明

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