// Author: Vadim Zeitlin
// Modified by:
// Created: 04/01/98
-// RCS-ID:
+// RCS-ID: $Id$
// Copyright:
-// Licence: wxWindows licence
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#include "wx/wxprec.h"
#include "wx/dnd.h"
-#ifdef __WXGTK__
+#ifdef __WXMOTIF__
+#error Sorry, drag and drop is not yet implemented on wxMotif.
+#endif
+
+#if defined(__WXGTK__) || defined(__WXMOTIF__)
#include "mondrian.xpm"
#endif
// ----------------------------------------------------------------------------
-// Derive 2 simple classes which just put in the listbox the strings (text or
+// Derive two simple classes which just put in the listbox the strings (text or
// file names) we drop on them
// ----------------------------------------------------------------------------
+
class DnDText : public wxTextDropTarget
{
public:
DnDText(wxListBox *pOwner) { m_pOwner = pOwner; }
- virtual bool OnDropText(long x, long y, const char *psz);
+ virtual bool OnDropText(long x, long y, const char *psz );
private:
wxListBox *m_pOwner;
DnDFile(wxListBox *pOwner) { m_pOwner = pOwner; }
virtual bool OnDropFiles(long x, long y,
- size_t nFiles, const char * const aszFiles[]);
+ size_t nFiles, const char * const aszFiles[] );
private:
wxListBox *m_pOwner;
// ----------------------------------------------------------------------------
// Define a new application type
// ----------------------------------------------------------------------------
+
class DnDApp : public wxApp
-{
+{
public:
bool OnInit();
};
// Define a new frame type
// ----------------------------------------------------------------------------
class DnDFrame : public wxFrame
-{
+{
public:
DnDFrame(wxFrame *frame, char *title, int x, int y, int w, int h);
~DnDFrame();
void OnLeftDown(wxMouseEvent& event);
void OnRightDown(wxMouseEvent& event);
-
+
bool OnClose();
-
+
DECLARE_EVENT_TABLE()
private:
// ----------------------------------------------------------------------------
// IDs for the menu commands
// ----------------------------------------------------------------------------
+
enum
{
Menu_Quit = 1,
END_EVENT_TABLE()
// `Main program' equivalent, creating windows and returning main app frame
-bool DnDApp::OnInit(void)
+bool DnDApp::OnInit()
{
// create the main frame window
- DnDFrame *frame = new DnDFrame((wxFrame *) NULL, "Drag & Drop wxWindows App",
+ DnDFrame *frame = new DnDFrame((wxFrame *) NULL, "Drag & Drop wxWindows App",
50, 50, 450, 340);
// activate it
m_strText("wxWindows drag & drop works :-)")
{
+// SetBackgroundColour(* wxWHITE);
// frame icon and status bar
SetIcon(wxICON(mondrian));
-
+
// const int widths[] = { -1 };
CreateStatusBar();
menu_bar->Append(help_menu, "&Help");
SetMenuBar(menu_bar);
-
+
// make a panel with 3 subwindows
wxPoint pos(0, 0);
wxSize size(400, 200);
m_ctrlFile = new wxListBox(this, -1, pos, size, 1, &strFile, wxLB_HSCROLL);
m_ctrlText = new wxListBox(this, -1, pos, size, 1, &strText, wxLB_HSCROLL);
- m_ctrlLog = new wxTextCtrl(this, -1, "", pos, size,
- wxTE_MULTILINE | wxTE_READONLY |
- wxSUNKEN_BORDER| wxHSCROLL);
+ m_ctrlLog = new wxTextCtrl(this, -1, "", pos, size,
+ wxTE_MULTILINE | wxTE_READONLY |
+ wxSUNKEN_BORDER );
// redirect log messages to the text window (don't forget to delete it!)
m_pLog = new wxLogTextCtrl(m_ctrlLog);
// associate drop targets with 2 text controls
m_ctrlFile->SetDropTarget(new DnDFile(m_ctrlFile));
- m_ctrlText->SetDropTarget(new DnDText(m_ctrlText));
+ m_ctrlText->SetDropTarget( new DnDText(m_ctrlText) );
wxLayoutConstraints *c;
// Top-left listbox
c = new wxLayoutConstraints;
- c->left.SameAs (this, wxLeft);
- c->top.SameAs (this, wxTop);
+ c->left.SameAs(this, wxLeft);
+ c->top.SameAs(this, wxTop);
c->right.PercentOf(this, wxRight, 50);
c->height.PercentOf(this, wxHeight, 40);
m_ctrlFile->SetConstraints(c);
int w = 0;
int h = 0;
GetClientSize( &w, &h );
-
+
wxPaintDC dc(this);
- dc.SetFont( wxFont( 24, wxDECORATIVE, wxNORMAL, wxNORMAL ) );
- dc.DrawText( "Drag text from here!", 20, h-20 );
+ dc.SetFont( wxFont( 24, wxDECORATIVE, wxNORMAL, wxNORMAL, FALSE, "charter" ) );
+ dc.DrawText( "Drag text from here!", 20, h-22 );
}
void DnDFrame::OnDrag(wxCommandEvent& /* event */)
void DnDFrame::OnAbout(wxCommandEvent& /* event */)
{
- wxMessageDialog dialog(this,
+ wxMessageDialog dialog(this,
"Drag-&-Drop Demo\n"
"Please see \"Help|Help...\" for details\n"
"Copyright (c) 1998 Vadim Zeitlin",
void DnDFrame::OnHelp(wxCommandEvent& /* event */)
{
- wxMessageDialog dialog(this,
+ wxMessageDialog dialog(this,
"This small program demonstrates drag & drop support in wxWindows. The program window\n"
"consists of 3 parts: the bottom pane is for debug messages, so that you can see what's\n"
-"going on inside. The top part is split into 2 listboxes, the left one accepts files\n"
+"going on inside. The top part is split into 2 listboxes, the left one accepts files\n"
"and the right one accepts text.\n"
"\n"
-"To test wxDropTarget: open wordpad (write.exe), select some text in it and drag it to\n"
-"the right listbox (you'll notice the usual visual feedback, i.e. the cursor will change).\n"
+"To test wxDropTarget: open wordpad (write.exe), select some text in it and drag it to\n"
+"the right listbox (you'll notice the usual visual feedback, i.e. the cursor will change).\n"
"Also, try dragging some files (you can select several at once) from Windows Explorer (or \n"
"File Manager) to the left pane. Hold down Ctrl/Shift keys when you drop text (doesn't \n"
"work with files) and see what changes.\n"
"\n"
-"To test wxDropSource: just press any mouse button on the empty zone of the window and drag\n"
+"To test wxDropSource: just press any mouse button on the empty zone of the window and drag\n"
"it to wordpad or any other droptarget accepting text (and of course you can just drag it\n"
"to the right pane). Due to a lot of trace messages, the cursor might take some time to \n"
-"change, don't release the mouse button until it does. You can change the string being\n"
+"change, don't release the mouse button until it does. You can change the string being\n"
"dragged in in \"File|Test drag...\" dialog.\n"
"\n"
"\n"
void DnDFrame::OnLogClear(wxCommandEvent& /* event */ )
{
-// m_ctrlLog->Clear();
+ m_ctrlLog->Clear();
}
-bool DnDFrame::OnClose()
-{
- return TRUE;
+bool DnDFrame::OnClose()
+{
+ return TRUE;
}
void DnDFrame::OnLeftDown(wxMouseEvent &WXUNUSED(event) )
{
- if ( !m_strText.IsEmpty() ) {
+ if ( !m_strText.IsEmpty() )
+ {
// start drag operation
-
- wxTextDataObject data(m_strText);
- wxDropSource dragSource(data, this);
+#ifdef __WXMSW__
+ wxTextDataObject textData(m_strText);
+ wxDropSource dragSource( textData, this );
+#else
+ wxDropSource dragSource( new wxTextDataObject (m_strText), this );
+#endif
const char *pc;
- switch ( dragSource.DoDragDrop(TRUE) ) {
+ switch ( dragSource.DoDragDrop(TRUE) )
+ {
case wxDragError: pc = "Error!"; break;
case wxDragNone: pc = "Nothing"; break;
case wxDragCopy: pc = "Copied"; break;
void DnDFrame::OnRightDown(wxMouseEvent &event )
{
wxMenu *menu = new wxMenu;
-
+
menu->Append(Menu_Drag, "&Test drag...");
menu->Append(Menu_About, "&About");
menu->Append(Menu_Quit, "E&xit");
-
+
PopupMenu( menu, event.GetX(), event.GetY() );
}
return TRUE;
}
-bool DnDFile::OnDropFiles(long, long, size_t nFiles,
+bool DnDFile::OnDropFiles(long, long, size_t nFiles,
const char * const aszFiles[])
{
wxString str;