This commit was manufactured by cvs2svn to create tag 'M_STABLE'.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/tags/M_STABLE@40387 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Bryan Petty
2006-07-30 23:36:38 +00:00
parent 6a06841c34
commit 9aea121b6c
4223 changed files with 1680500 additions and 3876 deletions

View File

@@ -0,0 +1,42 @@
0.0.6
-----
Toolbar, bitmap, icon support (no display yet).
Changed parameter objects, added support for multiple parameters (like
`growablecols').
Fixed double-clicking problem with tree control on Windows.
Some performance improovements.
0.0.5
-----
Added notebook with properties page and style page. Fixed some problems
on Windows.
0.0.4
-----
Some fixes suggested by RD
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>

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

@@ -0,0 +1,33 @@
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
* disable some window creation when it's not valid
* check for memory leaks from wx objects
* style defaults for `hidde' and `focused' should be false

View File

@@ -0,0 +1,350 @@
#----------------------------------------------------------------------
# This file was generated by img2py.py
#
from wxPython.wx import wxBitmapFromXPMData, wxImageFromBitmap
import cPickle, zlib
def getIconData():
return cPickle.loads(zlib.decompress(
'x\xda\x9d\x90\xbb\x0e\xc20\x0cEw\xbe\xc2\x12C\x91"Y-\xa2\x82\xd1\x80\xd45C\
\x97\xac\x88\x11\xa4\xf0\xff\x13\xd7Nh\xa0\xcd\x00\xb8y\xf4\xe6\xf8\x95l\xee\
\x8fn56\xdb\x1da\xec\xa9kV\x97\xb1\tt\xa5\xd3\xfdr\xbd\x99b\xa8\xf5\xf1\xa0\
\x9fi\xa7\xba\x85\rI\xcb\x8bg\x1dU\xf7m\xbf\xeb[\xd3\xfe\xa53\'\xd5\xc3a8O\
\xban_@\x0eL10\x07X\xc4iL[\x8e\x8c\x81 \xe1\xc3\xea\x17\xd4/NPct\x85{0N\xcc\
\xa5f\xb4\x83\x94\xd6|\xde\x1b\xb2"\x9a\x16\x05\xe6\x10\x81\x08\xe5\x9cZ\x1d\
K\xcd\xd4\xed\x04-}\xb9\n\n\x12\xdb\xb0\x99\x0e\xe8\x8f\x17\xf2N~\x81\xe2}"^\
\x16\xd0;\x18\xce\x9c\xcb?oP\x9c\xc7t\xf0\xb1\xfd\x13Z&,9z\x0eS:\x04/\x1bB:\
\x81Q\x15jM4Z\xaf\x99\xba\xf4\xf5n\xed\x9e\x92\xef)B\x7f\xbem\x81\xfc\x04\
\x8f\xd5\x99\xcc' ))
def getIconBitmap():
return wxBitmapFromXPMData(getIconData())
def getIconImage():
return wxImageFromBitmap(getIconBitmap())
#----------------------------------------------------------------------
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 getTreeDefaultData():
return cPickle.loads(zlib.decompress(
"x\xda\xd3\xc8)0\xe4\nV74S04Q0U0T\xe7J\x0cV\x8fPHVp\xcaIL\xce\x06\xf3\xfc\
\x81<eK\x03K\x13K\x030_\x01\xc8\xf7\xcb\xcfK\x05s\xf4@\x92n\x16n\xcen\x16`~>\
\x88\xefb\xe0b\xe2\x02S\x8c\n\xc8\x10\xd4\x83\x80\x08T\xc1|\x10\xf0\xa7\xae\
\xa0?\x18\xa0\nF@\x01\x99\x8e'FP\x0f\x00\xdc\x1bL7" ))
def getTreeDefaultBitmap():
return wxBitmapFromXPMData(getTreeDefaultData())
def getTreeDefaultImage():
return wxImageFromBitmap(getTreeDefaultBitmap())
#----------------------------------------------------------------------
def getTreeRootData():
return cPickle.loads(zlib.decompress(
'x\xda\xd3\xc8)0\xe4\nV74S04Q0V0T\xe7J\x0cV\xd7SHVp\xcaIL\xce\x06\xf3"\x80<e\
c\x0b\x10\x04\xf3\x15\x80|\xbf\xfc\xbcT(\x07\x15 \x04\xf5\x80\x00Y0\x02\x080\
\x04\x15"\xb0i\x8f\x80\xe9\x87\xa8\x86\n\xc2\xf4\xa3\x08\x0e\xa8v\x9c~G\x15\
\xd4\x03\x00\x87\xa5@\xc2' ))
def getTreeRootBitmap():
return wxBitmapFromXPMData(getTreeRootData())
def getTreeRootImage():
return wxImageFromBitmap(getTreeRootBitmap())
#----------------------------------------------------------------------
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 getTreeToolBarData():
return cPickle.loads(zlib.decompress(
'x\xda\xd3\xc8)0\xe4\nV74S\x00"\x0b\x05Cu\xae\xc4`\xf5\x08\x85d\x05\xa7\x9c\
\xc4\xe4l0\xcf\x1f\xc8S\xb64\xb04\xb14\x00\xf3\x1d@|7\x0b7g\x03\x08_\x19\xc4\
70\x80\xf3\x15\x80|\xbf\xfc\xbcT0G\x0f\xa6\xd8\xcd\x02\xcc\xd7\x86\xf0\r\x0c\
\xa0\x8a\xf3A|\x17\x03\x17\x13\x17\x98fT@\rA=T\x10\x01\x11\xccG\x06\xfe0Am\
\xed\x88|\x07\x87\x88|e\xe5\x08\x02\x82\x11\x11\x11p\xec\x8f\xc7L\x7fT\x00\
\x11\x8c@\x034\xf2\xbb\x1e\x00\x1c\x05j\x12' ))
def getTreeToolBarBitmap():
return wxBitmapFromXPMData(getTreeToolBarData())
def getTreeToolBarImage():
return wxImageFromBitmap(getTreeToolBarBitmap())
#----------------------------------------------------------------------
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,535 @@
# Name: params.py
# Purpose: Classes for parameter introduction
# Author: Roman Rolinsky <rolinsky@mema.ucl.ac.be>
# Created: 22.08.2001
# RCS-ID: $Id$
from wxPython.wx import *
from wxPython.xrc import *
import string
import os.path
# Object which is currently processed
currentXXX = None
def SetCurrentXXX(xxx):
global currentXXX
currentXXX = xxx
genericStyles = ['wxSIMPLE_BORDER', 'wxDOUBLE_BORDER',
'wxSUNKEN_BORDER', 'wxRAISED_BORDER',
'wxSTATIC_BORDER', 'wxNO_BORDER',
'wxTRANSPARENT_WINDOW', 'wxWANTS_CHARS',
'wxNO_FULL_REPAINT_ON_RESIZE']
# Class that can properly disable children
class PPanel(wxPanel):
def __init__(self, parent, id, name):
wxPanel.__init__(self, parent, id, name=name)
self.modified = self.freeze = false
def Enable(self, value):
# Something strange is going on with enable so we make sure...
for w in self.GetChildren():
w.Enable(value)
wxPanel.Enable(self, value)
def SetModified(self):
self.modified = true
panel.SetModified(true)
class ParamBinaryOr(PPanel):
def __init__(self, parent, id, size, name):
PPanel.__init__(self, parent, id, name)
self.ID_TEXT_CTRL = wxNewId()
self.ID_BUTTON_CHOICES = wxNewId()
self.SetBackgroundColour(panel.GetBackgroundColour())
sizer = wxBoxSizer()
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 10)
self.button = wxButton(self, self.ID_BUTTON_CHOICES, 'Edit...')
sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
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):
if self.freeze: return
self.SetModified()
evt.Skip()
def GetValue(self):
return self.text.GetValue()
def SetValue(self, value):
self.freeze = true
self.text.SetValue(value)
self.freeze = false
def OnButtonChoices(self, evt):
dlg = wxDialog(self, -1, 'Choices')
topSizer = wxBoxSizer(wxVERTICAL)
listBox = wxCheckListBox(dlg, -1, choices=self.values, size=(250,200))
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 'WARNING: 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)
topSizer.Fit(dlg)
dlg.Center()
if dlg.ShowModal() == wxID_OK:
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))
self.SetModified()
dlg.Destroy()
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, size, name):
ParamBinaryOr.__init__(self, parent, id, size, name)
class ParamStyle(ParamBinaryOr):
equal = {'wxALIGN_CENTER': 'wxALIGN_CENTRE'}
def __init__(self, parent, id = -1, size = wxDefaultSize, name = ''):
self.values = currentXXX.winStyles + genericStyles
ParamBinaryOr.__init__(self, parent, id, size, name)
class ParamNonGenericStyle(ParamBinaryOr):
def __init__(self, parent, id = -1, size = wxDefaultSize, name = ''):
self.values = currentXXX.winStyles
ParamBinaryOr.__init__(self, parent, id, size, name)
class ParamExStyle(ParamBinaryOr):
def __init__(self, parent, id = -1, size = wxDefaultSize, name = ''):
if currentXXX:
self.values = currentXXX.exStyles # constant at the moment
else:
self.values = []
ParamBinaryOr.__init__(self, parent, id, size, name)
class ParamColour(PPanel):
def __init__(self, parent, id = -1, size = wxDefaultSize, name = ''):
PPanel.__init__(self, parent, id, name)
self.ID_TEXT_CTRL = wxNewId()
self.ID_BUTTON = wxNewId()
self.SetBackgroundColour(panel.GetBackgroundColour())
sizer = wxBoxSizer()
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(60,-1))
sizer.Add(self.text, 0, wxRIGHT, 10)
self.button = wxPanel(self, self.ID_BUTTON, wxDefaultPosition, wxSize(40, -1))
sizer.Add(self.button, 0, wxGROW)
self.SetAutoLayout(true)
self.SetSizer(sizer)
sizer.Fit(self)
self.textModified = false
EVT_PAINT(self.button, self.OnPaintButton)
EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
EVT_LEFT_DOWN(self.button, self.OnLeftDown)
def GetValue(self):
return self.value
def SetValue(self, value):
self.freeze = true
if not value: value = '#FFFFFF'
self.value = value
self.text.SetValue(str(value)) # update text ctrl
colour = wxColour(int(value[1:3], 16), int(value[3:5], 16), int(value[5:7], 16))
self.button.SetBackgroundColour(colour)
self.button.Refresh()
self.freeze = false
def OnChange(self, evt):
if self.freeze: return
self.SetModified()
self.textModified = true
evt.Skip()
def OnPaintButton(self, evt):
dc = wxPaintDC(self.button)
dc.SetBrush(wxTRANSPARENT_BRUSH)
if self.IsEnabled(): dc.SetPen(wxBLACK_PEN)
else: dc.SetPen(wxGREY_PEN)
size = self.button.GetSize()
dc.DrawRectangle(0, 0, size.x, size.y)
def OnLeftDown(self, evt):
dlg = wxColourDialog(self)
if dlg.ShowModal() == wxID_OK:
self.SetValue('#%02X%02X%02X' % dlg.GetColourData().GetColour().Get())
self.SetModified()
self.textModified = false
dlg.Destroy()
################################################################################
# Mapping from wx constants ro XML strings
fontFamiliesWx2Xml = {wxDEFAULT: 'default', wxDECORATIVE: 'decorative',
wxROMAN: 'roman', wxSCRIPT: 'script', wxSWISS: 'swiss',
wxMODERN: 'modern'}
fontStylesWx2Xml = {wxNORMAL: 'normal', wxSLANT: 'slant', wxITALIC: 'italic'}
fontWeightsWx2Xml = {wxNORMAL: 'normal', wxLIGHT: 'light', wxBOLD: 'bold'}
def ReverseMap(m):
rm = {}
for k,v in m.items(): rm[v] = k
return rm
fontFamiliesXml2wx = ReverseMap(fontFamiliesWx2Xml)
fontStylesXml2wx = ReverseMap(fontStylesWx2Xml)
fontWeightsXml2wx = ReverseMap(fontWeightsWx2Xml)
class ParamFont(PPanel):
def __init__(self, parent, id = -1, size = wxDefaultSize, name = ''):
PPanel.__init__(self, parent, id, name)
self.ID_TEXT_CTRL = wxNewId()
self.ID_BUTTON_SELECT = wxNewId()
self.SetBackgroundColour(panel.GetBackgroundColour())
sizer = wxBoxSizer()
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 10)
self.button = wxButton(self, self.ID_BUTTON_SELECT, 'Select...')
sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
self.SetAutoLayout(true)
self.SetSizer(sizer)
sizer.Fit(self)
self.textModified = false
EVT_BUTTON(self, self.ID_BUTTON_SELECT, self.OnButtonSelect)
EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
def OnChange(self, evt):
if self.freeze: return
self.SetModified()
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.freeze = true # disable other handlers
if not value: value = [''] * 7
self.value = value
self.text.SetValue(str(value)) # update text ctrl
self.freeze = false
def OnButtonSelect(self, evt):
if self.textModified: # text has newer value
self.value = eval(self.text.GetValue())
# Make initial font
try: size = int(self.value[0])
except ValueError: size = 12
try: family = fontFamiliesXml2wx[self.value[1]]
except KeyError: family = wxDEFAULT
try: style = fontStylesXml2wx[self.value[2]]
except KeyError: style = wxNORMAL
try: weight = fontWeightsXml2wx[self.value[3]]
except KeyError: weight = wxNORMAL
try: underlined = int(self.value[4])
except ValueError: underlined = 0
face = self.value[5]
mapper = wxFontMapper()
enc = wxFONTENCODING_DEFAULT
if not self.value[6]: enc = mapper.CharsetToEncoding(self.value[6])
if enc == wxFONTENCODING_DEFAULT: enc = wxFONTENCODING_SYSTEM
font = wxFont(size, family, style, weight, underlined, face, enc)
data = wxFontData()
data.SetInitialFont(font)
dlg = wxFontDialog(self, data)
if dlg.ShowModal() == wxID_OK:
font = dlg.GetFontData().GetChosenFont()
value = [str(font.GetPointSize()), fontFamiliesWx2Xml[font.GetFamily()],
fontStylesWx2Xml[font.GetStyle()],
fontWeightsWx2Xml[font.GetWeight()],
str(font.GetUnderlined()), font.GetFaceName(),
wxFontMapper_GetEncodingName(font.GetEncoding())]
# Add ignored flags
self.SetValue(value)
self.SetModified()
self.textModified = false
dlg.Destroy()
################################################################################
class ParamInt(PPanel):
def __init__(self, parent, id = -1, size = wxDefaultSize, name = ''):
PPanel.__init__(self, parent, id, name)
self.ID_SPIN_CTRL = wxNewId()
sizer = wxBoxSizer()
self.spin = wxSpinCtrl(self, self.ID_SPIN_CTRL, size=wxSize(50,-1))
self.SetBackgroundColour(panel.GetBackgroundColour())
sizer.Add(self.spin)
self.SetAutoLayout(true)
self.SetSizer(sizer)
sizer.Fit(self)
EVT_SPINCTRL(self, self.ID_SPIN_CTRL, self.OnChange)
def GetValue(self):
return str(self.spin.GetValue())
def SetValue(self, value):
self.freeze = true
if not value: value = 0
self.spin.SetValue(int(value))
self.freeze = false
def OnChange(self, evt):
if self.freeze: return
self.SetModified()
evt.Skip()
class ParamText(PPanel):
def __init__(self, parent, id = -1, size = wxDefaultSize, name = '', textWidth=200):
PPanel.__init__(self, parent, id, name)
self.ID_TEXT_CTRL = wxNewId()
# We use sizer even here to have the same size of text control
sizer = wxBoxSizer()
self.SetBackgroundColour(panel.GetBackgroundColour())
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(textWidth,-1))
sizer.Add(self.text, 0, wxALIGN_CENTER_VERTICAL)
self.SetAutoLayout(true)
self.SetSizer(sizer)
sizer.Fit(self)
EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
def GetValue(self):
return self.text.GetValue()
def SetValue(self, value):
self.freeze = true # disable other handlers
self.text.SetValue(value)
self.freeze = false # disable other handlers
def OnChange(self, evt):
if self.freeze: return
self.SetModified()
evt.Skip()
class ParamAccel(ParamText):
def __init__(self, parent, id = -1, size = wxDefaultSize, name = ''):
ParamText.__init__(self, parent, id, size, name, 50)
class ParamPosSize(ParamText):
def __init__(self, parent, id = -1, size = wxDefaultSize, name = ''):
ParamText.__init__(self, parent, id, size, name, 80)
class ContentDialog(wxDialog):
def __init__(self, parent, value):
#wxPreDialog(self)
# 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)
self.SetAutoLayout(true)
# !!! self.SetSizer(sizer)
self.GetSizer().Fit(self)
# 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() != -1 and \
self.list.GetSelection() < self.list.Number() - 1)
class ParamContent(PPanel):
def __init__(self, parent, id = -1, size = wxDefaultSize, name = ''):
PPanel.__init__(self, parent, id, name)
self.ID_TEXT_CTRL = wxNewId()
self.ID_BUTTON_EDIT = wxNewId()
self.SetBackgroundColour(panel.GetBackgroundColour())
sizer = wxBoxSizer()
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 10)
self.button = wxButton(self, self.ID_BUTTON_EDIT, 'Edit...')
sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
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):
if self.freeze: return
self.SetModified()
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.freeze = true
self.value = value
self.text.SetValue(str(value)) # update text ctrl
self.freeze = false
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:
value = []
for i in range(dlg.list.Number()):
value.append(dlg.list.GetString(i))
# Add ignored flags
self.SetValue(value)
self.SetModified()
self.textModified = false
dlg.Destroy()
# Boxless radiobox
class RadioBox(PPanel):
def __init__(self, parent, id, choices,
pos=wxDefaultPosition, size=wxDefaultSize, name='radiobox'):
PPanel.__init__(self, parent, id, name)
self.SetBackgroundColour(panel.GetBackgroundColour())
self.choices = choices
topSizer = wxBoxSizer()
for i in choices:
button = wxRadioButton(self, -1, i, name=i)
topSizer.Add(button)
EVT_RADIOBUTTON(self, button.GetId(), self.OnRadioChoice)
self.SetAutoLayout(true)
self.SetSizer(topSizer)
topSizer.Fit(self)
def SetStringSelection(self, value):
self.freeze = true
for i in self.choices:
self.FindWindowByName(i).SetValue(i == value)
self.value = value
self.freeze = false
def OnRadioChoice(self, evt):
if self.freeze: return
if evt.GetSelection():
self.value = evt.GetEventObject().GetName()
self.SetModified()
def GetStringSelection(self):
return self.value
class ParamBool(RadioBox):
values = {'yes': '1', 'no': '0'}
seulav = {'1': 'yes', '0': 'no'}
def __init__(self, parent, id = -1, size = wxDefaultSize, name = ''):
RadioBox.__init__(self, parent, id, choices = self.values.keys(), name=name)
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 = -1, size = wxDefaultSize, name = ''):
RadioBox.__init__(self, parent, id, choices = self.values.keys(), name=name)
def GetValue(self):
return self.values[self.GetStringSelection()]
def SetValue(self, value):
if not value: value = 'wxHORIZONTAL'
self.SetStringSelection(self.seulav[value])
class ParamFile(PPanel):
def __init__(self, parent, id = -1, size = wxDefaultSize, name = ''):
PPanel.__init__(self, parent, id, name)
self.ID_TEXT_CTRL = wxNewId()
self.ID_BUTTON_BROWSE = wxNewId()
self.SetBackgroundColour(panel.GetBackgroundColour())
sizer = wxBoxSizer()
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 10)
self.button = wxButton(self, self.ID_BUTTON_BROWSE, 'Browse...')
sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
self.SetAutoLayout(true)
self.SetSizer(sizer)
sizer.Fit(self)
self.textModified = false
EVT_BUTTON(self, self.ID_BUTTON_BROWSE, self.OnButtonBrowse)
EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
def OnChange(self, evt):
if self.freeze: return
self.SetModified()
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.freeze = true
self.value = value
self.text.SetValue(value) # update text ctrl
self.freeze = false
def OnButtonBrowse(self, evt):
if self.textModified: # text has newer value
self.value = self.text.GetValue()
dlg = wxFileDialog(self,
defaultDir = os.path.abspath(os.path.dirname(self.value)),
defaultFile = os.path.basename(self.value))
if dlg.ShowModal() == wxID_OK:
# Make relative
common = os.path.commonprefix([frame.dataFile, dlg.GetPath()])
self.SetValue(dlg.GetPath()[len(common):])
self.SetModified()
self.textModified = false
dlg.Destroy()
paramDict = {
'flag': ParamFlag,
'style': ParamStyle, 'exstyle': ParamExStyle,
'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,
'fg': ParamColour, 'bg': ParamColour, 'font': ParamFont,
'enabled': ParamBool, 'focused': ParamBool, 'hidden': ParamBool,
'tooltip': ParamText, 'bitmap': ParamFile, 'icon': ParamFile,
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,2 @@
<?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"><size>10,20</size><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"/><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><style>wxRESIZE_BORDER</style></object></resource>

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

@@ -0,0 +1,674 @@
# 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
# RCS-ID: $Id$
from wxPython.wx import *
from wxPython.xrc import *
from xml.dom import minidom
import wxPython.lib.wxpTag
from params import *
# Parameter value class
class xxxParam:
# Standard use: for text nodes
def __init__(self, node):
self.node = node
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.textNode = text
# Value returns string
def value(self):
return str(self.textNode.data)
def update(self, value):
self.textNode.data = value
def remove(self):
self.node.parentNode.removeChild(self.node)
self.node.unlink()
# Content parameter
class xxxParamContent:
def __init__(self, node):
self.node = node
data, l = [], [] # data is needed to quicker value retrieval
nodes = node.childNodes[:] # make a copy of the child list
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)
data.append(text.data)
else: # remove other
node.removeChild(n)
n.unlink()
self.l, self.data = l, data
def value(self):
return self.data
def update(self, value):
# If number if items is not the same, recreate children
if len(value) != len(self.l): # remove first if number of items has changed
for n in self.node.childNodes:
self.node.removeChild(n)
l = []
for str in value:
itemElem = tree.dom.createElement('item')
itemText = tree.dom.createTextNode(str)
itemElem.appendChild(itemText)
self.node.appendChild(itemElem)
l.append(itemText)
else:
for i in range(len(value)):
self.l[i].data = value[i]
self.data = value
################################################################################
# Classes to interface DOM objects
class xxxObject:
# Default behavior
hasChildren = false # has children elements?
hasStyle = true # almost everyone
hasName = true # has name attribute?
isSizer = hasChild = false
# Style parameters (all optional)
styles = ['fg', 'bg', 'font', 'enabled', 'focused', 'hidden', 'tooltip']
# Special parameters
specials = []
# Required paremeters: none by default
required = []
# Default parameters with default values
default = {}
# Parameter types
paramDict = {}
# Window styles and extended styles
winStyles = []
# 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:
tag = node.tagName
if tag == 'object':
continue # do nothing for object children here
if not tag in self.allParams and not tag in self.styles:
print 'WARNING: unknown parameter for %s: %s' % \
(self.className, tag)
elif tag in self.specials:
self.special(tag, node)
elif tag == 'content':
self.params[tag] = xxxParamContent(node)
elif tag == 'font': # has children
self.params[tag] = xxxParamFont(self, node)
else: # simple parameter
self.params[tag] = xxxParam(node)
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=120>\
<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="name" value="data_name">
</wxp></td>"""
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=20></td><td width=100>%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="%s">
<param name="label" value=("")>
</wxp></td><td width=100>%s: </td>
""" % (paramIDs[param], prefix + 'check_' + param, param)
# 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="%s">
</wxp></td>
""" % (typeClass, -1, prefix + 'data_' + 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 xxxParamFont(xxxParam):
allParams = ['size', 'style', 'weight', 'family', 'underlined',
'face', 'encoding']
def __init__(self, parent, element):
xxxObject.__init__(self, parent, element)
self.parentNode = element # required to behave similar to DOM node
v = []
for p in self.allParams:
try:
v.append(str(self.params[p].data))
except KeyError:
v.append('')
self.data = v
def update(self, value):
# `value' is a list of strings corresponding to all parameters
elem = self.element
for node in elem.childNodes:
elem.removeChild(node)
i = 0
self.params.clear()
v = []
for param in self.allParams:
if value[i]:
fontElem = tree.dom.createElement(param)
textNode = tree.dom.createTextNode(value[i])
self.params[param] = textNode
fontElem.appendChild(textNode)
elem.appendChild(fontElem)
v.append(value[i])
i += 1
self.data = v
################################################################################
class xxxContainer(xxxObject):
hasChildren = true
################################################################################
# Top-level windwos
class xxxPanel(xxxContainer):
allParams = ['pos', 'size', 'style']
styles = ['fg', 'bg', 'font', 'enabled', 'focused', 'hidden', 'exstyle',
'tooltip']
winStyles = ['wxNO_3D', 'wxTAB_TRAVERSAL', 'wxCLIP_CHILDREN']
exStyles = ['wxWS_EX_VALIDATE_RECURSIVELY']
class xxxDialog(xxxContainer):
allParams = ['title', 'pos', 'size', 'style']
required = ['title']
winStyles = ['wxDEFAULT_DIALOG_STYLE', 'wxSTAY_ON_TOP',
'wxDIALOG_MODAL', 'wxDIALOG_MODELESS',
'wxCAPTION', 'wxSYSTEM_MENU', 'wxRESIZE_BORDER', 'wxRESIZE_BOX',
'wxTHICK_FRAME',
'wxNO_3D', 'wxTAB_TRAVERSAL', 'wxCLIP_CHILDREN']
styles = ['fg', 'bg', 'font', 'enabled', 'focused', 'hidden', 'exstyle',
'tooltip']
exStyles = ['wxWS_EX_VALIDATE_RECURSIVELY']
class xxxFrame(xxxContainer):
allParams = ['title', 'centered', 'pos', 'size', 'style']
paramDict = {'centered': ParamBool}
required = ['title']
winStyles = ['wxDEFAULT_FRAME_STYLE', 'wxDEFAULT_DIALOG_STYLE',
'wxSTAY_ON_TOP',
'wxCAPTION', 'wxSYSTEM_MENU', 'wxRESIZE_BORDER',
'wxRESIZE_BOX', 'wxMINIMIZE_BOX', 'wxMAXIMIZE_BOX',
'wxFRAME_FLOAT_ON_PARENT', 'wxFRAME_TOOL_WINDOW',
'wxNO_3D', 'wxTAB_TRAVERSAL', 'wxCLIP_CHILDREN']
styles = ['fg', 'bg', 'font', 'enabled', 'focused', 'hidden', 'exstyle',
'tooltip']
exStyles = ['wxWS_EX_VALIDATE_RECURSIVELY']
class xxxTool(xxxObject):
allParams = ['bitmap', 'bitmap2', 'toggle', 'tooltip', 'longhelp']
paramDict = {'bitmap2': ParamFile}
hasStyle = false
class xxxToolBar(xxxContainer):
allParams = ['bitmapsize', 'margins', 'packing', 'separation',
'pos', 'size', 'style']
hasStyle = false
paramDict = {'bitmapsize': ParamPosSize, 'margins': ParamPosSize,
'packing': ParamInt, 'separation': ParamInt,
'style': ParamNonGenericStyle}
winStyles = ['wxTB_FLAT', 'wxTB_DOCKABLE', 'wxTB_VERTICAL', 'wxTB_HORIZONTAL']
################################################################################
# Bitmap, Icon
class xxxBitmap(xxxObject):
allParams = ['bitmap']
required = ['bitmap']
class xxxIcon(xxxObject):
allParams = ['icon']
required = ['icon']
################################################################################
# Controls
class xxxStaticText(xxxObject):
allParams = ['label', 'pos', 'size', 'style']
required = ['label']
winStyles = ['wxALIGN_LEFT', 'wxALIGN_RIGHT', 'wxALIGN_CENTRE', 'wxST_NO_AUTORESIZE']
class xxxStaticLine(xxxObject):
allParams = ['pos', 'size', 'style']
winStyles = ['wxLI_HORIZONTAL', 'wxLI_VERTICAL']
class xxxStaticBitmap(xxxObject):
allParams = ['bitmap', 'pos', 'size', 'style']
required = ['bitmap']
class xxxTextCtrl(xxxObject):
allParams = ['value', 'pos', 'size', 'style']
winStyles = ['wxTE_PROCESS_ENTER', 'wxTE_PROCESS_TAB', 'wxTE_MULTILINE',
'wxTE_PASSWORD', 'wxTE_READONLY', 'wxHSCROLL']
class xxxChoice(xxxObject):
allParams = ['content', 'selection', 'pos', 'size', 'style']
required = ['content']
winStyles = ['wxCB_SORT']
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']
winStyles = ['wxSL_HORIZONTAL', 'wxSL_VERTICAL', 'wxSL_AUTOTICKS', 'wxSL_LABELS',
'wxSL_LEFT', 'wxSL_RIGHT', 'wxSL_TOP', 'wxSL_BOTTOM',
'wxSL_BOTH', 'wxSL_SELRANGE']
class xxxGauge(xxxObject):
allParams = ['range', 'pos', 'size', 'style', 'value', 'shadow', 'bezel']
paramDict = {'range': ParamInt, 'value': ParamInt,
'shadow': ParamInt, 'bezel': ParamInt}
winStyles = ['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}
winStyles = ['wxSB_HORIZONTAL', 'wxSB_VERTICAL']
class xxxListCtrl(xxxObject):
allParams = ['pos', 'size', 'style']
winStyles = ['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']
winStyles = ['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}
winStyles = ['wxHW_SCROLLBAR_NEVER', 'wxHW_SCROLLBAR_AUTO']
class xxxCalendar(xxxObject):
allParams = ['pos', 'size', 'style']
class xxxNotebook(xxxContainer):
allParams = ['usenotebooksizer', 'pos', 'size', 'style']
paramDict = {'usenotebooksizer': ParamBool}
winStyles = ['wxNB_FIXEDWIDTH', 'wxNB_LEFT', 'wxNB_RIGHT', 'wxNB_BOTTOM']
################################################################################
# Buttons
class xxxButton(xxxObject):
allParams = ['label', 'default', 'pos', 'size', 'style']
paramDict = {'default': ParamBool}
required = ['label']
winStyles = ['wxBU_LEFT', 'wxBU_TOP', 'wxBU_RIGHT', 'wxBU_BOTTOM']
class xxxBitmapButton(xxxObject):
allParams = ['bitmap', 'selected', 'focus', 'disabled', 'default',
'pos', 'size', 'style']
required = ['bitmap']
winStyles = ['wxBU_AUTODRAW', 'wxBU_LEFT', 'wxBU_TOP',
'wxBU_RIGHT', 'wxBU_BOTTOM']
class xxxRadioButton(xxxObject):
allParams = ['label', 'value', 'pos', 'size', 'style']
paramDict = {'value': ParamBool}
required = ['label']
winStyles = ['wxRB_GROUP']
class xxxSpinButton(xxxObject):
allParams = ['pos', 'size', 'style']
winStyles = ['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']
winStyles = ['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']
winStyles = ['wxCB_SIMPLE', 'wxCB_SORT', 'wxCB_READONLY', 'wxCB_DROPDOWN']
class xxxListBox(xxxObject):
allParams = ['content', 'selection', 'pos', 'size', 'style']
required = ['content']
winStyles = ['wxLB_SINGLE', 'wxLB_MULTIPLE', 'wxLB_EXTENDED', 'wxLB_HSCROLL',
'wxLB_ALWAYS_SB', 'wxLB_NEEDED_SB', 'wxLB_SORT']
################################################################################
# Sizers
class xxxSizer(xxxContainer):
hasName = hasStyle = 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'].value() == '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'}
# For repeated parameters
class xxxParamMulti:
def __init__(self):
self.l, self.data = [], []
def append(self, param):
self.l.append(param)
self.data.append(param.value())
def value(self):
return self.data
def remove(self):
for param in self.l:
param.remove()
self.l, self.data = [], []
class xxxFlexGridSizer(xxxGridSizer):
specials = ['growablecols', 'growablerows']
allParams = ['cols', 'rows', 'vgap', 'hgap'] + specials
paramDict = {'growablecols':ParamContent, 'growablerows':ParamContent}
# Special processing for growable* parameters
# (they are represented by several nodes)
def special(self, tag, node):
if tag not in self.params.keys():
self.params[tag] = xxxParamMulti()
self.params[tag].append(xxxParam(node))
def setSpecial(self, param, value):
# Straightforward implementation: remove, add again
self.params[param].remove()
del self.params[param]
for str in value:
node = tree.dom.createElement(param)
text = tree.dom.createTextNode(str)
node.appendChild(text)
self.element.appendChild(node)
self.special(param, node)
# Container with only one child.
# Not shown in tree.
class xxxChildContainer(xxxObject):
hasName = hasStyle = 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 = hasStyle = false
allParams = ['size', 'option', 'flag', 'border']
paramDict = {'option': ParamInt}
default = {'size': '0,0'}
class xxxMenuBar(xxxContainer):
allParams = []
class xxxMenu(xxxContainer):
allParams = ['label']
default = {'label': ''}
paramDict = {'style': ParamNonGenericStyle} # no generic styles
winStyles = ['wxMENU_TEAROFF']
class xxxMenuItem(xxxObject):
allParams = ['checkable', 'label', 'accel', 'help']
default = {'label': ''}
class xxxSeparator(xxxObject):
hasName = hasStyle = false
allParams = []
################################################################################
xxxDict = {
'wxPanel': xxxPanel,
'wxDialog': xxxDialog,
'wxFrame': xxxFrame,
'tool': xxxTool,
'wxToolBar': xxxToolBar,
'wxBitmap': xxxBitmap,
'wxIcon': xxxIcon,
'wxButton': xxxButton,
'wxBitmapButton': xxxBitmapButton,
'wxRadioButton': xxxRadioButton,
'wxSpinButton': xxxSpinButton,
'wxStaticBox': xxxStaticBox,
'wxStaticBitmap': xxxStaticBitmap,
'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,
}
# Create IDs for all parameters of all classes
paramIDs = {'fg': wxNewId(), 'bg': wxNewId(), 'exstyle': wxNewId(), 'font': wxNewId(),
'enabled': wxNewId(), 'focused': wxNewId(), 'hidden': wxNewId(),
'tooltip': wxNewId()
}
for cl in xxxDict.values():
for param in cl.allParams + cl.paramDict.keys():
if not paramIDs.has_key(param):
paramIDs[param] = wxNewId()
################################################################################
# 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):
try:
return xxxDict[element.getAttribute('class')](parent, element)
except KeyError:
# Verify that it's not recursive exception
if element.getAttribute('class') not in xxxDict.keys():
print 'ERROR: unknown class:', element.getAttribute('class')
raise
# 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)

195
wxPython/tools/img2py.py Normal file
View File

@@ -0,0 +1,195 @@
#!/usr/bin/env python
"""
img2py.py -- Convert an image to XPM format and embed it in a Python
module with appropriate code so it can be loaded into
a program at runtime. The benefit is that since it is
Python source code it can be delivered as a .pyc or
'compiled' into the program using freeze, py2exe, etc.
Usage:
img2py.py [options] image_file python_file
Options:
-m <#rrggbb> If the original image has a mask or transparency defined
it will be used by default. You can use this option to
override the default or provide a new mask by specifying
a colour in the image to mark as transparent.
-n <name> Normally generic names (getBitmap, etc.) are used for the
image access functions. If you use this option you can
specify a name that should be used to customize the access
fucntions, (getNameBitmap, etc.)
-a This flag specifies that the python_file should be appended
to instead of overwritten. This in combination with -n will
allow you to put multiple images in one Python source file.
-u Don't use compression. Leaves the data uncompressed.
"""
import sys, os, glob, getopt, tempfile, string
import cPickle, cStringIO, zlib
import img2xpm
def crunch_data(data, compressed):
# convert the lines to a Python list, pickle it and optionally compress the result.
lines = []
for line in data:
if line[0] == "\"":
# the line is typically (but not always):
# [quote] <data> [quote][comma][newline]
# chop one char from the front
line = line[1:]
# now find the final quote and truncate there
quote = string.rfind(line, "\"")
# and append the remaining data to our list
lines.append(line[:quote])
# pickle, crunch and convert it to a form suitable for embedding in code
data = cPickle.dumps(lines)
if compressed:
data = zlib.compress(data, 9)
data = repr(data)
# This next bit is borrowed from PIL. It is used to wrap the text intelligently.
fp = cStringIO.StringIO()
data = data + " " # buffer for the +1 test
c = i = 0
word = ""
octdigits = "01234567"
hexdigits = "0123456789abcdef"
while i < len(data):
if data[i] != "\\":
word = data[i]
i = i + 1
else:
if data[i+1] in octdigits:
for n in range(2, 5):
if data[i+n] not in octdigits:
break
word = data[i:i+n]
i = i + n
elif data[i+1] == 'x':
for n in range(2, 5):
if data[i+n] not in hexdigits:
break
word = data[i:i+n]
i = i + n
else:
word = data[i:i+2]
i = i + 2
l = len(word)
if c + l >= 78-1:
fp.write("\\\n")
c = 0
fp.write(word)
c = c + l
# return the formatted compressed data
return fp.getvalue()
def main(args):
if not args or ("-h" in args):
print __doc__
return
append = 0
compressed = 1
maskClr = None
imgName = ""
try:
opts, fileArgs = getopt.getopt(args, "aun:m:")
except getopt.GetoptError:
print __doc__
return
for opt, val in opts:
if opt == "-a":
append = 1
elif opt == "-u":
compressed = 0
elif opt == "-n":
imgName = val
elif opt == "-m":
maskClr = val
if len(fileArgs) != 2:
print __doc__
return
image_file, python_file = fileArgs
# convert the image file to a temporary file
tfname = tempfile.mktemp()
ok, msg = img2xpm.convert(image_file, maskClr, None, tfname)
if not ok:
print msg
return
data = open(tfname, "r").readlines()
data = crunch_data(data, compressed)
os.unlink(tfname)
if append:
out = open(python_file, "a")
else:
out = open(python_file, "w")
out.write("#" + "-" * 70 + "\n")
if not append:
out.write("# This file was generated by %s\n#\n" % sys.argv[0])
out.write("from wxPython.wx import wxBitmapFromXPMData, wxImageFromBitmap\n")
if compressed:
out.write("import cPickle, zlib\n\n\n")
else:
out.write("import cPickle\n\n\n")
if compressed:
out.write("def get%sData():\n"
" return cPickle.loads(zlib.decompress(\n%s))\n\n"
% (imgName, data))
else:
out.write("def get%sData():\n"
" return cPickle.loads(\n%s)\n\n"
% (imgName, data))
out.write("def get%sBitmap():\n"
" return wxBitmapFromXPMData(get%sData())\n\n"
"def get%sImage():\n"
" return wxImageFromBitmap(get%sBitmap())\n\n"
% tuple([imgName] * 4))
if imgName:
n_msg = ' using "%s"' % imgName
else:
n_msg = ""
if maskClr:
m_msg = " with mask %s" % maskClr
else:
m_msg = ""
print "Embedded %s%s into %s%s" % (image_file, n_msg, python_file, m_msg)
if __name__ == "__main__":
main(sys.argv[1:])

101
wxPython/tools/img2xpm.py Normal file
View File

@@ -0,0 +1,101 @@
#!/usr/bin/env python
"""
img2xpm.py -- convert several image formats to XPM
Usage:
img2xpm.py [options] image_files...
Options:
-o <dir> The directory to place the .xpm file(s), defaults to
the current directory.
-m <#rrggbb> If the original image has a mask or transparency defined
it will be used by default. You can use this option to
override the default or provide a new mask by specifying
a colour in the image to mark as transparent.
-n <name> A filename to write the .xpm data to. Defaults to the
basename of the image file + '.xpm' This option overrides
the -o option.
"""
import sys, os, glob, getopt, string
from wxPython.wx import *
wxInitAllImageHandlers()
def convert(file, maskClr, outputDir, outputName):
if string.lower(os.path.splitext(file)[1]) == ".ico":
icon = wxIcon(file, wxBITMAP_TYPE_ICO)
img = wxBitmapFromIcon(icon)
else:
img = wxBitmap(file, wxBITMAP_TYPE_ANY)
if not img.Ok():
return 0, file + " failed to load!"
else:
if maskClr:
om = img.GetMask()
mask = wxMaskColour(img, maskClr)
img.SetMask(mask)
if om is not None:
om.Destroy()
if outputName:
newname = outputName
else:
newname = os.path.join(outputDir, os.path.basename(os.path.splitext(file)[0]) + ".xpm")
if img.SaveFile(newname, wxBITMAP_TYPE_XPM):
return 1, file + " converted to " + newname
else:
img = wxImageFromBitmap(img)
if img.SaveFile(newname, wxBITMAP_TYPE_XPM):
return 1, "ok"
else:
return 0, file + " failed to save!"
def main(args):
if not args or ("-h" in args):
print __doc__
return
outputDir = ""
maskClr = None
outputName = None
try:
opts, fileArgs = getopt.getopt(args, "m:n:o:")
except getopt.GetoptError:
print __doc__
return
for opt, val in opts:
if opt == "-m":
maskClr = val
elif opt == "-n":
outputName = val
elif opt == "-o":
outputDir = val
if not fileArgs:
print __doc__
return
for arg in fileArgs:
for file in glob.glob(arg):
if not os.path.isfile(file):
continue
ok, msg = convert(file, maskClr, outputDir, outputName)
print msg
if __name__ == "__main__":
main(sys.argv[1:])