git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40345 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
357 lines
8.8 KiB
C++
357 lines
8.8 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// Name: src/os2/dataobj.cpp
|
|
// Purpose: implementation of wx[I]DataObject class
|
|
// Author: David Webster
|
|
// Modified by:
|
|
// Created: 10/21/99
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) 1999 David Webster
|
|
// Licence: wxWindows licence
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// ============================================================================
|
|
// declarations
|
|
// ============================================================================
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// headers
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// For compilers that support precompilation, includes "wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
#if wxUSE_DATAOBJ
|
|
|
|
#include "wx/dataobj.h"
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/intl.h"
|
|
#include "wx/log.h"
|
|
#include "wx/image.h"
|
|
#endif
|
|
|
|
#include "wx/mstream.h"
|
|
|
|
#include "wx/os2/private.h"
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// functions
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxDataFormat
|
|
// ----------------------------------------------------------------------------
|
|
|
|
wxString wxDataFormat::GetId() const
|
|
{
|
|
wxChar zBuf[256];
|
|
wxString sRet;
|
|
|
|
::WinQueryAtomName( ::WinQuerySystemAtomTable()
|
|
,m_uFormat
|
|
,(PSZ)zBuf
|
|
,256
|
|
);
|
|
sRet = zBuf;
|
|
return sRet;
|
|
} // end of wxDataFormat::GetId()
|
|
|
|
void wxDataFormat::SetId (
|
|
const wxChar* zId
|
|
)
|
|
{
|
|
m_uFormat = ::WinAddAtom( ::WinQuerySystemAtomTable()
|
|
,(PSZ)zId
|
|
);
|
|
} // end of wxDataFormat::SetId
|
|
|
|
class CIDataObject
|
|
{
|
|
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 )
|
|
{
|
|
QueryGetData(rFormat);
|
|
if (rFormat.GetType() == wxDF_INVALID)
|
|
return false;
|
|
|
|
ULONG ulSize = m_pDataObject->GetDataSize(rFormat);
|
|
|
|
if (ulSize == 0)
|
|
{
|
|
//
|
|
// 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);
|
|
}
|
|
|
|
if (ulSize > ulLen) // not enough room to copy
|
|
return false;
|
|
|
|
//
|
|
// Copy the data
|
|
//
|
|
GetDataHere( rFormat
|
|
,pzBuffer
|
|
,ulSize
|
|
);
|
|
return true;
|
|
} // end of CIDataObject::GetData
|
|
|
|
void CIDataObject::GetDataHere(
|
|
const wxDataFormat& rFormat
|
|
, char* pzBuffer
|
|
, ULONG WXUNUSED(ulLen)
|
|
)
|
|
{
|
|
m_pDataObject->GetDataHere( rFormat
|
|
,(void*)pzBuffer
|
|
);
|
|
} // end of CIDataObject::GetDataHere
|
|
|
|
void CIDataObject::QueryGetData (
|
|
const wxDataFormat& rFormat
|
|
)
|
|
{
|
|
m_pDataObject->IsSupportedFormat(rFormat);
|
|
} // end of CIDataObject::QueryGetData
|
|
|
|
void CIDataObject::SetData (
|
|
const wxDataFormat& rFormat
|
|
, char* pzBuffer
|
|
)
|
|
{
|
|
ULONG ulSize = 0;
|
|
|
|
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
|
|
|
|
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 ()
|
|
{
|
|
m_pDataObject = new DRAGITEM;
|
|
} // end of wxDataObject::wxDataObject
|
|
|
|
wxDataObject::~wxDataObject ()
|
|
{
|
|
delete m_pDataObject;
|
|
} // end of wxDataObject::~wxDataObject
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxFileDataObject
|
|
// ----------------------------------------------------------------------------
|
|
|
|
bool wxFileDataObject::GetDataHere( void* pBuf ) const
|
|
{
|
|
wxString sFilenames;
|
|
|
|
for (size_t i = 0; i < m_filenames.GetCount(); i++)
|
|
{
|
|
sFilenames += m_filenames[i];
|
|
sFilenames += (wxChar)0;
|
|
}
|
|
|
|
memcpy(pBuf, sFilenames.mbc_str(), sFilenames.length() + 1);
|
|
return true;
|
|
}
|
|
|
|
size_t wxFileDataObject::GetDataSize() const
|
|
{
|
|
size_t nRes = 0;
|
|
|
|
for (size_t i = 0; i < m_filenames.GetCount(); i++)
|
|
{
|
|
nRes += m_filenames[i].length();
|
|
nRes += 1;
|
|
}
|
|
|
|
return nRes + 1;
|
|
}
|
|
|
|
bool wxFileDataObject::SetData( size_t WXUNUSED(nSize),
|
|
const void* pBuf )
|
|
{
|
|
/* TODO */
|
|
|
|
wxString sFile((const wxChar *)pBuf); /* char, not wxChar */
|
|
|
|
AddFile(sFile);
|
|
|
|
return true;
|
|
}
|
|
|
|
void wxFileDataObject::AddFile(
|
|
const wxString& rFilename
|
|
)
|
|
{
|
|
m_filenames.Add(rFilename);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxBitmapDataObject
|
|
// ----------------------------------------------------------------------------
|
|
|
|
wxBitmapDataObject::wxBitmapDataObject()
|
|
{
|
|
Init();
|
|
}
|
|
|
|
wxBitmapDataObject::wxBitmapDataObject(
|
|
const wxBitmap& rBitmap
|
|
)
|
|
: wxBitmapDataObjectBase(rBitmap)
|
|
{
|
|
Init();
|
|
|
|
DoConvertToPng();
|
|
}
|
|
|
|
wxBitmapDataObject::~wxBitmapDataObject()
|
|
{
|
|
Clear();
|
|
}
|
|
|
|
void wxBitmapDataObject::SetBitmap( const wxBitmap& rBitmap )
|
|
{
|
|
ClearAll();
|
|
wxBitmapDataObjectBase::SetBitmap(rBitmap);
|
|
DoConvertToPng();
|
|
}
|
|
|
|
bool wxBitmapDataObject::GetDataHere( void* pBuf ) const
|
|
{
|
|
if (!m_pngSize)
|
|
{
|
|
wxFAIL_MSG(wxT("attempt to copy empty bitmap failed"));
|
|
return false;
|
|
}
|
|
memcpy(pBuf, m_pngData, m_pngSize);
|
|
return true;
|
|
}
|
|
|
|
bool wxBitmapDataObject::SetData( size_t nSize, const void* pBuf)
|
|
{
|
|
Clear();
|
|
m_pngSize = nSize;
|
|
m_pngData = malloc(m_pngSize);
|
|
|
|
memcpy(m_pngData, pBuf, m_pngSize);
|
|
|
|
#if wxUSE_STREAMS
|
|
wxMemoryInputStream vMstream((char*)m_pngData, m_pngSize);
|
|
wxImage vImage;
|
|
wxPNGHandler vHandler;
|
|
|
|
if (!vHandler.LoadFile(&vImage, vMstream))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
m_bitmap = wxBitmap(vImage);
|
|
#endif //wxUSE_STREAMS
|
|
|
|
return m_bitmap.Ok();
|
|
}
|
|
|
|
void wxBitmapDataObject::DoConvertToPng()
|
|
{
|
|
if (!m_bitmap.Ok())
|
|
return;
|
|
|
|
#if wxUSE_STREAMS
|
|
wxImage vImage = m_bitmap.ConvertToImage();
|
|
wxPNGHandler vHandler;
|
|
wxCountingOutputStream vCount;
|
|
|
|
vHandler.SaveFile(&vImage, vCount);
|
|
|
|
m_pngSize = vCount.GetSize() + 100; // sometimes the size seems to vary ???
|
|
m_pngData = malloc(m_pngSize);
|
|
|
|
wxMemoryOutputStream vMstream((char*) m_pngData, m_pngSize);
|
|
|
|
vHandler.SaveFile(&vImage, vMstream );
|
|
#endif
|
|
}
|
|
|
|
#endif // wxUSE_DATAOBJ
|