]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/dnd_osx.cpp
support for file types in save panel
[wxWidgets.git] / src / osx / dnd_osx.cpp
index c19bf6eb8f0aae1c9bb1df1f083e937fc1bd78e7..7fb1c922cc3051e9b040e049966a5384755e94ea 100644 (file)
@@ -4,7 +4,7 @@
 // Author:      Stefan Csomor
 // Modified by:
 // Created:     1998-01-01
-// RCS-ID:      $Id: dnd.cpp 61724 2009-08-21 10:41:26Z VZ $
+// RCS-ID:      $Id$
 // Copyright:   (c) 1998 Stefan Csomor
 // Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
@@ -61,6 +61,95 @@ wxDragResult wxDropTarget::OnData(
     return GetData() ? def : wxDragNone;
 }
 
+bool wxDropTarget::CurrentDragHasSupportedFormat()
+{
+    bool supported = false;
+    if (m_dataObject == NULL)
+        return false;
+
+    if ( wxDropSource* currentSource = wxDropSource::GetCurrentDropSource() )
+    {
+        wxDataObject* data = 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 )
+    {
+        supported = m_dataObject->HasDataInPasteboard( m_currentDragPasteboard );
+    }
+
+    return supported;
+}
+
+bool wxDropTarget::GetData()
+{
+    if (m_dataObject == NULL)
+        return false;
+
+    if ( !CurrentDragHasSupportedFormat() )
+        return false;
+
+    bool transferred = false;
+    if ( wxDropSource* currentSource = wxDropSource::GetCurrentDropSource() )
+    {
+        wxDataObject* data = currentSource->GetDataObject();
+
+        if (data != NULL)
+        {
+            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 )
+    {
+        transferred = m_dataObject->GetFromPasteboard( m_currentDragPasteboard );
+    }
+
+    return transferred;
+}
+
 //-------------------------------------------------------------------------
 // wxDropSource
 //-------------------------------------------------------------------------