]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/samples/wxPIA_book/Chapter-18/drop_source.py
Added the sample code from wxPython In Action to the samples dir
[wxWidgets.git] / wxPython / samples / wxPIA_book / Chapter-18 / drop_source.py
diff --git a/wxPython/samples/wxPIA_book/Chapter-18/drop_source.py b/wxPython/samples/wxPIA_book/Chapter-18/drop_source.py
new file mode 100644 (file)
index 0000000..d854947
--- /dev/null
@@ -0,0 +1,70 @@
+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()