Rearranged wxApp to do the same in the same order upon program start-up on wxGTK and wxMSW ODBC tweaks exchanged wxDataFormat for wxIPCFormat git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1427 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
446 lines
8.8 KiB
C++
446 lines
8.8 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// Name: dataobj.cpp
|
|
// Purpose: wxDataObject class
|
|
// Author: Robert Roebling
|
|
// Id: $Id$
|
|
// Copyright: (c) 1998 Robert Roebling
|
|
// Licence: wxWindows licence
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifdef __GNUG__
|
|
#pragma implementation "dataobj.h"
|
|
#endif
|
|
|
|
#include "wx/dataobj.h"
|
|
#include "wx/app.h"
|
|
#include "wx/debug.h"
|
|
|
|
#include "gdk/gdk.h"
|
|
|
|
//-------------------------------------------------------------------------
|
|
// wxDataFormat
|
|
//-------------------------------------------------------------------------
|
|
|
|
IMPLEMENT_CLASS(wxDataFormat, wxObject)
|
|
|
|
wxDataFormat::wxDataFormat( wxDataType type )
|
|
{
|
|
m_type = type;
|
|
|
|
if (m_type == wxDF_TEXT)
|
|
{
|
|
m_id = "STRING";
|
|
}
|
|
else
|
|
if (m_type == wxDF_BITMAP)
|
|
{
|
|
m_id = "BITMAP";
|
|
}
|
|
else
|
|
if (m_type == wxDF_FILENAME)
|
|
{
|
|
m_id = "file:ALL";
|
|
}
|
|
else
|
|
{
|
|
wxFAIL_MSG( "invalid dataformat" )
|
|
}
|
|
|
|
m_hasAtom = FALSE;
|
|
}
|
|
|
|
wxDataFormat::wxDataFormat( const wxString &id )
|
|
{
|
|
m_type = wxDF_PRIVATE;
|
|
m_id = id;
|
|
m_hasAtom = FALSE;
|
|
}
|
|
|
|
wxDataFormat::wxDataFormat( wxDataFormat &format )
|
|
{
|
|
m_type = format.GetType();
|
|
m_id = format.GetId();
|
|
m_hasAtom = TRUE;
|
|
m_atom = format.GetAtom();
|
|
}
|
|
|
|
wxDataFormat::wxDataFormat( const GdkAtom atom )
|
|
{
|
|
m_hasAtom = TRUE;
|
|
|
|
m_atom = atom;
|
|
|
|
if (m_atom == GDK_TARGET_STRING)
|
|
{
|
|
m_type = wxDF_TEXT;
|
|
} else
|
|
if (m_atom == GDK_TARGET_BITMAP)
|
|
{
|
|
m_type = wxDF_BITMAP;
|
|
} else
|
|
{
|
|
m_type = wxDF_PRIVATE;
|
|
m_id = gdk_atom_name( m_atom );
|
|
|
|
if (m_id == "file:ALL")
|
|
{
|
|
m_type = wxDF_FILENAME;
|
|
}
|
|
}
|
|
}
|
|
|
|
int wxDataFormat::GetType() const
|
|
{
|
|
return m_type;
|
|
}
|
|
|
|
wxString wxDataFormat::GetId() const
|
|
{
|
|
return m_id;
|
|
}
|
|
|
|
void wxDataFormat::SetId( const wxString &id )
|
|
{
|
|
m_type = wxDF_PRIVATE;
|
|
m_id = id;
|
|
m_hasAtom = FALSE;
|
|
}
|
|
|
|
GdkAtom wxDataFormat::GetAtom()
|
|
{
|
|
if (!m_hasAtom)
|
|
{
|
|
m_hasAtom = TRUE;
|
|
|
|
if (m_type == wxDF_TEXT)
|
|
{
|
|
m_atom = GDK_TARGET_STRING;
|
|
}
|
|
else
|
|
if (m_type == wxDF_BITMAP)
|
|
{
|
|
m_atom = GDK_TARGET_BITMAP;
|
|
}
|
|
else
|
|
if (m_type == wxDF_PRIVATE)
|
|
{
|
|
m_atom = gdk_atom_intern( WXSTRINGCAST( m_id ), FALSE );
|
|
}
|
|
else
|
|
if (m_type == wxDF_FILENAME)
|
|
{
|
|
m_atom = gdk_atom_intern( "file:ALL", FALSE );
|
|
}
|
|
else
|
|
{
|
|
m_hasAtom = FALSE;
|
|
m_atom = (GdkAtom) 0;
|
|
}
|
|
}
|
|
|
|
return m_atom;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
// wxDataBroker
|
|
//-------------------------------------------------------------------------
|
|
|
|
IMPLEMENT_CLASS(wxDataBroker,wxObject)
|
|
|
|
wxDataBroker::wxDataBroker()
|
|
{
|
|
m_dataObjects.DeleteContents(TRUE);
|
|
m_preferred = 0;
|
|
}
|
|
|
|
void wxDataBroker::Add( wxDataObject *dataObject, bool preferred )
|
|
{
|
|
if (preferred) m_preferred = m_dataObjects.GetCount();
|
|
m_dataObjects.Append( dataObject );
|
|
}
|
|
|
|
size_t wxDataBroker::GetFormatCount() const
|
|
{
|
|
return m_dataObjects.GetCount();
|
|
}
|
|
|
|
wxDataFormat &wxDataBroker::GetPreferredFormat() const
|
|
{
|
|
wxNode *node = m_dataObjects.Nth( m_preferred );
|
|
|
|
wxASSERT( node );
|
|
|
|
wxDataObject* data_obj = (wxDataObject*)node->Data();
|
|
|
|
return data_obj->GetFormat();
|
|
}
|
|
|
|
wxDataFormat &wxDataBroker::GetNthFormat( size_t nth ) const
|
|
{
|
|
wxNode *node = m_dataObjects.Nth( nth );
|
|
|
|
wxASSERT( node );
|
|
|
|
wxDataObject* data_obj = (wxDataObject*)node->Data();
|
|
|
|
return data_obj->GetFormat();
|
|
}
|
|
|
|
bool wxDataBroker::IsSupportedFormat( wxDataFormat &format ) const
|
|
{
|
|
wxNode *node = m_dataObjects.First();
|
|
while (node)
|
|
{
|
|
wxDataObject *dobj = (wxDataObject*)node->Data();
|
|
|
|
if (dobj->GetFormat().GetAtom() == format.GetAtom())
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
node = node->Next();
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
size_t wxDataBroker::GetSize( wxDataFormat& format ) const
|
|
{
|
|
wxNode *node = m_dataObjects.First();
|
|
while (node)
|
|
{
|
|
wxDataObject *dobj = (wxDataObject*)node->Data();
|
|
|
|
if (dobj->GetFormat().GetAtom() == format.GetAtom())
|
|
{
|
|
return dobj->GetSize();
|
|
}
|
|
|
|
node = node->Next();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void wxDataBroker::WriteData( wxDataFormat& format, void *dest ) const
|
|
{
|
|
wxNode *node = m_dataObjects.First();
|
|
while (node)
|
|
{
|
|
wxDataObject *dobj = (wxDataObject*)node->Data();
|
|
|
|
if (dobj->GetFormat().GetAtom() == format.GetAtom())
|
|
{
|
|
return dobj->WriteData( dest );
|
|
}
|
|
|
|
node = node->Next();
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
// wxDataObject
|
|
//-------------------------------------------------------------------------
|
|
|
|
IMPLEMENT_ABSTRACT_CLASS( wxDataObject, wxObject )
|
|
|
|
wxDataObject::wxDataObject()
|
|
{
|
|
m_format = (wxDataFormat*) NULL;
|
|
}
|
|
|
|
wxDataObject::~wxDataObject()
|
|
{
|
|
if (m_format) delete m_format;
|
|
}
|
|
|
|
wxDataFormat &wxDataObject::GetFormat() const
|
|
{
|
|
wxASSERT( m_format );
|
|
|
|
return (*m_format);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxTextDataObject
|
|
// ----------------------------------------------------------------------------
|
|
|
|
IMPLEMENT_DYNAMIC_CLASS( wxTextDataObject, wxDataObject )
|
|
|
|
wxTextDataObject::wxTextDataObject()
|
|
{
|
|
m_format = new wxDataFormat( wxDF_TEXT );
|
|
}
|
|
|
|
wxTextDataObject::wxTextDataObject( const wxString& data )
|
|
{
|
|
m_format = new wxDataFormat( wxDF_TEXT );
|
|
|
|
m_data = data;
|
|
}
|
|
|
|
void wxTextDataObject::SetText( const wxString& data )
|
|
{
|
|
m_data = data;
|
|
}
|
|
|
|
wxString wxTextDataObject::GetText() const
|
|
{
|
|
return m_data;
|
|
}
|
|
|
|
void wxTextDataObject::WriteData( void *dest ) const
|
|
{
|
|
WriteString( m_data, dest );
|
|
}
|
|
|
|
size_t wxTextDataObject::GetSize() const
|
|
{
|
|
return m_data.Len() + 1;
|
|
}
|
|
|
|
void wxTextDataObject::WriteString( const wxString &str, void *dest ) const
|
|
{
|
|
memcpy( dest, m_data.c_str(), GetSize() );
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxFileDataObject
|
|
// ----------------------------------------------------------------------------
|
|
|
|
IMPLEMENT_DYNAMIC_CLASS( wxFileDataObject, wxDataObject )
|
|
|
|
wxFileDataObject::wxFileDataObject(void)
|
|
{
|
|
m_format = new wxDataFormat( wxDF_FILENAME );
|
|
}
|
|
|
|
void wxFileDataObject::AddFile( const wxString &file )
|
|
{
|
|
m_files += file;
|
|
m_files += (char)0;
|
|
}
|
|
|
|
wxString wxFileDataObject::GetFiles() const
|
|
{
|
|
return m_files;
|
|
}
|
|
|
|
void wxFileDataObject::WriteData( void *dest ) const
|
|
{
|
|
memcpy( dest, m_files.c_str(), GetSize() );
|
|
}
|
|
|
|
size_t wxFileDataObject::GetSize() const
|
|
{
|
|
return m_files.Len() + 1;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxBitmapDataObject
|
|
// ----------------------------------------------------------------------------
|
|
|
|
IMPLEMENT_DYNAMIC_CLASS( wxBitmapDataObject, wxDataObject )
|
|
|
|
wxBitmapDataObject::wxBitmapDataObject()
|
|
{
|
|
m_format = new wxDataFormat( wxDF_BITMAP );
|
|
}
|
|
|
|
wxBitmapDataObject::wxBitmapDataObject( const wxBitmap& bitmap )
|
|
{
|
|
m_format = new wxDataFormat( wxDF_BITMAP );
|
|
|
|
m_bitmap = bitmap;
|
|
}
|
|
|
|
void wxBitmapDataObject::SetBitmap( const wxBitmap &bitmap )
|
|
{
|
|
m_bitmap = bitmap;
|
|
}
|
|
|
|
wxBitmap wxBitmapDataObject::GetBitmap() const
|
|
{
|
|
return m_bitmap;
|
|
}
|
|
|
|
void wxBitmapDataObject::WriteData( void *dest ) const
|
|
{
|
|
WriteBitmap( m_bitmap, dest );
|
|
}
|
|
|
|
size_t wxBitmapDataObject::GetSize() const
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
void wxBitmapDataObject::WriteBitmap( const wxBitmap &bitmap, void *dest ) const
|
|
{
|
|
memcpy( dest, m_bitmap.GetPixmap(), GetSize() );
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxPrivateDataObject
|
|
// ----------------------------------------------------------------------------
|
|
|
|
IMPLEMENT_DYNAMIC_CLASS( wxPrivateDataObject, wxDataObject )
|
|
|
|
wxPrivateDataObject::wxPrivateDataObject()
|
|
{
|
|
m_id = "application/";
|
|
m_id += wxTheApp->GetAppName();
|
|
|
|
m_format = new wxDataFormat( m_id );
|
|
|
|
m_size = 0;
|
|
m_data = (char*) NULL;
|
|
}
|
|
|
|
wxPrivateDataObject::~wxPrivateDataObject()
|
|
{
|
|
if (m_data) delete[] m_data;
|
|
}
|
|
|
|
void wxPrivateDataObject::SetId( const wxString& id )
|
|
{
|
|
m_id = id;
|
|
m_format->SetId( m_id );
|
|
}
|
|
|
|
wxString wxPrivateDataObject::GetId() const
|
|
{
|
|
return m_id;
|
|
}
|
|
|
|
void wxPrivateDataObject::SetData( const char *data, size_t size )
|
|
{
|
|
m_size = size;
|
|
|
|
if (m_data) delete[] m_data;
|
|
|
|
m_data = new char[size];
|
|
|
|
memcpy( m_data, data, size );
|
|
}
|
|
|
|
char* wxPrivateDataObject::GetData() const
|
|
{
|
|
return m_data;
|
|
}
|
|
|
|
void wxPrivateDataObject::WriteData( void *dest ) const
|
|
{
|
|
WriteData( m_data, dest );
|
|
}
|
|
|
|
size_t wxPrivateDataObject::GetSize() const
|
|
{
|
|
return m_size;
|
|
}
|
|
|
|
void wxPrivateDataObject::WriteData( const char *data, void *dest ) const
|
|
{
|
|
memcpy( dest, data, GetSize() );
|
|
}
|
|
|