Added names to demo widgets; added RemoteWidgetDialog.
diff --git a/Demo/tkinter/guido/AttrDialog.py b/Demo/tkinter/guido/AttrDialog.py
index d9ad82a..05da37d 100755
--- a/Demo/tkinter/guido/AttrDialog.py
+++ b/Demo/tkinter/guido/AttrDialog.py
@@ -148,6 +148,7 @@
 	def refresh(self):
 		self.current = self.widget.newinfo()
 		self.current['.class'] = self.widget.winfo_class()
+		self.current['.name'] = self.widget._w
 
 	class packoption: # Mix-in class
 		def set(self, e=None):
@@ -165,7 +166,8 @@
 
 	options = {
 		'.class': (None, 'Class'),
-		'after': (None, 'Widet'),
+		'.name': (None, 'Name'),
+		'after': (None, 'Widget'),
 		'anchor': ('center', 'Anchor'),
 		'before': (None, 'Widget'),
 		'expand': ('no', 'Boolean'),
@@ -184,6 +186,7 @@
 		'Class': 'readonly',
 		'Expand': 'boolean',
 		'Fill': ('none', 'x', 'y', 'both'),
+		'Name': 'readonly',
 		'Pad': 'pixel',
 		'Side': ('top', 'right', 'bottom', 'left'),
 		'Widget': 'readonly',
@@ -197,8 +200,8 @@
 		self.widget = widget
 		self.refresh()
 		self.top = Toplevel(self.master)
-		self.top.title('Remote %s Pack: %s' % (self.app, self.widget))
-		self.top.minsize(1, 1) # XXX
+		self.top.title(self.app + ' PackDialog')
+		self.top.minsize(1, 1)
 		self.addchoices()
 
 	def refresh(self):
@@ -220,6 +223,7 @@
 						  'winfo',
 						  'class',
 						  self.widget)
+		dict['.name'] = self.widget
 		self.current = dict
 
 	class remotepackoption: # Mix-in class
@@ -254,14 +258,19 @@
 
 	def refresh(self):
 		self.configuration = self.widget.config()
+		self.update()
+		self.current['.class'] = self.widget.winfo_class()
+		self.current['.name'] = self.widget._w
+
+	def update(self):
 		self.current = {}
 		self.options = {}
-		self.options['.class'] = (None, 'Class')
-		self.current['.class'] = self.widget.winfo_class()
 		for k, v in self.configuration.items():
 			if len(v) > 4:
 				self.current[k] = v[4]
 				self.options[k] = v[3], v[2] # default, klass
+		self.options['.class'] = (None, 'Class')
+		self.options['.name'] = (None, 'Name')
 
 	class widgetoption: # Mix-in class
 		def set(self, e=None):
@@ -301,6 +310,7 @@
 		'Label': 'string',
 		'Length': 'pixel',
 		'MenuName': 'widget',
+		'Name': 'readonly',
 		'OffTime': 'time',
 		'OnTime': 'time',
 		'Orient': ('horizontal', 'vertical'),
@@ -337,7 +347,60 @@
 		'menubutton': _tristate,
 		'slider': _bistate,
 		}
-		
+
+class RemoteWidgetDialog(WidgetDialog):
+
+	def __init__(self, master, app, widget):
+		self.master = master
+		self.app = app
+		self.widget = widget
+		self.refresh()
+		self.top = Toplevel(self.master)
+		self.top.title(self.app + ' WidgetDialog')
+		self.top.minsize(1, 1)
+		self.addchoices()
+
+	def refresh(self):
+		try:
+			items = self.master.tk.splitlist(
+				self.master.send(self.app,
+						 self.widget,
+						 'config'))
+		except TclError, msg:
+			print 'send widget config', self.widget, ':', msg
+			return
+		dict = {}
+		for item in items:
+			words = self.master.tk.splitlist(item)
+			key = words[0][1:]
+			value = (key,) + words[1:]
+			dict[key] = value
+		self.configuration = dict
+		self.update()
+		self.current['.class'] = self.master.send(self.app,
+							  'winfo',
+							  'class',
+							  self.widget)
+		self.current['.name'] = self.widget
+
+	class remotewidgetoption: # Mix-in class
+		def set(self, e=None):
+			self.current = self.var.get()
+			try:
+				self.dialog.master.send(
+					self.dialog.app,
+					self.dialog.widget,
+					'config',
+					'-'+self.option,
+					self.current)
+			except TclError, msg:
+				print 'send widget config :', msg
+				self.refresh()
+
+	class booleanoption(remotewidgetoption, BooleanOption): pass
+	class enumoption(remotewidgetoption, EnumOption): pass
+	class stringoption(remotewidgetoption, StringOption): pass
+	class readonlyoption(remotewidgetoption, ReadonlyOption): pass
 
 def test():
 	import sys
@@ -345,11 +408,18 @@
 	root.minsize(1, 1)
 	if sys.argv[2:]:
 		pd = RemotePackDialog(root, sys.argv[1], sys.argv[2])
+		wd = RemoteWidgetDialog(root, sys.argv[1], sys.argv[2])
 	else:
-		frame = Frame(root, {Pack: {'expand': 1, 'fill': 'both'}})
-		button = Button(frame, {'text': 'button',
+		frame = Frame(root, {'name': 'frame',
+				     Pack: {'expand': 1, 'fill': 'both'},
+				     })
+		button = Button(frame, {'name': 'button',
+					'text': 'button',
 					Pack: {'expand': 1}})
-		canvas = Canvas(frame, {Pack: {}})
+		canvas = Canvas(frame, {'name': 'canvas',
+					Pack: {}})
+		fpd = PackDialog(frame)
+		fwd = WidgetDialog(frame)
 		bpd = PackDialog(button)
 		bwd = WidgetDialog(button)
 		cpd = PackDialog(canvas)