- changed encoding selection, removed -i option

- replace command


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@20117 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Roman Rolinsky
2003-04-10 09:31:39 +00:00
parent 8ed35e7493
commit 22b3452638
6 changed files with 182 additions and 28 deletions

View File

@@ -1,3 +1,16 @@
0.1.1-1
-------
Changed internationalization support. '-i' option removed, default
encoding is used (should be defined in sitecustomize.py, or 'ascii' by
default). When XRC file is opened with encoding specified,
translations are not used.
0.1.1
-----
Replace command added (not quite finished yet).
0.1.0 0.1.0
----- -----

View File

@@ -15,7 +15,7 @@ modernFont = wxFont(sysFont.GetPointSize(), wxMODERN, wxNORMAL, wxNORMAL)
smallerFont = wxFont(sysFont.GetPointSize()-2, wxDEFAULT, wxNORMAL, wxNORMAL) smallerFont = wxFont(sysFont.GetPointSize()-2, wxDEFAULT, wxNORMAL, wxNORMAL)
progname = 'XRCed' progname = 'XRCed'
version = '0.1.0' version = '0.1.1-1'
try: try:
True True
@@ -34,6 +34,5 @@ class Globals:
testWin = None testWin = None
testWinPos = wxDefaultPosition testWinPos = wxDefaultPosition
currentXXX = None currentXXX = None
xmlFlags = wxXRC_USE_LOCALE | wxXRC_NO_SUBCLASSING
g = Globals() g = Globals()

View File

@@ -140,9 +140,9 @@ class ParamColour(PPanel):
self.SetBackgroundColour(g.panel.GetBackgroundColour()) self.SetBackgroundColour(g.panel.GetBackgroundColour())
sizer = wxBoxSizer() sizer = wxBoxSizer()
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=(65,-1)) self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=(65,-1))
sizer.Add(self.text, 0, wxRIGHT, 5) sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 5)
self.button = wxPanel(self, self.ID_BUTTON, wxDefaultPosition, wxSize(20, 20)) self.button = wxPanel(self, self.ID_BUTTON, wxDefaultPosition, wxSize(20, -1))
sizer.Add(self.button, 0, wxGROW) sizer.Add(self.button, 0, wxGROW | wxALIGN_CENTER_VERTICAL)
self.SetAutoLayout(True) self.SetAutoLayout(True)
self.SetSizer(sizer) self.SetSizer(sizer)
sizer.Fit(self) sizer.Fit(self)

View File

