]>
Commit | Line | Data |
---|---|---|
cc6eca35 RD |
1 | #---------------------------------------------------------------------- |
2 | # Name: wxMimeTypesManager | |
3 | # Purpose: Demonstrate use of wx.MimeTypesManager, wx.FileType | |
4 | # | |
5 | # Author: Jeff Grimmett (grimmtoo@softhome.net), adapted from original | |
6 | # .wdr-derived demo | |
7 | # | |
8 | # Created: 12/31/03 | |
9 | # RCS-ID: $Id$ | |
10 | # Copyright: | |
11 | # Licence: wxWindows license | |
12 | #---------------------------------------------------------------------- | |
13 | # | |
b37c7e1d | 14 | |
cc6eca35 RD |
15 | |
16 | import pprint | |
17 | import wx | |
18 | import images | |
b37c7e1d RD |
19 | |
20 | #---------------------------------------------------------------------------- | |
21 | ||
cc6eca35 RD |
22 | # A convenient wrapper around wx.TextCtrl to give it a spiffy label. |
23 | class ExtStr(wx.Panel): | |
24 | def __init__(self, parent): | |
25 | wx.Panel.__init__(self, parent, -1) | |
26 | sizer = wx.StaticBoxSizer(wx.StaticBox(self, -1, 'Extension'), wx.HORIZONTAL) | |
27 | self.ctl = wx.TextCtrl(self, -1, value="wav", style = wx.TE_PROCESS_ENTER ) | |
28 | sizer.Add(self.ctl, 0, wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 3) | |
29 | self.Enable(True) | |
30 | ||
31 | self.SetSizer(sizer) | |
32 | sizer.Fit(self) | |
33 | ||
34 | def Enable(self, value): | |
35 | self.ctl.Enable(value) | |
36 | ||
37 | def SetValue(self, value): | |
38 | self.ctl.SetValue(value) | |
39 | ||
40 | def GetValue(self): | |
41 | return(self.ctl.GetValue()) | |
42 | ||
43 | ||
44 | class MimeTypesDemoPanel(wx.Panel): | |
45 | def __init__(self, parent, log): | |
46 | ||
47 | self.log = log | |
48 | ||
49 | wx.Panel.__init__(self, parent, -1) | |
50 | ||
51 | # Contains everything | |
52 | tsizer = wx.BoxSizer(wx.VERTICAL) | |
53 | ||
54 | # Contains upper controls | |
55 | usizer = wx.BoxSizer(wx.HORIZONTAL) | |
56 | ||
57 | # A little fancy stuff to make things align right. | |
58 | self.ext = ExtStr(self) | |
59 | usizer.Add(self.ext, 0, wx.ALL | wx.ALIGN_TOP, 4) | |
60 | self.ext.Bind(wx.EVT_TEXT_ENTER, self.OnLookup) | |
61 | ||
62 | # Select how to look it up | |
63 | self.how = wx.RadioBox( | |
64 | self, -1, "Lookup method", choices=['By extension', 'By MIME type'], | |
65 | majorDimension=2, style=wx.RA_SPECIFY_COLS | |
66 | ) | |
67 | usizer.Add(self.how, 0, wx.ALL | wx.ALIGN_TOP, 4) | |
68 | self.how.SetSelection(0) | |
69 | ||
70 | # Trigger a lookup (hitting ENTER in the text ctrl will do the same thing) | |
71 | self.go = wx.Button(self, -1, "Go get it!") | |
72 | usizer.Add(self.go, 0, wx.ALL | wx.ALIGN_CENTER, 4) | |
73 | self.Bind(wx.EVT_BUTTON, self.OnLookup, self.go) | |
74 | ||
75 | # StaticBox with larger label than usual | |
76 | lbox = wx.StaticBox(self, -1, 'wx.FileType') | |
77 | lbox.SetFont( | |
78 | wx.Font( | |
79 | self.GetFont().GetPointSize() * 2, | |
80 | self.GetFont().GetFamily(), | |
81 | self.GetFont().GetStyle(), | |
82 | wx.BOLD | |
83 | )) | |
84 | ||
85 | lsizer = wx.StaticBoxSizer(lbox, wx.HORIZONTAL) | |
86 | ||
87 | # Contains the wx.FileType info | |
88 | llsizer = wx.GridBagSizer(2, 2) | |
89 | llsizer.AddGrowableCol(2) | |
90 | ||
91 | # This will be used for all of the labels that follow (bold label) | |
92 | bfont = wx.Font( | |
93 | self.GetFont().GetPointSize(), | |
94 | self.GetFont().GetFamily(), | |
95 | self.GetFont().GetStyle(), | |
96 | wx.BOLD | |
97 | ) | |
98 | ||
99 | #------- Icon info | |
100 | ||
101 | t = wx.StaticText(self, -1, 'GetIconInfo: ', style = wx.ALIGN_RIGHT ) | |
102 | t.SetFont(bfont) | |
103 | llsizer.Add(t, (0, 0), (1, 1), wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 2) | |
104 | ||
105 | self.icon = wx.StaticBitmap(self, -1, images.getNoIconBitmap()) | |
106 | llsizer.Add(self.icon, (0, 1), (1, 1), wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 2) | |
107 | ||
108 | self.iconsource = wx.TextCtrl(self, -1, value="", style = wx.TE_READONLY ) | |
109 | llsizer.Add(self.iconsource, (0, 2), (1, 1), wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 2) | |
110 | ||
111 | self.iconoffset = wx.TextCtrl(self, -1, value="", style = wx.TE_READONLY ) | |
112 | llsizer.Add(self.iconoffset, (0, 3), (1, 1), wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 2) | |
113 | ||
114 | #------- MIME Type | |
115 | ||
116 | t = wx.StaticText(self, -1, 'GetMimeType: ', style = wx.ALIGN_RIGHT ) | |
117 | t.SetFont(bfont) | |
118 | llsizer.Add(t, (1, 0), (1, 1), wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 2) | |
119 | ||
120 | self.mimetype = wx.TextCtrl(self, -1, value="", style = wx.TE_READONLY ) | |
121 | llsizer.Add(self.mimetype, (1, 1), (1, 3), wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 2) | |
122 | ||
123 | #------- MIME Types | |
124 | ||
125 | t = wx.StaticText(self, -1, 'GetMimeTypes: ', style = wx.ALIGN_RIGHT ) | |
126 | t.SetFont(bfont) | |
127 | llsizer.Add(t, (2, 0), (1, 1), wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 2) | |
128 | ||
129 | self.mimetypes = wx.TextCtrl(self, -1, value="", style = wx.TE_READONLY ) | |
130 | llsizer.Add(self.mimetypes, (2, 1), (1, 3), wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 2) | |
131 | ||
132 | #------- Extensions | |
133 | ||
134 | t = wx.StaticText(self, -1, 'GetExtensions: ', style = wx.ALIGN_RIGHT ) | |
135 | t.SetFont(bfont) | |
136 | llsizer.Add(t, (3, 0), (1, 1), wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 2) | |
137 | ||
138 | self.extensions = wx.TextCtrl(self, -1, value="", style = wx.TE_READONLY ) | |
139 | llsizer.Add(self.extensions, (3, 1), (1, 3), wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 2) | |
140 | ||
141 | #------- Description | |
b37c7e1d | 142 | |
cc6eca35 RD |
143 | t = wx.StaticText(self, -1, 'GetDescription: ', style = wx.ALIGN_RIGHT ) |
144 | t.SetFont(bfont) | |
145 | llsizer.Add(t, (4, 0), (1, 1), wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 2) | |
b37c7e1d | 146 | |
cc6eca35 RD |
147 | self.description = wx.TextCtrl(self, -1, value="", style = wx.TE_READONLY) |
148 | llsizer.Add(self.description, (4, 1), (1, 3), wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 2) | |
b37c7e1d | 149 | |
cc6eca35 | 150 | #------- Open command |
b37c7e1d | 151 | |
cc6eca35 RD |
152 | t = wx.StaticText(self, -1, 'GetOpenCommand: ', style = wx.ALIGN_RIGHT ) |
153 | t.SetFont(bfont) | |
154 | llsizer.Add(t, (5, 0), (1, 1), wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 2) | |
155 | ||
156 | self.opencommand = wx.TextCtrl(self, -1, value="", style = wx.TE_READONLY ) | |
157 | llsizer.Add(self.opencommand, (5, 1), (1, 3), wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 2) | |
158 | ||
159 | #------- Print command | |
160 | ||
161 | t = wx.StaticText(self, -1, 'GetPrintCommand: ', style = wx.ALIGN_RIGHT ) | |
162 | t.SetFont(bfont) | |
163 | llsizer.Add(t, (6, 0), (1, 1), wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 2) | |
164 | ||
165 | self.printcommand = wx.TextCtrl(self, -1, value="", style = wx.TE_READONLY ) | |
166 | llsizer.Add(self.printcommand, (6, 1), (1, 3), wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 2) | |
167 | ||
168 | #------- All commands | |
169 | ||
170 | t = wx.StaticText(self, -1, 'GetAllCommands: ', style = wx.ALIGN_RIGHT ) | |
171 | t.SetFont(bfont) | |
172 | llsizer.Add(t, (7, 0), (1, 1), wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 2) | |
173 | ||
174 | self.allcommands = wx.TextCtrl(self, -1, value="", style = wx.TE_READONLY | wx.TE_DONTWRAP | wx.TE_MULTILINE ) | |
175 | ||
176 | # Set the default height to be smaller than normal (for | |
177 | # multi-line) so the sizer can then expand it to whatever | |
178 | # space is available | |
179 | self.allcommands.SetSize((-1, 20)) | |
180 | ||
181 | llsizer.Add(self.allcommands, (7, 1), (1, 3), wx.ALL | wx.GROW | wx.ALIGN_CENTER, 2) | |
182 | ||
183 | # Tell the sizer to expand this row as needed | |
184 | llsizer.AddGrowableRow(7) | |
185 | ||
186 | #---------------------------------------------------------------------------- | |
187 | ||
188 | lrsizer = wx.StaticBoxSizer(wx.StaticBox(self, -1, 'Known MIME types'), wx.HORIZONTAL) | |
189 | ||
190 | #------- List box with known MIME types | |
191 | self.mimelist = wx.ListBox(self, -1, choices=[], style = wx.LB_SINGLE | wx.LB_SORT) | |
192 | lrsizer.Add(self.mimelist, 0, wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 4) | |
193 | self.Bind(wx.EVT_LISTBOX, self.OnListbox, self.mimelist) | |
194 | ||
195 | #---------------------------------------------------------------------------- | |
196 | ||
197 | lsizer.Add(llsizer, 1, wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 4) | |
198 | lsizer.Add(lrsizer, 0, wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 4) | |
b37c7e1d | 199 | |
cc6eca35 | 200 | #---------------------------------------------------------------------------- |
b37c7e1d | 201 | |
cc6eca35 RD |
202 | tsizer.Add(usizer, 0, wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 4) |
203 | tsizer.Add(lsizer, 1, wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 4) | |
b37c7e1d | 204 | |
cc6eca35 | 205 | #---------------------------------------------------------------------------- |
b37c7e1d | 206 | |
cc6eca35 RD |
207 | self.SetSizer(tsizer) |
208 | tsizer.Fit(self) | |
209 | ||
210 | # Populate the Known MIME types list with what is in the database | |
211 | mtypes = wx.TheMimeTypesManager.EnumAllFileTypes() | |
212 | for mt in mtypes: | |
213 | self.mimelist.Append(mt) | |
b37c7e1d | 214 | |
cc6eca35 RD |
215 | # Do a lookup of *.wav for a starting position |
216 | self.OnLookup() | |
217 | ||
218 | # Grab the selection from the listbox, push that into | |
219 | # the text box at top, select 'MIME', and then look it up. | |
b37c7e1d RD |
220 | def OnListbox(self, event): |
221 | mimetype = event.GetString() | |
cc6eca35 RD |
222 | self.ext.SetValue(mimetype) |
223 | self.how.SetSelection(1) | |
b37c7e1d RD |
224 | self.OnLookup() |
225 | ||
cc6eca35 | 226 | # Look up a given file extension or MIME type. |
b37c7e1d | 227 | def OnLookup(self, event=None): |
cc6eca35 RD |
228 | txt = self.ext.GetValue() |
229 | ||
230 | # For MIME lookups | |
231 | if self.how.GetSelection() == 1: | |
232 | fileType = wx.TheMimeTypesManager.GetFileTypeFromMimeType(txt) | |
b37c7e1d | 233 | msg = "Mime type" |
cc6eca35 RD |
234 | |
235 | # Select the entered value in the list | |
236 | if fileType: | |
237 | if self.mimelist.FindString(txt) != -1: | |
238 | self.mimelist.SetSelection(self.mimelist.FindString(txt)) | |
239 | ||
240 | # Must be an extension lookup | |
b37c7e1d | 241 | else: |
cc6eca35 | 242 | fileType = wx.TheMimeTypesManager.GetFileTypeFromExtension(txt) |
b37c7e1d | 243 | msg = "File extension" |
cc6eca35 RD |
244 | |
245 | # Select the entered value in the list | |
246 | if fileType: | |
247 | if self.mimelist.FindString(str(fileType.GetMimeType())) != -1: | |
248 | # Using CallAfter to ensure that GUI is ready before trying to | |
249 | # select it (otherwise, it's selected but not visible) | |
250 | wx.CallAfter(self.mimelist.SetSelection, self.mimelist.FindString(str(fileType.GetMimeType()))) | |
251 | ||
252 | ||
b37c7e1d | 253 | if fileType is None: |
cc6eca35 | 254 | wx.MessageBox(msg + " not found.", "Oops!") |
b37c7e1d RD |
255 | else: |
256 | self.Update(fileType) | |
257 | ||
cc6eca35 | 258 | # Populate the wx.FileType fields with actual values. |
b37c7e1d | 259 | def Update(self, ft): |
cc6eca35 RD |
260 | |
261 | #------- Icon info | |
b37c7e1d | 262 | info = ft.GetIconInfo() |
cc6eca35 | 263 | |
b37c7e1d | 264 | if info is None: |
cc6eca35 RD |
265 | bmp = images.getNoIconBitmap() |
266 | self.icon.SetBitmap(bmp) | |
267 | self.iconsource.SetValue("") | |
268 | self.iconoffset.SetValue("") | |
b37c7e1d RD |
269 | else: |
270 | icon, file, idx = info | |
cc6eca35 RD |
271 | if icon.Ok(): |
272 | self.icon.SetIcon(icon) | |
273 | else: | |
274 | bmp = images.getNoIconBitmap() | |
275 | self.icon.SetBitmap(bmp) | |
276 | self.iconsource.SetValue(file) | |
277 | self.iconoffset.SetValue(str(idx)) | |
278 | ||
279 | #------- MIME type | |
280 | self.mimetype.SetValue(str(ft.GetMimeType())) | |
281 | #------- MIME types | |
282 | self.mimetypes.SetValue(str(ft.GetMimeTypes())) | |
283 | #------- Associated extensions | |
284 | self.extensions.SetValue(str(ft.GetExtensions())) | |
285 | #------- Description of file type | |
286 | self.description.SetValue(str(ft.GetDescription())) | |
287 | ||
288 | #------- Prep a fake command line command | |
0d3859bf | 289 | extList = ft.GetExtensions() |
cc6eca35 | 290 | |
0d3859bf RD |
291 | if extList: |
292 | ext = extList[0] | |
293 | if ext[0] == ".": ext = ext[1:] | |
294 | else: | |
295 | ext = "" | |
cc6eca35 | 296 | |
4c3b4ed0 | 297 | filename = "SPAM" + "." + ext |
b37c7e1d | 298 | mime = ft.GetMimeType() or "" |
cc6eca35 RD |
299 | |
300 | #------- OPEN command | |
ee707cb7 | 301 | cmd = ft.GetOpenCommand(filename, mime) |
cc6eca35 | 302 | self.opencommand.SetValue(str(cmd)) |
b37c7e1d | 303 | |
cc6eca35 | 304 | #------- PRINT command |
ee707cb7 | 305 | cmd = ft.GetPrintCommand(filename, mime) |
cc6eca35 | 306 | self.printcommand.SetValue(str(cmd)) |
b37c7e1d | 307 | |
cc6eca35 | 308 | #------- All commands |
ee707cb7 | 309 | all = ft.GetAllCommands(filename, mime) |
cc6eca35 | 310 | |
b37c7e1d | 311 | if all is None: |
cc6eca35 | 312 | self.allcommands.SetValue("") |
b37c7e1d RD |
313 | else: |
314 | verbs, commands = all | |
315 | text = pprint.pformat(map(None, verbs, commands)) | |
cc6eca35 RD |
316 | self.allcommands.SetValue(text) |
317 | ||
b37c7e1d RD |
318 | |
319 | #---------------------------------------------------------------------- | |
320 | ||
321 | def runTest(frame, nb, log): | |
cc6eca35 | 322 | win = MimeTypesDemoPanel(nb, log) |
b37c7e1d RD |
323 | return win |
324 | ||
b37c7e1d RD |
325 | #---------------------------------------------------------------------- |
326 | ||
b37c7e1d | 327 | overview = """\ |
b37c7e1d | 328 | |
cc6eca35 RD |
329 | The <b>wx.MimeTypesManager</b> class allows the application to retrieve the |
330 | information about all known MIME types from a system-specific location and the | |
331 | filename extensions to the MIME types and vice versa. After initialization the | |
332 | methods <b>GetFileTypeFromMimeType()</b> and <b>GetFileTypeFromExtension()</b> | |
333 | may be called: they will return a <b>wx.FileType</b> object which may be further | |
334 | queried for file description, icon and other attributes. | |
b37c7e1d | 335 | |
cc6eca35 RD |
336 | A global instance of <b>wx.MimeTypesManager</b> is always available as |
337 | <b>wx.TheMimeTypesManager</b>. It is recommended to use this instance instead | |
338 | of creating your own because gathering MIME information may take quite a long | |
339 | on Unix systems. | |
b37c7e1d | 340 | |
cc6eca35 RD |
341 | This demo shows how to use wx.TheMimeTypesManager to list all known MIME types |
342 | and retrieve that information as a wx.FileType from either an extension or | |
343 | MIME type. | |
1fded56b | 344 | |
cc6eca35 RD |
345 | For further information please consult the wxWindows documentation for |
346 | <b>wx.MimeTypesManager</b> and <b>wx.FileType</b>. | |
1fded56b | 347 | |
cc6eca35 | 348 | """ |
1fded56b | 349 | |
cc6eca35 | 350 | #---------------------------------------------------------------------- |
1fded56b RD |
351 | |
352 | if __name__ == '__main__': | |
353 | import sys,os | |
354 | import run | |
355 | run.main(['', os.path.basename(sys.argv[0])]) |