diff --git a/wxPython/wxPython/tools/XRCed/CHANGES b/wxPython/wxPython/tools/XRCed/CHANGES
index 0281339872..4815b83035 100644
--- a/wxPython/wxPython/tools/XRCed/CHANGES
+++ b/wxPython/wxPython/tools/XRCed/CHANGES
@@ -1,3 +1,21 @@
+0.0.9-4
+-------
+
+Implemented standard bitmap selection.
+
+Fixed a bug in FlexGridSizer code.
+
+0.0.9-3
+-------
+
+File browsing (for bitmaps/icons, etc.) had a small problem when current
+file was not saved yet.
+
+0.0.9-2
+-------
+
+Small bug fix for initial don't panic message.
+
0.0.9-1
-------
diff --git a/wxPython/wxPython/tools/XRCed/globals.py b/wxPython/wxPython/tools/XRCed/globals.py
index 5f59ef4366..78bb0595c2 100644
--- a/wxPython/wxPython/tools/XRCed/globals.py
+++ b/wxPython/wxPython/tools/XRCed/globals.py
@@ -16,7 +16,7 @@ else:
modernFont = wxFont(10, wxMODERN, wxNORMAL, wxNORMAL)
progname = 'XRCed'
-version = '0.0.9-1'
+version = '0.0.9-4'
# Global variables
diff --git a/wxPython/wxPython/tools/XRCed/panel.py b/wxPython/wxPython/tools/XRCed/panel.py
index 0da807e754..5202ccb237 100644
--- a/wxPython/wxPython/tools/XRCed/panel.py
+++ b/wxPython/wxPython/tools/XRCed/panel.py
@@ -170,6 +170,8 @@ class ParamPage(wxPanel):
# Some classes are special
if param == 'font':
xxx.params[param] = xxxParamFont(xxx.element, elem)
+ elif param in xxxObject.bitmapTags:
+ xxx.params[param] = xxxParamBitmap(elem)
else:
xxx.params[param] = xxxParam(elem)
# Find place to put new element: first present element after param
@@ -247,7 +249,7 @@ class PropPage(ParamPage):
label = wxStaticText(self, -1, 'XML ID:', size=(100,-1))
control = ParamText(self, name='XML_name')
sizer.AddMany([ (label, 0, wxALIGN_CENTER_VERTICAL),
- (control, 0, wxALIGN_CENTER_VERTICAL) ])
+ (control, 0, wxALIGN_CENTER_VERTICAL | wxBOTTOM, 5) ])
self.controlName = control
for param in xxx.allParams:
present = xxx.params.has_key(param)
diff --git a/wxPython/wxPython/tools/XRCed/params.py b/wxPython/wxPython/tools/XRCed/params.py
index a8d2d7d67e..986c94ad3f 100644
--- a/wxPython/wxPython/tools/XRCed/params.py
+++ b/wxPython/wxPython/tools/XRCed/params.py
@@ -8,6 +8,7 @@ import string
import os.path
from globals import *
from types import *
+from wxPython.xrc import *
genericStyles = ['wxSIMPLE_BORDER', 'wxDOUBLE_BORDER',
'wxSUNKEN_BORDER', 'wxRAISED_BORDER',
@@ -305,7 +306,7 @@ class ParamInt(PPanel):
self.freeze = false
class ParamText(PPanel):
- def __init__(self, parent, name, textWidth=200):
+ def __init__(self, parent, name, textWidth=260):
PPanel.__init__(self, parent, name)
self.ID_TEXT_CTRL = wxNewId()
# We use sizer even here to have the same size of text control
@@ -334,8 +335,9 @@ class ParamPosSize(ParamText):
class ContentDialog(wxDialogPtr):
def __init__(self, parent, value):
- # Is this normal???
+ # Load from resource
w = g.frame.res.LoadDialog(parent, 'DIALOG_CONTENT')
+ # Perform initialization with class pointer
wxDialogPtr.__init__(self, w.this)
self.thisown = 1
self.Center()
@@ -385,7 +387,6 @@ class ContentDialog(wxDialogPtr):
class ContentCheckListDialog(wxDialogPtr):
def __init__(self, parent, value):
- # Is this normal???
w = g.frame.res.LoadDialog(parent, 'DIALOG_CONTENT_CHECK_LIST')
wxDialogPtr.__init__(self, w.this)
self.thisown = 1
@@ -684,6 +685,83 @@ class ParamFile(PPanel):
self.textModified = false
dlg.Destroy()
+class ParamBitmap(PPanel):
+ def __init__(self, parent, name):
+ # Load from resource
+ w = g.frame.res.LoadPanel(parent, 'PANEL_BITMAP')
+ # Perform initialization with class pointer
+ wxPanelPtr.__init__(self, w.this)
+ self.thisown = 1
+ self.modified = self.freeze = false
+ self.SetBackgroundColour(g.panel.GetBackgroundColour())
+ self.radio_std = self.FindWindowByName('RADIO_STD')
+ self.radio_file = self.FindWindowByName('RADIO_FILE')
+ self.combo = self.FindWindowByName('COMBO_STD')
+ self.text = self.FindWindowByName('TEXT_FILE')
+ self.button = self.FindWindowByName('BUTTON_BROWSE')
+ self.textModified = false
+ self.SetAutoLayout(true)
+ self.GetSizer().SetMinSize((260, -1))
+ self.GetSizer().Fit(self)
+ EVT_RADIOBUTTON(self, XMLID('RADIO_STD'), self.OnRadioStd)
+ EVT_RADIOBUTTON(self, XMLID('RADIO_FILE'), self.OnRadioFile)
+ EVT_BUTTON(self, XMLID('BUTTON_BROWSE'), self.OnButtonBrowse)
+ EVT_COMBOBOX(self, XMLID('COMBO_STD'), self.OnCombo)
+ EVT_TEXT(self, XMLID('COMBO_STD'), self.OnChange)
+ EVT_TEXT(self, XMLID('TEXT_FILE'), self.OnChange)
+ def OnRadioStd(self, evt):
+ self.SetModified()
+ self.SetValue('')
+ def OnRadioFile(self, evt):
+ self.SetModified()
+ self.SetValue(['',''])
+ def updateRadios(self):
+ if self.value[0]:
+ self.text.Enable(false)
+ self.button.Enable(false)
+ self.combo.Enable(true)
+ else:
+ self.text.Enable(true)
+ self.button.Enable(true)
+ self.combo.Enable(false)
+ def OnChange(self, evt):
+ PPanel.OnChange(self, evt)
+ self.textModified = true
+ def OnCombo(self, evt):
+ PPanel.OnChange(self, evt)
+ self.value[0] = self.combo.GetValue()
+ def GetValue(self):
+ if self.textModified: # text has newer value
+ return [self.combo.GetValue(), self.text.GetValue()]
+ return self.value
+ def SetValue(self, value):
+ self.freeze = true
+ if not value:
+ self.value = ['wxART_MISSING_IMAGE', '']
+ else:
+ self.value = value
+ self.combo.SetValue(self.value[0])
+ self.text.SetValue(self.value[1]) # update text ctrl
+ self.updateRadios()
+ self.freeze = false
+ def OnButtonBrowse(self, evt):
+ if self.textModified: # text has newer value
+ self.value[1] = self.text.GetValue()
+ dlg = wxFileDialog(self,
+ defaultDir = os.path.abspath(os.path.dirname(self.value[1])),
+ defaultFile = os.path.basename(self.value[1]))
+ if dlg.ShowModal() == wxID_OK:
+ # Get common part of selected path and current
+ if g.frame.dataFile:
+ curpath = os.path.abspath(g.frame.dataFile)
+ else:
+ curpath = os.path.join(os.getcwd(), '')
+ common = os.path.commonprefix([curpath, dlg.GetPath()])
+ self.SetValue(['', dlg.GetPath()[len(common):]])
+ self.SetModified()
+ self.textModified = false
+ dlg.Destroy()
+
paramDict = {
'flag': ParamFlag,
'style': ParamStyle, 'exstyle': ParamExStyle,
@@ -696,6 +774,6 @@ paramDict = {
'min': ParamInt, 'max': ParamInt,
'fg': ParamColour, 'bg': ParamColour, 'font': ParamFont,
'enabled': ParamBool, 'focused': ParamBool, 'hidden': ParamBool,
- 'tooltip': ParamText, 'bitmap': ParamFile, 'icon': ParamFile,
+ 'tooltip': ParamText, 'bitmap': ParamBitmap, 'icon': ParamBitmap,
}
diff --git a/wxPython/wxPython/tools/XRCed/xrced.xrc b/wxPython/wxPython/tools/XRCed/xrced.xrc
index a407461450..dd19218ab9 100644
--- a/wxPython/wxPython/tools/XRCed/xrced.xrc
+++ b/wxPython/wxPython/tools/XRCed/xrced.xrc
@@ -232,4 +232,87 @@
+
\ No newline at end of file
diff --git a/wxPython/wxPython/tools/XRCed/xxx.py b/wxPython/wxPython/tools/XRCed/xxx.py
index 9cfa41c307..b7ddcf8a6e 100644
--- a/wxPython/wxPython/tools/XRCed/xxx.py
+++ b/wxPython/wxPython/tools/XRCed/xxx.py
@@ -151,6 +151,21 @@ class xxxParamContentCheckList(xxxNode):
self.l[i][1].setAttribute('checked', str(value[i][1]))
self.data = value
+# Bitmap parameter
+class xxxParamBitmap(xxxParam):
+ def __init__(self, node):
+ xxxParam.__init__(self, node)
+ self.stock_id = node.getAttribute('stock_id')
+ def value(self):
+ return [self.stock_id, xxxParam.value(self)]
+ def update(self, value):
+ self.stock_id = value[0]
+ if self.stock_id:
+ self.node.setAttribute('stock_id', self.stock_id)
+ else:
+ self.node.removeAttribute('stock_id')
+ xxxParam.update(self, value[1])
+
################################################################################
# Classes to interface DOM objects
@@ -165,6 +180,8 @@ class xxxObject:
styles = ['fg', 'bg', 'font', 'enabled', 'focused', 'hidden', 'tooltip']
# Special parameters
specials = []
+ # Bitmap tags
+ bitmapTags = ['bitmap', 'bitmap2', 'icon']
# Required paremeters: none by default
required = []
# Default parameters with default values
@@ -204,6 +221,9 @@ class xxxObject:
self.params[tag] = xxxParamContent(node)
elif tag == 'font': # has children
self.params[tag] = xxxParamFont(element, node)
+ elif tag in self.bitmapTags:
+ # Can have attributes
+ self.params[tag] = xxxParamBitmap(node)
else: # simple parameter
self.params[tag] = xxxParam(node)
else:
@@ -327,7 +347,7 @@ class xxxFrame(xxxContainer):
class xxxTool(xxxObject):
allParams = ['bitmap', 'bitmap2', 'toggle', 'tooltip', 'longhelp']
required = ['bitmap']
- paramDict = {'bitmap2': ParamFile, 'toggle': ParamBool}
+ paramDict = {'bitmap2': ParamBitmap, 'toggle': ParamBool}
hasStyle = false
class xxxToolBar(xxxContainer):
@@ -346,6 +366,7 @@ class xxxBitmap(xxxObject):
allParams = ['bitmap']
required = ['bitmap']
+# Just like bitmap
class xxxIcon(xxxObject):
allParams = ['icon']
required = ['icon']
@@ -530,7 +551,8 @@ class xxxGridSizer(xxxSizer):
# For repeated parameters
class xxxParamMulti:
- def __init__(self):
+ def __init__(self, node):
+ self.node = node
self.l, self.data = [], []
def append(self, param):
self.l.append(param)
@@ -550,7 +572,8 @@ class xxxFlexGridSizer(xxxGridSizer):
# (they are represented by several nodes)
def special(self, tag, node):
if not self.params.has_key(tag):
- self.params[tag] = xxxParamMulti()
+ # Create new multi-group
+ self.params[tag] = xxxParamMulti(node)
self.params[tag].append(xxxParamInt(node))
def setSpecial(self, param, value):
# Straightforward implementation: remove, add again