@@ -84,7 +84,7 @@ class ID_NEW:
MENU = wxNewId() MENU = wxNewId()
MENU_ITEM = wxNewId() MENU_ITEM = wxNewId()
SEPARATOR = wxNewId() SEPARATOR = wxNewId()
LAST = wxNewId() LAST = wxNewId()
class PullDownMenu: class PullDownMenu:
ID_EXPAND = wxNewId() ID_EXPAND = wxNewId()
@@ -94,6 +94,7 @@ class PullDownMenu:
def __init__(self, parent): def __init__(self, parent):
self.ID_DELETE = parent.ID_DELETE self.ID_DELETE = parent.ID_DELETE
EVT_MENU_RANGE(parent, ID_NEW.PANEL, ID_NEW.LAST, parent.OnCreate) EVT_MENU_RANGE(parent, ID_NEW.PANEL, ID_NEW.LAST, parent.OnCreate)
EVT_MENU_RANGE(parent, 1000 + ID_NEW.PANEL, 1000 + ID_NEW.LAST, parent.OnReplace)
EVT_MENU(parent, self.ID_COLLAPSE, parent.OnCollapse) EVT_MENU(parent, self.ID_COLLAPSE, parent.OnCollapse)
EVT_MENU(parent, self.ID_EXPAND, parent.OnExpand) EVT_MENU(parent, self.ID_EXPAND, parent.OnExpand)
EVT_MENU(parent, self.ID_PASTE_SIBLING, parent.OnPaste) EVT_MENU(parent, self.ID_PASTE_SIBLING, parent.OnPaste)
@@ -148,6 +149,29 @@ class PullDownMenu:
ID_NEW.SPACER: 'spacer', ID_NEW.SPACER: 'spacer',
ID_NEW.UNKNOWN: 'unknown', ID_NEW.UNKNOWN: 'unknown',
} }
self.topLevel = [
(ID_NEW.PANEL, 'Panel', 'Create panel'),
(ID_NEW.DIALOG, 'Dialog', 'Create dialog'),
(ID_NEW.FRAME, 'Frame', 'Create frame'),
None,
(ID_NEW.TOOL_BAR, 'ToolBar', 'Create toolbar'),
(ID_NEW.MENU_BAR, 'MenuBar', 'Create menubar'),
(ID_NEW.MENU, 'Menu', 'Create menu')
]
self.containers = [
(ID_NEW.PANEL, 'Panel', 'Create panel'),
(ID_NEW.NOTEBOOK, 'Notebook', 'Create notebook control'),
(ID_NEW.TOOL_BAR, 'ToolBar', 'Create toolbar'),
]
self.sizers = [
(ID_NEW.BOX_SIZER, 'BoxSizer', 'Create box sizer'),
(ID_NEW.STATIC_BOX_SIZER, 'StaticBoxSizer',
'Create static box sizer'),
(ID_NEW.GRID_SIZER, 'GridSizer', 'Create grid sizer'),
(ID_NEW.FLEX_GRID_SIZER, 'FlexGridSizer',
'Create flexgrid sizer'),
(ID_NEW.SPACER, 'Spacer', 'Create spacer'),
]
self.controls = [ self.controls = [
['control', 'Various controls', ['control', 'Various controls',
(ID_NEW.STATIC_TEXT, 'Label', 'Create label'), (ID_NEW.STATIC_TEXT, 'Label', 'Create label'),
@@ -246,6 +270,19 @@ def SetMenu(m, list):
m.AppendMenu(wxNewId(), l[0], subMenu, l[1]) m.AppendMenu(wxNewId(), l[0], subMenu, l[1])
else: # separator else: # separator
m.AppendSeparator() m.AppendSeparator()
# Same, but adds 1000 to all IDs
def SetMenu2(m, list):
for l in list:
if type(l) == types.TupleType:
# Shift ID
l = (1000 + l[0],) + l[1:]
apply(m.Append, l)
elif type(l) == types.ListType:
subMenu = wxMenu()
SetMenu2(subMenu, l[2:])
m.AppendMenu(wxNewId(), l[0], subMenu, l[1])
else: # separator
m.AppendSeparator()
################################################################################ ################################################################################
@@ -413,6 +450,7 @@ class XML_Tree(wxTreeCtrl):
elif n.nodeType != minidom.Node.ELEMENT_NODE: elif n.nodeType != minidom.Node.ELEMENT_NODE:
treeObj.element.removeChild(n) treeObj.element.removeChild(n)
n.unlink() n.unlink()
# Insert new item at specific position # Insert new item at specific position
def InsertNode(self, itemParent, parent, elem, nextItem): def InsertNode(self, itemParent, parent, elem, nextItem):
# Insert in XML tree and wxWin # Insert in XML tree and wxWin
@@ -640,7 +678,11 @@ class XML_Tree(wxTreeCtrl):
else: else:
elem.setAttribute('name', xxx.name) elem.setAttribute('name', xxx.name)
memFile.close() # write to wxMemoryFS memFile.close() # write to wxMemoryFS
res = wxXmlResource('', g.xmlFlags) xmlFlags = wxXRC_NO_SUBCLASSING
# Use translations if encoding is not specified
if xxx.currentEncoding == 'ascii':
xmlFlags != wxXRC_USE_LOCALE
res = wxXmlResource('', xmlFlags)
res.Load('memory:xxx.xrc') res.Load('memory:xxx.xrc')
if xxx.__class__ == xxxFrame: if xxx.__class__ == xxxFrame:
# Frame can't have many children, # Frame can't have many children,
@@ -764,13 +806,7 @@ class XML_Tree(wxTreeCtrl):
else: else:
needInsert = self.NeedInsert(item) needInsert = self.NeedInsert(item)
if item == self.root or needInsert and self.GetItemParent(item) == self.root: if item == self.root or needInsert and self.GetItemParent(item) == self.root:
m.Append(ID_NEW.PANEL, 'Panel', 'Create panel') SetMenu(m, pullDownMenu.topLevel)
m.Append(ID_NEW.DIALOG, 'Dialog', 'Create dialog')
m.Append(ID_NEW.FRAME, 'Frame', 'Create frame')
m.AppendSeparator()
m.Append(ID_NEW.TOOL_BAR, 'ToolBar', 'Create toolbar')
m.Append(ID_NEW.MENU_BAR, 'MenuBar', 'Create menubar')
m.Append(ID_NEW.MENU, 'Menu', 'Create menu')
else: else:
xxx = self.GetPyData(item).treeObject() xxx = self.GetPyData(item).treeObject()
# Check parent for possible child nodes if inserting sibling # Check parent for possible child nodes if inserting sibling
@@ -803,6 +839,29 @@ class XML_Tree(wxTreeCtrl):
else: else:
menu.AppendMenu(wxNewId(), 'Create Sibling', m, menu.AppendMenu(wxNewId(), 'Create Sibling', m,
'Create sibling after selected object') 'Create sibling after selected object')
# Build replace menu
if item != self.root:
xxx = self.GetPyData(item).treeObject()
m = wxMenu() # create replace menu
if xxx.__class__ == xxxMenuBar:
m.Append(1000 + ID_NEW.MENU, 'Menu', 'Create menu')
elif xxx.__class__ in [xxxMenu, xxxMenuItem]:
SetMenu2(m, pullDownMenu.menuControls)
elif xxx.__class__ == xxxToolBar and \
self.GetItemParent(item) == self.root:
SetMenu2(m, [])
elif xxx.__class__ in [xxxFrame, xxxDialog, xxxPanel]:
SetMenu2(m, [
(ID_NEW.PANEL, 'Panel', 'Create panel'),
(ID_NEW.DIALOG, 'Dialog', 'Create dialog'),
(ID_NEW.FRAME, 'Frame', 'Create frame')])
elif xxx.isSizer:
SetMenu2(m, pullDownMenu.sizers)
else:
SetMenu2(m, pullDownMenu.controls)
id = wxNewId()
menu.AppendMenu(id, 'Replace With', m)
if not m.GetMenuItemCount(): menu.Enable(id, False)
menu.AppendSeparator() menu.AppendSeparator()
# Not using standart IDs because we don't want to show shortcuts # Not using standart IDs because we don't want to show shortcuts
menu.Append(wxID_CUT, 'Cut', 'Cut to the clipboard') menu.Append(wxID_CUT, 'Cut', 'Cut to the clipboard')

View File

@@ -11,14 +11,12 @@ xrced -- Simple resource editor for XRC format used by wxWindows/wxPython
Usage: Usage:
xrced [ -h ] [ -i ] [ -v ] [ XRC-file ] xrced [ -h ] [ -v ] [ XRC-file ]
Options: Options:
-h output short usage info and exit -h output short usage info and exit
-i use international character set instead of translations
-v output version info and exit -v output version info and exit
""" """
@@ -272,6 +270,7 @@ class Frame(wxFrame):
EVT_KEY_UP(self, tools.OnKeyUp) EVT_KEY_UP(self, tools.OnKeyUp)
def OnNew(self, evt): def OnNew(self, evt):
if not self.AskSave(): return
self.Clear() self.Clear()
def OnOpen(self, evt): def OnOpen(self, evt):
@@ -527,7 +526,7 @@ class Frame(wxFrame):
else: else:
self.toolsSizer.Remove(g.tools) self.toolsSizer.Remove(g.tools)
self.toolsSizer.Layout() self.toolsSizer.Layout()
def OnTest(self, evt): def OnTest(self, evt):
if not tree.selection: return # key pressed event if not tree.selection: return # key pressed event
tree.ShowTestWindow(tree.selection) tree.ShowTestWindow(tree.selection)
@@ -637,6 +636,92 @@ Homepage: http://xrced.sourceforge.net\
else: else:
tree.pendingHighLight = None tree.pendingHighLight = None
tree.SetFocus() tree.SetFocus()
self.modified = True
# Replace one object with another
def OnReplace(self, evt):
selected = tree.selection
xxx = tree.GetPyData(selected).treeObject()
elem = xxx.element
parent = elem.parentNode
parentXXX = xxx.parent
# New class
className = pullDownMenu.createMap[evt.GetId() - 1000]
# Create temporary empty node (with default values)
dummy = MakeEmptyDOM(className)
xxxClass = xxxDict[className]
# Remove non-compatible children
if tree.ItemHasChildren(selected) and not xxxClass.hasChildren:
tree.DeleteChildren(selected)
nodes = elem.childNodes[:]
tags = []
for node in nodes:
remove = False
tag = node.tagName
if tag == 'object':
if not xxxClass.hasChildren:
remove = True
elif tag not in xxxClass.allParams and \
(not xxxClass.hasStyle or tag not in xxxClass.styles):
remove = True
else:
tags.append(tag)
if remove:
elem.removeChild(node)
node.unlink()
# Copy parameters present in dummy but not in elem
for node in dummy.childNodes:
tag = node.tagName
if tag not in tags:
elem.appendChild(node.cloneNode(True))
dummy.unlink()
# Change class name
elem.setAttribute('class', className)
# Re-create xxx element
xxx = MakeXXXFromDOM(parentXXX, elem)
# Update parent in child objects
if tree.ItemHasChildren(selected):
i, cookie = tree.GetFirstChild(selected, 0)
while i.IsOk():
x = tree.GetPyData(i)
x.parent = xxx
if x.hasChild: x.child.parent = xxx
i, cookie = tree.GetNextChild(selected, cookie)
# Update tree
if tree.GetPyData(selected).hasChild: # child container
container = tree.GetPyData(selected)
container.child = xxx
container.hasChildren = xxx.hasChildren
container.isSizer = xxx.isSizer
else:
tree.SetPyData(selected, xxx)
tree.SetItemText(selected, xxx.treeName())
tree.SetItemImage(selected, xxx.treeImage())
# Set default name for top-level windows
if parent.__class__ == xxxMainNode:
cl = xxx.treeObject().__class__
frame.maxIDs[cl] += 1
xxx.treeObject().name = '%s%d' % (defaultIDs[cl], frame.maxIDs[cl])
xxx.treeObject().element.setAttribute('name', xxx.treeObject().name)
# Update panel
g.panel.SetData(xxx)
# Update tools
g.tools.UpdateUI()
#undoMan.RegisterUndo(UndoPasteCreate(parentLeaf, parent, newItem, selected))
# Update view?
if g.testWin and tree.IsHighlatable(newItem):
if conf.autoRefresh:
tree.needUpdate = True
tree.pendingHighLight = newItem
else:
tree.pendingHighLight = None
tree.SetFocus()
self.modified = True
# Expand/collapse subtree # Expand/collapse subtree
def OnExpand(self, evt): def OnExpand(self, evt):
@@ -739,8 +824,10 @@ Homepage: http://xrced.sourceforge.net\
import xxx import xxx
if mo: if mo:
dom.encoding = xxx.currentEncoding = mo.group('encd') dom.encoding = xxx.currentEncoding = mo.group('encd')
if dom.encoding not in ['ascii', sys.getdefaultencoding()]:
wxLogWarning('Encoding is different from system default')
else: else:
xxx.currentEncoding = 'iso-8859-1' xxx.currentEncoding = 'ascii'
dom.encoding = '' dom.encoding = ''
f.close() f.close()
# Change dir # Change dir
@@ -819,14 +906,13 @@ Homepage: http://xrced.sourceforge.net\
################################################################################ ################################################################################
def usage(): def usage():
print >> sys.stderr, 'usage: xrced [-dhlv] [file]' print >> sys.stderr, 'usage: xrced [-dhiv] [file]'
class App(wxApp): class App(wxApp):
def OnInit(self): def OnInit(self):
global debug global debug
# Process comand-line # Process comand-line
try: try:
opts = args = [] #give empty values in case of exception
opts, args = getopt.getopt(sys.argv[1:], 'dhiv') opts, args = getopt.getopt(sys.argv[1:], 'dhiv')
except getopt.GetoptError: except getopt.GetoptError:
if wxPlatform != '__WXMAC__': # macs have some extra parameters if wxPlatform != '__WXMAC__': # macs have some extra parameters
@@ -839,8 +925,6 @@ class App(wxApp):
sys.exit(0) sys.exit(0)
elif o == '-d': elif o == '-d':
debug = True debug = True
elif o == '-i':
g.xmlFlags &= ~wxXRC_USE_LOCALE
elif o == '-v': elif o == '-v':
print 'XRCed version', version print 'XRCed version', version
sys.exit(0) sys.exit(0)

View File

@@ -8,9 +8,7 @@ from xml.dom import minidom
from globals import * from globals import *
from params import * from params import *
currentEncoding = wxLocale_GetSystemEncodingName() currentEncoding = sys.getdefaultencoding() # wxLocale_GetSystemEncodingName()
if not currentEncoding:
currentEncoding = 'ascii'
# Base class for interface parameter classes # Base class for interface parameter classes
class xxxNode: class xxxNode:
@@ -325,12 +323,13 @@ class xxxEncoding:
# Special class for root node # Special class for root node
class xxxMainNode(xxxContainer): class xxxMainNode(xxxContainer):
allParams = ['encoding'] allParams = ['encoding']
required = ['encoding']
default = {'encoding': ''}
hasStyle = hasName = False hasStyle = hasName = False
def __init__(self, dom): def __init__(self, dom):
xxxContainer.__init__(self, None, dom.documentElement) xxxContainer.__init__(self, None, dom.documentElement)
self.className = 'XML tree' self.className = 'XML tree'
# Reset required parameters after processing XML, because encoding is
# a little special
self.required = ['encoding']
self.params['encoding'] = xxxEncoding(dom.encoding) self.params['encoding'] = xxxEncoding(dom.encoding)
################################################################################ ################################################################################