diff -r 000000000000 -r ae805ac0140d python-2.5.2/win32/Tools/pynche/Switchboard.py --- /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