]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/dataobj.cpp
Wrappers for *ToText
[wxWidgets.git] / src / os2 / dataobj.cpp
index 80c9b8479c3e49d293bac6b061897026cc114850..9c94fc10e44fd812d2f3bc6cd85e2df799fc65dc 100644 (file)
@@ -6,7 +6,7 @@
 // Created:     10/21/99
 // RCS-ID:      $Id$
 // Copyright:   (c) 1999 David Webster
 // Created:     10/21/99
 // RCS-ID:      $Id$
 // Copyright:   (c) 1999 David Webster
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 ///////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
 ///////////////////////////////////////////////////////////////////////////////
 
 // ============================================================================
@@ -31,6 +31,8 @@
 
 #include "wx/log.h"
 #include "wx/dataobj.h"
 
 #include "wx/log.h"
 #include "wx/dataobj.h"
+#include "wx/mstream.h"
+#include "wx/image.h"
 
 #define INCL_DOS
 #include <os2.h>
 
 #define INCL_DOS
 #include <os2.h>
 // functions
 // ----------------------------------------------------------------------------
 
 // functions
 // ----------------------------------------------------------------------------
 
-#ifdef __WXDEBUG__
-    static const wxChar *GetTymedName(DWORD tymed);
-#endif // Debug
-
 // ----------------------------------------------------------------------------
 // wxDataFormat
 // ----------------------------------------------------------------------------
 
 // ----------------------------------------------------------------------------
 // wxDataFormat
 // ----------------------------------------------------------------------------
 
