]>
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 two simple classes which just put in the listbox the strings (text or
33 // file names) we drop on them
34 // ----------------------------------------------------------------------------
36 class DnDText
: public wxTextDropTarget
39 DnDText(wxListBox
*pOwner
) { m_pOwner
= pOwner
; }
41 virtual bool OnDropText(long x
, long y
, const char *psz
);
47 class DnDFile
: public wxFileDropTarget
50 DnDFile(wxListBox
*pOwner
) { m_pOwner
= pOwner
; }
52 virtual bool OnDropFiles(long x
, long y
,
53 size_t nFiles
, const char * const aszFiles
[] );
59 // ----------------------------------------------------------------------------
60 // Define a new application type
61 // ----------------------------------------------------------------------------
63 class DnDApp
: public wxApp
69 IMPLEMENT_APP(DnDApp
);
71 // ----------------------------------------------------------------------------
72 // Define a new frame type
73 // ----------------------------------------------------------------------------
74 class DnDFrame
: public wxFrame
77 DnDFrame(wxFrame
*frame
, char *title
, int x
, int y
, int w
, int h
);
80 void OnPaint(wxPaintEvent
& event
);
81 void OnQuit (wxCommandEvent
& event
);
82 void OnAbout(wxCommandEvent
& event
);
83 void OnDrag (wxCommandEvent
& event
);
84 void OnHelp (wxCommandEvent
& event
);
85 void OnLogClear(wxCommandEvent
& event
);
87 void OnLeftDown(wxMouseEvent
& event
);
88 void OnRightDown(wxMouseEvent
& event
);
95 wxListBox
*m_ctrlFile
,
97 wxTextCtrl
*m_ctrlLog
;
99 wxLog
*m_pLog
, *m_pLogPrev
;
104 // ----------------------------------------------------------------------------
105 // IDs for the menu commands
106 // ----------------------------------------------------------------------------
117 BEGIN_EVENT_TABLE(DnDFrame
, wxFrame
)
118 EVT_MENU(Menu_Quit
, DnDFrame::OnQuit
)
119 EVT_MENU(Menu_About
, DnDFrame::OnAbout
)
120 EVT_MENU(Menu_Drag
, DnDFrame::OnDrag
)
121 EVT_MENU(Menu_Help
, DnDFrame::OnHelp
)
122 EVT_MENU(Menu_Clear
, DnDFrame::OnLogClear
)
123 EVT_LEFT_DOWN( DnDFrame::OnLeftDown
)
124 EVT_RIGHT_DOWN( DnDFrame::OnRightDown
)
125 EVT_PAINT( DnDFrame::OnPaint
)
128 // `Main program' equivalent, creating windows and returning main app frame
129 bool DnDApp::OnInit()
131 // create the main frame window
132 DnDFrame
*frame
= new DnDFrame((wxFrame
*) NULL
, "Drag & Drop wxWindows App",
143 DnDFrame::DnDFrame(wxFrame
*frame
, char *title
, int x
, int y
, int w
, int h
)
144 : wxFrame(frame
, -1, title
, wxPoint(x
, y
), wxSize(w
, h
)),
145 m_strText("wxWindows drag & drop works :-)")
148 // SetBackgroundColour(* wxWHITE);
150 // frame icon and status bar
151 SetIcon(wxICON(mondrian
));
153 // const int widths[] = { -1 };
157 wxMenu
*file_menu
= new wxMenu
;
158 file_menu
->Append(Menu_Drag
, "&Test drag...");
159 file_menu
->AppendSeparator();
160 file_menu
->Append(Menu_Quit
, "E&xit");
162 wxMenu
*log_menu
= new wxMenu
;
163 log_menu
->Append(Menu_Clear
, "Clear");
165 wxMenu
*help_menu
= new wxMenu
;
166 help_menu
->Append(Menu_Help
, "&Help...");
167 help_menu
->AppendSeparator();
168 help_menu
->Append(Menu_About
, "&About");
170 wxMenuBar
*menu_bar
= new wxMenuBar
;
171 menu_bar
->Append(file_menu
, "&File");
172 menu_bar
->Append(log_menu
, "&Log");
173 menu_bar
->Append(help_menu
, "&Help");
175 SetMenuBar(menu_bar
);
177 // make a panel with 3 subwindows
179 wxSize
size(400, 200);
181 wxString
strFile("Drop files here!"), strText("Drop text on me");
183 m_ctrlFile
= new wxListBox(this, -1, pos
, size
, 1, &strFile
, wxLB_HSCROLL
);
184 m_ctrlText
= new wxListBox(this, -1, pos
, size
, 1, &strText
, wxLB_HSCROLL
);
186 m_ctrlLog
= new wxTextCtrl(this, -1, "", pos
, size
,
187 wxTE_MULTILINE
| wxTE_READONLY
|
190 // redirect log messages to the text window (don't forget to delete it!)
191 m_pLog
= new wxLogTextCtrl(m_ctrlLog
);
192 m_pLogPrev
= wxLog::SetActiveTarget(m_pLog
);
194 // associate drop targets with 2 text controls
195 m_ctrlFile
->SetDropTarget(new DnDFile(m_ctrlFile
));
196 m_ctrlText
->SetDropTarget( new DnDText(m_ctrlText
) );
198 wxLayoutConstraints
*c
;
201 c
= new wxLayoutConstraints
;
202 c
->left
.SameAs(this, wxLeft
);
203 c
->top
.SameAs(this, wxTop
);
204 c
->right
.PercentOf(this, wxRight
, 50);
205 c
->height
.PercentOf(this, wxHeight
, 40);
206 m_ctrlFile
->SetConstraints(c
);
209 c
= new wxLayoutConstraints
;
210 c
->left
.SameAs (m_ctrlFile
, wxRight
);
211 c
->top
.SameAs (this, wxTop
);
212 c
->right
.SameAs (this, wxRight
);
213 c
->height
.PercentOf(this, wxHeight
, 40);
214 m_ctrlText
->SetConstraints(c
);
216 // Lower text control
217 c
= new wxLayoutConstraints
;
218 c
->left
.SameAs (this, wxLeft
);
219 c
->right
.SameAs (this, wxRight
);
220 c
->height
.PercentOf(this, wxHeight
, 40);
221 c
->top
.SameAs(m_ctrlText
, wxBottom
);
222 m_ctrlLog
->SetConstraints(c
);
227 void DnDFrame::OnQuit(wxCommandEvent
& /* event */)
232 void DnDFrame::OnPaint(wxPaintEvent
& /*event*/)
236 GetClientSize( &w
, &h
);
239 dc
.SetFont( wxFont( 24, wxDECORATIVE
, wxNORMAL
, wxNORMAL
, FALSE
, "charter" ) );
240 dc
.DrawText( "Drag text from here!", 20, h
-22 );
243 void DnDFrame::OnDrag(wxCommandEvent
& /* event */)
245 wxString strText
= wxGetTextFromUser
247 "After you enter text in this dialog, press any mouse\n"
248 "button in the bottom (empty) part of the frame and \n"
249 "drag it anywhere - you will be in fact dragging the\n"
250 "text object containing this text",
251 "Please enter some text", m_strText
, this
257 void DnDFrame::OnAbout(wxCommandEvent
& /* event */)
259 wxMessageDialog
dialog(this,
261 "Please see \"Help|Help...\" for details\n"
262 "Copyright (c) 1998 Vadim Zeitlin",
268 void DnDFrame::OnHelp(wxCommandEvent
& /* event */)
270 wxMessageDialog
dialog(this,
271 "This small program demonstrates drag & drop support in wxWindows. The program window\n"
272 "consists of 3 parts: the bottom pane is for debug messages, so that you can see what's\n"
273 "going on inside. The top part is split into 2 listboxes, the left one accepts files\n"
274 "and the right one accepts text.\n"
276 "To test wxDropTarget: open wordpad (write.exe), select some text in it and drag it to\n"
277 "the right listbox (you'll notice the usual visual feedback, i.e. the cursor will change).\n"
278 "Also, try dragging some files (you can select several at once) from Windows Explorer (or \n"
279 "File Manager) to the left pane. Hold down Ctrl/Shift keys when you drop text (doesn't \n"
280 "work with files) and see what changes.\n"
282 "To test wxDropSource: just press any mouse button on the empty zone of the window and drag\n"
283 "it to wordpad or any other droptarget accepting text (and of course you can just drag it\n"
284 "to the right pane). Due to a lot of trace messages, the cursor might take some time to \n"
285 "change, don't release the mouse button until it does. You can change the string being\n"
286 "dragged in in \"File|Test drag...\" dialog.\n"
289 "Please send all questions/bug reports/suggestions &c to \n"
290 "Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>",
296 void DnDFrame::OnLogClear(wxCommandEvent
& /* event */ )
301 bool DnDFrame::OnClose()
306 void DnDFrame::OnLeftDown(wxMouseEvent
&WXUNUSED(event
) )
308 if ( !m_strText
.IsEmpty() )
310 // start drag operation
312 wxTextDataObject
textData(m_strText
);
313 wxDropSource
dragSource( textData
, this );
315 wxDropSource
dragSource( new wxTextDataObject (m_strText
), this );
319 switch ( dragSource
.DoDragDrop(TRUE
) )
321 case wxDragError
: pc
= "Error!"; break;
322 case wxDragNone
: pc
= "Nothing"; break;
323 case wxDragCopy
: pc
= "Copied"; break;
324 case wxDragMove
: pc
= "Moved"; break;
325 case wxDragCancel
: pc
= "Cancelled"; break;
326 default: pc
= "Huh?"; break;
329 SetStatusText(wxString("Drag result: ") + pc
);
333 void DnDFrame::OnRightDown(wxMouseEvent
&event
)
335 wxMenu
*menu
= new wxMenu
;
337 menu
->Append(Menu_Drag
, "&Test drag...");
338 menu
->Append(Menu_About
, "&About");
339 menu
->Append(Menu_Quit
, "E&xit");
341 PopupMenu( menu
, event
.GetX(), event
.GetY() );
344 DnDFrame::~DnDFrame()
346 if ( m_pLog
!= NULL
) {
347 if ( wxLog::SetActiveTarget(m_pLogPrev
) == m_pLog
)
352 // ----------------------------------------------------------------------------
353 // Notifications called by the base class
354 // ----------------------------------------------------------------------------
355 bool DnDText::OnDropText(long, long, const char *psz
)
357 m_pOwner
->Append(psz
);
362 bool DnDFile::OnDropFiles(long, long, size_t nFiles
,
363 const char * const aszFiles
[])
366 str
.Printf("%d files dropped", nFiles
);
367 m_pOwner
->Append(str
);
368 for ( size_t n
= 0; n
< nFiles
; n
++ ) {
369 m_pOwner
->Append(aszFiles
[n
]);