Un PMW-ified
diff --git a/Tools/pynche/ChipViewer.py b/Tools/pynche/ChipViewer.py
index a2a9034..b4dfa85 100644
--- a/Tools/pynche/ChipViewer.py
+++ b/Tools/pynche/ChipViewer.py
@@ -1,79 +1,92 @@
-"""Color chip megawidget.
-This widget is used for displaying a color.  It consists of three components:
-
-    label -- a Tkinter.Label, this is the chip's label which is displayed
-             about the color chip 
-    chip  -- A Tkinter.Frame, the frame displaying the color
-    name  -- a Tkinter.Label, the name of the color
-
-In addition, the megawidget understands the following options:
-
-    color -- the color displayed in the chip and name widgets
-
-When run as a script, this program displays a sample chip.
-"""
-
-
+from types import StringType
 from Tkinter import *
-import Pmw
+import ColorDB
 
-class ChipWidget(Pmw.MegaWidget):
+
+class ChipWidget:
     _WIDTH = 150
     _HEIGHT = 80
 
-    def __init__(self, parent=None, **kw):
-	options = (('chip_borderwidth', 2,            None),
-		   ('chip_width',       self._WIDTH,  None),
-		   ('chip_height',      self._HEIGHT, None),
-		   ('label_text',       'Color',      None),
-		   ('color',            'blue',       self.__set_color),
-		   )
-	self.defineoptions(kw, options)
+    def __init__(self,
+                 parent = None,
+                 width  = _WIDTH,
+                 height = _HEIGHT,
+                 text   = 'Color',
+                 initialcolor = 'blue',
+                 presscmd   = None,
+                 releasecmd = None):
+        # create the text label
+        self.__label = Label(parent, text=text)
+        self.__label.grid(row=0, column=0)
+        # create the color chip, implemented as a frame
+        self.__chip = Frame(parent, relief=RAISED, borderwidth=2,
+                            width=width,
+                            height=height,
+                            background=initialcolor)
+        self.__chip.grid(row=1, column=0)
+        # create the color name, ctor argument must be a string
+        self.__name = Label(parent, text=initialcolor)
+        self.__name.grid(row=2, column=0)
+        #
+        # set bindings
+        if presscmd:
+            self.__chip.bind('<ButtonPress-1>', presscmd)
+        if releasecmd:
+            self.__chip.bind('<ButtonRelease-1>', releasecmd)
 
-	# initialize base class -- after defining options
-	Pmw.MegaWidget.__init__(self, parent)
-	interiorarg = (self.interior(),)
+    def set_color(self, color):
+        self.__chip.config(background=color)
+        self.__name.config(text=color)
 
-	# create the label
-	self.__label = self.createcomponent(
-	    # component name, aliases, group
-	    'label', (), None,
-	    # widget class, widget args
-	    Label, interiorarg)
-	self.__label.grid(row=0, column=0)
+    def get_color(self):
+        return self.__chip['background']
 
-	# create the color chip
-	self.__chip = self.createcomponent(
-	    'chip', (), None,
-	    Frame, interiorarg,
-	    relief=RAISED, borderwidth=2)
-	self.__chip.grid(row=1, column=0)
+    def press(self):
+        self.__chip.configure(relief=SUNKEN)
 
-	# create the color name
-	self.__name = self.createcomponent(
-	    'name', (), None,
-	    Label, interiorarg,)
-	self.__name.grid(row=2, column=0)
-
-	# Check keywords and initialize options
-	self.initialiseoptions(ChipWidget)
-
-    # called whenever `color' option is set
-    def __set_color(self):
-	color = self['color']
-	self.__chip['background'] = color
-	self.__name['text'] = color
+    def release(self):
+        self.__chip.configure(relief=RAISED)
 
 
 
-if __name__ == '__main__':
-    root = Pmw.initialise(fontScheme='pmw1')
-    root.title('ChipWidget demonstration')
+class ChipViewer:
+    def __init__(self, switchboard, parent=None):
+        self.__sb = switchboard
+        self.__frame = Frame(parent)
+        self.__frame.pack()
+        # create the chip that will display the currently selected color
+        # exactly
+        self.__sframe = Frame(self.__frame)
+        self.__sframe.grid(row=0, column=0)
+        self.__selected = ChipWidget(self.__sframe, text='Selected')
+        # create the chip that will display the nearest real X11 color
+        # database color name
+        self.__nframe = Frame(self.__frame)
+        self.__nframe.grid(row=0, column=1)
+        self.__nearest = ChipWidget(self.__nframe, text='Nearest',
+                                    presscmd = self.__buttonpress,
+                                    releasecmd = self.__buttonrelease)
 
-    exitbtn = Button(root, text='Exit', command=root.destroy)
-    exitbtn.pack(side=BOTTOM)
-    widget = ChipWidget(root, color='red',
-			chip_width=200,
-			label_text='Selected Color')
-    widget.pack()
-    root.mainloop()
+    def update_yourself(self, red, green, blue):
+        # TBD: should exactname default to X11 color name if their is an exact
+        # match for the rgb triplet?  Part of me says it's nice to see both
+        # names for the color, the other part says that it's better to
+        # feedback the exact match.
+        rgbtuple = (red, green, blue)
+        try:
+            allcolors = self.__sb.colordb().find_byrgb(rgbtuple)
+            exactname = allcolors[0]
+        except ColorDB.BadColor:
+            exactname = ColorDB.triplet_to_rrggbb(rgbtuple)
+        nearest = self.__sb.colordb().nearest(red, green, blue)
+        self.__selected.set_color(exactname)
+        self.__nearest.set_color(nearest)
+
+    def __buttonpress(self, event=None):
+        self.__nearest.press()
+
+    def __buttonrelease(self, event=None):
+        self.__nearest.release()
+        colorname = self.__nearest.get_color()
+        red, green, blue = self.__sb.colordb().find_byname(colorname)
+        self.__sb.update_views(red, green, blue)