-wxDataFormat::wxDataFormat(
-  wxDataFormatId                    vType
-)
-{
-    PrepareFormats();
-    m_vType = wxDF_INVALID;
-    m_vFormat = 0;
-}
-
-wxDataFormat::wxDataFormat(
-  wxDataFormatId                    vType
-)
+wxString wxDataFormat::GetId() const
 {
 {
-    PrepareFormats();
-    SetType(vType);
-}
+    char                            zBuf[256];
+    wxString                        sRet;
+
+    ::WinQueryAtomName( ::WinQuerySystemAtomTable()
+                       ,m_uFormat
+                       ,zBuf
+                       ,256
+                      );
+    sRet = zBuf;
+    return sRet;
+} // end of wxDataFormat::GetId()
 
 
-wxDataFormat::wxDataFormat(
+void wxDataFormat::SetId (
   const wxChar*                     zId
 )
 {
   const wxChar*                     zId
 )
 {
-    PrepareFormats();
-    SetId(zId);
-}
+    m_uFormat = ::WinAddAtom( ::WinQuerySystemAtomTable()
+                             ,zId
+                            );
+} // end of wxDataFormat::SetId
 
 
-wxDataFormat::wxDataFormat(
-  const wxString&                   rId
-)
+class CIDataObject
 {
 {
-    PrepareFormats();
-    SetId(rId);
-}
-
-wxDataFormat::wxDataFormat(
-  NativeFormat                      vFormat
+public:
+    CIDataObject(wxDataObject* pDataObject);
+    ~CIDataObject();
+
+    //
+    // Operations on the DRAGITEM struct
+    //
+    bool GetData( const wxDataFormat& rFormat
+                 ,char*               pzBuffer
+                 ,ULONG               ulLen
+                );
+    void GetDataHere( const wxDataFormat& rFormat
+                     ,char*               pzBuffer
+                     ,ULONG               ulLen
+                    );
+    void QueryGetData(const wxDataFormat& rFormat);
+    void SetData( const wxDataFormat& rFormat
+                 ,char*               pzBuffer
+                );
+private:
+    wxDataObject*                   m_pDataObject;      // pointer to C++ class we belong to
+    DRAGITEM                        m_vDragItem;
+}; // end of CLASS CIDataObject
+
+bool CIDataObject::GetData (
+  const wxDataFormat&               rFormat
+, char*                             pzBuffer
+, ULONG                             ulLen
 )
 {
 )
 {
-    PrepareFormats();
-    SetId(vFormat);
-}
+    QueryGetData(rFormat);
+    if (rFormat.GetType() == wxDF_INVALID)
+        return FALSE;
 
 
-void wxDataFormat::SetType(
-  wxDataFormatId                    vType
-)
-{
-    m_vType = vType;
-
-    if (m_vType == wxDF_TEXT)
-        m_vFormat = 0;
-    else
-    if (m_vType == wxDF_BITMAP)
-        m_vFormat = 0;
-    else
-    if (m_vType == wxDF_FILENAME)
-        m_vFormat = 0;
-    else
+    ULONG                           ulSize = m_pDataObject->GetDataSize(rFormat);
+
+    if (ulSize == 0)
     {
     {
-       wxFAIL_MSG( wxT("invalid dataformat") );
+        //
+        // It probably means that the method is just not implemented
+        //
+        return FALSE;
+    }
+    if (rFormat.GetType() == wxDF_PRIVATE)
+    {
+        //
+        // For custom formats, put the size with the data - alloc the
+        // space for it
+        //
+        ulSize += sizeof(ULONG);
     }
     }
-}
 
 
-wxDataFormatId wxDataFormat::GetType() const
-{
-    return m_vType;
-}
+    if (ulSize > ulLen) // not enough room to copy
+        return FALSE;
 
 
-wxString wxDataFormat::GetId() const
+    //
+    // Copy the data
+    //
+    GetDataHere( rFormat
+                ,pzBuffer
+                ,ulSize
+               );
+    return TRUE;
+} // end of CIDataObject::GetData
+
+void CIDataObject::GetDataHere(
+  const wxDataFormat&               rFormat
+, char*                             pzBuffer
+, ULONG                             WXUNUSED(ulLen)
+)
 {
 {
-    wxString                        sRet("");  // TODO: gdk_atom_name( m_format ) );
-    return sRet;
-}
+    m_pDataObject->GetDataHere( rFormat
+                               ,(void*)pzBuffer
+                              );
+} // end of CIDataObject::GetDataHere
 
 
-void wxDataFormat::SetId(
-  NativeFormat                      vFormat
+void CIDataObject::QueryGetData (
+  const wxDataFormat&               rFormat
 )
 {
 )
 {
-    m_vFormat = vFormat;
-// TODO:
-/*
-    if (m_format == g_textAtom)
-        m_type = wxDF_TEXT;
-    else
-    if (m_format == g_pngAtom)
-        m_type = wxDF_BITMAP;
-    else
-    if (m_format == g_fileAtom)
-        m_type = wxDF_FILENAME;
-    else
-        m_type = wxDF_PRIVATE;
-*/
-}
+    m_pDataObject->IsSupportedFormat(rFormat);
+} // end of CIDataObject::QueryGetData
 
 
-void wxDataFormat::SetId(
-  const wxChar*                     zId
+void CIDataObject::SetData (
+  const wxDataFormat&               rFormat
+, char*                             pzBuffer
 )
 {
 )
 {
-    wxString                        tmp(zId);
+    ULONG                           ulSize;
 
 
-    m_vType = wxDF_PRIVATE;
-    m_vFormat = 0;// TODO: get the format gdk_atom_intern( wxMBSTRINGCAST tmp.mbc_str(), FALSE );
-}
+    switch (rFormat.GetType())
+    {
+        case wxDF_TEXT:
+        case wxDF_OEMTEXT:
+        case wxDF_FILENAME:
+        case wxDF_HTML:
+            ulSize = strlen((const char *)pzBuffer);
+            break;
+
+#if wxUSE_UNICODE
+        case wxDF_UNICODETEXT:
+             ulSize = ::wcslen((const wchar_t *)pzBuffer);
+             break;
+#endif
 
 
-void wxDataFormat::PrepareFormats()
-{
-// TODO:
-/*
-    if (!g_textAtom)
-        g_textAtom = gdk_atom_intern( "STRING", FALSE );
-    if (!g_pngAtom)
-        g_pngAtom = gdk_atom_intern( "image/png", FALSE );
-    if (!g_fileAtom)
-        g_fileAtom = gdk_atom_intern( "file:ALL", FALSE );
-*/
-}
+        case wxDF_BITMAP:
+        case wxDF_METAFILE:
+        case wxDF_ENHMETAFILE:
+        case wxDF_TIFF:
+        case wxDF_DIB:
+            ulSize = 0; // pass via a handle
+            break;
+
+
+        case wxDF_SYLK:
+        case wxDF_DIF:
+        case wxDF_PALETTE:
+        case wxDF_PENDATA:
+        case wxDF_RIFF:
+        case wxDF_WAVE:
+        case wxDF_LOCALE:
+            //PUNT
+            break;
+
+        case wxDF_PRIVATE:
+            size_t*                 p = (size_t *)pzBuffer;
+
+            ulSize = *p++;
+            pzBuffer = (char*)p;
+            break;
+    }
+    m_pDataObject->SetData( rFormat
+                           ,ulSize
+                           ,(void*)pzBuffer
+                          );
+} // end of CIDataObject::SetData
 
 //-------------------------------------------------------------------------
 // wxDataObject
 //-------------------------------------------------------------------------
 
 
 //-------------------------------------------------------------------------
 // wxDataObject
 //-------------------------------------------------------------------------
 
