26#include <wx/clipbrd.h>
27#include <wx/dataobj.h>
30#include <wx/mstream.h>
32#include <wx/sstream.h>
40 if( wxTheClipboard->Open() )
43 wxTheClipboard->SetData(
44 new wxTextDataObject( wxString( aTextUTF8.c_str(), wxConvUTF8 ) ) );
46 wxTheClipboard->Flush();
47 wxTheClipboard->Close();
56bool SaveClipboard(
const std::string& aTextUTF8,
const std::vector<CLIPBOARD_MIME_DATA>& aMimeData )
58 if( aMimeData.empty() )
63 if( wxTheClipboard->Open() )
65 wxDataObjectComposite* data =
new wxDataObjectComposite();
66 data->Add(
new wxTextDataObject( wxString( aTextUTF8.c_str(), wxConvUTF8 ) ),
true );
71 if( entry.m_data.GetDataLen() == 0 && !entry.m_image.has_value() )
76 if( entry.m_useRawPngData && entry.m_data.GetDataLen() > 0 )
78 wxCustomDataObject* custom =
new wxCustomDataObject( wxDF_BITMAP );
79 custom->Alloc( entry.m_data.GetDataLen() );
80 custom->SetData( entry.m_data.GetDataLen(), entry.m_data.GetData() );
90 if( entry.m_image.has_value() && entry.m_image->IsOk() )
92 data->Add(
new wxBitmapDataObject( *entry.m_image ) );
100 wxDataFormat format( entry.m_mimeType );
101 wxCustomDataObject* custom =
new wxCustomDataObject( format );
104 custom->Alloc( entry.m_data.GetDataLen() );
105 custom->SetData( entry.m_data.GetDataLen(), entry.m_data.GetData() );
109 wxTheClipboard->SetData( data );
110 wxTheClipboard->Flush();
111 wxTheClipboard->Close();
129 bool wasAlreadyOpen = wxTheClipboard->IsOpened();
130 bool isOpen = wasAlreadyOpen || wxTheClipboard->Open();
134 if( wxTheClipboard->IsSupported( wxDataFormat( wxS(
"application/kicad" ) ) ) )
136 wxCustomDataObject data( wxDataFormat( wxS(
"application/kicad" ) ) );
138 if( wxTheClipboard->GetData( data ) )
140 result.assign(
static_cast<const char*
>( data.GetData() ), data.GetSize() );
142 if( !wasAlreadyOpen )
143 wxTheClipboard->Close();
149 if( wxTheClipboard->IsSupported( wxDF_TEXT )
150 || wxTheClipboard->IsSupported( wxDF_UNICODETEXT ) )
152 wxTextDataObject data;
153 wxTheClipboard->GetData( data );
157 result = data.GetText().utf8_str();
160 if( !wasAlreadyOpen )
161 wxTheClipboard->Close();
170 std::unique_ptr<wxBitmap> bitmap;
174 bool wasAlreadyOpen = wxTheClipboard->IsOpened();
175 bool isOpen = wasAlreadyOpen || wxTheClipboard->Open();
179 if( wxTheClipboard->IsSupported( wxDF_BITMAP ) )
181 wxBitmapDataObject data;
183 if( wxTheClipboard->GetData( data ) )
185 bitmap = std::make_unique<wxBitmap>( data.GetBitmap() );
190 else if( wxDataFormat pngFormat( wxS(
"public.png" ) ); wxTheClipboard->IsSupported( pngFormat ) )
192 wxCustomDataObject pngData( pngFormat );
194 if( wxTheClipboard->GetData( pngData ) && pngData.GetSize() > 0 )
196 wxMemoryInputStream stream( pngData.GetData(), pngData.GetSize() );
197 wxImage img( stream, wxBITMAP_TYPE_PNG );
200 bitmap = std::make_unique<wxBitmap>( img );
204 else if( wxTheClipboard->IsSupported( wxDF_FILENAME ) )
206 wxFileDataObject data;
208 if( wxTheClipboard->GetData( data ) && data.GetFilenames().size() == 1 )
210 wxImage img( data.GetFilenames()[0] );
211 bitmap = std::make_unique<wxBitmap>( img );
213 if( !bitmap->IsOk() )
218 if( !wasAlreadyOpen )
219 wxTheClipboard->Close();
230 if( wxTheClipboard->Open() )
232 wxDataObjectComposite* data =
new wxDataObjectComposite();
236 wxStringOutputStream os;
240 data->Add(
new wxTextDataObject( os.GetString() ),
true );
249 wxTheClipboard->SetData( data );
250 wxTheClipboard->Flush();
251 wxTheClipboard->Close();
268 bool wasAlreadyOpen = wxTheClipboard->IsOpened();
269 bool isOpen = wasAlreadyOpen || wxTheClipboard->Open();
273 if( wxTheClipboard->IsSupported( wxDF_TEXT ) )
275 wxTextDataObject data;
277 if( wxTheClipboard->GetData( data ) )
285 if( !wasAlreadyOpen )
286 wxTheClipboard->Close();
298 wxImage imageCopy( aImage );
301 imageCopy.SetOption( wxIMAGE_OPTION_PNG_COMPRESSION_LEVEL, 1 );
302 imageCopy.SetOption( wxIMAGE_OPTION_PNG_COMPRESSION_STRATEGY, 3 );
303 imageCopy.SetOption( wxIMAGE_OPTION_PNG_FILTER, 0x08 );
305 wxMemoryOutputStream memStream;
306 wxBufferedOutputStream bufferedStream( memStream );
308 if( !imageCopy.SaveFile( bufferedStream, wxBITMAP_TYPE_PNG ) )
310 wxLogDebug( wxS(
"Failed to encode PNG" ) );
314 bufferedStream.Close();
316 auto stBuf = memStream.GetOutputStreamBuffer();
317 aOutput.SetDataLen( 0 );
318 aOutput.AppendData( stBuf->GetBufferStart(), stBuf->GetIntPosition() );
325 const wxImage* aFallbackImage )
327 wxCHECK( wxTheClipboard->IsOpened(),
false );
328 wxCHECK( aPngData.GetDataLen() > 0,
false );
330#if defined( __WXMSW__ )
331 aData->Add(
new wxCustomDataObject( wxDataFormat( wxDataFormatId::wxDF_BITMAP ) ) );
333 wxCustomDataObject* pngObj =
new wxCustomDataObject( wxDataFormat(
"PNG" ) );
334 pngObj->SetData( aPngData.GetDataLen(), aPngData.GetData() );
335 aData->Add( pngObj );
336#elif defined( __WXGTK__ )
337 wxCustomDataObject* pngObj =
new wxCustomDataObject( wxDF_BITMAP );
338 pngObj->SetData( aPngData.GetDataLen(), aPngData.GetData() );
339 aData->Add( pngObj );
341 wxCHECK( aFallbackImage && aFallbackImage->IsOk(),
false );
342 aData->Add(
new wxBitmapDataObject( wxBitmap( *aFallbackImage ) ) );
351 wxCHECK( wxTheClipboard->IsOpened(),
false );
352 wxCHECK( aImage.IsOk(),
false );
354#if defined( __WXGTK__ ) || defined( __WXMSW__ )
355 wxMemoryBuffer pngData;
362 aData->Add(
new wxBitmapDataObject( wxBitmap( aImage ) ) );
void WriteLines(const std::vector< std::vector< wxString > > &aRows)
Write a vector of rows to the stream.
std::unique_ptr< wxBitmap > GetImageFromClipboard()
Get image data from the clipboard, if there is any.
bool EncodeImageToPng(const wxImage &aImage, wxMemoryBuffer &aOutput)
Encode an image to PNG format with fast compression settings optimized for clipboard use.
bool AddTransparentImageToClipboardData(wxDataObjectComposite *aData, wxImage aImage)
Adds an image to clipboard data in a platform-specific way such that transparency is supported.
bool SaveTabularDataToClipboard(const std::vector< std::vector< wxString > > &aData)
Store tabular data to the system clipboard.
bool SaveClipboard(const std::string &aTextUTF8)
Store information to the system clipboard.
std::string GetClipboardUTF8()
Return the information currently stored in the system clipboard.
bool AddPngToClipboardData(wxDataObjectComposite *aData, const wxMemoryBuffer &aPngData, const wxImage *aFallbackImage)
Adds pre-encoded PNG data to clipboard in a platform-specific way.
bool GetTabularDataFromClipboard(std::vector< std::vector< wxString > > &aData)
Attempt to get tabular data from the clipboard.
bool AutoDecodeCSV(const wxString &aInput, std::vector< std::vector< wxString > > &aData)
Try to guess the format of a T/CSV file and decode it into aData.
wxString result
Test unit parsing edge cases and error handling.