]> git.saurik.com Git - wxWidgets.git/blame - wxPython/demo/DragAndDrop.py
Changes to ensure that GDI objects returned from Python methods are
[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
b1462dfa
RD
11 #self.SetFont(wxFont(10, wxSWISS, wxNORMAL, wxBOLD, false))
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
31 self.SetAutoLayout(true)
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))
89 return true
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
123
b1462dfa
RD
124
125class FileDropPanel(wxPanel):
126 def __init__(self, parent, log):
127 wxPanel.__init__(self, parent, -1)
128
129 #self.SetFont(wxFont(10, wxSWISS, wxNORMAL, wxBOLD, false))
130
131 sizer = wxBoxSizer(wxVERTICAL)
132 sizer.Add(wxStaticText(self, -1, " \nDrag some files here:"),
133 0, wxEXPAND|wxALL, 2)
134
135 self.text = wxTextCtrl(self, -1, "",
136 style = wxTE_MULTILINE|wxHSCROLL|wxTE_READONLY)
137 dt = MyFileDropTarget(self, log)
138 self.text.SetDropTarget(dt)
139 sizer.Add(self.text, 1, wxEXPAND)
140
846ec2f9
RD
141 sizer.Add(wxStaticText(self, -1, " \nDrag some text here:"),
142 0, wxEXPAND|wxALL, 2)
143 self.text2 = wxTextCtrl(self, -1, "",
144 style = wxTE_MULTILINE|wxHSCROLL|wxTE_READONLY)
145 dt = MyTextDropTarget(self.text2, log)
146 self.text2.SetDropTarget(dt)
147 sizer.Add(self.text2, 1, wxEXPAND)
148
b1462dfa
RD
149 self.SetAutoLayout(true)
150 self.SetSizer(sizer)
151
152
153 def WriteText(self, text):
154 self.text.WriteText(text)
155
156 def SetInsertionPointEnd(self):
157 self.text.SetInsertionPointEnd()
158
159
160#----------------------------------------------------------------------
161#----------------------------------------------------------------------
162
163class TestPanel(wxPanel):
164 def __init__(self, parent, log):
165 wxPanel.__init__(self, parent, -1)
166
167 self.SetAutoLayout(true)
168 outsideSizer = wxBoxSizer(wxVERTICAL)
169
4120ef2b 170 msg = "Clipboard / Drag-And-Drop"
b1462dfa
RD
171 text = wxStaticText(self, -1, "", style=wxALIGN_CENTRE)
172 text.SetFont(wxFont(24, wxSWISS, wxNORMAL, wxBOLD, false))
4120ef2b
RD
173 text.SetLabel(msg)
174 w,h = text.GetTextExtent(msg)
175 text.SetSize(wxSize(w,h+1))
b1462dfa
RD
176 text.SetForegroundColour(wxBLUE)
177 outsideSizer.Add(text, 0, wxEXPAND|wxALL, 5)
178 outsideSizer.Add(wxStaticLine(self, -1), 0, wxEXPAND)
179
180 inSizer = wxBoxSizer(wxHORIZONTAL)
181 inSizer.Add(ClipTextPanel(self, log), 1, wxEXPAND)
182 inSizer.Add(FileDropPanel(self, log), 1, wxEXPAND)
183
184 outsideSizer.Add(inSizer, 1, wxEXPAND)
185 self.SetSizer(outsideSizer)
186
187
188#----------------------------------------------------------------------
189
190def runTest(frame, nb, log):
191 win = TestPanel(nb, log)
192 return win
193
194#----------------------------------------------------------------------
195
196
197
198
199
200
201
202
203
204
205
206
207overview = """\
208This demo shows some examples of data transfer through clipboard or drag and drop. In wxWindows, these two ways to transfer data (either between different applications or inside one and the same) are very similar which allows to implement both of them using almost the same code - or, in other words, if you implement drag and drop support for your application, you get clipboard support for free and vice versa.
209
210At the heart of both clipboard and drag and drop operations lies the wxDataObject class. The objects of this class (or, to be precise, classes derived from it) represent the data which is being carried by the mouse during drag and drop operation or copied to or pasted from the clipboard. wxDataObject is a "smart" piece of data because it knows which formats it supports (see GetFormatCount and GetAllFormats) and knows how to render itself in any of them (see GetDataHere). It can also receive its value from the outside in a format it supports if it implements the SetData method. Please see the documentation of this class for more details.
211
212Both clipboard and drag and drop operations have two sides: the source and target, the data provider and the data receiver. These which may be in the same application and even the same window when, for example, you drag some text from one position to another in a word processor. Let us describe what each of them should do.
213
214"""