]> git.saurik.com Git - wxWidgets.git/blame - wxPython/wx/tools/XRCed/params.py
Putting draft of wxImplDC and the wxDC using it
[wxWidgets.git] / wxPython / wx / tools / XRCed / params.py
CommitLineData
d14a1e28
RD
1# Name: params.py
2# Purpose: Classes for parameter introduction
3# Author: Roman Rolinsky <rolinsky@mema.ucl.ac.be>
4# Created: 22.08.2001
5# RCS-ID: $Id$
6
7import string
8import os.path
9from globals import *
10from types import *
d14a1e28 11
b2371711 12genericStyles = [
306b6fe9 13 'wxSIMPLE_BORDER', 'wxSUNKEN_BORDER', 'wxDOUBLE_BORDER',
64bce500 14 'wxRAISED_BORDER', 'wxSTATIC_BORDER', 'wxNO_BORDER',
306b6fe9
RR
15 'wxCLIP_CHILDREN', 'wxTRANSPARENT_WINDOW', 'wxWANTS_CHARS',
16 'wxNO_FULL_REPAINT_ON_RESIZE', 'wxFULL_REPAINT_ON_RESIZE'
64bce500
RR
17 ]
18
19genericExStyles = [
20 'wxWS_EX_VALIDATE_RECURSIVELY',
b2371711 21 'wxWS_EX_BLOCK_EVENTS',
64bce500
RR
22 'wxWS_EX_TRANSIENT',
23 'wxFRAME_EX_CONTEXTHELP',
24 'wxWS_EX_PROCESS_IDLE',
25 'wxWS_EX_PROCESS_UI_UPDATES'
26 ]
d14a1e28 27
375e3718
RR
28# Global vars initialized in Panel.__init__ for button and textbox size in screen pixels
29buttonSize = textSise = None
30# Default Button size in dialog units
b372319f 31buttonSizeD = (35,-1)
d14a1e28 32
375e3718 33
d14a1e28 34# Class that can properly disable children
29a41103 35class PPanel(wx.Panel):
d14a1e28 36 def __init__(self, parent, name):
29a41103 37 wx.Panel.__init__(self, parent, -1, name=name)
d14a1e28
RD
38 self.modified = self.freeze = False
39 def Enable(self, value):
f2ccaa22 40 self.enabled = value
d14a1e28
RD
41 # Something strange is going on with enable so we make sure...
42 for w in self.GetChildren():
43 w.Enable(value)
29a41103 44 #wx.Panel.Enable(self, value)
7df24e78
RR
45 def SetModified(self, state=True):
46 self.modified = state
47 if state: g.panel.SetModified(True)
d14a1e28
RD
48 # Common method to set modified state
49 def OnChange(self, evt):
50 if self.freeze: return
51 self.SetModified()
52 evt.Skip()
53
54class ParamBinaryOr(PPanel):
55 def __init__(self, parent, name):
56 PPanel.__init__(self, parent, name)
29a41103
RD
57 self.ID_TEXT_CTRL = wx.NewId()
58 self.ID_BUTTON_CHOICES = wx.NewId()
59 sizer = wx.BoxSizer()
60 self.text = wx.TextCtrl(self, self.ID_TEXT_CTRL, size=wx.Size(200,-1))
61 sizer.Add(self.text, 0, wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, 5)
375e3718
RR
62 self.button = wx.Button(self, self.ID_BUTTON_CHOICES, 'Edit...',
63 size=(buttonSize[0], textSize[1]))
64 sizer.Add(self.button, 0, wx.EXPAND)
65 self.SetSizerAndFit(sizer)
29a41103
RD
66 wx.EVT_BUTTON(self, self.ID_BUTTON_CHOICES, self.OnButtonChoices)
67 wx.EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
d14a1e28
RD
68 def GetValue(self):
69 return self.text.GetValue()
70 def SetValue(self, value):
71 self.freeze = True
72 self.text.SetValue(value)
73 self.freeze = False
74 def OnButtonChoices(self, evt):
a4c013b2 75 dlg = g.frame.res.LoadDialog(self, 'DIALOG_CHOICES')
c032d94e
RR
76 if self.GetName() == 'flag': dlg.SetTitle('Sizer item flags')
77 elif self.GetName() == 'style': dlg.SetTitle('Window styles')
78 elif self.GetName() == 'exstyle': dlg.SetTitle('Extended window styles')
29a41103 79 listBox = xrc.XRCCTRL(dlg, 'CHECKLIST')
a4c013b2 80 listBox.InsertItems(self.values, 0)
d14a1e28
RD
81 value = map(string.strip, self.text.GetValue().split('|'))
82 if value == ['']: value = []
83 ignored = []
84 for i in value:
85 try:
86 listBox.Check(self.values.index(i))
87 except ValueError:
88 # Try to find equal
89 if self.equal.has_key(i):
90 listBox.Check(self.values.index(self.equal[i]))
91 else:
92 print 'WARNING: unknown flag: %s: ignored.' % i
93 ignored.append(i)
29a41103 94 if dlg.ShowModal() == wx.ID_OK:
d14a1e28 95 value = []
31f04352 96 for i in range(listBox.GetCount()):
d14a1e28
RD
97 if listBox.IsChecked(i):
98 value.append(self.values[i])
99 # Add ignored flags
100 value.extend(ignored)
c37cba89 101 self.SetValue('|'.join(value))
d14a1e28
RD
102 self.SetModified()
103 dlg.Destroy()
104
105class ParamFlag(ParamBinaryOr):
106 values = ['wxTOP', 'wxBOTTOM', 'wxLEFT', 'wxRIGHT', 'wxALL',
306b6fe9
RR
107 'wxEXPAND', 'wxGROW', 'wxSHAPED', 'wxSTRETCH_NOT',
108 'wxALIGN_CENTRE', 'wxALIGN_LEFT', 'wxALIGN_RIGHT',
109 'wxALIGN_TOP', 'wxALIGN_BOTTOM',
110 'wxALIGN_CENTRE_VERTICAL', 'wxALIGN_CENTRE_HORIZONTAL',
111 'wxADJUST_MINSIZE', 'wxFIXED_MINSIZE'
9abdd2cb 112 ]
d14a1e28
RD
113 equal = {'wxALIGN_CENTER': 'wxALIGN_CENTRE',
114 'wxALIGN_CENTER_VERTICAL': 'wxALIGN_CENTRE_VERTICAL',
306b6fe9
RR
115 'wxALIGN_CENTER_HORIZONTAL': 'wxALIGN_CENTRE_HORIZONTAL',
116 'wxUP': 'wxTOP', 'wxDOWN': 'wxBOTTOM', 'wxNORTH': 'wxTOP',
117 'wxSOUTH': 'wxBOTTOM', 'wxWEST': 'wxLEFT', 'wxEAST': 'wxRIGHT'}
d14a1e28
RD
118 def __init__(self, parent, name):
119 ParamBinaryOr.__init__(self, parent, name)
120
c032d94e 121class ParamNonGenericStyle(ParamBinaryOr):
d14a1e28 122 def __init__(self, parent, name):
c032d94e 123 self.values = g.currentXXX.winStyles
d14a1e28
RD
124 ParamBinaryOr.__init__(self, parent, name)
125
c032d94e
RR
126class ParamStyle(ParamBinaryOr):
127 equal = {'wxALIGN_CENTER': 'wxALIGN_CENTRE'}
d14a1e28 128 def __init__(self, parent, name):
d14a1e28 129 ParamBinaryOr.__init__(self, parent, name)
c032d94e
RR
130 self.valuesSpecific = g.currentXXX.winStyles
131 if self.valuesSpecific: # override if using specific styles
132 # Remove duplicates
133 self.valuesGeneric = [s for s in genericStyles
134 if s not in self.valuesSpecific]
29a41103 135 wx.EVT_BUTTON(self, self.ID_BUTTON_CHOICES, self.OnButtonChoicesBoth)
c032d94e
RR
136 else:
137 self.values = genericStyles
138 def OnButtonChoicesBoth(self, evt):
139 dlg = g.frame.res.LoadDialog(self, 'DIALOG_STYLES')
29a41103 140 listBoxSpecific = xrc.XRCCTRL(dlg, 'CHECKLIST_SPECIFIC')
c032d94e 141 listBoxSpecific.InsertItems(self.valuesSpecific, 0)
29a41103 142 listBoxGeneric = xrc.XRCCTRL(dlg, 'CHECKLIST_GENERIC')
c032d94e
RR
143 listBoxGeneric.InsertItems(self.valuesGeneric, 0)
144 value = map(string.strip, self.text.GetValue().split('|'))
145 if value == ['']: value = []
146 # Set specific styles
147 value2 = [] # collect generic and ignored here
148 for i in value:
149 try:
150 listBoxSpecific.Check(self.valuesSpecific.index(i))
151 except ValueError:
152 # Try to find equal
153 if self.equal.has_key(i):
154 listBoxSpecific.Check(self.valuesSpecific.index(self.equal[i]))
155 else:
156 value2.append(i)
157 ignored = []
158 # Set generic styles, collect non-standart values
159 for i in value2:
160 try:
161 listBoxGeneric.Check(self.valuesGeneric.index(i))
162 except ValueError:
163 # Try to find equal
164 if self.equal.has_key(i):
165 listBoxGeneric.Check(self.valuesGeneric.index(self.equal[i]))
166 else:
167 print 'WARNING: unknown flag: %s: ignored.' % i
168 ignored.append(i)
29a41103 169 if dlg.ShowModal() == wx.ID_OK:
c032d94e
RR
170 value = [self.valuesSpecific[i]
171 for i in range(listBoxSpecific.GetCount())
172 if listBoxSpecific.IsChecked(i)] + \
173 [self.valuesGeneric[i]
174 for i in range(listBoxGeneric.GetCount())
175 if listBoxGeneric.IsChecked(i)] + ignored
c37cba89 176 self.SetValue('|'.join(value))
c032d94e
RR
177 self.SetModified()
178 dlg.Destroy()
d14a1e28
RD
179
180class ParamExStyle(ParamBinaryOr):
181 def __init__(self, parent, name):
182 if g.currentXXX:
64bce500 183 self.values = g.currentXXX.exStyles + genericExStyles
d14a1e28
RD
184 else:
185 self.values = []
186 ParamBinaryOr.__init__(self, parent, name)
187
188class ParamColour(PPanel):
189 def __init__(self, parent, name):
190 PPanel.__init__(self, parent, name)
29a41103
RD
191 self.ID_TEXT_CTRL = wx.NewId()
192 self.ID_BUTTON = wx.NewId()
193 sizer = wx.BoxSizer()
194 self.text = wx.TextCtrl(self, self.ID_TEXT_CTRL, size=(80,-1))
195 sizer.Add(self.text, 0, wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.BOTTOM, 2)
196 self.button = wx.Panel(self, self.ID_BUTTON, wx.DefaultPosition, wx.Size(20, 20))
197 sizer.Add(self.button, 0, wx.ALIGN_CENTER_VERTICAL | wx.LEFT, 5)
b372319f 198 self.SetSizer(sizer)
d14a1e28 199 self.textModified = False
29a41103
RD
200 wx.EVT_PAINT(self.button, self.OnPaintButton)
201 wx.EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
202 wx.EVT_LEFT_DOWN(self.button, self.OnLeftDown)
d14a1e28
RD
203 def GetValue(self):
204 return self.text.GetValue()
205 def SetValue(self, value):
206 self.freeze = True
207 if not value: value = '#FFFFFF'
208 self.text.SetValue(str(value)) # update text ctrl
99328372 209 try:
29a41103 210 colour = wx.Colour(int(value[1:3], 16), int(value[3:5], 16), int(value[5:7], 16))
99328372
RR
211 self.button.SetBackgroundColour(colour)
212 except: # ignore errors
213 pass
d14a1e28
RD
214 self.button.Refresh()
215 self.freeze = False
216 def OnPaintButton(self, evt):
29a41103
RD
217 dc = wx.PaintDC(self.button)
218 dc.SetBrush(wx.TRANSPARENT_BRUSH)
219 if self.IsEnabled(): dc.SetPen(wx.BLACK_PEN)
220 else: dc.SetPen(wx.GREY_PEN)
d14a1e28 221 size = self.button.GetSize()
b09afc93 222 dc.DrawRectangle(0, 0, size.width, size.height)
d14a1e28 223 def OnLeftDown(self, evt):
29a41103 224 data = wx.ColourData()
d14a1e28 225 data.SetColour(self.GetValue())
29a41103
RD
226 dlg = wx.ColourDialog(self, data)
227 if dlg.ShowModal() == wx.ID_OK:
d14a1e28
RD
228 self.SetValue('#%02X%02X%02X' % dlg.GetColourData().GetColour().Get())
229 self.SetModified()
230 dlg.Destroy()
231
232################################################################################
233
f65bb0f8 234# Mapping from wx constants to XML strings
29a41103
RD
235fontFamiliesWx2Xml = {wx.DEFAULT: 'default', wx.DECORATIVE: 'decorative',
236 wx.ROMAN: 'roman', wx.SCRIPT: 'script', wx.SWISS: 'swiss',
237 wx.MODERN: 'modern'}
238fontStylesWx2Xml = {wx.NORMAL: 'normal', wx.SLANT: 'slant', wx.ITALIC: 'italic'}
239fontWeightsWx2Xml = {wx.NORMAL: 'normal', wx.LIGHT: 'light', wx.BOLD: 'bold'}
d14a1e28
RD
240def ReverseMap(m):
241 rm = {}
242 for k,v in m.items(): rm[v] = k
243 return rm
244fontFamiliesXml2wx = ReverseMap(fontFamiliesWx2Xml)
245fontStylesXml2wx = ReverseMap(fontStylesWx2Xml)
246fontWeightsXml2wx = ReverseMap(fontWeightsWx2Xml)
247
248class ParamFont(PPanel):
249 def __init__(self, parent, name):
250 PPanel.__init__(self, parent, name)
29a41103
RD
251 self.ID_TEXT_CTRL = wx.NewId()
252 self.ID_BUTTON_SELECT = wx.NewId()
253 sizer = wx.BoxSizer()
254 self.text = wx.TextCtrl(self, self.ID_TEXT_CTRL, size=(200,-1))
255 sizer.Add(self.text, 0, wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, 5)
256 self.button = wx.Button(self, self.ID_BUTTON_SELECT, 'Select...', size=buttonSize)
257 sizer.Add(self.button, 0, wx.ALIGN_CENTER_VERTICAL)
b372319f 258 self.SetSizer(sizer)
d14a1e28 259 self.textModified = False
29a41103
RD
260 wx.EVT_BUTTON(self, self.ID_BUTTON_SELECT, self.OnButtonSelect)
261 wx.EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
d14a1e28
RD
262 def OnChange(self, evt):
263 PPanel.OnChange(self, evt)
264 self.textModified = True
265 def _defaultValue(self):
306b6fe9 266 return [`g._sysFont.GetPointSize()`, 'default', 'normal', 'normal', '0', '', '']
d14a1e28
RD
267 def GetValue(self):
268 if self.textModified: # text has newer value
269 try:
270 return eval(self.text.GetValue())
271 except SyntaxError:
29a41103 272 wx.LogError('Syntax error in parameter value: ' + self.GetName())
d14a1e28
RD
273 return self._defaultValue()
274 return self.value
275 def SetValue(self, value):
276 self.freeze = True # disable other handlers
277 if not value: value = self._defaultValue()
278 self.value = value
279 self.text.SetValue(str(value)) # update text ctrl
280 self.freeze = False
281 def OnButtonSelect(self, evt):
282 if self.textModified: # text has newer value
283 try:
284 self.value = eval(self.text.GetValue())
285 except SyntaxError:
29a41103 286 wx.LogError('Syntax error in parameter value: ' + self.GetName())
d14a1e28
RD
287 self.value = self._defaultValue()
288 # Make initial font
289 # Default values
306b6fe9 290 size = g._sysFont.GetPointSize()
29a41103
RD
291 family = wx.DEFAULT
292 style = weight = wx.NORMAL
d14a1e28
RD
293 underlined = 0
294 face = ''
29a41103 295 enc = wx.FONTENCODING_DEFAULT
d14a1e28
RD
296 # Fall back to default if exceptions
297 error = False
298 try:
299 try: size = int(self.value[0])
29a41103 300 except ValueError: error = True; wx.LogError('Invalid size specification')
d14a1e28 301 try: family = fontFamiliesXml2wx[self.value[1]]
29a41103 302 except KeyError: error = True; wx.LogError('Invalid family specification')
d14a1e28 303 try: style = fontStylesXml2wx[self.value[2]]
29a41103 304 except KeyError: error = True; wx.LogError('Invalid style specification')
d14a1e28 305 try: weight = fontWeightsXml2wx[self.value[3]]
29a41103 306 except KeyError: error = True; wx.LogError('Invalid weight specification')
016f67ba 307 try: underlined = bool(self.value[4])
29a41103 308 except ValueError: error = True; wx.LogError('Invalid underlined flag specification')
d14a1e28 309 face = self.value[5]
d14a1e28
RD
310 except IndexError:
311 error = True
29a41103 312 mapper = wx.FontMapper()
016f67ba
RR
313 if not self.value[6]: enc = mapper.CharsetToEncoding(self.value[6])
314
29a41103
RD
315 if error: wx.LogError('Invalid font specification')
316 if enc == wx.FONTENCODING_DEFAULT: enc = wx.FONTENCODING_SYSTEM
317 font = wx.Font(size, family, style, weight, underlined, face, enc)
318 data = wx.FontData()
d14a1e28 319 data.SetInitialFont(font)
29a41103
RD
320 dlg = wx.FontDialog(self, data)
321 if dlg.ShowModal() == wx.ID_OK:
d14a1e28 322 font = dlg.GetFontData().GetChosenFont()
29a41103 323 if font.GetEncoding() == wx.FONTENCODING_SYSTEM:
016f67ba
RR
324 encName = ''
325 else:
29a41103 326 encName = wx.FontMapper.GetEncodingName(font.GetEncoding()).encode()
d14a1e28
RD
327 value = [str(font.GetPointSize()),
328 fontFamiliesWx2Xml.get(font.GetFamily(), "default"),
329 fontStylesWx2Xml.get(font.GetStyle(), "normal"),
330 fontWeightsWx2Xml.get(font.GetWeight(), "normal"),
0d9b8891 331 str(int(font.GetUnderlined())),
d14a1e28 332 font.GetFaceName().encode(),
016f67ba 333 encName
d14a1e28 334 ]
d14a1e28
RD
335 self.SetValue(value)
336 self.SetModified()
337 self.textModified = False
338 dlg.Destroy()
339
340################################################################################
341
342class ParamInt(PPanel):
343 def __init__(self, parent, name):
344 PPanel.__init__(self, parent, name)
29a41103
RD
345 self.ID_SPIN_CTRL = wx.NewId()
346 sizer = wx.BoxSizer()
347 self.spin = wx.SpinCtrl(self, self.ID_SPIN_CTRL, size=(60,-1))
c032d94e
RR
348 self.spin.SetRange(-2147483648, 2147483647) # min/max integers
349 sizer.Add(self.spin)
b372319f 350 self.SetSizer(sizer)
29a41103 351 wx.EVT_SPINCTRL(self, self.ID_SPIN_CTRL, self.OnChange)
c032d94e
RR
352 def GetValue(self):
353 return str(self.spin.GetValue())
354 def SetValue(self, value):
355 self.freeze = True
356 if not value: value = 0
357 self.spin.SetValue(int(value))
358 self.freeze = False
359
360# Non-negative number
361class ParamIntNN(PPanel):
362 def __init__(self, parent, name):
363 PPanel.__init__(self, parent, name)
29a41103
RD
364 self.ID_SPIN_CTRL = wx.NewId()
365 sizer = wx.BoxSizer()
366 self.spin = wx.SpinCtrl(self, self.ID_SPIN_CTRL, size=(60,-1))
c032d94e 367 self.spin.SetRange(0, 10000) # min/max integers
d14a1e28 368 sizer.Add(self.spin)
b372319f 369 self.SetSizer(sizer)
29a41103 370 wx.EVT_SPINCTRL(self, self.ID_SPIN_CTRL, self.OnChange)
d14a1e28
RD
371 def GetValue(self):
372 return str(self.spin.GetValue())
373 def SetValue(self, value):
374 self.freeze = True
375 if not value: value = 0
376 self.spin.SetValue(int(value))
377 self.freeze = False
378
379# Same as int but allows dialog units (XXXd)
380class ParamUnit(PPanel):
381 def __init__(self, parent, name):
382 PPanel.__init__(self, parent, name)
29a41103
RD
383 self.ID_TEXT_CTRL = wx.NewId()
384 self.ID_SPIN_BUTTON = wx.NewId()
385 sizer = wx.BoxSizer(wx.HORIZONTAL)
e2dc45d8 386 self.spin = wx.SpinButton(self, self.ID_SPIN_BUTTON, style = wx.SP_VERTICAL, size=(-1,0))
c032d94e 387 textW = 60 - self.spin.GetSize()[0]
29a41103 388 self.text = wx.TextCtrl(self, self.ID_TEXT_CTRL, size=(textW,-1))
d14a1e28 389 self.spin.SetRange(-10000, 10000)
29a41103
RD
390 sizer.Add(self.text, 0, wx.EXPAND)
391 sizer.Add(self.spin, 0, wx.EXPAND)
b372319f 392 self.SetSizer(sizer)
538a0c0d
RR
393 self.spin.Bind(wx.EVT_SPIN_UP, self.OnSpinUp)
394 self.spin.Bind(wx.EVT_SPIN_DOWN, self.OnSpinDown)
375e3718
RR
395 self.text.Bind(wx.EVT_TEXT, self.OnChange)
396
d14a1e28
RD
397 def GetValue(self):
398 return self.text.GetValue()
399 def SetValue(self, value):
ed650677 400 self.freeze = True
538a0c0d 401 if not value: value = '0'
d14a1e28 402 self.text.SetValue(value)
538a0c0d 403 self.Change(0)
ed650677 404 self.freeze = False
d14a1e28 405 def Change(self, x):
538a0c0d 406 self.freeze = True
d14a1e28
RD
407 # Check if we are working with dialog units
408 value = self.text.GetValue()
409 units = ''
410 if value[-1].upper() == 'D':
411 units = value[-1]
412 value = value[:-1]
413 try:
414 intValue = int(value) + x
415 self.spin.SetValue(intValue)
538a0c0d
RR
416 if x: # 0 can be passed to update spin value only
417 self.text.SetValue(str(intValue) + units)
418 self.SetModified()
d14a1e28 419 except:
29a41103 420 # !!! Strange, if I use wx.LogWarning, event is re-generated
7df24e78 421 print 'ERROR: incorrect unit format'
538a0c0d 422 self.freeze = False
d14a1e28 423 def OnSpinUp(self, evt):
538a0c0d 424 self.freeze = True
d14a1e28
RD
425 self.Change(1)
426 def OnSpinDown(self, evt):
538a0c0d
RR
427 if self.freeze: return
428 self.freeze = True
d14a1e28
RD
429 self.Change(-1)
430
d14a1e28
RD
431class ParamMultilineText(PPanel):
432 def __init__(self, parent, name, textWidth=-1):
433 PPanel.__init__(self, parent, name)
29a41103
RD
434 self.ID_TEXT_CTRL = wx.NewId()
435 self.ID_BUTTON_EDIT = wx.NewId()
436 sizer = wx.BoxSizer()
437 self.text = wx.TextCtrl(self, self.ID_TEXT_CTRL, size=wx.Size(200,-1))
438 sizer.Add(self.text, 0, wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, 5)
439 self.button = wx.Button(self, self.ID_BUTTON_EDIT, 'Edit...', size=buttonSize)
440 sizer.Add(self.button, 0, wx.ALIGN_CENTER_VERTICAL)
538a0c0d 441 self.SetSizerAndFit(sizer)
29a41103
RD
442 wx.EVT_BUTTON(self, self.ID_BUTTON_EDIT, self.OnButtonEdit)
443 wx.EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
d14a1e28
RD
444 def GetValue(self):
445 return self.text.GetValue()
446 def SetValue(self, value):
447 self.freeze = True # disable other handlers
448 self.text.SetValue(value)
449 self.freeze = False # disable other handlers
450 def OnButtonEdit(self, evt):
a4c013b2 451 dlg = g.frame.res.LoadDialog(self, 'DIALOG_TEXT')
29a41103 452 textCtrl = xrc.XRCCTRL(dlg, 'TEXT')
a4c013b2 453 textCtrl.SetValue(self.text.GetValue())
29a41103 454 if dlg.ShowModal() == wx.ID_OK:
a4c013b2 455 self.text.SetValue(textCtrl.GetValue())
d14a1e28
RD
456 self.SetModified()
457 dlg.Destroy()
458
459class ParamText(PPanel):
fe295b0d 460 def __init__(self, parent, name, textWidth=-1, style=0):
d14a1e28 461 PPanel.__init__(self, parent, name)
29a41103 462 self.ID_TEXT_CTRL = wx.NewId()
d14a1e28 463 # We use sizer even here to have the same size of text control
29a41103 464 sizer = wx.BoxSizer()
fe295b0d 465 self.text = wx.TextCtrl(self, self.ID_TEXT_CTRL, size=wx.Size(textWidth,-1), style=style)
d14a1e28
RD
466 if textWidth == -1: option = 1
467 else: option = 0
29a41103 468 sizer.Add(self.text, option, wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.BOTTOM, 2)
b372319f 469 self.SetSizer(sizer)
29a41103 470 wx.EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
d14a1e28
RD
471 def GetValue(self):
472 return self.text.GetValue()
473 def SetValue(self, value):
474 self.freeze = True # disable other handlers
475 self.text.SetValue(value)
476 self.freeze = False # disable other handlers
477
478class ParamAccel(ParamText):
479 def __init__(self, parent, name):
480 ParamText.__init__(self, parent, name, 100)
481
482class ParamPosSize(ParamText):
483 def __init__(self, parent, name):
484 ParamText.__init__(self, parent, name, 80)
485
486class ParamLabel(ParamText):
487 def __init__(self, parent, name):
488 ParamText.__init__(self, parent, name, 200)
489
490class ParamEncoding(ParamText):
491 def __init__(self, parent, name):
492 ParamText.__init__(self, parent, name, 100)
493
b372319f
RR
494class ParamComment(ParamText):
495 def __init__(self, parent, name):
fe295b0d
RR
496 ParamText.__init__(self, parent, name, 330 + buttonSize[0],
497 style=wx.TE_PROCESS_ENTER)
b372319f 498
29a41103 499class ContentDialog(wx.Dialog):
d14a1e28
RD
500 def __init__(self, parent, value):
501 # Load from resource
29a41103 502 pre = wx.PreDialog()
d14a1e28 503 g.frame.res.LoadOnDialog(pre, parent, 'DIALOG_CONTENT')
29a41103
RD
504 self.PostCreate(pre)
505 self.list = xrc.XRCCTRL(self, 'LIST')
d14a1e28
RD
506 # Set list items
507 for v in value:
508 self.list.Append(v)
509 self.SetAutoLayout(True)
510 self.GetSizer().Fit(self)
511 # Callbacks
29a41103
RD
512 self.ID_BUTTON_APPEND = xrc.XRCID('BUTTON_APPEND')
513 self.ID_BUTTON_REMOVE = xrc.XRCID('BUTTON_REMOVE')
514 self.ID_BUTTON_UP = xrc.XRCID('BUTTON_UP')
515 self.ID_BUTTON_DOWN = xrc.XRCID('BUTTON_DOWN')
516 wx.EVT_BUTTON(self, self.ID_BUTTON_UP, self.OnButtonUp)
517 wx.EVT_BUTTON(self, self.ID_BUTTON_DOWN, self.OnButtonDown)
518 wx.EVT_BUTTON(self, self.ID_BUTTON_APPEND, self.OnButtonAppend)
519 wx.EVT_BUTTON(self, self.ID_BUTTON_REMOVE, self.OnButtonRemove)
520 wx.EVT_UPDATE_UI(self, self.ID_BUTTON_UP, self.OnUpdateUI)
521 wx.EVT_UPDATE_UI(self, self.ID_BUTTON_DOWN, self.OnUpdateUI)
522 wx.EVT_UPDATE_UI(self, self.ID_BUTTON_REMOVE, self.OnUpdateUI)
d14a1e28
RD
523 def OnButtonUp(self, evt):
524 i = self.list.GetSelection()
525 str = self.list.GetString(i)
526 self.list.Delete(i)
527 self.list.InsertItems([str], i-1)
528 self.list.SetSelection(i-1)
529 def OnButtonDown(self, evt):
530 i = self.list.GetSelection()
531 str = self.list.GetString(i)
532 self.list.Delete(i)
533 self.list.InsertItems([str], i+1)
534 self.list.SetSelection(i+1)
535 def OnButtonAppend(self, evt):
29a41103 536 str = wx.GetTextFromUser('Enter new item:', 'Append', '', self)
d14a1e28
RD
537 self.list.Append(str)
538 def OnButtonRemove(self, evt):
539 self.list.Delete(self.list.GetSelection())
540 def OnUpdateUI(self, evt):
541 if evt.GetId() == self.ID_BUTTON_REMOVE:
542 evt.Enable(self.list.GetSelection() != -1)
543 elif evt.GetId() == self.ID_BUTTON_UP:
544 evt.Enable(self.list.GetSelection() > 0)
545 elif evt.GetId() == self.ID_BUTTON_DOWN:
546 evt.Enable(self.list.GetSelection() != -1 and \
31f04352 547 self.list.GetSelection() < self.list.GetCount() - 1)
d14a1e28 548
29a41103 549class ContentCheckListDialog(wx.Dialog):
d14a1e28 550 def __init__(self, parent, value):
29a41103 551 pre = wx.PreDialog()
c032d94e 552 g.frame.res.LoadOnDialog(pre, parent, 'DIALOG_CONTENT_CHECKLIST')
29a41103 553 self.PostCreate(pre)
75aa1946 554 self.list = xrc.XRCCTRL(self, 'CHECK_LIST')
d14a1e28
RD
555 # Set list items
556 i = 0
557 for v,ch in value:
558 self.list.Append(v)
559 self.list.Check(i, ch)
560 i += 1
561 self.SetAutoLayout(True)
562 self.GetSizer().Fit(self)
563 # Callbacks
29a41103
RD
564 self.ID_BUTTON_APPEND = xrc.XRCID('BUTTON_APPEND')
565 self.ID_BUTTON_REMOVE = xrc.XRCID('BUTTON_REMOVE')
566 self.ID_BUTTON_UP = xrc.XRCID('BUTTON_UP')
567 self.ID_BUTTON_DOWN = xrc.XRCID('BUTTON_DOWN')
568 wx.EVT_CHECKLISTBOX(self, self.list.GetId(), self.OnCheck)
569 wx.EVT_BUTTON(self, self.ID_BUTTON_UP, self.OnButtonUp)
570 wx.EVT_BUTTON(self, self.ID_BUTTON_DOWN, self.OnButtonDown)
571 wx.EVT_BUTTON(self, self.ID_BUTTON_APPEND, self.OnButtonAppend)
572 wx.EVT_BUTTON(self, self.ID_BUTTON_REMOVE, self.OnButtonRemove)
573 wx.EVT_UPDATE_UI(self, self.ID_BUTTON_UP, self.OnUpdateUI)
574 wx.EVT_UPDATE_UI(self, self.ID_BUTTON_DOWN, self.OnUpdateUI)
575 wx.EVT_UPDATE_UI(self, self.ID_BUTTON_REMOVE, self.OnUpdateUI)
d14a1e28
RD
576 def OnCheck(self, evt):
577 # !!! Wrong wxGTK (wxMSW?) behavior: toggling selection if checking
578 self.list.Deselect(evt.GetSelection())
579 def OnButtonUp(self, evt):
580 i = self.list.GetSelection()
581 str, ch = self.list.GetString(i), self.list.IsChecked(i)
582 self.list.Delete(i)
583 self.list.InsertItems([str], i-1)
584 self.list.Check(i-1, ch)
585 self.list.SetSelection(i-1)
586 def OnButtonDown(self, evt):
587 i = self.list.GetSelection()
588 str, ch = self.list.GetString(i), self.list.IsChecked(i)
589 self.list.Delete(i)
590 self.list.InsertItems([str], i+1)
591 self.list.Check(i+1, ch)
592 self.list.SetSelection(i+1)
593 def OnButtonAppend(self, evt):
29a41103 594 str = wx.GetTextFromUser('Enter new item:', 'Append', '', self)
d14a1e28
RD
595 self.list.Append(str)
596 def OnButtonRemove(self, evt):
597 self.list.Delete(self.list.GetSelection())
598 def OnUpdateUI(self, evt):
599 if evt.GetId() == self.ID_BUTTON_REMOVE:
600 evt.Enable(self.list.GetSelection() != -1)
601 elif evt.GetId() == self.ID_BUTTON_UP:
602 evt.Enable(self.list.GetSelection() > 0)
603 elif evt.GetId() == self.ID_BUTTON_DOWN:
604 evt.Enable(self.list.GetSelection() != -1 and \
31f04352 605 self.list.GetSelection() < self.list.GetCount() - 1)
d14a1e28
RD
606
607class ParamContent(PPanel):
608 def __init__(self, parent, name):
609 PPanel.__init__(self, parent, name)
29a41103
RD
610 self.ID_TEXT_CTRL = wx.NewId()
611 self.ID_BUTTON_EDIT = wx.NewId()
612 sizer = wx.BoxSizer()
613 self.text = wx.TextCtrl(self, self.ID_TEXT_CTRL, size=wx.Size(200,-1))
614 sizer.Add(self.text, 0, wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, 5)
615 self.button = wx.Button(self, self.ID_BUTTON_EDIT, 'Edit...', size=buttonSize)
616 sizer.Add(self.button, 0, wx.ALIGN_CENTER_VERTICAL)
b372319f 617 self.SetSizer(sizer)
d14a1e28 618 self.textModified = False
29a41103
RD
619 wx.EVT_BUTTON(self, self.ID_BUTTON_EDIT, self.OnButtonEdit)
620 wx.EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
d14a1e28
RD
621 def OnChange(self, evt):
622 PPanel.OnChange(self, evt)
623 self.textModified = True
624 def GetValue(self):
625 if self.textModified: # text has newer value
626 try:
e484fddf 627 return self.text.GetValue().split('|')
7df24e78 628 except ValueError:
d14a1e28
RD
629 return []
630 return self.value
631 def SetValue(self, value):
632 self.freeze = True
633 if not value: value = []
634 self.value = value
c37cba89 635 repr_ = '|'.join(map(str, value))
e484fddf 636 self.text.SetValue(repr_) # update text ctrl
d14a1e28
RD
637 self.freeze = False
638 def OnButtonEdit(self, evt):
639 if self.textModified: # text has newer value
e484fddf 640 self.value = self.GetValue()
d14a1e28 641 dlg = ContentDialog(self, self.value)
29a41103 642 if dlg.ShowModal() == wx.ID_OK:
d14a1e28 643 value = []
31f04352 644 for i in range(dlg.list.GetCount()):
d14a1e28 645 value.append(dlg.list.GetString(i))
d14a1e28
RD
646 self.SetValue(value)
647 self.SetModified()
648 self.textModified = False
649 dlg.Destroy()
7df24e78
RR
650 def SetModified(self, state=True):
651 PPanel.SetModified(self, state)
652 self.textModified = False
d14a1e28
RD
653
654# CheckList content
655class ParamContentCheckList(ParamContent):
656 def __init__(self, parent, name):
657 ParamContent.__init__(self, parent, name)
658 def OnButtonEdit(self, evt):
659 if self.textModified: # text has newer value
e484fddf 660 self.value = self.GetValue()
d14a1e28 661 dlg = ContentCheckListDialog(self, self.value)
29a41103 662 if dlg.ShowModal() == wx.ID_OK:
d14a1e28 663 value = []
31f04352 664 for i in range(dlg.list.GetCount()):
efa5f709 665 value.append((dlg.list.GetString(i), int(dlg.list.IsChecked(i))))
d14a1e28
RD
666 self.SetValue(value)
667 self.SetModified()
668 self.textModified = False
669 dlg.Destroy()
75aa1946
RR
670 def SetValue(self, value):
671 self.freeze = True
672 if not value: value = []
673 self.value = value
c37cba89 674 repr_ = '|'.join(map(str,value))
75aa1946
RR
675 self.text.SetValue(repr_) # update text ctrl
676 self.freeze = False
d14a1e28 677
29a41103 678class IntListDialog(wx.Dialog):
d14a1e28 679 def __init__(self, parent, value):
29a41103 680 pre = wx.PreDialog()
d14a1e28 681 g.frame.res.LoadOnDialog(pre, parent, 'DIALOG_INTLIST')
29a41103
RD
682 self.PostCreate(pre)
683 self.list = xrc.XRCCTRL(self, 'LIST')
d14a1e28
RD
684 # Set list items
685 value.sort()
686 for v in value:
687 if type(v) != IntType:
29a41103 688 wx.LogError('Invalid item type')
d14a1e28
RD
689 else:
690 self.list.Append(str(v))
691 self.SetAutoLayout(True)
692 self.GetSizer().Fit(self)
693 # Callbacks
29a41103
RD
694 self.spinCtrl = xrc.XRCCTRL(self, 'SPIN')
695 wx.EVT_BUTTON(self, xrc.XRCID('BUTTON_ADD'), self.OnButtonAdd)
696 self.ID_BUTTON_REMOVE = xrc.XRCID('BUTTON_REMOVE')
697 wx.EVT_BUTTON(self, self.ID_BUTTON_REMOVE, self.OnButtonRemove)
698 wx.EVT_BUTTON(self, xrc.XRCID('BUTTON_CLEAR'), self.OnButtonClear)
699 wx.EVT_UPDATE_UI(self, self.ID_BUTTON_REMOVE, self.OnUpdateUI)
c032d94e 700 def OnButtonAdd(self, evt):
d14a1e28
RD
701 # Check that it's unique
702 try:
c032d94e 703 v = self.spinCtrl.GetValue()
d14a1e28
RD
704 s = str(v) # to be sure
705 i = self.list.FindString(s)
706 if i == -1: # ignore non-unique
707 # Find place to insert
708 found = False
31f04352 709 for i in range(self.list.GetCount()):
d14a1e28
RD
710 if int(self.list.GetString(i)) > v:
711 found = True
712 break
713 if found: self.list.InsertItems([s], i)
714 else: self.list.Append(s)
715 except ValueError:
29a41103 716 wx.LogError('List item is not an int!')
d14a1e28
RD
717 def OnButtonRemove(self, evt):
718 self.list.Delete(self.list.GetSelection())
c032d94e
RR
719 def OnButtonClear(self, evt):
720 self.list.Clear()
d14a1e28
RD
721 def OnUpdateUI(self, evt):
722 if evt.GetId() == self.ID_BUTTON_REMOVE:
723 evt.Enable(self.list.GetSelection() != -1)
724
725# For growable list
726class ParamIntList(ParamContent):
727 def __init__(self, parent, name):
728 ParamContent.__init__(self, parent, name)
729 def OnButtonEdit(self, evt):
730 if self.textModified: # text has newer value
731 try:
c37cba89 732 self.value = map(int, self.text.GetValue().split('|'))
7df24e78 733 except ValueError:
d14a1e28
RD
734 self.value = []
735 dlg = IntListDialog(self, self.value)
29a41103 736 if dlg.ShowModal() == wx.ID_OK:
d14a1e28 737 value = []
31f04352 738 for i in range(dlg.list.GetCount()):
d14a1e28 739 value.append(int(dlg.list.GetString(i)))
d14a1e28
RD
740 self.SetValue(value)
741 self.SetModified()
742 self.textModified = False
743 dlg.Destroy()
744
745# Boxless radiobox
746class RadioBox(PPanel):
747 def __init__(self, parent, id, choices,
29a41103 748 pos=wx.DefaultPosition, name='radiobox'):
d14a1e28 749 PPanel.__init__(self, parent, name)
d14a1e28 750 self.choices = choices
29a41103 751 topSizer = wx.BoxSizer()
d14a1e28 752 for i in choices:
29a41103
RD
753 button = wx.RadioButton(self, -1, i, size=(-1,buttonSize[1]), name=i)
754 topSizer.Add(button, 0, wx.RIGHT, 5)
755 wx.EVT_RADIOBUTTON(self, button.GetId(), self.OnRadioChoice)
b372319f 756 self.SetSizer(topSizer)
d14a1e28
RD
757 def SetStringSelection(self, value):
758 self.freeze = True
759 for i in self.choices:
760 self.FindWindowByName(i).SetValue(i == value)
761 self.value = value
762 self.freeze = False
763 def OnRadioChoice(self, evt):
764 if self.freeze: return
765 if evt.GetSelection():
766 self.value = evt.GetEventObject().GetName()
767 self.SetModified()
768 def GetStringSelection(self):
769 return self.value
770
771class ParamBool(RadioBox):
772 values = {'yes': '1', 'no': '0'}
773 seulav = {'1': 'yes', '0': 'no'}
774 def __init__(self, parent, name):
a4c013b2 775 RadioBox.__init__(self, parent, -1, choices=self.values.keys(), name=name)
d14a1e28
RD
776 def GetValue(self):
777 return self.values[self.GetStringSelection()]
778 def SetValue(self, value):
779 if not value: value = '1'
780 self.SetStringSelection(self.seulav[value])
781
782class ParamOrient(RadioBox):
783 values = {'horizontal': 'wxHORIZONTAL', 'vertical': 'wxVERTICAL'}
784 seulav = {'wxHORIZONTAL': 'horizontal', 'wxVERTICAL': 'vertical'}
785 def __init__(self, parent, name):
a4c013b2 786 RadioBox.__init__(self, parent, -1, choices=self.values.keys(), name=name)
d14a1e28
RD
787 def GetValue(self):
788 return self.values[self.GetStringSelection()]
789 def SetValue(self, value):
790 if not value: value = 'wxHORIZONTAL'
791 self.SetStringSelection(self.seulav[value])
792
68ae5821
RD
793class ParamOrientation(RadioBox):
794 values = {'horizontal': 'horizontal', 'vertical': 'vertical'}
795 seulav = {'horizontal': 'horizontal', 'vertical': 'vertical'}
796 def __init__(self, parent, name):
797 RadioBox.__init__(self, parent, -1, choices=self.values.keys(), name=name)
798 def GetValue(self):
799 return self.values[self.GetStringSelection()]
800 def SetValue(self, value):
801 if not value: value = 'vertical'
802 self.SetStringSelection(self.seulav[value])
803
d14a1e28
RD
804class ParamFile(PPanel):
805 def __init__(self, parent, name):
806 PPanel.__init__(self, parent, name)
29a41103
RD
807 self.ID_TEXT_CTRL = wx.NewId()
808 self.ID_BUTTON_BROWSE = wx.NewId()
809 sizer = wx.BoxSizer()
810 self.text = wx.TextCtrl(self, self.ID_TEXT_CTRL, size=wx.Size(200,-1))
811 sizer.Add(self.text, 0, wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, 5)
812 self.button = wx.Button(self, self.ID_BUTTON_BROWSE, 'Browse...',size=buttonSize)
813 sizer.Add(self.button, 0, wx.ALIGN_CENTER_VERTICAL)
b372319f 814 self.SetSizer(sizer)
d14a1e28 815 self.textModified = False
29a41103
RD
816 wx.EVT_BUTTON(self, self.ID_BUTTON_BROWSE, self.OnButtonBrowse)
817 wx.EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
d14a1e28
RD
818 def OnChange(self, evt):
819 PPanel.OnChange(self, evt)
820 self.textModified = True
821 def GetValue(self):
822 if self.textModified: # text has newer value
823 return self.text.GetValue()
824 return self.value
825 def SetValue(self, value):
826 self.freeze = True
827 self.value = value
828 self.text.SetValue(value) # update text ctrl
829 self.freeze = False
830 def OnButtonBrowse(self, evt):
831 if self.textModified: # text has newer value
832 self.value = self.text.GetValue()
29a41103 833 dlg = wx.FileDialog(self,
d14a1e28
RD
834 defaultDir = os.path.abspath(os.path.dirname(self.value)),
835 defaultFile = os.path.basename(self.value))
29a41103 836 if dlg.ShowModal() == wx.ID_OK:
d14a1e28
RD
837 # Get common part of selected path and current
838 if g.frame.dataFile:
839 curpath = os.path.abspath(g.frame.dataFile)
840 else:
841 curpath = os.path.join(os.getcwd(), '')
842 common = os.path.commonprefix([curpath, dlg.GetPath()])
843 self.SetValue(dlg.GetPath()[len(common):])
844 self.SetModified()
845 self.textModified = False
846 dlg.Destroy()
847
848class ParamBitmap(PPanel):
849 def __init__(self, parent, name):
29a41103 850 pre = wx.PrePanel()
d14a1e28 851 g.frame.res.LoadOnPanel(pre, parent, 'PANEL_BITMAP')
29a41103 852 self.PostCreate(pre)
d14a1e28 853 self.modified = self.freeze = False
29a41103
RD
854 self.radio_std = xrc.XRCCTRL(self, 'RADIO_STD')
855 self.radio_file = xrc.XRCCTRL(self, 'RADIO_FILE')
856 self.combo = xrc.XRCCTRL(self, 'COMBO_STD')
857 self.text = xrc.XRCCTRL(self, 'TEXT_FILE')
858 self.button = xrc.XRCCTRL(self, 'BUTTON_BROWSE')
d14a1e28
RD
859 self.textModified = False
860 self.SetAutoLayout(True)
861 self.GetSizer().SetMinSize((260, -1))
862 self.GetSizer().Fit(self)
29a41103
RD
863 wx.EVT_RADIOBUTTON(self, xrc.XRCID('RADIO_STD'), self.OnRadioStd)
864 wx.EVT_RADIOBUTTON(self, xrc.XRCID('RADIO_FILE'), self.OnRadioFile)
865 wx.EVT_BUTTON(self, xrc.XRCID('BUTTON_BROWSE'), self.OnButtonBrowse)
866 wx.EVT_COMBOBOX(self, xrc.XRCID('COMBO_STD'), self.OnCombo)
867 wx.EVT_TEXT(self, xrc.XRCID('COMBO_STD'), self.OnChange)
868 wx.EVT_TEXT(self, xrc.XRCID('TEXT_FILE'), self.OnChange)
d14a1e28
RD
869 def OnRadioStd(self, evt):
870 self.SetModified()
871 self.SetValue(['wxART_MISSING_IMAGE',''])
872 def OnRadioFile(self, evt):
873 self.SetModified()
874 self.SetValue(['',''])
875 def updateRadios(self):
876 if self.value[0]:
877 self.radio_std.SetValue(True)
878 self.radio_file.SetValue(False)
879 self.text.Enable(False)
880 self.button.Enable(False)
881 self.combo.Enable(True)
882 else:
883 self.radio_std.SetValue(False)
884 self.radio_file.SetValue(True)
885 self.text.Enable(True)
886 self.button.Enable(True)
887 self.combo.Enable(False)
888 def OnChange(self, evt):
889 PPanel.OnChange(self, evt)
890 self.textModified = True
891 def OnCombo(self, evt):
892 PPanel.OnChange(self, evt)
893 self.value[0] = self.combo.GetValue()
894 def GetValue(self):
895 if self.textModified: # text has newer value
896 return [self.combo.GetValue(), self.text.GetValue()]
897 return self.value
898 def SetValue(self, value):
899 self.freeze = True
900 if not value:
901 self.value = ['', '']
902 else:
903 self.value = value
904 self.combo.SetValue(self.value[0])
905 self.text.SetValue(self.value[1]) # update text ctrl
906 self.updateRadios()
907 self.freeze = False
908 def OnButtonBrowse(self, evt):
909 if self.textModified: # text has newer value
910 self.value[1] = self.text.GetValue()
29a41103 911 dlg = wx.FileDialog(self,
d14a1e28
RD
912 defaultDir = os.path.abspath(os.path.dirname(self.value[1])),
913 defaultFile = os.path.basename(self.value[1]))
29a41103 914 if dlg.ShowModal() == wx.ID_OK:
d14a1e28
RD
915 # Get common part of selected path and current
916 if g.frame.dataFile:
917 curpath = os.path.abspath(g.frame.dataFile)
918 else:
919 curpath = os.path.join(os.getcwd(), '')
920 common = os.path.commonprefix([curpath, dlg.GetPath()])
921 self.SetValue(['', dlg.GetPath()[len(common):]])
922 self.SetModified()
923 self.textModified = False
924 dlg.Destroy()
925
926paramDict = {
927 'flag': ParamFlag,
928 'style': ParamStyle, 'exstyle': ParamExStyle,
929 'pos': ParamPosSize, 'size': ParamPosSize,
80389ff7 930 'cellpos': ParamPosSize, 'cellspan': ParamPosSize,
c032d94e 931 'border': ParamUnit, 'cols': ParamIntNN, 'rows': ParamIntNN,
d14a1e28
RD
932 'vgap': ParamUnit, 'hgap': ParamUnit,
933 'checkable': ParamBool, 'checked': ParamBool, 'radio': ParamBool,
934 'accel': ParamAccel,
935 'label': ParamMultilineText, 'title': ParamText, 'value': ParamText,
c032d94e 936 'content': ParamContent, 'selection': ParamIntNN,
d14a1e28
RD
937 'min': ParamInt, 'max': ParamInt,
938 'fg': ParamColour, 'bg': ParamColour, 'font': ParamFont,
939 'enabled': ParamBool, 'focused': ParamBool, 'hidden': ParamBool,
940 'tooltip': ParamText, 'bitmap': ParamBitmap, 'icon': ParamBitmap,
b372319f
RR
941 'encoding': ParamEncoding, 'borders': ParamUnit,
942 'comment': ParamComment
d14a1e28 943 }