]>
git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/DragAndDrop.py
   4 #---------------------------------------------------------------------- 
   6 ID_CopyBtn      
= wx
.NewId() 
   7 ID_PasteBtn     
= wx
.NewId() 
   8 ID_BitmapBtn    
= wx
.NewId() 
  10 #---------------------------------------------------------------------- 
  12 class ClipTextPanel(wx
.Panel
): 
  13     def __init__(self
, parent
, log
): 
  14         wx
.Panel
.__init
__(self
, parent
, -1) 
  17         #self.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD, False)) 
  19         sizer 
= wx
.BoxSizer(wx
.VERTICAL
) 
  22                 self
, -1, "Copy/Paste text to/from\n" 
  23                 "this window and other apps" 
  25             0, wx
.EXPAND|wx
.ALL
, 2 
  28         self
.text 
= wx
.TextCtrl(self
, -1, "", style
=wx
.TE_MULTILINE|wx
.HSCROLL
) 
  29         sizer
.Add(self
.text
, 1, wx
.EXPAND
) 
  31         hsz 
= wx
.BoxSizer(wx
.HORIZONTAL
) 
  32         hsz
.Add(wx
.Button(self
, ID_CopyBtn
, " Copy "), 1, wx
.EXPAND|wx
.ALL
, 2) 
  33         hsz
.Add(wx
.Button(self
, ID_PasteBtn
, " Paste "), 1, wx
.EXPAND|wx
.ALL
, 2) 
  34         sizer
.Add(hsz
, 0, wx
.EXPAND
) 
  36             wx
.Button(self
, ID_BitmapBtn
, " Copy Bitmap "),  
  37             0, wx
.EXPAND|wx
.ALL
, 2 
  40         self
.Bind(wx
.EVT_BUTTON
, self
.OnCopy
, id=ID_CopyBtn
) 
  41         self
.Bind(wx
.EVT_BUTTON
, self
.OnPaste
, id=ID_PasteBtn
) 
  42         self
.Bind(wx
.EVT_BUTTON
, self
.OnCopyBitmap
, id=ID_BitmapBtn
) 
  44         self
.SetAutoLayout(True) 
  48     def OnCopy(self
, evt
): 
  49         self
.do 
= wx
.TextDataObject() 
  50         self
.do
.SetText(self
.text
.GetValue()) 
  51         wx
.TheClipboard
.Open() 
  52         wx
.TheClipboard
.SetData(self
.do
) 
  53         wx
.TheClipboard
.Close() 
  56     def OnPaste(self
, evt
): 
  57         do 
= wx
.TextDataObject() 
  58         wx
.TheClipboard
.Open() 
  59         success 
= wx
.TheClipboard
.GetData(do
) 
  60         wx
.TheClipboard
.Close() 
  63             self
.text
.SetValue(do
.GetText()) 
  66                 "There is no data in the clipboard in the required format", 
  70     def OnCopyBitmap(self
, evt
): 
  71         dlg 
= wx
.FileDialog(self
, "Choose a bitmap to copy", wildcard
="*.bmp") 
  73         if dlg
.ShowModal() == wx
.ID_OK
: 
  74             bmp 
= wx
.Bitmap(dlg
.GetPath(), wx
.BITMAP_TYPE_BMP
) 
  75             bmpdo 
= wx
.BitmapDataObject(bmp
) 
  76             wx
.TheClipboard
.Open() 
  77             wx
.TheClipboard
.SetData(bmpdo
) 
  78             wx
.TheClipboard
.Close() 
  81                 "The bitmap is now in the Clipboard.  Switch to a graphics\n" 
  82                 "editor and try pasting it in..." 
  87 #---------------------------------------------------------------------- 
  89 class OtherDropTarget(wx
.PyDropTarget
): 
  90     def __init__(self
, window
, log
): 
  91         wx
.PyDropTarget
.__init
__(self
) 
  93         self
.do 
= wx
.FileDataObject() 
  94         self
.SetDataObject(self
.do
) 
  96     def OnEnter(self
, x
, y
, d
): 
  97         self
.log
.WriteText("OnEnter: %d, %d, %d\n" % (x
, y
, d
)) 
 100     #def OnDragOver(self, x, y, d): 
 101     #    self.log.WriteText("OnDragOver: %d, %d, %d\n" % (x, y, d)) 
 105         self
.log
.WriteText("OnLeave\n") 
 107     def OnDrop(self
, x
, y
): 
 108         self
.log
.WriteText("OnDrop: %d %d\n" % (x
, y
)) 
 111     def OnData(self
, x
, y
, d
): 
 112         self
.log
.WriteText("OnData: %d, %d, %d\n" % (x
, y
, d
)) 
 114         self
.log
.WriteText("%s\n" % self
.do
.GetFilenames()) 
 118 class MyFileDropTarget(wx
.FileDropTarget
): 
 119     def __init__(self
, window
, log
): 
 120         wx
.FileDropTarget
.__init
__(self
) 
 124     def OnDropFiles(self
, x
, y
, filenames
): 
 125         self
.window
.SetInsertionPointEnd() 
 126         self
.window
.WriteText("\n%d file(s) dropped at %d,%d:\n" % 
 127                               (len(filenames
), x
, y
)) 
 129         for file in filenames
: 
 130             self
