wxwidgets/src/qt/clipbrd.cpp
Tim Stahlhut fb5d1a002c Fixes for wxQt build under Cygwin
Include the missing headers, notable QtGui/QFont from wx/fontutil.h which uses
a QFont object.

Closes #16750.
2015-10-25 18:00:05 +01:00

190 lines
4.6 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: wx/qt/toolbar.h
// Author: Sean D'Epagnier
// Copyright: (c) Sean D'Epagnier 2014
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include <QApplication>
#include <QClipboard>
#include "wx/clipbrd.h"
#include "wx/scopedarray.h"
#include "wx/scopeguard.h"
#include "wx/qt/private/converter.h"
// ----------------------------------------------------------------------------
// wxClipboard ctor/dtor
// ----------------------------------------------------------------------------
wxIMPLEMENT_DYNAMIC_CLASS(wxClipboard, wxObject);
#define QtClipboard QApplication::clipboard()
typedef wxScopedArray<wxDataFormat> wxDataFormatArray;
class QtClipBoardSignalHandler : public QObject
{
public:
QtClipBoardSignalHandler(wxClipboard *clipboard)
: m_clipboard(clipboard)
{
connect(QtClipboard, &QClipboard::changed, this, &QtClipBoardSignalHandler::changed);
}
private:
void changed( QClipboard::Mode mode)
{
if(mode != m_clipboard->Mode() || !m_clipboard->m_sink)
return;
wxClipboardEvent *event = new wxClipboardEvent(wxEVT_CLIPBOARD_CHANGED);
event->SetEventObject( m_clipboard );
m_clipboard->m_sink->QueueEvent( event );
m_clipboard->m_sink.Release();
}
wxClipboard *m_clipboard;
};
wxClipboard::wxClipboard()
{
m_SignalHandler = new QtClipBoardSignalHandler(this);
m_open = false;
}
wxClipboard::~wxClipboard()
{
delete m_SignalHandler;
}
bool wxClipboard::Open()
{
wxCHECK_MSG( !m_open, false, wxT("clipboard already open") );
m_open = true;
return true;
}
void wxClipboard::Close()
{
wxCHECK_RET( m_open, wxT("clipboard not open") );
m_open = false;
}
bool wxClipboard::IsOpened() const
{
return m_open;
}
bool wxClipboard::AddData( wxDataObject *data )
{
QMimeData *MimeData = new QMimeData;
const size_t count = data->GetFormatCount();
wxDataFormatArray formats(count);
data->GetAllFormats(formats.get());
// how to add timestamp?
// Unfortunately I cannot find a way to use the qt clipboard with
// a callback to select the data type, so I must copy it all here
for ( size_t i = 0; i < count; i++ )
{
const wxDataFormat format(formats[i]);
int size = data->GetDataSize( format );
if ( !size )
continue;
QByteArray bytearray(size, 0);
data->GetDataHere(format, bytearray.data());
MimeData->setData(format.m_MimeType, bytearray);
}
delete data;
QtClipboard->setMimeData(MimeData, (QClipboard::Mode)Mode());
return true;
}
bool wxClipboard::SetData( wxDataObject *data )
{
wxCHECK_MSG( m_open, false, wxT("clipboard not open") );
wxCHECK_MSG( data, false, wxT("data is invalid") );
Clear();
return AddData( data );
}
bool wxClipboard::GetData( wxDataObject& data )
{
wxCHECK_MSG( m_open, false, wxT("clipboard not open") );
const QMimeData *MimeData = QtClipboard->mimeData( (QClipboard::Mode)Mode() );
const size_t count = data.GetFormatCount(wxDataObject::Set);
wxDataFormatArray formats(count);
data.GetAllFormats(formats.get(), wxDataObject::Set);
for ( size_t i = 0; i < count; i++ )
{
const wxDataFormat format(formats[i]);
// is this format supported by clipboard ?
if( !MimeData->hasFormat(format.m_MimeType) )
continue;
wxTextDataObject *textdata = dynamic_cast<wxTextDataObject*>(&data);
if(textdata)
textdata->SetText(wxQtConvertString(MimeData->text()));
else
{
QByteArray bytearray = MimeData->data( format.m_MimeType ).data();
data.SetData(format, bytearray.size(), bytearray.constData());
}
return true;
}
return false;
}
void wxClipboard::Clear()
{
QtClipboard->clear( (QClipboard::Mode)Mode() );
}
bool wxClipboard::IsSupported( const wxDataFormat& format )
{
const QMimeData *data = QtClipboard->mimeData( (QClipboard::Mode)Mode() );
return data->hasFormat(format.m_MimeType);
}
bool wxClipboard::IsSupportedAsync(wxEvtHandler *sink)
{
if (m_sink.get())
return false; // currently busy, come back later
wxCHECK_MSG( sink, false, wxT("no sink given") );
m_sink = sink;
return true;
}
int wxClipboard::Mode()
{
return m_usePrimary ? QClipboard::Selection : QClipboard::Clipboard;
}