]>
git.saurik.com Git - wxWidgets.git/blob - samples/dnd/dnd.cpp
d2983beb5a3baa77c1d9d5edbde283618d6dabb3
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Drag and drop sample
4 // Author: Vadim Zeitlin
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #include "wx/wxprec.h"
28 #error Sorry, drag and drop is not yet implemented on wxMotif.
31 #if defined(__WXGTK__) || defined(__WXMOTIF__)
32 #include "mondrian.xpm"
35 // ----------------------------------------------------------------------------
36 // Derive two simple classes which just put in the listbox the strings (text or
37 // file names) we drop on them
38 // ----------------------------------------------------------------------------
40 class DnDText
: public wxTextDropTarget
43 DnDText(wxListBox
*pOwner
) { m_pOwner
= pOwner
; }
45 virtual bool OnDropText(long x
, long y
, const char *psz
);
51 class DnDFile
: public wxFileDropTarget
54 DnDFile(wxListBox
*pOwner
) { m_pOwner
= pOwner
; }
56 virtual bool OnDropFiles(long x
, long y
,
57 size_t nFiles
, const char * const aszFiles
[] );
63 // ----------------------------------------------------------------------------
64 // Define a new application type
65 // ----------------------------------------------------------------------------
67 class DnDApp
: public wxApp
73 IMPLEMENT_APP(DnDApp
);
75 // ----------------------------------------------------------------------------
76 // Define a new frame type
77 // ----------------------------------------------------------------------------
78 class DnDFrame
: public wxFrame
81 DnDFrame(wxFrame
*frame
, char *title
, int x
, int y
, int w
, int h
);
84 void OnPaint(wxPaintEvent
& event
);
85 void OnQuit (wxCommandEvent
& event
);
86 void OnAbout(wxCommandEvent
& event
);
87 void OnDrag (wxCommandEvent
& event
);
88 void OnHelp (wxCommandEvent
& event
);
89 void OnLogClear(wxCommandEvent
& event
);
91 void OnLeftDown(wxMouseEvent
& event
);
92 void OnRightDown(wxMouseEvent
& event
);
99 wxListBox
*m_ctrlFile
,
101 wxTextCtrl
*m_ctrlLog
;
103 wxLog
*m_pLog
, *m_pLogPrev
;
108 // ----------------------------------------------------------------------------
109 // IDs for the menu commands
110 // ----------------------------------------------------------------------------
121 BEGIN_EVENT_TABLE(DnDFrame
, wxFrame
)
122 EVT_MENU(Menu_Quit
, DnDFrame::OnQuit
)
123 EVT_MENU(Menu_About
, DnDFrame::OnAbout
)
124 EVT_MENU(Menu_Drag
, DnDFrame::OnDrag
)
125 EVT_MENU(Menu_Help
, DnDFrame::OnHelp
)
126 EVT_MENU(Menu_Clear
, DnDFrame::OnLogClear
)
127 EVT_LEFT_DOWN( DnDFrame::OnLeftDown
)
128 EVT_RIGHT_DOWN( DnDFrame::OnRightDown
)
129 EVT_PAINT( DnDFrame::OnPaint
)
132 // `Main program' equivalent, creating windows and returning main app frame
133 bool DnDApp::OnInit()
135 // create the main frame window
136 DnDFrame
*frame
= new DnDFrame((wxFrame
*) NULL
, "Drag & Drop wxWindows App",
147 DnDFrame::DnDFrame(wxFrame
*frame
, char *title
, int x
, int y
, int w
, int h
)
148 : wxFrame(frame
, -1, title
, wxPoint(x
, y
), wxSize(w
, h
)),
149 m_strText("wxWindows drag & drop works :-)")
152 // SetBackgroundColour(* wxWHITE);
154 // frame icon and status bar
155 SetIcon(wxICON(mondrian
));
157 // const int widths[] = { -1 };
161 wxMenu
*file_menu
= new wxMenu
;
162 file_menu
->Append(Menu_Drag
, "&Test drag...");
163 file_menu
->AppendSeparator();
164 file_menu
->Append(Menu_Quit
, "E&xit");
166 wxMenu
*log_menu
= new wxMenu
;
167 log_menu
->Append(Menu_Clear
, "Clear");
169 wxMenu
*help_menu
= new wxMenu
;
170 help_menu
->Append(Menu_Help
, "&Help...");
171 help_menu
->AppendSeparator();
172 help_menu
->Append(Menu_About
, "&About");
174 wxMenuBar
*menu_bar
= new wxMenuBar
;
175 menu_bar
->Append(file_menu
, "&File");
176 menu_bar
->Append(log_menu
, "&Log");
177 menu_bar
->Append(help_menu
, "&Help");
179 SetMenuBar(menu_bar
);
181 // make a panel with 3 subwindows
183 wxSize
size(400, 200);
185 wxString
strFile("Drop files here!"), strText("Drop text on me");
187 m_ctrlFile
= new wxListBox(this, -1, pos
, size
, 1, &strFile
, wxLB_HSCROLL
);
188 m_ctrlText
= new wxListBox(this, -1, pos
, size
, 1, &strText
, wxLB_HSCROLL
);
190 m_ctrlLog
= new wxTextCtrl(this, -1, "", pos
, size
,
191 wxTE_MULTILINE
| wxTE_READONLY
|
194 // redirect log messages to the text window (don't forget to delete it!)
195 m_pLog
= new wxLogTextCtrl(m_ctrlLog
);
196 m_pLogPrev
= wxLog::SetActiveTarget(m_pLog
);
198 // associate drop targets with 2 text controls
199 m_ctrlFile
->SetDropTarget(new DnDFile(m_ctrlFile
));
200 m_ctrlText
->SetDropTarget( new DnDText(m_ctrlText
) );
202 wxLayoutConstraints
*c
;
205 c
= new wxLayoutConstraints
;
206 c
->left
.SameAs(this, wxLeft
);
207 c
->top
.SameAs(this, wxTop
);
208 c
->right
.PercentOf(this, wxRight
, 50);
209 c
->height
.PercentOf(this, wxHeight
, 40);
210 m_ctrlFile
->SetConstraints(c
);
213 c
= new wxLayoutConstraints
;
214 c
->left
.SameAs (m_ctrlFile
, wxRight
);
215 c
->top
.SameAs (this, wxTop
);
216 c
->right
.SameAs (this, wxRight
);
217 c
->height
.PercentOf(this, wxHeight
, 40);
218 m_ctrlText
->SetConstraints(c
);
220 // Lower text control
221 c
= new wxLayoutConstraints
;
222 c
->left
.SameAs (this, wxLeft
);
223 c
->right
.SameAs (this, wxRight
);
224 c
->height
.PercentOf(this, wxHeight
, 40);
225 c
->top
.SameAs(m_ctrlText
, wxBottom
);
226 m_ctrlLog
->SetConstraints(c
);
231 void DnDFrame::OnQuit(wxCommandEvent
& /* event */)
236 void DnDFrame::OnPaint(wxPaintEvent
& /*event*/)
240 GetClientSize( &w
, &h
);
243 dc
.SetFont( wxFont( 24, wxDECORATIVE
, wxNORMAL
, wxNORMAL
, FALSE
, "charter" ) );
244 dc
.DrawText( "Drag text from here!", 20, h
-22 );
247 void DnDFrame::OnDrag(wxCommandEvent
& /* event */)
249 wxString strText
= wxGetTextFromUser
251 "After you enter text in this dialog, press any mouse\n"
252 "button in the bottom (empty) part of the frame and \n"
253 "drag it anywhere - you will be in fact dragging the\n"
254 "text object containing this text",
255 "Please enter some text", m_strText
, this
261 void DnDFrame::OnAbout(wxCommandEvent
& /* event */)
263 wxMessageDialog
dialog(this,
265 "Please see \"Help|Help...\" for details\n"
266 "Copyright (c) 1998 Vadim Zeitlin",
272 void DnDFrame::OnHelp(wxCommandEvent
& /* event */)
274 wxMessageDialog
dialog(this,
275 "This small program demonstrates drag & drop support in wxWindows. The program window\n"
276 "consists of 3 parts: the bottom pane is for debug messages, so that you can see what's\n"
277 "going on inside. The top part is split into 2 listboxes, the left one accepts files\n"
278 "and the right one accepts text.\n"
280 "To test wxDropTarget: open wordpad (write.exe), select some text in it and drag it to\n"
281 "the right listbox (you'll notice the usual visual feedback, i.e. the cursor will change).\n"
282 "Also, try dragging some files (you can select several at once) from Windows Explorer (or \n"
283 "File Manager) to the left pane. Hold down Ctrl/Shift keys when you drop text (doesn't \n"
284 "work with files) and see what changes.\n"
286 "To test wxDropSource: just press any mouse button on the empty zone of the window and drag\n"
287 "it to wordpad or any other droptarget accepting text (and of course you can just drag it\n"
288 "to the right pane). Due to a lot of trace messages, the cursor might take some time to \n"
289 "change, don't release the mouse button until it does. You can change the string being\n"
290 "dragged in in \"File|Test drag...\" dialog.\n"
293 "Please send all questions/bug reports/suggestions &c to \n"
294 "Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>",
300 void DnDFrame::OnLogClear(wxCommandEvent
& /* event */ )
305 bool DnDFrame::OnClose()
310 void DnDFrame::OnLeftDown(wxMouseEvent
&WXUNUSED(event
) )
312 if ( !m_strText
.IsEmpty() )
314 // start drag operation
316 wxTextDataObject
textData(m_strText
);
317 wxDropSource
dragSource( textData
, this );
319 wxDropSource
dragSource( new wxTextDataObject (m_strText
), this );
323 switch ( dragSource
.DoDragDrop(TRUE
) )
325 case wxDragError
: pc
= "Error!"; break;
326 case wxDragNone
: pc
= "Nothing"; break;
327 case wxDragCopy
: pc
= "Copied"; break;
328 case wxDragMove
: pc
= "Moved"; break;
329 case wxDragCancel
: pc
= "Cancelled"; break;
330 default: pc
= "Huh?"; break;
333 SetStatusText(wxString("Drag result: ") + pc
);
337 void DnDFrame::OnRightDown(wxMouseEvent
&event
)
339 wxMenu
*menu
= new wxMenu
;
341 menu
->Append(Menu_Drag
, "&Test drag...");
342 menu
->Append(Menu_About
, "&About");
343 menu
->Append(Menu_Quit
, "E&xit");
345 PopupMenu( menu
, event
.GetX(), event
.GetY() );
348 DnDFrame::~DnDFrame()
350 if ( m_pLog
!= NULL
) {
351 if ( wxLog::SetActiveTarget(m_pLogPrev
) == m_pLog
)
356 // ----------------------------------------------------------------------------
357 // Notifications called by the base class
358 // ----------------------------------------------------------------------------
359 bool DnDText::OnDropText(long, long, const char *psz
)
361 m_pOwner
->Append(psz
);
366 bool DnDFile::OnDropFiles(long, long, size_t nFiles
,
367 const char * const aszFiles
[])
370 str
.Printf("%d files dropped", nFiles
);
371 m_pOwner
->Append(str
);
372 for ( size_t n
= 0; n
< nFiles
; n
++ ) {
373 m_pOwner
->Append(aszFiles
[n
]);