Added XRCed to the wxPython Tools directory, contributed by Roman

Rolinsky.

Added wrappers for the default ctor and the Create methods for most
window classes.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11526 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2001-08-31 21:38:03 +00:00
parent f6010d8fad
commit 09f3d4e679
43 changed files with 8191 additions and 940 deletions

View File

@@ -0,0 +1,19 @@
0.0.3
-----
Faster preview window refresh.
Cut/Paste works better.
Some tree icons.
Tree item names.
Bugfixes.
0.0.2
-----
The first release.

View File

@@ -0,0 +1,60 @@
********************************************************************************
XRCed README
********************************************************************************
Installation on UNIX
--------------------
XRCed was developed using Python 2.1.1. xml.dom.minidom module should be
available. XML support requires Expat package (http://expat.sourceforge.net),
and you have to uncomment expat lines in Modules/Setup file of Python source:
EXPAT_DIR=$(HOME)/expat
pyexpat pyexpat.c -I$(EXPAT_DIR)/xmlparse -L$(EXPAT_DIR) -lexpat
wxPython version used was 2.3.1, which itself uses wxGTK 2.3.1. wxPython
should be modified to support some extra functions. To update it, go to
wxPython source directory and untar "wxPython-update.tgz" (included with
xrced) file there. Then recompile (run "b 21" for example) it and install as
usual (or you can set your environment to use it from the source tree).
Short manual
------------
To start xrced, change to the directory where you installed it and run
"python2.1 xrced.py".
To create an object, first you should select some object in the tree (or the
root item if it's empty) then press the right mouse button and select right
(in another sense now :) ) command. The pulldown menu is context-dependent on
the selected object.
XRCed tries to guess if new object should be added as a next sibling or a
child of current object, depending on the possibility of the object to have
child objects and expanded state (if tree item is collapsed, new object will
be sibling). You can change this behavior to create siblings by pressing and
holding the Control key before clicking the mouse.
Same applies for copy/paste, but at the moment Control key is ignored.
Panel on the right contains object properties. Properties which are optional
should be "checked" first. XMLID of the object is the textbox to the right of
the class name.
All properties can be edited as text, and some are supplied with special
editing controls.
To display the preview window double-click a top-level object (you should
assign an XMLID to it first). After that, if you select a child object, it
becomes highlighted, and if you change it, preview is updated when you select
another item or press Ctrl-R (refresh). To turn off automatic update, toggle
"View->Auto-refresh" or toolbar auto-refresh button (to the right of refresh
button).
--------------------------------------------------------------------------------
Copyright 2001 Roman Rolinsky <rolinsky@mema.ucl.ac.be>

28
wxPython/tools/XRCed/TODO Normal file
View File

@@ -0,0 +1,28 @@
TODO for XRCed
==============
* Undo/Redo
* menu - accel not displayed in preview
* tree icons
* paste as sibling (toolbar toggle button)
* replace object with abother, keeping children
* write tmp file for current dialog/panel/etc.
* XML indents
* select same notebook pages after update
* put some default values in tree ctrl etc.
* special (fast) update for some values: pos/size, value/content, sizeritem
stuff (?), well, as much as possible
* highlighting with better method
* import XRC/WXR files

View File

@@ -0,0 +1,286 @@
#----------------------------------------------------------------------
# This file was generated by img2py.py
#
from wxPython.wx import wxBitmapFromXPMData, wxImageFromBitmap
import cPickle, zlib
def getNewData():
return cPickle.loads(zlib.decompress(
"x\xda\xd3\xc8)0\xe4\nV72Q02V0Q0T\xe7J\x0cV\xd7SHVp\xcaIL\xce\x06\xf3\xf2\
\x81<eK\x03\x10\x04\xf3\x15\x80|\xbf\xfc\xbcT0'\x02$\xe9f\xe1\xe6\xecf\x01\
\x95\xc4\x0e\x06ZR\x0f\n\xb0KF\x80\x01B\x16\x9bd\x84\x1e>\x9d0\xbdX$A\xf2\
\xf9\xc3Z\x12\x010%\x15\xf2\x11` S\x82\x1e\x00-\xd9\x8b\xfa" ))
def getNewBitmap():
return wxBitmapFromXPMData(getNewData())
def getNewImage():
return wxImageFromBitmap(getNewBitmap())
#----------------------------------------------------------------------
def getOpenData():
return cPickle.loads(zlib.decompress(
'x\xda\xcd\x92\xb1\n\xc3 \x10\x86\xf7<\xc5A\x07\x0b\x81#IK\xb1\xab\x01\xc7:d\
\xb95\x84N\r\xbd\xbe\xff\xd4hb\xb5j\xbb\xb6\xbf\x08~|\xde)\xe2~~\xb4\xd5 \
\xba#t\x078A+\xaaq\x10\x08\x13\xa8y\x9cn\x8e\xccB\xbbsc\x87c\xb2\xac\xa5\xee\
\x9b\x95a\xe1\x0b\xdf\xaf\x0e\xd8K-\x1d\xd7\x96\x95Tas9\x7f"\x11\xf1\xa3D7\
\xf1K[Leh\xe7\x97A"1\xe1\x9a\xfcB\xc8\xb4\r4\xb9\xf4\x8eJ\x92C\xdf\xf2\x99\
\xb5\x8f\xab\x8e+9v\x89\xa4\xd4\xc52so\xf2\x95\xcd\xc5/dB~\xfb\x13\xf0\t\x81\
T\x87G' ))
def getOpenBitmap():
return wxBitmapFromXPMData(getOpenData())
def getOpenImage():
return wxImageFromBitmap(getOpenBitmap())
#----------------------------------------------------------------------
def getSaveData():
return cPickle.loads(zlib.decompress(
'x\xda\xd3\xc8)0\xe4\nV72Q02V0U0T\xe7J\x0cV\xd7SHVp\xcaIL\xce\x06\xf3\xfc\
\x81<eK\x03\x10\x04\xf3#@|\x0b\x03\x0b\x03\x03\x08_\x01\xc8\xf7\xcb\xcfK\x05\
s\xf2A\x92n\x16n\xcen\x16PI\xec\x80\xe6\x92z(\x00]2B/\x1f\n\x80L\x7f\xdc\x92\
z\xf8$#\xe8&\x19\x01\xf3G\x046I\x04\xc0\xa3\x13\x8f\xb1x\xed$Y\x125\xe4\xd1%\
\x15\xfc\x91\x01]R\x02vI=\x00\xd8\x14\x96@' ))
def getSaveBitmap():
return wxBitmapFromXPMData(getSaveData())
def getSaveImage():
return wxImageFromBitmap(getSaveBitmap())
#----------------------------------------------------------------------
def getCutData():
return cPickle.loads(zlib.decompress(
'x\xda\xd3\xc8)0\xe4\nV72Q02V0Q0T\xe7J\x0cV\xd7SHVp\xcaIL\xce\x06\xf3\xf2\
\x81<e\x03 \xb00\x00\xf3#@|K\x03\x10\x04\xf3\x15\x80|\xbf\xfc\xbcT(\x07;\xa0\
\x96\xa4\x1e^\xc9\x08\x145h\x92z\x102\x02\xab\x9d a\xa0\x1c\x0eI=$9L\xc9\x08\
\xb8\xa1\x98^\xd1C\xd2\x88U\x12W \xe4\xe7\xeb\xe5\xe7\xe3\x96\x8c\xc8\xcf\
\x87K\xa3H\x82\xc4#\xc0\x08S\x12&\x03B\xe4H\x82\x0c\x8f\x88\xc0j\'H8\x02{\
\xf0E \x02\x80\x9a)\x81DI=\x00\x12\xa5\x85\x9f' ))
def getCutBitmap():
return wxBitmapFromXPMData(getCutData())
def getCutImage():
return wxImageFromBitmap(getCutBitmap())
#----------------------------------------------------------------------
def getCopyData():
return cPickle.loads(zlib.decompress(
'x\xda\xc5\x92\xb1\n\xc20\x10\x86\xf7>\xc5\x81C\x9c\x8e\xb4*\xc4\xd5BF3t\xc9\
Z\x8a\x93\xc5\xf3\xfd\'\xef.vP\xee\xe6\xfe\t\x81\x9f/\xdf\r!\xc7\xf5\xddwS\
\x18\xce0\x9c\xe0\x02}\xe8\xe6) ,p[\xe7\xe5\xa9\x8d\xb8\x1d"\'E\xedE\xfa5\
\xca\xd2\x0e\xdc\xef\xf4zh\xa9\x02s\xcacN_hg_\x88\x1a\x0fV\xce/\xfd\x87\x15\
\x1d\x88\xbcIc\x9b\x95\xf4 \xcbDl\xb0\x92c\xf2\xf0m\xb2i\xca\xa5\xe2\x98(r1\
\x1e\xc11\xa1H\x1c\xb3\xc53\x1b\xdcb\xc16\\\xb2\xdfO\xc0\x0f5t\x92\x06' ))
def getCopyBitmap():
return wxBitmapFromXPMData(getCopyData())
def getCopyImage():
return wxImageFromBitmap(getCopyBitmap())
#----------------------------------------------------------------------
def getPasteData():
return cPickle.loads(zlib.decompress(
'x\xda\xcd\x92\xb1\n\x830\x10\x86w\x9f\xe2\xa0\x83\x85\xc0\x11m\xa1\xe9\x16Z\
p\xec\r.YE:U\x9a\xbe\xff\xe4]48x\xe9V\xe8\'\xc2\xfd|\xf7g\x88\x1e\xa7OS\xf5u\
{\x86\xf6\x04\x17h\xeaj\xe8k\x84\x11n\xd30\xbeR2\x9c\x0e\x96q6e\x92|\xb5\xf2\
\xa4\x1c$w\xae\xbb\xdb%G\xc9\xce\xba\xbc\x0f\x9c\x1f\xf1\xfdL\xc1\xe7\xe5\
\xce\xadR\xe7\x0f$2\xaa\x14\x81!\xe0\xb6\xb0I\x8c1"\xab\x90\x86\xbd\xe4\x9e \
\x13\xed\xe5\x8a*7ti\x16\n\xd2\x0b\xc6|\x93\xde\xe8\x92\x0f\x95\x97\x8aM\xee\
R\xa9)]R\xae\xaf\xd0\x04 \xc6dH\xfbd\x94\xf9\xe9\x9f\x803\xb0L\x99\x05' ))
def getPasteBitmap():
return wxBitmapFromXPMData(getPasteData())
def getPasteImage():
return wxImageFromBitmap(getPasteBitmap())
#----------------------------------------------------------------------
def getRefreshData():
return cPickle.loads(zlib.decompress(
'x\xda\xad\xd2\xbb\x0e\xc20\x0c\x05\xd0\xbd_q%\x860]\xf55\xc0\x0f0\xb2t\xf1\
\x8a\x10\x1bj\xf9\xff\x89\xbc\x9a\x9a\xe2\xc2Rg\x89u\x14+vr|\xbe\x9ajpm\x8f\
\xb6C\x87\xc6U\xb7\xc1\t\xee8\x9c\xeb\xb0b\x0e\x9f_\xa7\xf1\x11\x13\x06\xbc\
\x9cj\x1f\x19\xed\xd8\r\x19b\x03\xbd\x88R\x85\x8c&XTc\xb2\xb0\x11\x13\x89_\
\xc8\xb4\xd9(\xab\xeb~`"\x13\x91\xc9F\xd5\xee\x9e8w@\x1bY\xae\xfd]6\x9f\xb0&\
4\x1f\xa5\x8dQY\xaa\x9a\x8f]\x86\xb1nED\x8a\xfd\xfdC|\x03\xab\xaaw\xdd' ))
def getRefreshBitmap():
return wxBitmapFromXPMData(getRefreshData())
def getRefreshImage():
return wxImageFromBitmap(getRefreshBitmap())
#----------------------------------------------------------------------
def getAutoRefreshData():
return cPickle.loads(zlib.decompress(
'x\xda\xad\xd21\x0e\xc20\x0c\x05\xd0\xbd\xa7\xb0\xc4\x10&+-\x1d\xca\x05\x18Y\
\xba\xfc\x15!6\x84\xb9\xffD\x9c8%R\x92\x8a\x01gh\xacW9\xb2\x93\xe3\xf3=\x0e\
\xab\x9bf\x9aN4\xd3\xe8\x86\xdb\xea@w:\x9c\xbd\xae\x98S\xc8\xaf\xf2z\xc4D\
\x14\xbd_\x16\x9f\x905\xbf\x84\xcc\xe7\x9f\xdb\xf17d\x8d\x0e\x06A\xa1\x05r4\
\xd0WKL\xa6\x1b4\x91i\x0f9m:eA\x12\x025*\x05\x03\x9b\x96\xad\x00\xf6i\xa1\
\x85luk\xec\x94\xdd\xc5\xd4\x81\xb4\xcb\xf2\xa6\x10\xa9\xca\xdahbO\xa8\xd1\
\x06\x84\xce\x95Q\x1e\x7f\xe7\xb2\xb3U\xad\xc0\x8e\xfb\xe9\r\xf1\x07\xdbD\
\x86\x9f' ))
def getAutoRefreshBitmap():
return wxBitmapFromXPMData(getAutoRefreshData())
def getAutoRefreshImage():
return wxImageFromBitmap(getAutoRefreshBitmap())
#----------------------------------------------------------------------
def getTreePanelData():
return cPickle.loads(zlib.decompress(
'x\xda\xd3\xc8)0\xe4\nV74S04Q0Q0T\xe7J\x0cV\xd7SHVp\xcaIL\xce\x06\xf3\xf2\
\x81<eK\x03K\x13K\x030_\x01\xc4w\xb3psv\xb3\x00\xf3#@|\x17\x03\x17\x13\x17\
\x98<\n\xd0\x83\x08F \x83\xfca+\x98\x8f\x02 \x82zh\x00(\xa8\x07\x00&\x96e\
\x83' ))
def getTreePanelBitmap():
return wxBitmapFromXPMData(getTreePanelData())
def getTreePanelImage():
return wxImageFromBitmap(getTreePanelBitmap())
#----------------------------------------------------------------------
def getTreeDialogData():
return cPickle.loads(zlib.decompress(
'x\xda\xd3\xc8)0\xe4\nV74S\x00"\x13\x05Cu\xae\xc4`u\x05\x85d\x05\xa7\x9c\xc4\
\xe4l0/\x1f\xc8S\xb64\xb04\xb14\x00\xf3\xf5@|\x03 p\xb3\x00\xf3#@|\x17\x03\
\x17\x13\x17\x03\xa8nT\x00\x11\xd4C\x01$\x0bb53\x02\x05\x0c\x98`>1\x82\xf9`@\
\xc8LLo\xea\x01\x00\xb5\x9cde' ))
def getTreeDialogBitmap():
return wxBitmapFromXPMData(getTreeDialogData())
def getTreeDialogImage():
return wxImageFromBitmap(getTreeDialogBitmap())
#----------------------------------------------------------------------
def getTreeFrameData():
return cPickle.loads(zlib.decompress(
'x\xda\xd3\xc8)0\xe4\nV74S\x00"c\x05Cu\xae\xc4`u\x05\x85d\x05\xa7\x9c\xc4\
\xe4l0O\x0f\xc8S6\x00\x027\x0b0?\x02\xc4w1p1q1\x80\xaaF\x05\x10A=\x14@\xb2 V\
3#P\xc0p\x10\xc4\xf4\xa6\x1e\x00\xe3\x8f`,' ))
def getTreeFrameBitmap():
return wxBitmapFromXPMData(getTreeFrameData())
def getTreeFrameImage():
return wxImageFromBitmap(getTreeFrameBitmap())
#----------------------------------------------------------------------
def getTreeMenuBarData():
return cPickle.loads(zlib.decompress(
'x\xda\xd3\xc8)0\xe4\nV74S\x00"S\x05Cu\xae\xc4`\xf5\x08\x85d\x05\xa7\x9c\xc4\
\xe4l0\xcf\x1f\xc8S\xb64\xb04\xb14\x00\xf3\x15\x80|\xbf\xfc\xbcT0G\x0f$\xe9f\
\xe1\xe6\xecf\x01\xe6\xe7\x83\xf8.\x06.&.0\xc5\xa8\x80\x1a\x82z\xa8 \x02"\
\x98\x8f\x0c\xfca\x82\xfe \x00#I\x17\xc4b\xa6?*\x80\x08F\xa0\x01\x1a\xf9]\
\x0f\x00\x9b\xde`\xb2' ))
def getTreeMenuBarBitmap():
return wxBitmapFromXPMData(getTreeMenuBarData())
def getTreeMenuBarImage():
return wxImageFromBitmap(getTreeMenuBarBitmap())
#----------------------------------------------------------------------
def getTreeMenuData():
return cPickle.loads(zlib.decompress(
'x\xda\xd3\xc8)0\xe4\nV74S\x00"S\x05Cu\xae\xc4`\xf5\x08\x85d\x05\xa7\x9c\xc4\
\xe4l0\xcf\x1f\xc8S\xb64\xb04\xb14\x00\xf3\x15\x80|\xbf\xfc\xbcT0G\x0f$\xe9f\
\xe1\xe6\xecf\x01\xe6\xe7\x83\xf8.\x06.&.0\xc5\nzp\x10\xa1\xa0\x00\x17\xcc\
\x87\x02\x7f\x14A\x7f0 [p(\x9b\xe9\x0f\x03H\x82\x11\x08\x00\x16\xd4\x03\x00&\
sj\xf9' ))
def getTreeMenuBitmap():
return wxBitmapFromXPMData(getTreeMenuData())
def getTreeMenuImage():
return wxImageFromBitmap(getTreeMenuBitmap())
#----------------------------------------------------------------------
def getTreeSizerHData():
return cPickle.loads(zlib.decompress(
'x\xda\xd3\xc8)0\xe4\nV74S\x00"#\x05Cu\xae\xc4`u=\x85d\x05e3\x033\x133\x030_\
\x01\xc8\xf7\xcb\xcfK\x85rP\x01\xa9\x82z\xa8\x00*\x08Q\x01\xa3\x06\xaf 6\xc7\
S\x12 z\x00\xf8\xc9>T' ))
def getTreeSizerHBitmap():
return wxBitmapFromXPMData(getTreeSizerHData())
def getTreeSizerHImage():
return wxImageFromBitmap(getTreeSizerHBitmap())
#----------------------------------------------------------------------
def getTreeSizerVData():
return cPickle.loads(zlib.decompress(
'x\xda\xd3\xc8)0\xe4\nV74S\x00"#\x05Cu\xae\xc4`u=\x85d\x05e3\x033\x133\x030_\
\x01\xc8\xf7\xcb\xcfK\x85r\x14\x14\xf4`\x00\xc8F\x08*@\xc0\x00\t\x0e\x11\'!\
\x03\xa0\xa0\x1e\x00\xfaC>*' ))
def getTreeSizerVBitmap():
return wxBitmapFromXPMData(getTreeSizerVData())
def getTreeSizerVImage():
return wxImageFromBitmap(getTreeSizerVBitmap())
#----------------------------------------------------------------------
def getTreeStaticBoxSizerHData():
return cPickle.loads(zlib.decompress(
'x\xda\xd3\xc8)0\xe4\nV74S\x00"c\x05Cu\xae\xc4`u=\x85d\x05\xa7\x9c\xc4\xe4l0\
/\x02\xc8S630313\x00\xf3\x15\x80|\xbf\xfc\xbcT(\x07\x15\xc0\x05\xf5\xb0\x08\
\xea!\x8bB\x04#\x14\xf4\xf4\xf4\x14"`\x00.\x08R\x19\x01Q\x08\x17\x84\xf0\x06\
\x93 *\xc0\x1f \xc4\x08\xea\x01\x00\x0b\xa9Jm' ))
def getTreeStaticBoxSizerHBitmap():
return wxBitmapFromXPMData(getTreeStaticBoxSizerHData())
def getTreeStaticBoxSizerHImage():
return wxImageFromBitmap(getTreeStaticBoxSizerHBitmap())
#----------------------------------------------------------------------
def getTreeStaticBoxSizerVData():
return cPickle.loads(zlib.decompress(
'x\xda\xd3\xc8)0\xe4\nV74S\x00"c\x05Cu\xae\xc4`u=\x85d\x05\xa7\x9c\xc4\xe4l0\
/\x02\xc8S630313\x00\xf3\x15\x80|\xbf\xfc\xbcT(\x07\x0c\xf4\xa0\xb4\x02\x92\
\xa0\x1e\\\x14.\x18\xa1\xa0\xa7\xa7\xa7\x10\x11\x11\x81&\x08V\x89&\x08\x01\
\xb4\x17\x84\x81\xc1`\xbb\x1e\x00U+IU' ))
def getTreeStaticBoxSizerVBitmap():
return wxBitmapFromXPMData(getTreeStaticBoxSizerVData())
def getTreeStaticBoxSizerVImage():
return wxImageFromBitmap(getTreeStaticBoxSizerVBitmap())
#----------------------------------------------------------------------
def getTreeSizerGridData():
return cPickle.loads(zlib.decompress(
'x\xda\xd3\xc8)0\xe4\nV74S\x00"#\x05Cu\xae\xc4`u=\x85d\x05e3\x033\x133\x030_\
\x01\xc8\xf7\xcb\xcfK\x85p\xf4P\x01TP\x01\x0c`\x14\xbd\x05\x87\x88\x93\xd0\
\x00PP\x0f\x00!\xb1?\xce' ))
def getTreeSizerGridBitmap():
return wxBitmapFromXPMData(getTreeSizerGridData())
def getTreeSizerGridImage():
return wxImageFromBitmap(getTreeSizerGridBitmap())
#----------------------------------------------------------------------
def getTreeSizerFlexGridData():
return cPickle.loads(zlib.decompress(
'x\xda\xd3\xc8)0\xe4\nV74S\x00"#\x05Cu\xae\xc4`u=\x85d\x05e3\x033\x133\x030_\
\x01\xc8\xf7\xcb\xcfK\x85p\xf4P\x01TP\x01\x08\xc0\x04\x98A\x1dA\xbaYD/\xc7\
\xa3\x01\xa0\xa0\x1e\x00>\x91?\xce' ))
def getTreeSizerFlexGridBitmap():
return wxBitmapFromXPMData(getTreeSizerFlexGridData())
def getTreeSizerFlexGridImage():
return wxImageFromBitmap(getTreeSizerFlexGridBitmap())

View File

@@ -0,0 +1,317 @@
# Name: params.py
# Purpose: Classes for parameter introduction
# Author: Roman Rolinsky <rolinsky@mema.ucl.ac.be>
# Created: 22.08.2001
from wxPython.wx import *
from wxPython.xrc import *
import string
# Object which is currently processed
currentXXX = None
def SetCurrentXXX(xxx):
global currentXXX
currentXXX = xxx
# Register objects in the view
registered = {}
def Register(param, obj):
registered[param] = obj
def GetRegistered(param):
return registered[param]
def ClearRegister():
registered.clear()
genericStyles = ['wxSIMPLE_BORDER', 'wxSUNKEN_BORDER', 'wxRAISED_BORDER',
'wxTAB_TRAVERSAL', 'wxWANTS_CHARS', 'wxVSCROLL', 'wxHSCROLL']
class ParamBinaryOr(wxPanel):
ID_TEXT_CTRL = wxNewId()
ID_BUTTON_CHOICES = wxNewId()
def __init__(self, parent, id, value, size, name, param):
wxPanel.__init__(self, parent, id, name=name)
self.SetBackgroundColour(panel.GetBackgroundColour())
Register(param, self)
sizer = wxBoxSizer()
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, value, size=wxSize(200,-1))
sizer.Add(self.text, 0, wxRIGHT, 10)
self.button = wxButton(self, self.ID_BUTTON_CHOICES, 'Edit...')
sizer.Add(self.button)
self.SetAutoLayout(true)
self.SetSizer(sizer)
sizer.Fit(self)
EVT_BUTTON(self, self.ID_BUTTON_CHOICES, self.OnButtonChoices)
EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
def OnChange(self, evt):
panel.SetModified(true)
evt.Skip()
def GetValue(self):
return self.text.GetValue()
def SetValue(self, value):
self.text.SetValue(value)
def OnButtonChoices(self, evt):
dlg = wxDialog(self, -1, 'Choices', size=wxSize(250,300))
topSizer = wxBoxSizer(wxVERTICAL)
listBox = wxCheckListBox(dlg, -1, choices=self.values)
value = map(string.strip, string.split(self.text.GetValue(), '|'))
if value == ['']: value = []
ignored = []
for i in value:
try:
listBox.Check(self.values.index(i))
except ValueError:
# Try to find equal
if self.equal.has_key(i):
listBox.Check(self.values.index(self.equal[i]))
else:
print 'Unknown flag: %s: ignored.' % i
ignored.append(i)
topSizer.Add(listBox, 1, wxEXPAND)
sizer = wxBoxSizer()
buttonOk = wxButton(dlg, wxID_OK, 'OK')
buttonOk.SetDefault()
sizer.Add(buttonOk, 0, wxRIGHT, 10)
sizer.Add(0, 0, 1)
sizer.Add(wxButton(dlg, wxID_CANCEL, 'Cancel'))
topSizer.Add(sizer, 0, wxALL | wxEXPAND, 10)
dlg.SetAutoLayout(true)
dlg.SetSizer(topSizer)
dlg.Center()
if dlg.ShowModal() != wxID_OK: return
value = []
for i in range(listBox.Number()):
if listBox.IsChecked(i):
value.append(self.values[i])
# Add ignored flags
value.extend(ignored)
self.SetValue(reduce(lambda a,b: a+'|'+b, value))
panel.SetModified(true)
class ParamFlag(ParamBinaryOr):
values = ['wxTOP', 'wxBOTTOM', 'wxLEFT', 'wxRIGHT', 'wxALL',
'wxEXPAND', 'wxSHAPED', 'wxALIGN_CENTRE', 'wxALIGN_RIGHT',
'wxALIGN_BOTTOM', 'wxALIGN_CENTRE_VERTICAL',
'wxALIGN_CENTRE_HORIZONTAL']
equal = {'wxALIGN_CENTER': 'wxALIGN_CENTRE',
'wxALIGN_CENTER_VERTICAL': 'wxALIGN_CENTRE_VERTICAL',
'wxALIGN_CENTER_HORIZONTAL': 'wxALIGN_CENTRE_HORIZONTAL'}
def __init__(self, parent, id, value, size, name, param):
ParamBinaryOr.__init__(self, parent, id, value, size, name, param)
class ParamStyle(ParamBinaryOr):
equal = {'wxALIGN_CENTER': 'wxALIGN_CENTRE'}
def __init__(self, parent, id, value, size, name, param):
self.values = currentXXX.styles + genericStyles
ParamBinaryOr.__init__(self, parent, id, value, size, name, param)
class ParamInt(wxPanel):
ID_SPIN_CTRL = wxNewId()
def __init__(self, parent, id, value, size, name, param):
wxPanel.__init__(self, parent, id, name=name)
sizer = wxBoxSizer()
self.spin = wxSpinCtrl(self, self.ID_SPIN_CTRL, value, size=wxSize(50,-1))
self.SetBackgroundColour(panel.GetBackgroundColour())
sizer.Add(self.spin)
self.SetAutoLayout(true)
self.SetSizer(sizer)
sizer.Fit(self)
Register(param, self)
EVT_SPINCTRL(self, self.ID_SPIN_CTRL, self.OnChange)
def GetValue(self):
return str(self.spin.GetValue())
def SetValue(self, value):
if not value: value = 0
self.spin.SetValue(int(value))
def OnChange(self, evt):
panel.SetModified(true)
evt.Skip()
class ParamText(wxTextCtrl):
def __init__(self, parent, id, value, size, name, param):
wxTextCtrl.__init__(self, parent, id, value, size=wxSize(200,-1), name=name)
Register(param, self)
EVT_TEXT(self, id, self.OnChange)
def OnChange(self, evt):
panel.SetModified(true)
evt.Skip()
class ParamAccel(wxTextCtrl):
def __init__(self, parent, id, value, size, name, param):
wxTextCtrl.__init__(self, parent, id, value, size=wxSize(50,-1), name=name)
Register(param, self)
EVT_TEXT(self, id, self.OnChange)
def OnChange(self, evt):
panel.SetModified(true)
evt.Skip()
class ParamPosSize(wxTextCtrl):
def __init__(self, parent, id, value, size, name, param):
wxTextCtrl.__init__(self, parent, id, value, size=wxSize(80,-1), name=name)
Register(param, self)
EVT_TEXT(self, id, self.OnChange)
def OnChange(self, evt):
panel.SetModified(true)
evt.Skip()
class ContentDialog(wxDialog):
def __init__(self, parent, value):
# Use another constructor
w = frame.res.LoadDialog(parent, 'ID_DIALOG_CONTENT')
self.this = w.this
w.thisown = 0
self.thisown = 1
#frame.res.LoadOnDialog(self, parent, 'ID_DIALOG_CONTENT')
self.Center()
self.list = self.FindWindowByName('ID_LIST')
# Set list items
for v in value:
self.list.Append(v)
# !!! Bug in XRC or wxWin listbox select random items
self.FindWindowByName('wxID_OK').SetFocus()
# Callbacks
self.ID_BUTTON_APPEND = XMLID('ID_BUTTON_APPEND')
self.ID_BUTTON_REMOVE = XMLID('ID_BUTTON_REMOVE')
self.ID_BUTTON_UP = XMLID('ID_BUTTON_UP')
self.ID_BUTTON_DOWN = XMLID('ID_BUTTON_DOWN')
EVT_BUTTON(self, self.ID_BUTTON_UP, self.OnButtonUp)
EVT_BUTTON(self, self.ID_BUTTON_DOWN, self.OnButtonDown)
EVT_BUTTON(self, self.ID_BUTTON_APPEND, self.OnButtonAppend)
EVT_BUTTON(self, self.ID_BUTTON_REMOVE, self.OnButtonRemove)
EVT_UPDATE_UI(self, self.ID_BUTTON_UP, self.OnUpdateUI)
EVT_UPDATE_UI(self, self.ID_BUTTON_DOWN, self.OnUpdateUI)
EVT_UPDATE_UI(self, self.ID_BUTTON_REMOVE, self.OnUpdateUI)
def OnButtonUp(self, evt):
i = self.list.GetSelection()
str = self.list.GetString(i)
self.list.Delete(i)
self.list.InsertItems([str], i-1)
self.list.SetSelection(i-1)
def OnButtonDown(self, evt):
i = self.list.GetSelection()
str = self.list.GetString(i)
self.list.Delete(i)
self.list.InsertItems([str], i+1)
self.list.SetSelection(i+1)
def OnButtonAppend(self, evt):
str = wxGetTextFromUser('Enter new item:', 'Append', '', self)
self.list.Append(str)
def OnButtonRemove(self, evt):
self.list.Delete(self.list.GetSelection())
def OnUpdateUI(self, evt):
if evt.GetId() == self.ID_BUTTON_REMOVE:
evt.Enable(self.list.GetSelection() != -1)
elif evt.GetId() == self.ID_BUTTON_UP:
evt.Enable(self.list.GetSelection() > 0)
elif evt.GetId() == self.ID_BUTTON_DOWN:
evt.Enable(self.list.GetSelection() < self.list.Number() - 1)
class ParamContent(wxPanel):
ID_TEXT_CTRL = wxNewId()
ID_BUTTON_EDIT = wxNewId()
def __init__(self, parent, id, value, size, name, param):
wxPanel.__init__(self, parent, id, name=name)
self.SetBackgroundColour(panel.GetBackgroundColour())
Register(param, self)
sizer = wxBoxSizer()
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, str(value), size=wxSize(200,-1))
sizer.Add(self.text, 0, wxRIGHT, 10)
self.button = wxButton(self, self.ID_BUTTON_EDIT, 'Edit...')
sizer.Add(self.button)
self.SetAutoLayout(true)
self.SetSizer(sizer)
sizer.Fit(self)
self.textModified = false
EVT_BUTTON(self, self.ID_BUTTON_EDIT, self.OnButtonEdit)
EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
def OnChange(self, evt):
panel.SetModified(true)
self.textModified = true
evt.Skip()
def GetValue(self):
if self.textModified: # text has newer value
return eval(self.text.GetValue())
return self.value
def SetValue(self, value):
self.value = value
self.text.SetValue(str(value)) # update text ctrl
def OnButtonEdit(self, evt):
if self.textModified: # text has newer value
self.value = eval(self.text.GetValue())
dlg = ContentDialog(self, self.value)
if dlg.ShowModal() != wxID_OK: return
value = []
for i in range(dlg.list.Number()):
value.append(dlg.list.GetString(i))
# Add ignored flags
self.SetValue(value)
panel.SetModified(true)
self.textModified = false
# Boxless radiobox
class RadioBox(wxPanel):
ID_RADIO_CHOICE = wxNewId() # economize on IDs, use names
def __init__(self, parent, id, choices,
pos=wxDefaultPosition, size=wxDefaultSize, name='radiobox'):
wxPanel.__init__(self, parent, id, pos, size, name=name)
self.SetBackgroundColour(panel.GetBackgroundColour())
self.choices = choices
topSizer = wxBoxSizer()
for i in choices:
topSizer.Add(wxRadioButton(self, self.ID_RADIO_CHOICE, i, name=i))
self.SetAutoLayout(true)
self.SetSizer(topSizer)
topSizer.Fit(self)
EVT_RADIOBUTTON(self, self.ID_RADIO_CHOICE, self.OnRadioChoice)
def SetStringSelection(self, value):
self.value = None
for i in self.choices:
w = self.FindWindowByName(i)
w.SetValue(i == value)
self.value = value
def OnRadioChoice(self, evt):
if not self.value: # procedure call
evt.Skip()
return
self.FindWindowByName(self.value).SetValue(false)
self.value = evt.GetEventObject().GetName()
panel.SetModified(true)
def GetStringSelection(self):
return self.value
class ParamBool(RadioBox):
values = {'yes': '1', 'no': '0'}
seulav = {'1': 'yes', '0': 'no'}
def __init__(self, parent, id, value, size, name, param):
RadioBox.__init__(self, parent, id, choices = self.values.keys(), name=name)
Register(param, self)
self.SetValue(value)
def GetValue(self):
return self.values[self.GetStringSelection()]
def SetValue(self, value):
if not value: value = '1'
self.SetStringSelection(self.seulav[value])
class ParamOrient(RadioBox):
values = {'horizontal': 'wxHORIZONTAL', 'vertical': 'wxVERTICAL'}
seulav = {'wxHORIZONTAL': 'horizontal', 'wxVERTICAL': 'vertical'}
def __init__(self, parent, id, value, size, name, param):
RadioBox.__init__(self, parent, id, choices = self.values.keys(), name=name)
Register(param, self)
self.SetValue(value)
def GetValue(self):
return self.values[self.GetStringSelection()]
def SetValue(self, value):
if not value: value = 'wxHORIZONTAL'
self.SetStringSelection(self.seulav[value])
paramDict = {
'flag': ParamFlag,
'style': ParamStyle,
'pos': ParamPosSize, 'size': ParamPosSize,
'border': ParamInt, 'cols': ParamInt, 'rows': ParamInt,
'vgap': ParamInt, 'hgap': ParamInt,
'checkable': ParamBool, 'accel': ParamAccel,
'label': ParamText, 'title': ParamText, 'value': ParamText,
'content': ParamContent, 'selection': ParamInt,
'min': ParamInt, 'max': ParamInt,
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,89 @@
<?xml version="1.0" ?>
<resource>
<object class="wxDialog" name="ID_DIALOG_CONTENT">
<title>Content</title>
<size>250,300</size>
<object class="wxBoxSizer">
<orient>wxVERTICAL</orient>
<object class="sizeritem">
<object class="wxBoxSizer">
<orient>wxHORIZONTAL</orient>
<object class="sizeritem">
<object class="wxListBox" name="ID_LIST">
<content/>
</object>
<option>1</option>
<flag>wxTOP|wxBOTTOM|wxLEFT|wxEXPAND</flag>
<border>5</border>
</object>
<object class="sizeritem">
<object class="wxBoxSizer">
<orient>wxVERTICAL</orient>
<object class="sizeritem">
<object class="wxButton" name="ID_BUTTON_UP">
<label>Move Up</label>
</object>
<flag>wxBOTTOM</flag>
<border>5</border>
</object>
<object class="sizeritem">
<object class="wxButton" name="ID_BUTTON_DOWN">
<label>Move Down</label>
</object>
</object>
<object class="spacer">
<option>1</option>
</object>
<object class="sizeritem">
<object class="wxButton" name="ID_BUTTON_APPEND">
<label>Append...</label>
</object>
<flag>wxBOTTOM</flag>
<border>5</border>
</object>
<object class="sizeritem">
<object class="wxButton" name="ID_BUTTON_REMOVE">
<label>Remove</label>
</object>
</object>
</object>
<flag>wxALL|wxEXPAND</flag>
<border>5</border>
</object>
</object>
<option>1</option>
<flag>wxEXPAND</flag>
</object>
<object class="sizeritem">
<object class="wxStaticLine">
</object>
<flag>wxEXPAND</flag>
</object>
<object class="sizeritem">
<object class="wxBoxSizer">
<orient>wxHORIZONTAL</orient>
<object class="sizeritem">
<object class="wxButton" name="wxID_OK">
<label>OK</label>
<default>1</default>
</object>
<flag>wxRIGHT</flag>
<border>10</border>
</object>
<object class="sizeritem">
<object class="wxButton" name="wxID_CANCEL">
<label>Cancel</label>
</object>
</object>
</object>
<flag>wxALL|wxALIGN_CENTRE_HORIZONTAL</flag>
<border>10</border>
</object>
</object>
</object>
</resource>

507
wxPython/tools/XRCed/xxx.py Normal file
View File

@@ -0,0 +1,507 @@
# Name: xxx.py (xxx is easy to distinguish from 'wx' :) )
# Purpose: XML interface classes
# Author: Roman Rolinsky <rolinsky@mema.ucl.ac.be>
# Created: 22.08.2001
from wxPython.wx import *
from wxPython.xrc import *
from xml.dom import minidom
import wxPython.lib.wxpTag
from params import *
# Classes to interface DOM objects
class xxxObject:
# Param ids for controls
ID_CHECK_PARAMS = wxNewId()
ID_TEXT_PARAMS = wxNewId()
# Default behavior
hasChildren = false # has children elements?
hasName = true # has name attribute?
isSizer = hasChild = false
# Required paremeters: none by default
required = []
# Default parameters with default values
default = {}
# Parameter types
paramDict = {}
# Additional styles
styles = []
# Tree icon index
image = -1
# Construct a new xxx object from DOM element
# parent is parent xxx object (or None if none), element is DOM element object
def __init__(self, parent, element):
self.parent = parent
self.element = element
self.undo = None
# Get attributes
self.className = element.getAttribute('class')
if self.hasName: self.name = element.getAttribute('name')
# Set parameters (text element children)
self.params = {}
nodes = element.childNodes[:]
for node in nodes:
if node.nodeType == minidom.Node.ELEMENT_NODE:
if node.tagName == 'object':
continue # do nothing for object children here
if not node.tagName in self.allParams:
print 'WARNING: unknown parameter for %s: %s' % \
(self.className, node.tagName)
if node.tagName == 'content': # has items
# Param value is a list of text nodes
l = []
nodes = node.childNodes[:]
for n in nodes:
if n.nodeType == minidom.Node.ELEMENT_NODE:
assert n.tagName == 'item', 'bad content content'
if not n.hasChildNodes():
# If does not have child nodes, create empty text node
text = tree.dom.createTextNode('')
node.appendChild(text)
else:
# !!! normalize?
text = n.childNodes[0] # first child must be text node
assert text.nodeType == minidom.Node.TEXT_NODE
l.append(text)
else:
node.removeChild(n)
n.unlink()
self.params[node.tagName] = l
else: # simple parameter
if not node.hasChildNodes():
# If does not have child nodes, create empty text node
text = tree.dom.createTextNode('')
node.appendChild(text)
else:
text = node.childNodes[0] # first child must be text node
assert text.nodeType == minidom.Node.TEXT_NODE
self.params[node.tagName] = text
else:
# Remove all other nodes
element.removeChild(node)
node.unlink()
# Generate HTML
def generateHtml(self, prefix=''):
SetCurrentXXX(self)
html = '<table cellspacing=0 cellpadding=0><tr><td width=130>\
<font size="+1"><b>%s</b></font></td>' % self.className
# Has id (name) attribute
if self.hasName:
html += """\
<td><wxp module="xxx" class="ParamText" width=150>
<param name="id" value="%d">
<param name="name" value="text_name">
<param name="value" value='("%s")'>
<param name="param" value="name">
</wxp></td>""" % (self.ID_TEXT_PARAMS, self.name)
html += '</table><p>'
html += '<table cellspacing=0 cellpadding=0>\n'
# Add required parameters
for param in self.allParams:
# Add checkbox or just text
if param in self.required:
html += '<tr><td width=25></td><td width=110>%s: </td>' % param
else: # optional parameter
html += """\
<tr><td width=20><wxp class="wxCheckBox">
<param name="id" value="%d">
<param name="size" value="(20,-1)">
<param name="name" value="check_%s">
<param name="label" value=("")>
</wxp></td><td width=110>%s: </td>
""" % (self.ID_CHECK_PARAMS, param, param + '&nbsp;')
# Add value part
if self.params.has_key(param):
if param == 'content':
l = []
for text in self.params[param]:
l.append(str(text.data)) # convert from unicode
value = str(l)
else:
value = "('" + self.params[param].data + "')"
else:
value = "('')"
# Get parameter type
try:
# Local or overriden type
typeClass = self.paramDict[param].__name__
except KeyError:
try:
# Standart type
typeClass = paramDict[param].__name__
except KeyError:
# Default
typeClass = 'ParamText'
html += """\
<td><wxp module="xxx" class="%s">
<param name="id" value="%d">
<param name="name" value="text_%s">
<param name="value" value="%s">
<param name="param" value="%s">
</wxp></td>
""" % (typeClass, self.ID_TEXT_PARAMS,
prefix + param, value, prefix + param)
html += '</table>\n'
return html
# Returns real tree object
def treeObject(self):
if self.hasChild: return self.child
return self
# Returns tree image index
def treeImage(self):
if self.hasChild: return self.child.treeImage()
return self.image
# Class name plus wx name
def treeName(self):
if self.hasChild: return self.child.treeName()
if self.hasName and self.name: return self.className + ' "' + self.name + '"'
return self.className
################################################################################
class xxxContainer(xxxObject):
hasChildren = true
################################################################################
# Top-level windwos
class xxxPanel(xxxContainer):
allParams = ['pos', 'size', 'style']
class xxxDialog(xxxContainer):
allParams = ['title', 'pos', 'size', 'style']
required = ['title']
styles = ['wxDIALOG_MODAL', 'wxCAPTION', 'wxDEFAULT_DIALOG_STYLE',
'wxRESIZE_BORDER', 'wxSYSTEM_MENU', 'wxTHICK_FRAME', 'wxSTAY_ON_TOP']
class xxxFrame(xxxContainer):
allParams = ['title', 'centered', 'pos', 'size', 'style']
paramDict = {'centered': ParamBool}
required = ['title']
styles = ['wxDEFAULT_FRAME_STYLE', 'wxICONIZE', 'wxCAPTION', 'wxMINIMIZE',
'wxICONIZE', 'wxMINIMIZE_BOX', 'wxMAXIMIZE', 'wxMAXIMIZE_BOX',
'wxSTAY_ON_TOP', 'wxSYSTEM_MENU', 'wxRESIZE_BORDER',
'wxFRAME_FLOAT_ON_PARENT', 'wxFRAME_TOOL_WINDOW']
################################################################################
# Controls
class xxxStaticText(xxxObject):
allParams = ['label', 'pos', 'size', 'style']
required = ['label']
styles = ['wxALIGN_LEFT', 'wxALIGN_RIGHT', 'wxALIGN_CENTRE', 'wxST_NO_AUTORESIZE']
class xxxStaticLine(xxxObject):
allParams = ['pos', 'size', 'style']
styles = ['wxLI_HORIZONTAL', 'wxLI_VERTICAL']
class xxxTextCtrl(xxxObject):
allParams = ['value', 'pos', 'size', 'style']
styles = ['wxTE_PROCESS_ENTER', 'wxTE_PROCESS_TAB', 'wxTE_MULTILINE',
'wxTE_PASSWORD', 'wxTE_READONLY']
class xxxChoice(xxxObject):
allParams = ['content', 'selection', 'pos', 'size', 'style']
required = ['content']
class xxxSlider(xxxObject):
allParams = ['value', 'min', 'max', 'pos', 'size', 'style',
'tickfreq', 'pagesize', 'linesize', 'thumb', 'tick',
'selmin', 'selmax']
paramDict = {'value': ParamInt, 'tickfreq': ParamInt, 'pagesize': ParamInt,
'linesize': ParamInt, 'thumb': ParamInt, 'thumb': ParamInt,
'tick': ParamInt, 'selmin': ParamInt, 'selmax': ParamInt}
required = ['value', 'min', 'max']
styles = ['wxSL_HORIZONTAL', 'wxSL_VERTICAL', 'wxSL_AUTOTICKS', 'wxSL_LABELS',
'wxSL_LEFT', 'wxSL_RIGHT', 'wxSL_TOP', 'wxSL_SELRANGE']
class xxxGauge(xxxObject):
allParams = ['range', 'pos', 'size', 'style', 'value', 'shadow', 'bezel']
paramDict = {'range': ParamInt, 'value': ParamInt,
'shadow': ParamInt, 'bezel': ParamInt}
styles = ['wxGA_HORIZONTAL', 'wxGA_VERTICAL', 'wxGA_PROGRESSBAR', 'wxGA_SMOOTH']
class xxxScrollBar(xxxObject):
allParams = ['pos', 'size', 'style', 'value', 'thumbsize', 'range', 'pagesize']
paramDict = {'value': ParamInt, 'range': ParamInt, 'thumbsize': ParamInt,
'pagesize': ParamInt}
styles = ['wxSB_HORIZONTAL', 'wxSB_VERTICAL']
class xxxListCtrl(xxxObject):
allParams = ['pos', 'size', 'style']
styles = ['wxLC_LIST', 'wxLC_REPORT', 'wxLC_ICON', 'wxLC_SMALL_ICON',
'wxLC_ALIGN_TOP', 'wxLC_ALIGN_LEFT', 'wxLC_AUTOARRANGE',
'wxLC_USER_TEXT', 'wxLC_EDIT_LABELS', 'wxLC_NO_HEADER',
'wxLC_SINGLE_SEL', 'wxLC_SORT_ASCENDING', 'wxLC_SORT_DESCENDING']
# !!! temporary
xxxCheckList = xxxListCtrl
class xxxTreeCtrl(xxxObject):
allParams = ['pos', 'size', 'style']
styles = ['wxTR_HAS_BUTTONS', 'wxTR_NO_LINES', 'wxTR_LINES_AT_ROOT',
'wxTR_EDIT_LABELS', 'wxTR_MULTIPLE']
class xxxHtmlWindow(xxxObject):
allParams = ['pos', 'size', 'style', 'borders', 'url', 'htmlcode']
paramDict = {'borders': ParamInt}
styles = ['wxHW_SCROLLBAR_NEVER', 'wxHW_SCROLLBAR_AUTO']
class xxxCalendar(xxxObject):
allParams = ['pos', 'size', 'style']
class xxxNotebook(xxxContainer):
allParams = ['usenotebooksizer', 'pos', 'size', 'style']
paramDict = {'usenotebooksizer': ParamBool}
styles = ['wxNB_FIXEDWIDTH', 'wxNB_LEFT', 'wxNB_RIGHT', 'wxNB_BOTTOM']
################################################################################
# Buttons
class xxxButton(xxxObject):
allParams = ['label', 'default', 'pos', 'size', 'style']
paramDict = {'default': ParamBool}
required = ['label']
styles = ['wxBU_LEFT', 'wxBU_TOP', 'wxBU_RIGHT', 'wxBU_BOTTOM']
class xxxBitmapButton(xxxObject):
allParams = ['bitmap', 'selected', 'focus', 'disabled', 'default',
'pos', 'size', 'style']
required = ['bitmap']
styles = ['wxBU_LEFT', 'wxBU_TOP', 'wxBU_RIGHT', 'wxBU_BOTTOM']
class xxxRadioButton(xxxObject):
allParams = ['label', 'value', 'pos', 'size', 'style']
paramDict = {'value': ParamBool}
required = ['label']
styles = ['wxRB_GROUP']
class xxxSpinButton(xxxObject):
allParams = ['pos', 'size', 'style']
styles = ['wxSP_HORIZONTAL', 'wxSP_VERTICAL', 'wxSP_ARROW_KEYS', 'wxSP_WRAP']
################################################################################
# Boxes
class xxxStaticBox(xxxObject):
allParams = ['label', 'pos', 'size', 'style']
required = ['label']
class xxxRadioBox(xxxObject):
allParams = ['label', 'content', 'selection', 'dimension', 'pos', 'size', 'style']
paramDict = {'dimension': ParamInt}
required = ['label', 'content']
styles = ['wxRA_SPECIFY_ROWS', 'wxRA_SPECIFY_COLS']
class xxxCheckBox(xxxObject):
allParams = ['label', 'pos', 'size', 'style']
required = ['label']
class xxxComboBox(xxxObject):
allParams = ['content', 'selection', 'value', 'pos', 'size', 'style']
required = ['content']
styles = ['wxCB_SIMPLE', 'wxCB_DROPDOWN', 'wxCB_READONLY', 'wxCB_DROPDOWN',
'wxCB_SORT']
class xxxListBox(xxxObject):
allParams = ['content', 'selection', 'pos', 'size', 'style']
required = ['content']
styles = ['wxLB_SINGLE', 'wxLB_MULTIPLE', 'wxLB_EXTENDED', 'wxLB_HSCROLL',
'wxLB_ALWAYS_SB', 'wxLB_NEEDED_SB', 'wxLB_SORT']
################################################################################
# Sizers
class xxxSizer(xxxContainer):
hasName = false
paramDict = {'orient': ParamOrient}
isSizer = true
class xxxBoxSizer(xxxSizer):
allParams = ['orient']
required = ['orient']
default = {'orient': 'wxVERTICAL'}
# Tree icon depends on orientation
def treeImage(self):
if self.params['orient'].data == 'wxHORIZONTAL': return self.imageH
else: return self.imageV
class xxxStaticBoxSizer(xxxBoxSizer):
allParams = ['label', 'orient']
required = ['label', 'orient']
default = {'orient': 'wxVERTICAL'}
class xxxGridSizer(xxxSizer):
allParams = ['cols', 'rows', 'vgap', 'hgap']
required = ['cols']
default = {'cols': '2', 'rows': '2'}
class xxxFlexGridSizer(xxxGridSizer):
pass
# Container with only one child.
# Not shown in tree.
class xxxChildContainer(xxxObject):
# Special param ids
ID_CHECK_PARAMS = wxNewId()
ID_TEXT_PARAMS = wxNewId()
hasName = false
hasChild = true
def __init__(self, parent, element):
xxxObject.__init__(self, parent, element)
# Must have one child with 'object' tag, but we don't check it
nodes = element.childNodes[:] # create copy
for node in nodes:
if node.nodeType == minidom.Node.ELEMENT_NODE:
if node.tagName == 'object':
# Create new xxx object for child node
self.child = MakeXXXFromDOM(self, node)
self.child.parent = parent
# Copy hasChildren and isSizer attributes
self.hasChildren = self.child.hasChildren
self.isSizer = self.child.isSizer
return # success
else:
element.removeChild(node)
node.unlink()
assert 0, 'no child found'
def generateHtml(self):
return xxxObject.generateHtml(self, '_') + '<hr>\n' + \
self.child.generateHtml()
class xxxSizerItem(xxxChildContainer):
allParams = ['option', 'flag', 'border']
paramDict = {'option': ParamInt}
def __init__(self, parent, element):
xxxChildContainer.__init__(self, parent, element)
# Remove pos parameter - unnecessary for sizeritems
if 'pos' in self.child.allParams:
self.child.allParams = self.child.allParams[:]
self.child.allParams.remove('pos')
class xxxNotebookPage(xxxChildContainer):
allParams = ['label', 'selected']
paramDict = {'selected': ParamBool}
required = ['label']
def __init__(self, parent, element):
xxxChildContainer.__init__(self, parent, element)
# pos and size dont matter for notebookpages
if 'pos' in self.child.allParams:
self.child.allParams = self.child.allParams[:]
self.child.allParams.remove('pos')
if 'size' in self.child.allParams:
self.child.allParams = self.child.allParams[:]
self.child.allParams.remove('size')
class xxxSpacer(xxxObject):
hasName = false
allParams = ['size', 'option', 'flag', 'border']
paramDict = {'option': ParamInt}
default = {'size': '0,0'}
class xxxMenuBar(xxxContainer):
allParams = []
class xxxMenu(xxxContainer):
allParams = ['label']
default = {'label': ''}
class xxxMenuItem(xxxObject):
allParams = ['checkable', 'label', 'accel', 'help']
default = {'label': ''}
class xxxSeparator(xxxObject):
hasName = false
allParams = []
xxxDict = {
'wxPanel': xxxPanel,
'wxDialog': xxxDialog,
'wxFrame': xxxFrame,
'wxButton': xxxButton,
'wxBitmapButton': xxxBitmapButton,
'wxRadioButton': xxxRadioButton,
'wxSpinButton': xxxSpinButton,
'wxStaticBox': xxxStaticBox,
'wxRadioBox': xxxRadioBox,
'wxComboBox': xxxComboBox,
'wxCheckBox': xxxCheckBox,
'wxListBox': xxxListBox,
'wxStaticText': xxxStaticText,
'wxStaticLine': xxxStaticLine,
'wxTextCtrl': xxxTextCtrl,
'wxChoice': xxxChoice,
'wxSlider': xxxSlider,
'wxGauge': xxxGauge,
'wxScrollBar': xxxScrollBar,
'wxTreeCtrl': xxxTreeCtrl,
'wxListCtrl': xxxListCtrl,
'wxCheckList': xxxCheckList,
'wxNotebook': xxxNotebook,
'notebookpage': xxxNotebookPage,
'wxHtmlWindow': xxxHtmlWindow,
'wxCalendar': xxxCalendar,
'wxBoxSizer': xxxBoxSizer,
'wxStaticBoxSizer': xxxStaticBoxSizer,
'wxGridSizer': xxxGridSizer,
'wxFlexGridSizer': xxxFlexGridSizer,
'sizeritem': xxxSizerItem,
'spacer': xxxSpacer,
'wxMenuBar': xxxMenuBar,
'wxMenu': xxxMenu,
'wxMenuItem': xxxMenuItem,
'separator': xxxSeparator,
}
# Helper functions
# Test for object elements
def IsObject(node):
return node.nodeType == minidom.Node.ELEMENT_NODE and node.tagName == 'object'
# Make XXX object from some DOM object, selecting correct class
def MakeXXXFromDOM(parent, element):
return xxxDict[element.getAttribute('class')](parent, element)
# Make empty DOM element
def MakeEmptyDOM(className):
elem = tree.dom.createElement('object')
elem.setAttribute('class', className)
# Set required and default parameters
xxxClass = xxxDict[className]
defaultNotRequired = filter(lambda x, l=xxxClass.required: x not in l,
xxxClass.default.keys())
for param in xxxClass.required + defaultNotRequired:
textElem = tree.dom.createElement(param)
try:
textNode = tree.dom.createTextNode(xxxClass.default[param])
except KeyError:
textNode = tree.dom.createTextNode('')
textElem.appendChild(textNode)
elem.appendChild(textElem)
return elem
# Make empty XXX object
def MakeEmptyXXX(parent, className):
# Make corresponding DOM object first
elem = MakeEmptyDOM(className)
# If parent is a sizer, we should create sizeritem object, except for spacers
if parent:
if parent.isSizer and className != 'spacer':
sizerItemElem = MakeEmptyDOM('sizeritem')
sizerItemElem.appendChild(elem)
elem = sizerItemElem
elif isinstance(parent, xxxNotebook):
pageElem = MakeEmptyDOM('notebookpage')
pageElem.appendChild(elem)
elem = pageElem
# Now just make object
return MakeXXXFromDOM(parent, elem)