-wxDataObject::wxDataObject()
+wxDataObject::wxDataObject ()
 {
 {
-}
+    m_pDataObject = new DRAGITEM;
+} // end of wxDataObject::wxDataObject
 
 
-bool wxDataObject::IsSupportedFormat(
-  const wxDataFormat&               rFormat
-, Direction                         vDir
-) const
+wxDataObject::~wxDataObject ()
 {
 {
-    size_t                          nFormatCount = GetFormatCount(vDir);
-
-    if (nFormatCount == 1)
-    {
-        return rFormat == GetPreferredFormat();
-    }
-    else
-    {
-        wxDataFormat*               pFormats = new wxDataFormat[nFormatCount];
-        GetAllFormats( rFormats
-                      ,vDir
-                     );
-
-        size_t                      n;
-
-        for (n = 0; n < nFormatCount; n++)
-        {
-            if (rFormats[n] == rFormat)
-                break;
-        }
-
-        delete [] rFormats;
-
-        // found?
-        return n < nFormatCount;
-    }
-}
+    delete m_pDataObject;
+} // end of wxDataObject::~wxDataObject
 
 // ----------------------------------------------------------------------------
 // wxFileDataObject
 
 // ----------------------------------------------------------------------------
 // wxFileDataObject
@@ -215,11 +233,11 @@ bool wxFileDataObject::GetDataHere(
 
     for (size_t i = 0; i < m_filenames.GetCount(); i++)
     {
 
     for (size_t i = 0; i < m_filenames.GetCount(); i++)
     {
-        filenames += m_filenames[i];
-        filenames += (wxChar)0;
+        sFilenames += m_filenames[i];
+        sFilenames += (wxChar)0;
     }
 
     }
 
-    memcpy(pBuf, filenames.mbc_str(), filenames.Len() + 1);
+    memcpy(pBuf, sFilenames.mbc_str(), sFilenames.Len() + 1);
     return TRUE;
 }
 
     return TRUE;
 }
 
@@ -314,6 +332,7 @@ bool wxBitmapDataObject::SetData(
 
     memcpy(m_pngData, pBuf, m_pngSize);
 
 
     memcpy(m_pngData, pBuf, m_pngSize);
 
+#if wxUSE_STREAMS
     wxMemoryInputStream             vMstream((char*)m_pngData, m_pngSize);
     wxImage                         vImage;
     wxPNGHandler                    vHandler;
     wxMemoryInputStream             vMstream((char*)m_pngData, m_pngSize);
     wxImage                         vImage;
     wxPNGHandler                    vHandler;
@@ -323,7 +342,9 @@ bool wxBitmapDataObject::SetData(
         return FALSE;
     }
 
         return FALSE;
     }
 
-    m_bitmap = vImage.ConvertToBitmap();
+    m_bitmap = wxBitmap(vImage);
+#endif //wxUSE_STREAMS
+
     return m_bitmap.Ok();
 }
 
     return m_bitmap.Ok();
 }
 
@@ -332,16 +353,19 @@ void wxBitmapDataObject::DoConvertToPng()
     if (!m_bitmap.Ok())
         return;
 
     if (!m_bitmap.Ok())
         return;
 
-    wxImage                         vImage(m_bitmap);
+#if wxUSE_STREAMS
+    wxImage                         vImage = m_bitmap.ConvertToImage();
     wxPNGHandler                    vHandler;
     wxCountingOutputStream          vCount;
 
     wxPNGHandler                    vHandler;
     wxCountingOutputStream          vCount;
 
-    vHandler.SaveFile(&rImage, vCount);
+    vHandler.SaveFile(&vImage, vCount);
 
     m_pngSize = vCount.GetSize() + 100; // sometimes the size seems to vary ???
     m_pngData = malloc(m_pngSize);
 
 
     m_pngSize = vCount.GetSize() + 100; // sometimes the size seems to vary ???
     m_pngData = malloc(m_pngSize);
 
-    wxMemoryOutputStream mstream((char*) m_pngData, m_pngSize);
+    wxMemoryOutputStream            vMstream((char*) m_pngData, m_pngSize);
+
     vHandler.SaveFile(&vImage, vMstream );
     vHandler.SaveFile(&vImage, vMstream );
+#endif
 }
 
 }