.window
.WriteText(file + '\n') 
 133 class MyTextDropTarget(wx
.TextDropTarget
): 
 134     def __init__(self
, window
, log
): 
 135         wx
.TextDropTarget
.__init
__(self
) 
 139     def OnDropText(self
, x
, y
, text
): 
 140         self
.window
.WriteText("(%d, %d)\n%s\n" % (x
, y
, text
)) 
 142     def OnDragOver(self
, x
, y
, d
): 
 146 class FileDropPanel(wx
.Panel
): 
 147     def __init__(self
, parent
, log
): 
 148         wx
.Panel
.__init
__(self
, parent
, -1) 
 150         #self.SetFont(wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD, False)) 
 152         sizer 
= wx
.BoxSizer(wx
.VERTICAL
) 
 154             wx
.StaticText(self
, -1, " \nDrag some files here:"), 
 155             0, wx
.EXPAND|wx
.ALL
, 2 
 158         self
.text 
= wx
.TextCtrl( 
 160                         style 
= wx
.TE_MULTILINE|wx
.HSCROLL|wx
.TE_READONLY
 
 163         dt 
= MyFileDropTarget(self
, log
) 
 164         self
.text
.SetDropTarget(dt
) 
 165         sizer
.Add(self
.text
, 1, wx
.EXPAND
) 
 168             wx
.StaticText(self
, -1, " \nDrag some text here:"), 
 169             0, wx
.EXPAND|wx
.ALL
, 2 
 172         self
.text2 
= wx
.TextCtrl( 
 174                         style 
= wx
.TE_MULTILINE|wx
.HSCROLL|wx
.TE_READONLY
 
 177         dt 
= MyTextDropTarget(self
.text2
, log
) 
 178         self
.text2
.SetDropTarget(dt
) 
 179         sizer
.Add(self
.text2
, 1, wx
.EXPAND
) 
 181         self
.SetAutoLayout(True) 
 185     def WriteText(self
, text
): 
 186         self
.text
.WriteText(text
) 
 188     def SetInsertionPointEnd(self
): 
 189         self
.text
.SetInsertionPointEnd() 
 192 #---------------------------------------------------------------------- 
 193 #---------------------------------------------------------------------- 
 195 class TestPanel(wx
.Panel
): 
 196     def __init__(self
, parent
, log
): 
 197         wx
.Panel
.__init
__(self
, parent
, -1) 
 199         self
.SetAutoLayout(True) 
 200         outsideSizer 
= wx
.BoxSizer(wx
.VERTICAL
) 
 202         msg 
= "Clipboard / Drag-And-Drop" 
 203         text 
= wx
.StaticText(self
, -1, "", style
=wx
.ALIGN_CENTRE
) 
 204         text
.SetFont(wx
.Font(24, wx
.SWISS
, wx
.NORMAL
, wx
.BOLD
, False)) 
 207         w
,h 
= text
.GetTextExtent(msg
) 
 208         text
.SetSize(wx
.Size(w
,h
+1)) 
 209         text
.SetForegroundColour(wx
.BLUE
) 
 210         outsideSizer
.Add(text
, 0, wx
.EXPAND|wx
.ALL
, 5) 
 211         outsideSizer
.Add(wx
.StaticLine(self
, -1), 0, wx
.EXPAND
) 
 213         inSizer 
= wx
.BoxSizer(wx
.HORIZONTAL
) 
 214         inSizer
.Add(ClipTextPanel(self
, log
), 1, wx
.EXPAND
) 
 215         inSizer
.Add(FileDropPanel(self
, log
), 1, wx
.EXPAND
) 
 217         outsideSizer
.Add(inSizer
, 1, wx
.EXPAND
) 
 218         self
.SetSizer(outsideSizer
) 
 221 #---------------------------------------------------------------------- 
 223 def runTest(frame
, nb
, log
): 
 224     win 
= TestPanel(nb
, log
) 
 227 #---------------------------------------------------------------------- 
 233 This demo shows some examples of data transfer through clipboard or 
 234 drag and drop. In wxWindows, these two ways to transfer data (either 
 235 between different applications or inside one and the same) are very 
 236 similar which allows to implement both of them using almost the same 
 237 code - or, in other words, if you implement drag and drop support for 
 238 your application, you get clipboard support for free and vice versa. 
 240 At the heart of both clipboard and drag and drop operations lies the 
 241 wxDataObject class. The objects of this class (or, to be precise, 
 242 classes derived from it) represent the data which is being carried by 
 243 the mouse during drag and drop operation or copied to or pasted from 
 244 the clipboard. wxDataObject is a "smart" piece of data because it 
 245 knows which formats it supports (see GetFormatCount and GetAllFormats) 
 246 and knows how to render itself in any of them (see GetDataHere). It 
 247 can also receive its value from the outside in a format it supports if 
 248 it implements the SetData method. Please see the documentation of this 
 249 class for more details. 
 251 Both clipboard and drag and drop operations have two sides: the source 
 252 and target, the data provider and the data receiver. These which may 
 253 be in the same application and even the same window when, for example, 
 254 you drag some text from one position to another in a word 
 255 processor. Let us describe what each of them should do. 
 261 if __name__ 
== '__main__': 
 264     run
.main(['', os
.path
.basename(sys
.argv
[0])] + sys
.argv
[1:])