From 3f364be84b91d4e19729634ebf0b119145303a35 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 21 Oct 1999 00:22:47 +0000 Subject: [PATCH 1/1] added dobjcmn.cpp git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4087 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- distrib/msw/tmake/filelist.txt | 5 + include/wx/gtk/dataobj2.h | 72 +++++++++ include/wx/gtk1/dataobj2.h | 72 +++++++++ src/common/dobjcmn.cpp | 272 +++++++++++++++++++++++++++++++++ 4 files changed, 421 insertions(+) create mode 100644 include/wx/gtk/dataobj2.h create mode 100644 include/wx/gtk1/dataobj2.h create mode 100644 src/common/dobjcmn.cpp diff --git a/distrib/msw/tmake/filelist.txt b/distrib/msw/tmake/filelist.txt index ce30526b92..7de559b05b 100644 --- a/distrib/msw/tmake/filelist.txt +++ b/distrib/msw/tmake/filelist.txt @@ -102,6 +102,7 @@ db.cpp C dbtable.cpp C dcbase.cpp C dlgcmn.cpp C +dobjcmn.cpp C docmdi.cpp C docview.cpp C dynarray.cpp C B @@ -613,7 +614,9 @@ colour.h K combobox.h K control.h K cursor.h K +dataform.h K dataobj.h K +dataobj2.h K dc.h K dcclient.h K dcmemory.h K @@ -672,7 +675,9 @@ colour.h F combobox.h F control.h F cursor.h F +dataform.h F dataobj.h F +dataobj2.h F dc.h F dcclient.h F dcmemory.h F diff --git a/include/wx/gtk/dataobj2.h b/include/wx/gtk/dataobj2.h new file mode 100644 index 0000000000..8f42fa8703 --- /dev/null +++ b/include/wx/gtk/dataobj2.h @@ -0,0 +1,72 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: gtk/dataobj2.h +// Purpose: declaration of standard wxDataObjectSimple-derived classes +// Author: Robert Roebling +// Created: 19.10.99 (extracted from gtk/dataobj.h) +// RCS-ID: $Id$ +// Copyright: (c) 1998, 1999 Vadim Zeitlin, Robert Roebling +// Licence: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_DATAOBJ2_H_ +#define _WX_GTK_DATAOBJ2_H_ + +#ifdef __GNUG__ + #pragma interface "dataobj.h" +#endif + +// ---------------------------------------------------------------------------- +// wxBitmapDataObject is a specialization of wxDataObject for bitmaps +// ---------------------------------------------------------------------------- + +class wxBitmapDataObject : public wxBitmapDataObjectBase +{ +public: + // ctors + wxBitmapDataObject(); + wxBitmapDataObject(const wxBitmap& bitmap); + + // destr + ~wxBitmapDataObject(); + + // override base class virtual to update PNG data too + virtual void SetBitmap(const wxBitmap& bitmap); + + void *GetPngData() const { return m_pngData; } + + // implement base class pure virtuals + // ---------------------------------- + + virtual size_t GetDataSize() const { return m_pngSize; } + virtual bool GetDataHere(void *buf) const; + virtual bool SetData(size_t len, const void *buf); + +protected: + void Init() { m_pngData = (void *)NULL; m_pngSize = 0; } + void Clear() { free(m_pngData); } + void ClearAll() { Clear(); Init(); } + +private: + size_t m_pngSize; + void *m_pngData; + + void DoConvertToPng(); +}; + +// ---------------------------------------------------------------------------- +// wxFileDataObject is a specialization of wxDataObject for file names +// ---------------------------------------------------------------------------- + +class wxFileDataObject : public wxFileDataObjectBase +{ +public: + // implement base class pure virtuals + // ---------------------------------- + + virtual size_t GetDataSize() const; + virtual bool GetDataHere(void *buf) const; + virtual bool SetData(size_t len, const void *buf); +}; + +#endif // _WX_GTK_DATAOBJ2_H_ + diff --git a/include/wx/gtk1/dataobj2.h b/include/wx/gtk1/dataobj2.h new file mode 100644 index 0000000000..8f42fa8703 --- /dev/null +++ b/include/wx/gtk1/dataobj2.h @@ -0,0 +1,72 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: gtk/dataobj2.h +// Purpose: declaration of standard wxDataObjectSimple-derived classes +// Author: Robert Roebling +// Created: 19.10.99 (extracted from gtk/dataobj.h) +// RCS-ID: $Id$ +// Copyright: (c) 1998, 1999 Vadim Zeitlin, Robert Roebling +// Licence: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_DATAOBJ2_H_ +#define _WX_GTK_DATAOBJ2_H_ + +#ifdef __GNUG__ + #pragma interface "dataobj.h" +#endif + +// ---------------------------------------------------------------------------- +// wxBitmapDataObject is a specialization of wxDataObject for bitmaps +// ---------------------------------------------------------------------------- + +class wxBitmapDataObject : public wxBitmapDataObjectBase +{ +public: + // ctors + wxBitmapDataObject(); + wxBitmapDataObject(const wxBitmap& bitmap); + + // destr + ~wxBitmapDataObject(); + + // override base class virtual to update PNG data too + virtual void SetBitmap(const wxBitmap& bitmap); + + void *GetPngData() const { return m_pngData; } + + // implement base class pure virtuals + // ---------------------------------- + + virtual size_t GetDataSize() const { return m_pngSize; } + virtual bool GetDataHere(void *buf) const; + virtual bool SetData(size_t len, const void *buf); + +protected: + void Init() { m_pngData = (void *)NULL; m_pngSize = 0; } + void Clear() { free(m_pngData); } + void ClearAll() { Clear(); Init(); } + +private: + size_t m_pngSize; + void *m_pngData; + + void DoConvertToPng(); +}; + +// ---------------------------------------------------------------------------- +// wxFileDataObject is a specialization of wxDataObject for file names +// ---------------------------------------------------------------------------- + +class wxFileDataObject : public wxFileDataObjectBase +{ +public: + // implement base class pure virtuals + // ---------------------------------- + + virtual size_t GetDataSize() const; + virtual bool GetDataHere(void *buf) const; + virtual bool SetData(size_t len, const void *buf); +}; + +#endif // _WX_GTK_DATAOBJ2_H_ + diff --git a/src/common/dobjcmn.cpp b/src/common/dobjcmn.cpp new file mode 100644 index 0000000000..f806dcdec6 --- /dev/null +++ b/src/common/dobjcmn.cpp @@ -0,0 +1,272 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: common/dobjcmn.cpp +// Purpose: implementation of data object methods common to all platforms +// Author: Vadim Zeitlin, Robert Roebling +// Modified by: +// Created: 19.10.99 +// RCS-ID: $Id$ +// Copyright: (c) wxWindows Team +// Licence: wxWindows license +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#ifdef __GNUG__ + #pragma implementation "dataobjbase.h" +#endif + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/app.h" + #include "wx/debug.h" +#endif // WX_PRECOMP + +#include "wx/dataobj.h" + +// ---------------------------------------------------------------------------- +// lists +// ---------------------------------------------------------------------------- + +#include "wx/listimpl.cpp" + +WX_DEFINE_LIST(wxSimpleDataObjectList); + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// wxDataObjectBase +// ---------------------------------------------------------------------------- + +wxDataObjectBase::~wxDataObjectBase() +{ +} + +// ---------------------------------------------------------------------------- +// wxDataObjectComposite +// ---------------------------------------------------------------------------- + +wxDataObjectSimple * +wxDataObjectComposite::GetObject(const wxDataFormat& format) const +{ + wxSimpleDataObjectList::Node *node = m_dataObjects.GetFirst(); + while ( node ) + { + wxDataObjectSimple *dataObj = node->GetData(); + + if ( dataObj->GetFormat() == format ) + { + return dataObj; + } + + node = node->GetNext(); + } + + return (wxDataObjectSimple *)NULL; +} + +void wxDataObjectComposite::Add(wxDataObjectSimple *dataObject, bool preferred) +{ + if ( preferred ) + m_preferred = m_dataObjects.GetCount(); + + m_dataObjects.Append( dataObject ); +} + +wxDataFormat +wxDataObjectComposite::GetPreferredFormat(Direction WXUNUSED(dir)) const +{ + wxSimpleDataObjectList::Node *node = m_dataObjects.Item( m_preferred ); + + wxCHECK_MSG( node, wxDF_INVALID, wxT("no preferred format") ); + + wxDataObjectSimple* dataObj = node->GetData(); + + return dataObj->GetFormat(); +} + +size_t wxDataObjectComposite::GetFormatCount(Direction WXUNUSED(dir)) const +{ + // TODO what about the Get/Set only formats? + return m_dataObjects.GetCount(); +} + +void wxDataObjectComposite::GetAllFormats(wxDataFormat *formats, + Direction WXUNUSED(dir)) const +{ + size_t n = 0; + wxSimpleDataObjectList::Node *node; + for ( node = m_dataObjects.GetFirst(); node; node = node->GetNext() ) + { + // TODO if ( !outputOnlyToo ) && this one counts ... + formats[n++] = node->GetData()->GetFormat(); + } +} + +size_t wxDataObjectComposite::GetDataSize(const wxDataFormat& format) const +{ + wxDataObjectSimple *dataObj = GetObject(format); + + wxCHECK_MSG( dataObj, 0, + wxT("unsupported format in wxDataObjectComposite")); + + return dataObj->GetDataSize(); +} + +bool wxDataObjectComposite::GetDataHere(const wxDataFormat& format, + void *buf) const +{ + wxDataObjectSimple *dataObj = GetObject(format); + + wxCHECK_MSG( dataObj, FALSE, + wxT("unsupported format in wxDataObjectComposite")); + + return dataObj->GetDataHere(buf); +} + +bool wxDataObjectComposite::SetData(const wxDataFormat& format, + size_t len, + const void *buf) +{ + wxDataObjectSimple *dataObj = GetObject(format); + + wxCHECK_MSG( dataObj, FALSE, + wxT("unsupported format in wxDataObjectComposite")); + + return dataObj->SetData(len, buf); +} + +// ---------------------------------------------------------------------------- +// wxTextDataObject +// ---------------------------------------------------------------------------- + +size_t wxTextDataObject::GetDataSize() const +{ + return GetTextLength(); +} + +bool wxTextDataObject::GetDataHere(void *buf) const +{ + strcpy((char *)buf, GetText().mb_str()); + + return TRUE; +} + +bool wxTextDataObject::SetData(size_t WXUNUSED(len), const void *buf) +{ + SetText(wxString((const char *)buf)); + + return TRUE; +} + +// ---------------------------------------------------------------------------- +// wxFileDataObjectBase +// ---------------------------------------------------------------------------- + +wxString wxFileDataObjectBase::GetFilenames() const +{ + wxString str; + size_t count = m_filenames.GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + str << m_filenames[n] << wxT('\0'); + } + + return str; +} + +void wxFileDataObjectBase::SetFilenames(const wxChar* filenames) +{ + m_filenames.Empty(); + + wxString current; + for ( const wxChar *pc = filenames; ; pc++ ) + { + if ( *pc ) + { + current += *pc; + } + else + { + if ( !current ) + { + // 2 consecutive NULs - this is the end of the string + break; + } + + m_filenames.Add(current); + current.Empty(); + } + } +} + +// ---------------------------------------------------------------------------- +// wxCustomDataObject +// ---------------------------------------------------------------------------- + +wxCustomDataObject::~wxCustomDataObject() +{ + Free(); +} + +void wxCustomDataObject::TakeData(size_t size, void *data) +{ + Free(); + + m_size = size; + m_data = data; +} + +void *wxCustomDataObject::Alloc(size_t size) +{ + return (void *)new char[size]; +} + +void wxCustomDataObject::Free() +{ + delete [] m_data; + m_size = 0; + m_data = (void *)NULL; +} + +size_t wxCustomDataObject::GetDataSize() const +{ + return GetSize(); +} + +bool wxCustomDataObject::GetDataHere(void *buf) const +{ + void *data = GetData(); + if ( !data ) + return FALSE; + + memcpy(buf, data, GetSize()); + + return TRUE; +} + +bool wxCustomDataObject::SetData(size_t len, const void *buf) +{ + Free(); + + m_data = Alloc(size); + if ( !m_data ) + return FALSE; + + memcpy(m_data, buf, m_size = len); + + return TRUE; +} + -- 2.45.2