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:
19
wxPython/tools/XRCed/CHANGES
Normal file
19
wxPython/tools/XRCed/CHANGES
Normal 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.
|
||||
|
60
wxPython/tools/XRCed/README
Normal file
60
wxPython/tools/XRCed/README
Normal 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
28
wxPython/tools/XRCed/TODO
Normal 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
|
||||
|
286
wxPython/tools/XRCed/images.py
Normal file
286
wxPython/tools/XRCed/images.py
Normal 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())
|
||||
|
317
wxPython/tools/XRCed/params.py
Normal file
317
wxPython/tools/XRCed/params.py
Normal 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,
|
||||
}
|
1325
wxPython/tools/XRCed/xrced.py
Normal file
1325
wxPython/tools/XRCed/xrced.py
Normal file
File diff suppressed because it is too large
Load Diff
89
wxPython/tools/XRCed/xrced.xrc
Normal file
89
wxPython/tools/XRCed/xrced.xrc
Normal 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
507
wxPython/tools/XRCed/xxx.py
Normal 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 + ' ')
|
||||
# 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)
|
||||
|
Reference in New Issue
Block a user