added wxDirCtrl to the sample to allow testing of the file names dragging (based on patch attached to the bug 1775213)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48609 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -25,6 +25,7 @@
|
|||||||
#include "wx/clipbrd.h"
|
#include "wx/clipbrd.h"
|
||||||
#include "wx/colordlg.h"
|
#include "wx/colordlg.h"
|
||||||
#include "wx/metafile.h"
|
#include "wx/metafile.h"
|
||||||
|
#include "wx/dirctrl.h"
|
||||||
|
|
||||||
#if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) || defined(__WXMAC__)
|
#if defined(__WXGTK__) || defined(__WXX11__) || defined(__WXMOTIF__) || defined(__WXMAC__)
|
||||||
#include "../sample.xpm"
|
#include "../sample.xpm"
|
||||||
@@ -56,7 +57,7 @@ private:
|
|||||||
class DnDFile : public wxFileDropTarget
|
class DnDFile : public wxFileDropTarget
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
DnDFile(wxListBox *pOwner) { m_pOwner = pOwner; }
|
DnDFile(wxListBox *pOwner = NULL) { m_pOwner = pOwner; }
|
||||||
|
|
||||||
virtual bool OnDropFiles(wxCoord x, wxCoord y,
|
virtual bool OnDropFiles(wxCoord x, wxCoord y,
|
||||||
const wxArrayString& filenames);
|
const wxArrayString& filenames);
|
||||||
@@ -199,7 +200,7 @@ private:
|
|||||||
class DnDFrame : public wxFrame
|
class DnDFrame : public wxFrame
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
DnDFrame(wxFrame *frame, const wxChar *title, int x, int y, int w, int h);
|
DnDFrame();
|
||||||
virtual ~DnDFrame();
|
virtual ~DnDFrame();
|
||||||
|
|
||||||
void OnPaint(wxPaintEvent& event);
|
void OnPaint(wxPaintEvent& event);
|
||||||
@@ -232,17 +233,22 @@ public:
|
|||||||
void OnLeftDown(wxMouseEvent& event);
|
void OnLeftDown(wxMouseEvent& event);
|
||||||
void OnRightDown(wxMouseEvent& event);
|
void OnRightDown(wxMouseEvent& event);
|
||||||
|
|
||||||
|
void OnBeginDrag(wxTreeEvent& event);
|
||||||
|
|
||||||
void OnUpdateUIMoveByDefault(wxUpdateUIEvent& event);
|
void OnUpdateUIMoveByDefault(wxUpdateUIEvent& event);
|
||||||
|
|
||||||
void OnUpdateUIPasteText(wxUpdateUIEvent& event);
|
void OnUpdateUIPasteText(wxUpdateUIEvent& event);
|
||||||
void OnUpdateUIPasteBitmap(wxUpdateUIEvent& event);
|
void OnUpdateUIPasteBitmap(wxUpdateUIEvent& event);
|
||||||
|
|
||||||
DECLARE_EVENT_TABLE()
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
// show the result of a dnd operation in the status bar
|
||||||
|
void LogDragResult(wxDragResult result);
|
||||||
|
|
||||||
|
|
||||||
// GUI controls
|
// GUI controls
|
||||||
wxListBox *m_ctrlFile,
|
wxListBox *m_ctrlFile,
|
||||||
*m_ctrlText;
|
*m_ctrlText;
|
||||||
|
wxGenericDirCtrl *m_ctrlDir;
|
||||||
|
|
||||||
#if wxUSE_LOG
|
#if wxUSE_LOG
|
||||||
wxTextCtrl *m_ctrlLog;
|
wxTextCtrl *m_ctrlLog;
|
||||||
@@ -259,6 +265,9 @@ private:
|
|||||||
|
|
||||||
// the text we drag
|
// the text we drag
|
||||||
wxString m_strText;
|
wxString m_strText;
|
||||||
|
|
||||||
|
|
||||||
|
DECLARE_EVENT_TABLE()
|
||||||
};
|
};
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -905,14 +914,7 @@ bool DnDApp::OnInit()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// create the main frame window
|
// create the main frame window
|
||||||
DnDFrame *frame = new DnDFrame((wxFrame *) NULL,
|
new DnDFrame();
|
||||||
_T("Drag-and-Drop/Clipboard wxWidgets Sample"),
|
|
||||||
10, 100, 650, 340);
|
|
||||||
|
|
||||||
// activate it
|
|
||||||
frame->Show(true);
|
|
||||||
|
|
||||||
SetTopWindow(frame);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
#else
|
#else
|
||||||
@@ -923,8 +925,9 @@ bool DnDApp::OnInit()
|
|||||||
|
|
||||||
#if wxUSE_DRAG_AND_DROP || wxUSE_CLIPBOARD
|
#if wxUSE_DRAG_AND_DROP || wxUSE_CLIPBOARD
|
||||||
|
|
||||||
DnDFrame::DnDFrame(wxFrame *frame, const wxChar *title, int x, int y, int w, int h)
|
DnDFrame::DnDFrame()
|
||||||
: wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h)),
|
: wxFrame(NULL, wxID_ANY, _T("Drag-and-Drop/Clipboard wxWidgets Sample"),
|
||||||
|
wxPoint(10, 100)),
|
||||||
m_strText(_T("wxWidgets drag & drop works :-)"))
|
m_strText(_T("wxWidgets drag & drop works :-)"))
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -980,16 +983,20 @@ DnDFrame::DnDFrame(wxFrame *frame, const wxChar *title, int x, int y, int w, int
|
|||||||
|
|
||||||
SetMenuBar(menu_bar);
|
SetMenuBar(menu_bar);
|
||||||
|
|
||||||
// make a panel with 3 subwindows
|
// create the child controls
|
||||||
|
SetBackgroundColour(*wxWHITE); // labels read better on this background
|
||||||
|
|
||||||
wxString strFile(_T("Drop files here!")), strText(_T("Drop text on me"));
|
wxString strFile(_T("Drop files here!")), strText(_T("Drop text on me"));
|
||||||
|
|
||||||
m_ctrlFile = new wxListBox(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 1, &strFile,
|
m_ctrlFile = new wxListBox(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 1, &strFile,
|
||||||
wxLB_HSCROLL | wxLB_ALWAYS_SB );
|
wxLB_HSCROLL | wxLB_ALWAYS_SB );
|
||||||
m_ctrlText = new wxListBox(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 1, &strText,
|
m_ctrlText = new wxListBox(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 1, &strText,
|
||||||
wxLB_HSCROLL | wxLB_ALWAYS_SB );
|
wxLB_HSCROLL | wxLB_ALWAYS_SB );
|
||||||
|
m_ctrlDir = new wxGenericDirCtrl(this);
|
||||||
|
|
||||||
#if wxUSE_LOG
|
#if wxUSE_LOG
|
||||||
m_ctrlLog = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize,
|
m_ctrlLog = new wxTextCtrl(this, wxID_ANY, wxEmptyString,
|
||||||
|
wxDefaultPosition, wxDefaultSize,
|
||||||
wxTE_MULTILINE | wxTE_READONLY |
|
wxTE_MULTILINE | wxTE_READONLY |
|
||||||
wxSUNKEN_BORDER );
|
wxSUNKEN_BORDER );
|
||||||
|
|
||||||
@@ -1002,6 +1009,16 @@ DnDFrame::DnDFrame(wxFrame *frame, const wxChar *title, int x, int y, int w, int
|
|||||||
// associate drop targets with the controls
|
// associate drop targets with the controls
|
||||||
m_ctrlFile->SetDropTarget(new DnDFile(m_ctrlFile));
|
m_ctrlFile->SetDropTarget(new DnDFile(m_ctrlFile));
|
||||||
m_ctrlText->SetDropTarget(new DnDText(m_ctrlText));
|
m_ctrlText->SetDropTarget(new DnDText(m_ctrlText));
|
||||||
|
|
||||||
|
m_ctrlDir->Connect
|
||||||
|
(
|
||||||
|
wxID_ANY,
|
||||||
|
wxEVT_COMMAND_TREE_BEGIN_DRAG,
|
||||||
|
wxTreeEventHandler(DnDFrame::OnBeginDrag),
|
||||||
|
NULL,
|
||||||
|
this
|
||||||
|
);
|
||||||
|
|
||||||
#if wxUSE_LOG
|
#if wxUSE_LOG
|
||||||
m_ctrlLog->SetDropTarget(new URLDropTarget);
|
m_ctrlLog->SetDropTarget(new URLDropTarget);
|
||||||
#endif // wxUSE_LOG
|
#endif // wxUSE_LOG
|
||||||
@@ -1011,21 +1028,32 @@ DnDFrame::DnDFrame(wxFrame *frame, const wxChar *title, int x, int y, int w, int
|
|||||||
sizer_top->Add(m_ctrlFile, 1, wxEXPAND );
|
sizer_top->Add(m_ctrlFile, 1, wxEXPAND );
|
||||||
sizer_top->Add(m_ctrlText, 1, wxEXPAND );
|
sizer_top->Add(m_ctrlText, 1, wxEXPAND );
|
||||||
|
|
||||||
|
wxBoxSizer *sizerDirCtrl = new wxBoxSizer(wxVERTICAL);
|
||||||
|
sizerDirCtrl->Add(new wxStaticText(this, wxID_ANY, "Drag files from here"),
|
||||||
|
wxSizerFlags().Centre().Border());
|
||||||
|
sizerDirCtrl->Add(m_ctrlDir, wxSizerFlags(1).Expand());
|
||||||
|
sizer_top->Add(sizerDirCtrl, 1, wxEXPAND );
|
||||||
|
|
||||||
|
// make all columns of reasonable minimal size
|
||||||
|
for ( unsigned n = 0; n < sizer_top->GetChildren().size(); n++ )
|
||||||
|
sizer_top->SetItemMinSize(n, 200, 300);
|
||||||
|
|
||||||
wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL );
|
wxBoxSizer *sizer = new wxBoxSizer( wxVERTICAL );
|
||||||
sizer->Add(sizer_top, 1, wxEXPAND );
|
sizer->Add(sizer_top, 1, wxEXPAND );
|
||||||
#if wxUSE_LOG
|
#if wxUSE_LOG
|
||||||
sizer->Add(m_ctrlLog, 2, wxEXPAND);
|
sizer->Add(m_ctrlLog, 2, wxEXPAND);
|
||||||
sizer->SetItemMinSize(m_ctrlLog, 450, 0);
|
sizer->SetItemMinSize(m_ctrlLog, 450, 200);
|
||||||
#endif // wxUSE_LOG
|
#endif // wxUSE_LOG
|
||||||
sizer->AddSpacer(50);
|
sizer->AddSpacer(50);
|
||||||
|
|
||||||
SetSizer(sizer);
|
|
||||||
sizer->SetSizeHints( this );
|
|
||||||
|
|
||||||
// copy data by default but allow moving it as well
|
// copy data by default but allow moving it as well
|
||||||
m_moveByDefault = false;
|
m_moveByDefault = false;
|
||||||
m_moveAllow = true;
|
m_moveAllow = true;
|
||||||
menu_bar->Check(Menu_DragMoveAllow, true);
|
menu_bar->Check(Menu_DragMoveAllow, true);
|
||||||
|
|
||||||
|
// set the correct size and show the frame
|
||||||
|
SetSizerAndFit(sizer);
|
||||||
|
Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DnDFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
|
void DnDFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
|
||||||
@@ -1162,6 +1190,26 @@ void DnDFrame::OnLogClear(wxCommandEvent& /* event */ )
|
|||||||
}
|
}
|
||||||
#endif // wxUSE_LOG
|
#endif // wxUSE_LOG
|
||||||
|
|
||||||
|
void DnDFrame::LogDragResult(wxDragResult result)
|
||||||
|
{
|
||||||
|
#if wxUSE_STATUSBAR
|
||||||
|
const wxChar *pc;
|
||||||
|
switch ( result )
|
||||||
|
{
|
||||||
|
case wxDragError: pc = _T("Error!"); break;
|
||||||
|
case wxDragNone: pc = _T("Nothing"); break;
|
||||||
|
case wxDragCopy: pc = _T("Copied"); break;
|
||||||
|
case wxDragMove: pc = _T("Moved"); break;
|
||||||
|
case wxDragCancel: pc = _T("Cancelled"); break;
|
||||||
|
default: pc = _T("Huh?"); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetStatusText(wxString(_T("Drag result: ")) + pc);
|
||||||
|
#else
|
||||||
|
wxUnusedVar(result);
|
||||||
|
#endif // wxUSE_STATUSBAR
|
||||||
|
}
|
||||||
|
|
||||||
void DnDFrame::OnLeftDown(wxMouseEvent &WXUNUSED(event) )
|
void DnDFrame::OnLeftDown(wxMouseEvent &WXUNUSED(event) )
|
||||||
{
|
{
|
||||||
#if wxUSE_DRAG_AND_DROP
|
#if wxUSE_DRAG_AND_DROP
|
||||||
@@ -1180,24 +1228,7 @@ void DnDFrame::OnLeftDown(wxMouseEvent &WXUNUSED(event) )
|
|||||||
else if ( m_moveAllow )
|
else if ( m_moveAllow )
|
||||||
flags |= wxDrag_AllowMove;
|
flags |= wxDrag_AllowMove;
|
||||||
|
|
||||||
wxDragResult result = source.DoDragDrop(flags);
|
LogDragResult(source.DoDragDrop(flags));
|
||||||
|
|
||||||
#if wxUSE_STATUSBAR
|
|
||||||
const wxChar *pc;
|
|
||||||
switch ( result )
|
|
||||||
{
|
|
||||||
case wxDragError: pc = _T("Error!"); break;
|
|
||||||
case wxDragNone: pc = _T("Nothing"); break;
|
|
||||||
case wxDragCopy: pc = _T("Copied"); break;
|
|
||||||
case wxDragMove: pc = _T("Moved"); break;
|
|
||||||
case wxDragCancel: pc = _T("Cancelled"); break;
|
|
||||||
default: pc = _T("Huh?"); break;
|
|
||||||
}
|
|
||||||
|
|
||||||
SetStatusText(wxString(_T("Drag result: ")) + pc);
|
|
||||||
#else
|
|
||||||
wxUnusedVar(result);
|
|
||||||
#endif // wxUSE_STATUSBAR
|
|
||||||
}
|
}
|
||||||
#endif // wxUSE_DRAG_AND_DROP
|
#endif // wxUSE_DRAG_AND_DROP
|
||||||
}
|
}
|
||||||
@@ -1232,6 +1263,17 @@ void DnDFrame::OnUsePrimary(wxCommandEvent& event)
|
|||||||
: _T("clipboard"));
|
: _T("clipboard"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DnDFrame::OnBeginDrag(wxTreeEvent& WXUNUSED(event))
|
||||||
|
{
|
||||||
|
wxFileDataObject data;
|
||||||
|
data.AddFile(m_ctrlDir->GetPath());
|
||||||
|
|
||||||
|
wxDropSource dragSource(this);
|
||||||
|
dragSource.SetData(data);
|
||||||
|
|
||||||
|
LogDragResult(dragSource.DoDragDrop());
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// bitmap clipboard
|
// bitmap clipboard
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
@@ -1503,8 +1545,11 @@ bool DnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString& filenames)
|
|||||||
size_t nFiles = filenames.GetCount();
|
size_t nFiles = filenames.GetCount();
|
||||||
wxString str;
|
wxString str;
|
||||||
str.Printf( _T("%d files dropped"), (int)nFiles);
|
str.Printf( _T("%d files dropped"), (int)nFiles);
|
||||||
|
|
||||||
|
if (m_pOwner != NULL)
|
||||||
|
{
|
||||||
m_pOwner->Append(str);
|
m_pOwner->Append(str);
|
||||||
for ( size_t n = 0; n < nFiles; n++ ) {
|
for ( size_t n = 0; n < nFiles; n++ )
|
||||||
m_pOwner->Append(filenames[n]);
|
m_pOwner->Append(filenames[n]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user