diff --git a/include/wx/dataobj.h b/include/wx/dataobj.h index 19563d31a4..7c7aee91f9 100644 --- a/include/wx/dataobj.h +++ b/include/wx/dataobj.h @@ -467,6 +467,7 @@ private: { public: wxString GetURL() const { return GetText(); } + void SetURL(const wxString& url) { SetText(url); } }; #endif // __WXMSW__/!__WXMSW__ diff --git a/include/wx/dnd.h b/include/wx/dnd.h index 20d34cd6bc..b0c68b3b54 100644 --- a/include/wx/dnd.h +++ b/include/wx/dnd.h @@ -34,12 +34,13 @@ enum wxDragResult wxDragNone, // drag target didn't accept the data wxDragCopy, // the data was successfully copied wxDragMove, // the data was successfully moved (MSW only) + wxDragLink, // operation is a drag-link wxDragCancel // the operation was cancelled by user (not an error) }; inline WXDLLEXPORT bool wxIsDragResultOk(wxDragResult res) { - return res == wxDragCopy || res == wxDragMove; + return res == wxDragCopy || res == wxDragMove || res == wxDragLink; } // ---------------------------------------------------------------------------- diff --git a/include/wx/msw/ole/dataobj2.h b/include/wx/msw/ole/dataobj2.h index 7fdfa70f97..6f3740d972 100644 --- a/include/wx/msw/ole/dataobj2.h +++ b/include/wx/msw/ole/dataobj2.h @@ -90,6 +90,9 @@ public: // return the URL as string wxString GetURL() const; + // Set a string as the URL in the data object + void SetURL(const wxString& url); + // override to set m_textFormat virtual bool SetData(const wxDataFormat& format, size_t len, diff --git a/samples/dnd/dnd.cpp b/samples/dnd/dnd.cpp index 164dd9c712..474633ce89 100644 --- a/samples/dnd/dnd.cpp +++ b/samples/dnd/dnd.cpp @@ -109,7 +109,10 @@ public: // URLs can't be moved, only copied virtual wxDragResult OnDragOver(wxCoord WXUNUSED(x), wxCoord WXUNUSED(y), wxDragResult def) - { return def == wxDragMove ? wxDragCopy : def; } + { + return wxDragLink; // At least IE 5.x needs wxDragLink, the + // other browsers on MSW seem okay with it too. + } // translate this to calls to OnDropURL() just for convenience virtual wxDragResult OnData(wxCoord x, wxCoord y, wxDragResult def) @@ -1462,7 +1465,7 @@ DnDShapeDialog::DnDShapeDialog(wxFrame *parent, DnDShape *shape) const wxString choices[] = { wxT("None"), wxT("Triangle"), wxT("Rectangle"), wxT("Ellipse") }; - m_radio = new wxRadioBox( this, -1, wxT("&Shape"), + m_radio = new wxRadioBox( this, -1, wxT("&Shape"), wxDefaultPosition, wxDefaultSize, 4, choices, 4, wxRA_SPECIFY_COLS ); shapesSizer->Add( m_radio, 0, wxGROW|wxALL, 5 ); @@ -1472,32 +1475,32 @@ DnDShapeDialog::DnDShapeDialog(wxFrame *parent, DnDShape *shape) wxStaticBox* box = new wxStaticBox( this, -1, wxT("&Attributes") ); wxStaticBoxSizer* attrSizer = new wxStaticBoxSizer( box, wxHORIZONTAL ); wxFlexGridSizer* xywhSizer = new wxFlexGridSizer( 4, 2 ); - + wxStaticText* st; st = new wxStaticText( this, -1, wxT("Position &X:") ); m_textX = new wxTextCtrl( this, -1, wxEmptyString, wxDefaultPosition, wxSize( 30, 20 ) ); - xywhSizer->Add( st, 1, wxGROW|wxALL, 2 ); - xywhSizer->Add( m_textX, 1, wxGROW|wxALL, 2 ); + xywhSizer->Add( st, 1, wxGROW|wxALL, 2 ); + xywhSizer->Add( m_textX, 1, wxGROW|wxALL, 2 ); st = new wxStaticText( this, -1, wxT("Size &width:") ); m_textW = new wxTextCtrl( this, -1, wxEmptyString, wxDefaultPosition, wxSize( 30, 20 ) ); - xywhSizer->Add( st, 1, wxGROW|wxALL, 2 ); - xywhSizer->Add( m_textW, 1, wxGROW|wxALL, 2 ); + xywhSizer->Add( st, 1, wxGROW|wxALL, 2 ); + xywhSizer->Add( m_textW, 1, wxGROW|wxALL, 2 ); st = new wxStaticText( this, -1, wxT("&Y:") ); m_textY = new wxTextCtrl( this, -1, wxEmptyString, wxDefaultPosition, wxSize( 30, 20 ) ); - xywhSizer->Add( st, 1, wxALL|wxALIGN_RIGHT, 2 ); - xywhSizer->Add( m_textY, 1, wxGROW|wxALL, 2 ); + xywhSizer->Add( st, 1, wxALL|wxALIGN_RIGHT, 2 ); + xywhSizer->Add( m_textY, 1, wxGROW|wxALL, 2 ); st = new wxStaticText( this, -1, wxT("&height:") ); m_textH = new wxTextCtrl( this, -1, wxEmptyString, wxDefaultPosition, wxSize( 30, 20 ) ); - xywhSizer->Add( st, 1, wxALL|wxALIGN_RIGHT, 2 ); - xywhSizer->Add( m_textH, 1, wxGROW|wxALL, 2 ); + xywhSizer->Add( st, 1, wxALL|wxALIGN_RIGHT, 2 ); + xywhSizer->Add( m_textH, 1, wxGROW|wxALL, 2 ); wxButton* col = new wxButton( this, Button_Colour, wxT("&Colour...") ); attrSizer->Add( xywhSizer, 1, wxGROW ); diff --git a/src/msw/ole/dataobj.cpp b/src/msw/ole/dataobj.cpp index 7d1870e9a2..29c0d6f8e5 100644 --- a/src/msw/ole/dataobj.cpp +++ b/src/msw/ole/dataobj.cpp @@ -1109,8 +1109,8 @@ wxURLDataObject::wxURLDataObject() // we support CF_TEXT and CFSTR_SHELLURL formats which are basicly the same // but it seems that some browsers only provide one of them so we have to // support both - Add(new CFSTR_SHELLURLDataObject()); Add(new wxTextDataObject); + Add(new CFSTR_SHELLURLDataObject()); // we don't have any data yet m_dataObjectLast = NULL; @@ -1135,12 +1135,18 @@ wxString wxURLDataObject::GetURL() const size_t len = m_dataObjectLast->GetDataSize(); - m_dataObjectLast->GetDataHere(url.GetWriteBuf(len + 1)); + m_dataObjectLast->GetDataHere(url.GetWriteBuf(len)); url.UngetWriteBuf(); return url; } +void wxURLDataObject::SetURL(const wxString& url) +{ + SetData(wxDataFormat(wxDF_TEXT), url.Length()+1, url.c_str()); + SetData(wxDataFormat(CFSTR_SHELLURL), url.Length()+1, url.c_str()); +} + // ---------------------------------------------------------------------------- // private functions // ---------------------------------------------------------------------------- diff --git a/src/msw/ole/droptgt.cpp b/src/msw/ole/droptgt.cpp index 20e505910c..d1e4a97b11 100644 --- a/src/msw/ole/droptgt.cpp +++ b/src/msw/ole/droptgt.cpp @@ -484,6 +484,9 @@ static wxDragResult ConvertDragEffectToResult(DWORD dwEffect) case DROPEFFECT_COPY: return wxDragCopy; + case DROPEFFECT_LINK: + return wxDragLink; + case DROPEFFECT_MOVE: return wxDragMove; @@ -502,6 +505,9 @@ static DWORD ConvertDragResultToEffect(wxDragResult result) case wxDragCopy: return DROPEFFECT_COPY; + case wxDragLink: + return DROPEFFECT_LINK; + case wxDragMove: return DROPEFFECT_MOVE;