#if defined(__WXMSW__)
#include "wx/msw/ole/dataobj2.h"
-#elif defined(__WXMOTIF__)
- // #include "wx/motif/dataobj2.h" -- not yet
-#elif defined(__WXGTK__)
- #include "wx/gtk/dataobj2.h"
-#elif defined(__WXMAC__)
- #include "wx/mac/dataobj2.h"
-#elif defined(__WXPM__)
- #include "wx/os2/dataobj2.h"
-#endif
+
+ // wxURLDataObject defined in msw/ole/dataobj2.h
+#else // !__WXMSW__
+ #if defined(__WXGTK__)
+ #include "wx/gtk/dataobj2.h"
+ #elif defined(__WXMAC__)
+ #include "wx/mac/dataobj2.h"
+ #elif defined(__WXPM__)
+ #include "wx/os2/dataobj2.h"
+ #endif
+
+ // wxURLDataObject is simply wxTextDataObject with a different name
+ class WXDLLEXPORT wxURLDataObject : public wxTextDataObject
+ {
+ public:
+ wxString GetURL() const { return GetText(); }
+ };
+#endif // __WXMSW__/!__WXMSW__
#endif // _WX_DATAOBJ_H_BASE_
bool IsSupportedFormat(const wxDataFormat& format) const
{ return wxDataObjectBase::IsSupported(format, Get); }
-#ifdef __WXDEBUG__
// function to return symbolic name of clipboard format (for debug messages)
+#ifdef __WXDEBUG__
static const wxChar *GetFormatName(wxDataFormat format);
#define wxGetFormatName(format) wxDataObject::GetFormatName(format)
#else // !Debug
- #define wxGetFormatName(format) ""
+ #define wxGetFormatName(format) _T("")
#endif // Debug/!Debug
private:
virtual void AddFile(const wxString& file);
};
+// ----------------------------------------------------------------------------
+// wxURLDataObject: data object for URLs
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxURLDataObject : public wxDataObjectComposite
+{
+public:
+ wxURLDataObject();
+
+ // return the URL as string
+ wxString GetURL() const;
+
+ // override to set m_textFormat
+ virtual bool SetData(const wxDataFormat& format,
+ size_t len,
+ const void *buf);
+
+private:
+ // last data object we got data in
+ wxDataObjectSimple *m_dataObjectLast;
+};
+
#endif // _WX_MSW_OLE_DATAOBJ2_H
wxListBox *m_pOwner;
};
+// ----------------------------------------------------------------------------
+// Define a custom dtop target accepting URLs
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT URLDropTarget : public wxDropTarget
+{
+public:
+ URLDropTarget() { SetDataObject(new wxURLDataObject); }
+
+ void OnDropURL(wxCoord x, wxCoord y, const wxString& text)
+ {
+ // of course, a real program would do something more useful here...
+ wxMessageBox(text, _T("wxDnD sample: got URL"),
+ wxICON_INFORMATION | wxOK);
+ }
+
+ // URLs can't be moved, only copied
+ virtual wxDragResult OnDragOver(wxCoord WXUNUSED(x), wxCoord WXUNUSED(y),
+ wxDragResult def)
+ { return def == wxDragMove ? wxDragCopy : def; }
+
+ // translate this to calls to OnDropURL() just for convenience
+ virtual wxDragResult OnData(wxCoord x, wxCoord y, wxDragResult def)
+ {
+ if ( !GetData() )
+ return wxDragNone;
+
+ OnDropURL(x, y, ((wxURLDataObject *)m_dataObject)->GetURL());
+
+ return def;
+ }
+};
+
// ----------------------------------------------------------------------------
// Define a new application type
// ----------------------------------------------------------------------------
m_pLog = new wxLogTextCtrl(m_ctrlLog);
m_pLogPrev = wxLog::SetActiveTarget(m_pLog);
- // associate drop targets with 2 text controls
+ // associate drop targets with the controls
m_ctrlFile->SetDropTarget(new DnDFile(m_ctrlFile));
m_ctrlText->SetDropTarget(new DnDText(m_ctrlText));
+ m_ctrlLog->SetDropTarget(new URLDropTarget);
wxLayoutConstraints *c;
return TRUE;
}
+// ----------------------------------------------------------------------------
+// wxURLDataObject
+// ----------------------------------------------------------------------------
+
+wxURLDataObject::wxURLDataObject()
+{
+ // we support CF_TEXT and CFSTR_SHELLURL formats which are basicly the same
+ // but it seems that some browsers only provideo ne of them so we have to
+ // support both
+ Add(new wxCustomDataObject(CFSTR_SHELLURL));
+ Add(new wxTextDataObject);
+
+ // we don't have any data yet
+ m_dataObjectLast = NULL;
+}
+
+bool wxURLDataObject::SetData(const wxDataFormat& format,
+ size_t len,
+ const void *buf)
+{
+ m_dataObjectLast = GetObject(format);
+
+ wxCHECK_MSG( m_dataObjectLast, FALSE,
+ wxT("unsupported format in wxURLDataObject"));
+
+ return m_dataObjectLast->SetData(len, buf);
+}
+
+wxString wxURLDataObject::GetURL() const
+{
+ wxString url;
+ wxCHECK_MSG( m_dataObjectLast, url, _T("no data in wxURLDataObject") );
+
+ size_t len = m_dataObjectLast->GetDataSize();
+
+ m_dataObjectLast->GetDataHere(url.GetWriteBuf(len + 1));
+ url.UngetWriteBuf();
+
+ return url;
+}
+
// ----------------------------------------------------------------------------
// private functions
// ----------------------------------------------------------------------------
_T("drop target must have data object") );
// show the list of formats supported by the source data object for the
- // debugging purposes
+ // debugging purposes, this is quite useful sometimes - please don't remove
#if 0
IEnumFORMATETC *penumFmt;
if ( SUCCEEDED(pIDataSource->EnumFormatEtc(DATADIR_GET, &penumFmt)) )
rc = TRUE;
}
else {
- wxLogLastError(wxT("IDataObject::SetData()"));
+ wxLogApiError(wxT("IDataObject::SetData()"), hr);
}
}
else {
- wxLogLastError(wxT("IDataObject::GetData()"));
+ wxLogApiError(wxT("IDataObject::GetData()"), hr);
}
return rc;