2 from wxPython
.wx
import *
4 #----------------------------------------------------------------------
6 class ClipTextPanel(wxPanel
):
7 def __init__(self
, parent
, log
):
8 wxPanel
.__init
__(self
, parent
, -1)
11 #self.SetFont(wxFont(10, wxSWISS, wxNORMAL, wxBOLD, False))
13 sizer
= wxBoxSizer(wxVERTICAL
)
14 sizer
.Add(wxStaticText(self
, -1,
15 "Copy/Paste text to/from\n"
16 "this window and other apps"), 0, wxEXPAND|wxALL
, 2)
18 self
.text
= wxTextCtrl(self
, -1, "", style
=wxTE_MULTILINE|wxHSCROLL
)
19 sizer
.Add(self
.text
, 1, wxEXPAND
)
21 hsz
= wxBoxSizer(wxHORIZONTAL
)
22 hsz
.Add(wxButton(self
, 6050, " Copy "), 1, wxEXPAND|wxALL
, 2)
23 hsz
.Add(wxButton(self
, 6051, " Paste "), 1, wxEXPAND|wxALL
, 2)
24 sizer
.Add(hsz
, 0, wxEXPAND
)
25 sizer
.Add(wxButton(self
, 6052, " Copy Bitmap "), 0, wxEXPAND|wxALL
, 2)
27 EVT_BUTTON(self
, 6050, self
.OnCopy
)
28 EVT_BUTTON(self
, 6051, self
.OnPaste
)
29 EVT_BUTTON(self
, 6052, self
.OnCopyBitmap
)
31 self
.SetAutoLayout(True)
35 def OnCopy(self
, evt
):
36 self
.do
= wxTextDataObject()
37 self
.do
.SetText(self
.text
.GetValue())
39 wxTheClipboard
.SetData(self
.do
)
40 wxTheClipboard
.Close()
43 def OnPaste(self
, evt
):
44 do
= wxTextDataObject()
46 success
= wxTheClipboard
.GetData(do
)
47 wxTheClipboard
.Close()
49 self
.text
.SetValue(do
.GetText())
51 wxMessageBox("There is no data in the clipboard in the required format",
54 def OnCopyBitmap(self
, evt
):
55 dlg
= wxFileDialog(self
, "Choose a bitmap to copy", wildcard
="*.bmp")
56 if dlg
.ShowModal() == wxID_OK
:
57 bmp
= wxBitmap(dlg
.GetFilename(), wxBITMAP_TYPE_BMP
)
58 bmpdo
= wxBitmapDataObject(bmp
)
60 wxTheClipboard
.SetData(bmpdo
)
61 wxTheClipboard
.Close()
63 wxMessageBox("The bitmap is now in the Clipboard. Switch to a graphics\n"
64 "editor and try pasting it in...")
67 #----------------------------------------------------------------------
69 class OtherDropTarget(wxPyDropTarget
):
70 def __init__(self
, window
, log
):
71 wxPyDropTarget
.__init
__(self
)
73 self
.do
= wxFileDataObject()
74 self
.SetDataObject(self
.do
)
76 def OnEnter(self
, x
, y
, d
):
77 self
.log
.WriteText("OnEnter: %d, %d, %d\n" % (x
, y
, d
))
80 #def OnDragOver(self, x, y, d):
81 # self.log.WriteText("OnDragOver: %d, %d, %d\n" % (x, y, d))
85 self
.log
.WriteText("OnLeave\n")
87 def OnDrop(self
, x
, y
):
88 self
.log
.WriteText("OnDrop: %d %d\n" % (x
, y
))
91 def OnData(self
, x
, y
, d
):
92 self
.log
.WriteText("OnData: %d, %d, %d\n" % (x
, y
, d
))
94 self
.log
.WriteText("%s\n" % self
.do
.GetFilenames())
100 class MyFileDropTarget(wxFileDropTarget
):
101 def __init__(self
, window
, log
):
102 wxFileDropTarget
.__init
__(self
)
106 def OnDropFiles(self
, x
, y
, filenames
):
107 self
.window
.SetInsertionPointEnd()
108 self
.window
.WriteText("\n%d file(s) dropped at %d,%d:\n" %
109 (len(filenames
), x
, y
))
110 for file in filenames
:
111 self
.window
.WriteText(file + '\n')
114 class MyTextDropTarget(wxTextDropTarget
):
115 def __init__(self
, window
, log
):
116 wxTextDropTarget
.__init
__(self
)
120 def OnDropText(self
, x
, y
, text
):
121 self
.window
.WriteText("(%d, %d)\n%s\n" % (x
, y
, text
))
123 def OnDragOver(self
, x
, y
, d
):
127 class FileDropPanel(wxPanel
):
128 def __init__(self
, parent
, log
):
129 wxPanel
.__init
__(self
, parent
, -1)
131 #self.SetFont(wxFont(10, wxSWISS, wxNORMAL, wxBOLD, False))
133 sizer
= wxBoxSizer(wxVERTICAL
)
134 sizer
.Add(wxStaticText(self
, -1, " \nDrag some files here:"),
135 0, wxEXPAND|wxALL
, 2)
137 self
.text
= wxTextCtrl(self
, -1, "",
138 style
= wxTE_MULTILINE|wxHSCROLL|wxTE_READONLY
)
139 dt
= MyFileDropTarget(self
, log
)
140 self
.text
.SetDropTarget(dt
)
141 sizer
.Add(self
.text
, 1, wxEXPAND
)
143 sizer
.Add(wxStaticText(self
, -1, " \nDrag some text here:"),
144 0, wxEXPAND|wxALL
, 2)
145 self
.text2
= wxTextCtrl(self
, -1, "",
146 style
= wxTE_MULTILINE|wxHSCROLL|wxTE_READONLY
)
147 dt
= MyTextDropTarget(self
.text2
, log
)
148 self
.text2
.SetDropTarget(dt
)
149 sizer
.Add(self
.text2
, 1, wxEXPAND
)
151 self
.SetAutoLayout(True)
155 def WriteText(self
, text
):
156 self
.text
.WriteText(text
)
158 def SetInsertionPointEnd(self
):
159 self
.text
.SetInsertionPointEnd()
162 #----------------------------------------------------------------------
163 #----------------------------------------------------------------------
165 class TestPanel(wxPanel
):
166 def __init__(self
, parent
, log
):
167 wxPanel
.__init
__(self
, parent
, -1)
169 self
.SetAutoLayout(True)
170 outsideSizer
= wxBoxSizer(wxVERTICAL
)
172 msg
= "Clipboard / Drag-And-Drop"
173 text
= wxStaticText(self
, -1, "", style
=wxALIGN_CENTRE
)
174 text
.SetFont(wxFont(24, wxSWISS
, wxNORMAL
, wxBOLD
, False))
176 w
,h
= text
.GetTextExtent(msg
)
177 text
.SetSize(wxSize(w
,h
+1))
178 text
.SetForegroundColour(wxBLUE
)
179 outsideSizer
.Add(text
, 0, wxEXPAND|wxALL
, 5)
180 outsideSizer
.Add(wxStaticLine(self
, -1), 0, wxEXPAND
)
182 inSizer
= wxBoxSizer(wxHORIZONTAL
)
183 inSizer
.Add(ClipTextPanel(self
, log
), 1, wxEXPAND
)
184 inSizer
.Add(FileDropPanel(self
, log
), 1, wxEXPAND
)
186 outsideSizer
.Add(inSizer
, 1, wxEXPAND
)
187 self
.SetSizer(outsideSizer
)
190 #----------------------------------------------------------------------
192 def runTest(frame
, nb
, log
):
193 win
= TestPanel(nb
, log
)
196 #----------------------------------------------------------------------
209 overview
= """<html><body>\
210 This demo shows some examples of data transfer through clipboard or
211 drag and drop. In wxWindows, these two ways to transfer data (either
212 between different applications or inside one and the same) are very
213 similar which allows to implement both of them using almost the same
214 code - or, in other words, if you implement drag and drop support for
215 your application, you get clipboard support for free and vice versa.
217 At the heart of both clipboard and drag and drop operations lies the
218 wxDataObject class. The objects of this class (or, to be precise,
219 classes derived from it) represent the data which is being carried by
220 the mouse during drag and drop operation or copied to or pasted from
221 the clipboard. wxDataObject is a "smart" piece of data because it
222 knows which formats it supports (see GetFormatCount and GetAllFormats)
223 and knows how to render itself in any of them (see GetDataHere). It
224 can also receive its value from the outside in a format it supports if
225 it implements the SetData method. Please see the documentation of this
226 class for more details.
228 Both clipboard and drag and drop operations have two sides: the source
229 and target, the data provider and the data receiver. These which may
230 be in the same application and even the same window when, for example,
231 you drag some text from one position to another in a word
232 processor. Let us describe what each of them should do.
239 if __name__
== '__main__':
242 run
.main(['', os
.path
.basename(sys
.argv
[0])])