// ask if data in correct format is available
virtual bool IsSupported( const wxDataFormat& format ) = 0;
+ // ask if data in correct format is available
+ virtual bool IsSupportedAsync( wxEvtHandler *sink );
+
// fill data with data on the clipboard (if available)
virtual bool GetData( wxDataObject& data ) = 0;
#include "../sample.xpm"
#endif
+
+#define USE_ASYNCHRONOUS_CLIPBOARD_REQUEST 0
+
class MyApp : public wxApp
{
public:
virtual bool OnInit();
};
+#if USE_ASYNCHRONOUS_CLIPBOARD_REQUEST
enum AsyncRequestState
{
Idle,
Waiting,
Finished
};
+#endif
class MyFrame : public wxFrame
{
void OnAbout(wxCommandEvent&event);
void OnWriteClipboardContents(wxCommandEvent&event);
void OnUpdateUI(wxUpdateUIEvent&event);
+#if USE_ASYNCHRONOUS_CLIPBOARD_REQUEST
void OnClipboardChange(wxClipboardEvent&event);
+#endif
private:
wxTextCtrl *m_textctrl;
+#if USE_ASYNCHRONOUS_CLIPBOARD_REQUEST
AsyncRequestState m_request;
bool m_clipboardSupportsText;
+#endif
DECLARE_EVENT_TABLE()
};
EVT_MENU(ID_About, MyFrame::OnAbout)
EVT_BUTTON(ID_Write, MyFrame::OnWriteClipboardContents)
EVT_UPDATE_UI(ID_Write, MyFrame::OnUpdateUI)
+#if USE_ASYNCHRONOUS_CLIPBOARD_REQUEST
EVT_CLIPBOARD_CHANGED(MyFrame::OnClipboardChange)
+#endif
END_EVENT_TABLE()
IMPLEMENT_APP(MyApp)
// set the frame icon
SetIcon(wxICON(sample));
+#if USE_ASYNCHRONOUS_CLIPBOARD_REQUEST
m_request = Idle;
m_clipboardSupportsText = false;
+#endif
#if wxUSE_MENUS
// create a menu bar
panel->SetSizer( main_sizer );
}
-void MyFrame::OnWriteClipboardContents(wxCommandEvent& event)
+void MyFrame::OnWriteClipboardContents(wxCommandEvent& WXUNUSED(event))
{
if (wxTheClipboard->Open())
{
}
}
+#if USE_ASYNCHRONOUS_CLIPBOARD_REQUEST
void MyFrame::OnClipboardChange(wxClipboardEvent&event)
{
m_clipboardSupportsText = event.SupportsFormat( wxDF_UNICODETEXT );
m_request = Finished;
}
+#endif
void MyFrame::OnUpdateUI(wxUpdateUIEvent&event)
{
+#if USE_ASYNCHRONOUS_CLIPBOARD_REQUEST
if (m_request == Idle)
{
wxTheClipboard->IsSupportedAsync( this );
event.Enable( m_clipboardSupportsText );
m_request = Idle;
}
+#else
+ event.Enable( wxTheClipboard->IsSupported( wxDF_UNICODETEXT ) );
+#endif
}
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
bool wxClipboardEvent::SupportsFormat( const wxDataFormat &format ) const
{
+#ifdef __WXGTK20__
+ // GTK has an asynchronnous API which reports
+ // the supported formats one by one.
+ // We may have to add X11 and Motif later.
wxVector<wxDataFormat>::size_type n;
for (n = 0; n < m_formats.size(); n++)
{ if (m_formats[n] == format) return true; }
return false;
+#else
+ // All other ports just query the clipboard directly
+ // from here
+ wxClipboard* clipboard = (wxClipboard*) GetEventObject();
+ return clipboard->IsSupported( format );
+#endif
}
void wxClipboardEvent::AddFormat( const wxDataFormat &format )
return gs_clipboard;
}
+bool wxClipboardBase::IsSupportedAsync( wxEvtHandler *sink )
+{
+ // We just imitate an asynchronous API on most platforms.
+ // This method is overridden uner GTK.
+ wxClipboardEvent *event = new wxClipboardEvent(wxEVT_CLIPBOARD_CHANGED);
+ event->SetEventObject( this );
+
+ sink->QueueEvent( event );
+
+ return true;
+}
+
+
// ----------------------------------------------------------------------------
// wxClipboardModule: module responsible for destroying the global clipboard
// object