--- /dev/null
+import wx
+
+class DragController(wx.Control):
+ """
+ Just a little control to handle dragging the text from a text
+ control. We use a separate control so as to not interfere with
+ the native drag-select functionality of the native text control.
+ """
+ def __init__(self, parent, source, size=(25,25)):
+ wx.Control.__init__(self, parent, -1, size=size,
+ style=wx.SIMPLE_BORDER)
+ self.source = source
+ self.SetMinSize(size)
+ self.Bind(wx.EVT_PAINT, self.OnPaint)
+ self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
+
+ def OnPaint(self, evt):
+ # draw a simple arrow
+ dc = wx.BufferedPaintDC(self)
+ dc.SetBackground(wx.Brush(self.GetBackgroundColour()))
+ dc.Clear()
+ w, h = dc.GetSize()
+ y = h/2
+ dc.SetPen(wx.Pen("dark blue", 2))
+ dc.DrawLine(w/8, y, w-w/8, y)
+ dc.DrawLine(w-w/8, y, w/2, h/4)
+ dc.DrawLine(w-w/8, y, w/2, 3*h/4)
+
+ def OnLeftDown(self, evt):
+ text = self.source.GetValue()
+ data = wx.TextDataObject(text)
+ dropSource = wx.DropSource(self)
+ dropSource.SetData(data)
+ result = dropSource.DoDragDrop(wx.Drag_AllowMove)
+
+ # if the user wants to move the data then we should delete it
+ # from the source
+ if result == wx.DragMove:
+ self.source.SetValue("")
+
+class MyFrame(wx.Frame):
+ def __init__(self):
+ wx.Frame.__init__(self, None, title="Drop Source")
+ p = wx.Panel(self)
+
+ # create the controls
+ label1 = wx.StaticText(p, -1, "Put some text in this control:")
+ label2 = wx.StaticText(p, -1,
+ "Then drag from the neighboring bitmap and\n"
+ "drop in an application that accepts dropped\n"
+ "text, such as MS Word.")
+ text = wx.TextCtrl(p, -1, "Some text")
+ dragctl = DragController(p, text)
+
+ # setup the layout with sizers
+ sizer = wx.BoxSizer(wx.VERTICAL)
+ sizer.Add(label1, 0, wx.ALL, 5)
+ hrow = wx.BoxSizer(wx.HORIZONTAL)
+ hrow.Add(text, 1, wx.RIGHT, 5)
+ hrow.Add(dragctl, 0)
+ sizer.Add(hrow, 0, wx.EXPAND|wx.ALL, 5)
+ sizer.Add(label2, 0, wx.ALL, 5)
+ p.SetSizer(sizer)
+ sizer.Fit(self)
+
+
+app = wx.PySimpleApp()
+frm = MyFrame()
+frm.Show()
+app.MainLoop()