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