22#include <wx/clipbrd.h>
23#include <wx/dataobj.h>
26#include <wx/mstream.h>
28#include <wx/sstream.h>
36 if( wxTheClipboard->Open() )
39 wxTheClipboard->SetData(
40 new wxTextDataObject( wxString( aTextUTF8.c_str(), wxConvUTF8 ) ) );
42 wxTheClipboard->Flush();
43 wxTheClipboard->Close();
52bool SaveClipboard(
const std::string& aTextUTF8,
const std::vector<CLIPBOARD_MIME_DATA>& aMimeData )
54 if( aMimeData.empty() )
59 if( wxTheClipboard->Open() )
61 wxDataObjectComposite* data =
new wxDataObjectComposite();
62 data->Add(
new wxTextDataObject( wxString( aTextUTF8.c_str(), wxConvUTF8 ) ),
true );
67 if( entry.m_data.GetDataLen() == 0 && !entry.m_image.has_value() )
72 if( entry.m_useRawPngData && entry.m_data.GetDataLen() > 0 )
74 wxCustomDataObject* custom =
new wxCustomDataObject( wxDF_BITMAP );
75 custom->Alloc( entry.m_data.GetDataLen() );
76 custom->SetData( entry.m_data.GetDataLen(), entry.m_data.GetData() );
86 if( entry.m_image.has_value() && entry.m_image->IsOk() )
88 data->Add(
new wxBitmapDataObject( *entry.m_image ) );
96 wxDataFormat format( entry.m_mimeType );
97 wxCustomDataObject* custom =
new wxCustomDataObject( format );
100 custom->Alloc( entry.m_data.GetDataLen() );
101 custom->SetData( entry.m_data.GetDataLen(), entry.m_data.GetData() );
105 wxTheClipboard->SetData( data );
106 wxTheClipboard->Flush();
107 wxTheClipboard->Close();
125 bool wasAlreadyOpen = wxTheClipboard->IsOpened();
126 bool isOpen = wasAlreadyOpen || wxTheClipboard->Open();
130 if( wxTheClipboard->IsSupported( wxDataFormat( wxS(
"application/kicad" ) ) ) )
132 wxCustomDataObject data( wxDataFormat( wxS(
"application/kicad" ) ) );
134 if( wxTheClipboard->GetData( data ) )
136 result.assign(
static_cast<const char*
>( data.GetData() ), data.GetSize() );
138 if( !wasAlreadyOpen )
139 wxTheClipboard->Close();
145 if( wxTheClipboard->IsSupported( wxDF_TEXT )
146 || wxTheClipboard->IsSupported( wxDF_UNICODETEXT ) )
148 wxTextDataObject data;
149 wxTheClipboard->GetData( data );
153 result = data.GetText().utf8_str();
156 if( !wasAlreadyOpen )
157 wxTheClipboard->Close();
166 std::unique_ptr<wxBitmap> bitmap;
170 bool wasAlreadyOpen = wxTheClipboard->IsOpened();
171 bool isOpen = wasAlreadyOpen || wxTheClipboard->Open();
175 if( wxTheClipboard->IsSupported( wxDF_BITMAP ) )
177 wxBitmapDataObject data;
179 if( wxTheClipboard->GetData( data ) )
181 bitmap = std::make_unique<wxBitmap>( data.GetBitmap() );
186 else if( wxDataFormat pngFormat( wxS(
"public.png" ) ); wxTheClipboard->IsSupported( pngFormat ) )
188 wxCustomDataObject pngData( pngFormat );
190 if( wxTheClipboard->GetData( pngData ) && pngData.GetSize() > 0 )
192 wxMemoryInputStream stream( pngData.GetData(), pngData.GetSize() );
193 wxImage img( stream, wxBITMAP_TYPE_PNG );
196 bitmap = std::make_unique<wxBitmap>( img );
200 else if( wxTheClipboard->IsSupported( wxDF_FILENAME ) )
202 wxFileDataObject data;
204 if( wxTheClipboard->GetData( data ) && data.GetFilenames().size() == 1 )
206 wxImage img( data.GetFilenames()[0] );
207 bitmap = std::make_unique<wxBitmap>( img );
209 if( !bitmap->IsOk() )
214 if( !wasAlreadyOpen )
215 wxTheClipboard->Close();
226 if( wxTheClipboard->Open() )
228 wxDataObjectComposite* data =
new wxDataObjectComposite();
232 wxStringOutputStream os;
236 data->Add(
new wxTextDataObject( os.GetString() ),
true );
245 wxTheClipboard->SetData( data );
246 wxTheClipboard->Flush();
247 wxTheClipboard->Close();
264 bool wasAlreadyOpen = wxTheClipboard->IsOpened();
265 bool isOpen = wasAlreadyOpen || wxTheClipboard->Open();
269 if( wxTheClipboard->IsSupported( wxDF_TEXT ) || wxTheClipboard->IsSupported( wxDF_UNICODETEXT ) )
271 wxTextDataObject data;
273 if( wxTheClipboard->GetData( data ) )
279 if( !wasAlreadyOpen )
280 wxTheClipboard->Close();
292 wxImage imageCopy( aImage );
295 imageCopy.SetOption( wxIMAGE_OPTION_PNG_COMPRESSION_LEVEL, 1 );
296 imageCopy.SetOption( wxIMAGE_OPTION_PNG_COMPRESSION_STRATEGY, 3 );
297 imageCopy.SetOption( wxIMAGE_OPTION_PNG_FILTER, 0x08 );
299 wxMemoryOutputStream memStream;
300 wxBufferedOutputStream bufferedStream( memStream );
302 if( !imageCopy.SaveFile( bufferedStream, wxBITMAP_TYPE_PNG ) )
304 wxLogDebug( wxS(
"Failed to encode PNG" ) );
308 bufferedStream.Close();
310 auto stBuf = memStream.GetOutputStreamBuffer();
311 aOutput.SetDataLen( 0 );
312 aOutput.AppendData( stBuf->GetBufferStart(), stBuf->GetIntPosition() );
319 const wxImage* aFallbackImage )
321 wxCHECK( wxTheClipboard->IsOpened(),
false );
322 wxCHECK( aPngData.GetDataLen() > 0,
false );
324#if defined( __WXMSW__ )
325 aData->Add(
new wxCustomDataObject( wxDataFormat( wxDataFormatId::wxDF_BITMAP ) ) );
327 wxCustomDataObject* pngObj =
new wxCustomDataObject( wxDataFormat(
"PNG" ) );
328 pngObj->SetData( aPngData.GetDataLen(), aPngData.GetData() );
329 aData->Add( pngObj );
330#elif defined( __WXGTK__ )
331 wxCustomDataObject* pngObj =
new wxCustomDataObject( wxDF_BITMAP );
332 pngObj->SetData( aPngData.GetDataLen(), aPngData.GetData() );
333 aData->Add( pngObj );
335 wxCHECK( aFallbackImage && aFallbackImage->IsOk(),
false );
336 aData->Add(
new wxBitmapDataObject( wxBitmap( *aFallbackImage ) ) );
345 wxCHECK( wxTheClipboard->IsOpened(),
false );
346 wxCHECK( aImage.IsOk(),
false );
348#if defined( __WXGTK__ ) || defined( __WXMSW__ )
349 wxMemoryBuffer pngData;
356 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.