]>
git.saurik.com Git - wxWidgets.git/blob - samples/dnd/dnd.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Drag and drop sample
4 // Author: Vadim Zeitlin
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #include "wx/wxprec.h"
28 #include "mondrian.xpm"
31 // ----------------------------------------------------------------------------
32 // Derive 2 simple classes which just put in the listbox the strings (text or
33 // file names) we drop on them
34 // ----------------------------------------------------------------------------
35 class DnDText
: public wxTextDropTarget
38 DnDText(wxListBox
*pOwner
) { m_pOwner
= pOwner
; }
40 virtual bool OnDropText(long x
, long y
, const char *psz
);
46 class DnDFile
: public wxFileDropTarget
49 DnDFile(wxListBox
*pOwner
) { m_pOwner
= pOwner
; }
51 virtual bool OnDropFiles(long x
, long y
,
52 size_t nFiles
, const char * const aszFiles
[]);
58 // ----------------------------------------------------------------------------
59 // Define a new application type
60 // ----------------------------------------------------------------------------
61 class DnDApp
: public wxApp
67 IMPLEMENT_APP(DnDApp
);
69 // ----------------------------------------------------------------------------
70 // Define a new frame type
71 // ----------------------------------------------------------------------------
72 class DnDFrame
: public wxFrame
75 DnDFrame(wxFrame
*frame
, char *title
, int x
, int y
, int w
, int h
);
78 void OnPaint(wxPaintEvent
& event
);
79 void OnQuit (wxCommandEvent
& event
);
80 void OnAbout(wxCommandEvent
& event
);
81 void OnDrag (wxCommandEvent
& event
);
82 void OnHelp (wxCommandEvent
& event
);
83 void OnLogClear(wxCommandEvent
& event
);
85 void OnLeftDown(wxMouseEvent
& event
);
86 void OnRightDown(wxMouseEvent
& event
);
93 wxListBox
*m_ctrlFile
,
95 wxTextCtrl
*m_ctrlLog
;
97 wxLog
*m_pLog
, *m_pLogPrev
;
102 // ----------------------------------------------------------------------------
103 // IDs for the menu commands
104 // ----------------------------------------------------------------------------
114 BEGIN_EVENT_TABLE(DnDFrame
, wxFrame
)
115 EVT_MENU(Menu_Quit
, DnDFrame::OnQuit
)
116 EVT_MENU(Menu_About
, DnDFrame::OnAbout
)
117 EVT_MENU(Menu_Drag
, DnDFrame::OnDrag
)
118 EVT_MENU(Menu_Help
, DnDFrame::OnHelp
)
119 EVT_MENU(Menu_Clear
, DnDFrame::OnLogClear
)
120 EVT_LEFT_DOWN(OnLeftDown
)
121 EVT_RIGHT_DOWN(OnRightDown
)
124 // `Main program' equivalent, creating windows and returning main app frame
125 bool DnDApp::OnInit(void)
127 // create the main frame window
128 DnDFrame
*frame
= new DnDFrame((wxFrame
*) NULL
, "Drag & Drop wxWindows App",
139 DnDFrame::DnDFrame(wxFrame
*frame
, char *title
, int x
, int y
, int w
, int h
)
140 : wxFrame(frame
, -1, title
, wxPoint(x
, y
), wxSize(w
, h
)),
141 m_strText("wxWindows drag & drop works :-)")
146 // frame icon and status bar
147 SetIcon(wxIcon("mondrian"));
149 SetIcon(wxIcon(mondrian_xpm
));
152 const int widths
[] = { -1 };
156 wxMenu
*file_menu
= new wxMenu
;
157 file_menu
->Append(Menu_Drag
, "&Test drag...");
158 file_menu
->AppendSeparator();
159 file_menu
->Append(Menu_Quit
, "E&xit");
161 wxMenu
*log_menu
= new wxMenu
;
162 log_menu
->Append(Menu_Clear
, "Clear");
164 wxMenu
*help_menu
= new wxMenu
;
165 help_menu
->Append(Menu_Help
, "&Help...");
166 help_menu
->AppendSeparator();
167 help_menu
->Append(Menu_About
, "&About");
169 wxMenuBar
*menu_bar
= new wxMenuBar
;
170 menu_bar
->Append(file_menu
, "&File");
171 menu_bar
->Append(log_menu
, "&Log");
172 menu_bar
->Append(help_menu
, "&Help");
174 SetMenuBar(menu_bar
);
176 // make a panel with 3 subwindows
178 wxSize
size(400, 200);
180 wxString
strFile("Drop files here!"), strText("Drop text on me");
182 m_ctrlFile
= new wxListBox(this, -1, pos
, size
, 1, &strFile
, wxLB_HSCROLL
);
183 m_ctrlText
= new wxListBox(this, -1, pos
, size
, 1, &strText
, wxLB_HSCROLL
);
185 m_ctrlLog
= new wxTextCtrl(this, -1, "", pos
, size
,
186 wxTE_MULTILINE
| wxTE_READONLY
|
187 wxSUNKEN_BORDER
| wxHSCROLL
);
189 // redirect log messages to the text window (don't forget to delete it!)
190 m_pLog
= new wxLogTextCtrl(m_ctrlLog
);
191 m_pLogPrev
= wxLog::SetActiveTarget(m_pLog
);
193 // associate drop targets with 2 text controls
194 #ifdef __WXMSW__ // it's not supported (yet) on other platforms
195 m_ctrlFile
->SetDropTarget(new DnDFile(m_ctrlFile
));
197 m_ctrlText
->SetDropTarget(new DnDText(m_ctrlText
));
199 wxLayoutConstraints
*c
;
202 c
= new wxLayoutConstraints
;
203 c
->left
.SameAs (this, wxLeft
);
204 c
->top
.SameAs (this, wxTop
);
205 c
->right
.PercentOf(this, wxRight
, 50);
206 c
->height
.PercentOf(this, wxHeight
, 40);
207 m_ctrlFile
->SetConstraints(c
);
210 c
= new wxLayoutConstraints
;
211 c
->left
.SameAs (m_ctrlFile
, wxRight
);
212 c
->top
.SameAs (this, wxTop
);
213 c
->right
.SameAs (this, wxRight
);
214 c
->height
.PercentOf(this, wxHeight
, 40);
215 m_ctrlText
->SetConstraints(c
);
217 // Lower text control
218 c
= new wxLayoutConstraints
;
219 c
->left
.SameAs (this, wxLeft
);
220 c
->right
.SameAs (this, wxRight
);
221 c
->height
.PercentOf(this, wxHeight
, 40);
222 c
->top
.SameAs(m_ctrlText
, wxBottom
);
224 m_ctrlLog
->SetConstraints(c
);
229 void DnDFrame::OnQuit(wxCommandEvent
& /* event */)
234 void DnDFrame::OnDrag(wxCommandEvent
& /* event */)
236 wxString strText
= wxGetTextFromUser
238 "After you enter text in this dialog, press any mouse\n"
239 "button in the bottom (empty) part of the frame and \n"
240 "drag it anywhere - you will be in fact dragging the\n"
241 "text object containing this text",
242 "Please enter some text", m_strText
, this
248 void DnDFrame::OnAbout(wxCommandEvent
& /* event */)
250 wxMessageDialog
dialog(this,
252 "Please see \"Help|Help...\" for details\n"
253 "Copyright (c) 1998 Vadim Zeitlin",
259 void DnDFrame::OnHelp(wxCommandEvent
& /* event */)
261 wxMessageDialog
dialog(this,
262 "This small program demonstrates drag & drop support in wxWindows. The program window\n"
263 "consists of 3 parts: the bottom pane is for debug messages, so that you can see what's\n"
264 "going on inside. The top part is split into 2 listboxes, the left one accepts files\n"
265 "and the right one accepts text.\n"
267 "To test wxDropTarget: open wordpad (write.exe), select some text in it and drag it to\n"
268 "the right listbox (you'll notice the usual visual feedback, i.e. the cursor will change).\n"
269 "Also, try dragging some files (you can select several at once) from Windows Explorer (or \n"
270 "File Manager) to the left pane. Hold down Ctrl/Shift keys when you drop text (doesn't \n"
271 "work with files) and see what changes.\n"
273 "To test wxDropSource: just press any mouse button on the empty zone of the window and drag\n"
274 "it to wordpad or any other droptarget accepting text (and of course you can just drag it\n"
275 "to the right pane). Due to a lot of trace messages, the cursor might take some time to \n"
276 "change, don't release the mouse button until it does. You can change the string being\n"
277 "dragged in in \"File|Test drag...\" dialog.\n"
280 "Please send all questions/bug reports/suggestions &c to \n"
281 "Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>",
287 void DnDFrame::OnLogClear(wxCommandEvent
& /* event */ )
292 bool DnDFrame::OnClose()
297 void DnDFrame::OnLeftDown(wxMouseEvent
&WXUNUSED(event
) )
299 if ( !m_strText
.IsEmpty() ) {
300 // start drag operation
302 wxTextDataObject
data(m_strText
);
303 wxDropSource
dragSource(data
, this);
306 switch ( dragSource
.DoDragDrop(TRUE
) ) {
307 case wxDropSource::Error
: pc
= "Error!"; break;
308 case wxDropSource::None
: pc
= "Nothing"; break;
309 case wxDropSource::Copy
: pc
= "Copied"; break;
310 case wxDropSource::Move
: pc
= "Moved"; break;
311 case wxDropSource::Cancel
: pc
= "Cancelled"; break;
312 default: pc
= "Huh?"; break;
315 SetStatusText(wxString("Drag result: ") + pc
);
319 void DnDFrame::OnRightDown(wxMouseEvent
&event
)
321 wxMenu
*menu
= new wxMenu
;
323 menu
->Append(Menu_Drag
, "&Test drag...");
324 menu
->Append(Menu_About
, "&About");
325 menu
->Append(Menu_Quit
, "E&xit");
327 PopupMenu( menu
, event
.GetX(), event
.GetY() );
330 DnDFrame::~DnDFrame()
332 if ( m_pLog
!= NULL
) {
333 if ( wxLog::SetActiveTarget(m_pLogPrev
) == m_pLog
)
338 // ----------------------------------------------------------------------------
339 // Notifications called by the base class
340 // ----------------------------------------------------------------------------
341 bool DnDText::OnDropText(long, long, const char *psz
)
343 m_pOwner
->Append(psz
);
348 bool DnDFile::OnDropFiles(long, long, size_t nFiles
,
349 const char * const aszFiles
[])
352 str
.Printf("%d files dropped", nFiles
);
353 m_pOwner
->Append(str
);
354 for ( size_t n
= 0; n
< nFiles
; n
++ ) {
355 m_pOwner
->Append(aszFiles
[n
]);