python-2.5.2/win32/Tools/pynche/Switchboard.py
changeset 0 ae805ac0140d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/python-2.5.2/win32/Tools/pynche/Switchboard.py	Fri Apr 03 17:19:34 2009 +0100
@@ -0,0 +1,139 @@
+"""Switchboard class.
+
+This class is used to coordinate updates among all Viewers.  Every Viewer must
+conform to the following interface:
+
+    - it must include a method called update_yourself() which takes three
+      arguments; the red, green, and blue values of the selected color.
+
+    - When a Viewer selects a color and wishes to update all other Views, it
+      should call update_views() on the Switchboard object.  Note that the
+      Viewer typically does *not* update itself before calling update_views(),
+      since this would cause it to get updated twice.
+
+Optionally, Viewers can also implement:
+
+    - save_options() which takes an optiondb (a dictionary).  Store into this
+      dictionary any values the Viewer wants to save in the persistent
+      ~/.pynche file.  This dictionary is saved using marshal.  The namespace
+      for the keys is ad-hoc; make sure you don't clobber some other Viewer's
+      keys!
+
+    - withdraw() which takes no arguments.  This is called when Pynche is
+      unmapped.  All Viewers should implement this.
+
+    - colordb_changed() which takes a single argument, an instance of
+      ColorDB.  This is called whenever the color name database is changed and
+      gives a chance for the Viewers to do something on those events.  See
+      ListViewer for details.
+
+External Viewers are found dynamically.  Viewer modules should have names such
+as FooViewer.py.  If such a named module has a module global variable called
+ADDTOVIEW and this variable is true, the Viewer will be added dynamically to
+the `View' menu.  ADDTOVIEW contains a string which is used as the menu item
+to display the Viewer (one kludge: if the string contains a `%', this is used
+to indicate that the next character will get an underline in the menu,
+otherwise the first character is underlined).
+
+FooViewer.py should contain a class called FooViewer, and its constructor
+should take two arguments, an instance of Switchboard, and optionally a Tk
+master window.
+
+"""
+
+import sys
+from types import DictType
+import marshal
+
+
+
+class Switchboard:
+    def __init__(self, initfile):
+        self.__initfile = initfile
+        self.__colordb = None
+        self.__optiondb = {}
+        self.__views = []
+        self.__red = 0
+        self.__green = 0
+        self.__blue = 0
+        self.__canceled = 0
+        # read the initialization file
+        fp = None
+        if initfile:
+            try:
+                try:
+                    fp = open(initfile)
+                    self.__optiondb = marshal.load(fp)
+                    if not isinstance(self.__optiondb, DictType):
+                        print >> sys.stderr, \
+                              'Problem reading options from file:', initfile
+                        self.__optiondb = {}
+                except (IOError, EOFError, ValueError):
+                    pass
+            finally:
+                if fp:
+                    fp.close()
+
+    def add_view(self, view):
+        self.__views.append(view)
+
+    def update_views(self, red, green, blue):
+        self.__red = red
+        self.__green = green
+        self.__blue = blue
+        for v in self.__views:
+            v.update_yourself(red, green, blue)
+
+    def update_views_current(self):
+        self.update_views(self.__red, self.__green, self.__blue)
+
+    def current_rgb(self):
+        return self.__red, self.__green, self.__blue
+
+    def colordb(self):
+        return self.__colordb
+
+    def set_colordb(self, colordb):
+        self.__colordb = colordb
+        for v in self.__views:
+            if hasattr(v, 'colordb_changed'):
+                v.colordb_changed(colordb)
+        self.update_views_current()
+
+    def optiondb(self):
+        return self.__optiondb
+
+    def save_views(self):
+        # save the current color
+        self.__optiondb['RED'] = self.__red
+        self.__optiondb['GREEN'] = self.__green
+        self.__optiondb['BLUE'] = self.__blue
+        for v in self.__views:
+            if hasattr(v, 'save_options'):
+                v.save_options(self.__optiondb)
+        # save the name of the file used for the color database.  we'll try to
+        # load this first.
+        self.__optiondb['DBFILE'] = self.__colordb.filename()
+        fp = None
+        try:
+            try:
+                fp = open(self.__initfile, 'w')
+            except IOError:
+                print >> sys.stderr, 'Cannot write options to file:', \
+                      self.__initfile
+            else:
+                marshal.dump(self.__optiondb, fp)
+        finally:
+            if fp:
+                fp.close()
+
+    def withdraw_views(self):
+        for v in self.__views:
+            if hasattr(v, 'withdraw'):
+                v.withdraw()
+
+    def canceled(self, flag=1):
+        self.__canceled = flag
+
+    def canceled_p(self):
+        return self.__canceled