]> git.saurik.com Git - wxWidgets.git/blame - wxPython/demo/DragAndDrop.py
fixed extraneous scrolling when scrollbars are added/removed (patch 788026; bug 746618)
[wxWidgets.git] / wxPython / demo / DragAndDrop.py
CommitLineData
b1462dfa
RD
1
2from wxPython.wx import *
3
4#----------------------------------------------------------------------
5
6class ClipTextPanel(wxPanel):
7 def __init__(self, parent, log):
8 wxPanel.__init__(self, parent, -1)
9 self.log = log
10
1e4a197e 11 #self.SetFont(wxFont(10, wxSWISS, wxNORMAL, wxBOLD, False))
b1462dfa
RD
12
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)
17
18 self.text = wxTextCtrl(self, -1, "", style=wxTE_MULTILINE|wxHSCROLL)
19 sizer.Add(self.text, 1, wxEXPAND)
20
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)
26
27 EVT_BUTTON(self, 6050, self.OnCopy)
28 EVT_BUTTON(self, 6051, self.OnPaste)
29 EVT_BUTTON(self, 6052, self.OnCopyBitmap)
30
1e4a197e 31 self.SetAutoLayout(True)
b1462dfa
RD
32 self.SetSizer(sizer)
33
34
35 def OnCopy(self, evt):
694759cf 36 self.do = wxTextDataObject()
b1462dfa
RD
37 self.do.SetText(self.text.GetValue())
38 wxTheClipboard.Open()
39 wxTheClipboard.SetData(self.do)
40 wxTheClipboard.Close()
41
42
43 def OnPaste(self, evt):
694759cf 44 do = wxTextDataObject()
b1462dfa 45 wxTheClipboard.Open()
694759cf 46 success = wxTheClipboard.GetData(do)
b1462dfa
RD
47 wxTheClipboard.Close()
48 if success:
694759cf 49 self.text.SetValue(do.GetText())
b1462dfa
RD
50 else:
51 wxMessageBox("There is no data in the clipboard in the required format",
52 "Error")
53
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)
59 wxTheClipboard.Open()
60 wxTheClipboard.SetData(bmpdo)
61 wxTheClipboard.Close()
62
63 wxMessageBox("The bitmap is now in the Clipboard. Switch to a graphics\n"
64 "editor and try pasting it in...")
65 dlg.Destroy()
66
67#----------------------------------------------------------------------
68
69class OtherDropTarget(wxPyDropTarget):
70 def __init__(self, window, log):
71 wxPyDropTarget.__init__(self)
72 self.log = log
73 self.do = wxFileDataObject()
74 self.SetDataObject(self.do)
75
76 def OnEnter(self, x, y, d):
77 self.log.WriteText("OnEnter: %d, %d, %d\n" % (x, y, d))
78 return wxDragCopy
79
80 #def OnDragOver(self, x, y, d):
81 # self.log.WriteText("OnDragOver: %d, %d, %d\n" % (x, y, d))
82 # return wxDragCopy
83
84 def OnLeave(self):
85 self.log.WriteText("OnLeave\n")
86
87 def OnDrop(self, x, y):
88 self.log.WriteText("OnDrop: %d %d\n" % (x, y))
1e4a197e 89 return True
b1462dfa
RD
90
91 def OnData(self, x, y, d):
92 self.log.WriteText("OnData: %d, %d, %d\n" % (x, y, d))
93 self.GetData()
94 self.log.WriteText("%s\n" % self.do.GetFilenames())
95 return d
96
97
98
99
100class MyFileDropTarget(wxFileDropTarget):
101 def __init__(self, window, log):
102 wxFileDropTarget.__init__(self)
103 self.window = window
104 self.log = log
105
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')
112
113
846ec2f9
RD
114class MyTextDropTarget(wxTextDropTarget):
115 def __init__(self, window, log):
116 wxTextDropTarget.__init__(self)
117 self.window = window
118 self.log = log
119
120 def OnDropText(self, x, y, text):
121 self.window.WriteText("(%d, %d)\n%s\n" % (x, y, text))
122
e00a2cc7
RD
123 def OnDragOver(self, x, y, d):
124 return wxDragCopy
846ec2f9 125
b1462dfa
RD
126
127class FileDropPanel(wxPanel):
128 def __init__(self, parent, log):
129 wxPanel.__init__(self, parent, -1)
130
1e4a197e 131 #self.SetFont(wxFont(10, wxSWISS, wxNORMAL, wxBOLD, False))
b1462dfa
RD
132
133 sizer = wxBoxSizer(wxVERTICAL)
134 sizer.Add(wxStaticText(self, -1, " \nDrag some files here:"),
135 0, wxEXPAND|wxALL, 2)
136
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)
142
846ec2f9
RD
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)
150
1e4a197e 151 self.SetAutoLayout(True)
b1462dfa
RD
152 self.SetSizer(sizer)
153
154
155 def WriteText(self, text):
156 self.text.WriteText(text)
157
158 def SetInsertionPointEnd(self):
159 self.text.SetInsertionPointEnd()
160
161
162#----------------------------------------------------------------------
163#----------------------------------------------------------------------
164
165class TestPanel(wxPanel):
166 def __init__(self, parent, log):
167 wxPanel.__init__(self, parent, -1)
168
1e4a197e 169 self.SetAutoLayout(True)
b1462dfa
RD
170 outsideSizer = wxBoxSizer(wxVERTICAL)
171
4120ef2b 172 msg = "Clipboard / Drag-And-Drop"
b1462dfa 173 text = wxStaticText(self, -1, "", style=wxALIGN_CENTRE)
1e4a197e 174 text.SetFont(wxFont(24, wxSWISS, wxNORMAL, wxBOLD, False))
4120ef2b
RD
175 text.SetLabel(msg)
176 w,h = text.GetTextExtent(msg)
177 text.SetSize(wxSize(w,h+1))
b1462dfa
RD
178 text.SetForegroundColour(wxBLUE)
179 outsideSizer.Add(text, 0, wxEXPAND|wxALL, 5)
180 outsideSizer.Add(wxStaticLine(self, -1), 0, wxEXPAND)
181
182 inSizer = wxBoxSizer(wxHORIZONTAL)
183 inSizer.Add(ClipTextPanel(self, log), 1, wxEXPAND)
184 inSizer.Add(FileDropPanel(self, log), 1, wxEXPAND)
185
186 outsideSizer.Add(inSizer, 1, wxEXPAND)
187 self.SetSizer(outsideSizer)
188
189
190#----------------------------------------------------------------------
191
192def runTest(frame, nb, log):
193 win = TestPanel(nb, log)
194 return win
195
196#----------------------------------------------------------------------
197
198
199
200
201
202
203
204
205
206
207
208
1fded56b
RD
209overview = """<html><body>\
210This demo shows some examples of data transfer through clipboard or
211drag and drop. In wxWindows, these two ways to transfer data (either
212between different applications or inside one and the same) are very
213similar which allows to implement both of them using almost the same
214code - or, in other words, if you implement drag and drop support for
215your application, you get clipboard support for free and vice versa.
216<p>
217At the heart of both clipboard and drag and drop operations lies the
218wxDataObject class. The objects of this class (or, to be precise,
219classes derived from it) represent the data which is being carried by
220the mouse during drag and drop operation or copied to or pasted from
221the clipboard. wxDataObject is a "smart" piece of data because it
222knows which formats it supports (see GetFormatCount and GetAllFormats)
223and knows how to render itself in any of them (see GetDataHere). It
224can also receive its value from the outside in a format it supports if
225it implements the SetData method. Please see the documentation of this
226class for more details.
227<p>
228Both clipboard and drag and drop operations have two sides: the source
229and target, the data provider and the data receiver. These which may
230be in the same application and even the same window when, for example,
231you drag some text from one position to another in a word
232processor. Let us describe what each of them should do.
233</body></html>
234"""
b1462dfa 235
b1462dfa 236
b1462dfa 237
1fded56b
RD
238
239if __name__ == '__main__':
240 import sys,os
241 import run
242 run.main(['', os.path.basename(sys.argv[0])])
243