################################################################################
#
#       This file is part of Gato (Graph Animation Toolbox) 
#
#	file:   GatoConfiguration.py
#	author: Alexander Schliep (schliep@molgen.mpg.de)
#
#       Copyright (C) 1998-2005, Alexander Schliep, Winfried Hochstaettler and 
#       Copyright 1998-2001 ZAIK/ZPR, Universitaet zu Koeln
#                                   
#       Contact: schliep@molgen.mpg.de, wh@zpr.uni-koeln.de             
#       Information: http://gato.sf.net
#
#       This library is free software; you can redistribute it and/or
#       modify it under the terms of the GNU Library General Public
#       License as published by the Free Software Foundation; either
#       version 2 of the License, or (at your option) any later version.
#
#       This library is distributed in the hope that it will be useful,
#       but WITHOUT ANY WARRANTY; without even the implied warranty of
#       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#       Library General Public License for more details.
#
#       You should have received a copy of the GNU Library General Public
#       License along with this library; if not, write to the Free
#       Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
#
#
#       This file is version $Revision: 1.8 $ 
#                       from $Date: 2005/02/22 11:12:49 $
#             last change by $Author: schliep $.
#
###############################################################################

import ConfigParser
import tkSimpleDialog 
import sys
import os
import tkFont
from Tkinter import *
from EditObjectAttributesDialog import TkIntEntry, TkStringPopupSelector, TkColorSelector

import StringIO

default_cfg = """
[animation]
BlinkRate = 50
BlinkRepeat = 4

[algorithm]
AlgoFont = Courier
AlgoFontSize = 10
# FG determines the foreground color and BG the background
# Valid colors are Tk names or #rrggbb hex tripel
AlgoFG = black 
AlgoBG = white 
BreakpointFG = #ff0000
BreakpointBG = #e5e5e5
InteractiveFG = #009900
InteractiveBG = #e5e5e5
ActiveFG = black
ActiveBG = #bbbbff
"""

class GatoConfiguration:
    """ GatoConfiguration provides a collection of all editable
    configuration items
    
    Configurations are read from
    - default_cfg string
    - gato.cfg
    - ~user/.gato.cfg
    """
    
    def __init__(self, parent):
        self.parent = parent
        self.config = ConfigParser.ConfigParser()
        self.config.readfp(StringIO.StringIO(default_cfg))
        self.config.read(['gato.cfg', os.path.expanduser('~/.gato.cfg')])
        # Keys which have widgets for editing
        self.editkeys = ['blinkrate', 'blinkrepeat', 
                         'algofont', 'algofontsize', 
                         'algofg', 'algobg',
                         'breakpointfg', 'breakpointbg',
                         'interactivefg', 'interactivebg',
                         'activefg', 'activebg']
        # setup a list of legal config keys and remember what section
        # they are from 
        self.keys = []
        self.section = {}
        for sec in self.config.sections():
            self.keys += self.config.options(sec)
            for opt in self.config.options(sec):
                self.section[opt] = sec
                #self.fonts = ['Courier', 'Helvetica']
        self.fonts = tkFont.families(self.parent)
        self.modified = 0
        
    def writeBack(self):
        """ write the current configuration to the user's config file """
        file = os.path.expanduser('~/.gato.cfg')
        try:
            cf = open(file, 'w')
        except:
            return
            
        self.config.write(cf)
        cf.close()
        
        
    def get(self, name):
        if name in self.keys:
            return self.config.get(self.section[name], name)
        else:
            raise 'NoOptionError'
            
    def set(self, name, value):
        if name in self.keys:
            self.config.set(self.section[name], name, "%s" % value)
            self.modified = 1
        else:
            raise 'NoOptionError'
            
            
    def edit(self):
        """ Bring up the editor for the configuration """
        conf_dialog = EditPreferencesDialog(self.parent, self)
        if self.modified == 1:
            self.writeBack()
            self.parent.SetFromConfig()
            
class EditPreferencesDialog(tkSimpleDialog.Dialog):
    def __init__(self, master, gatoconfig):
        self.widgets = {}
        self.gatoconfig = gatoconfig
        tkSimpleDialog.Dialog.__init__(self, master, "Preferences")
        
        
    def pane(self, master, name, desc):
        if desc == "":
            frame = LabelFrame(master, relief=RIDGE, borderwidth=2, text=name)
        else:
            frame = LabelFrame(master, relief=RIDGE, borderwidth=2, text=name + ":" + desc)            
        frame.pack(expand=1, fill=BOTH, side=TOP)
        result = Frame(frame)
        return result
        
    def body(self, master):
        self.resizable(0,0)	
        
        #------------------ pane ------------------------------------------
        pane = self.pane(master, "Animation", "")
        row = 0
        Label(pane, text="Delay between instructions:").grid(row=row, 
                                                             column=0, sticky=E)	
        self.widgets['blinkrate'] = TkIntEntry(pane, 3)
        self.widgets['blinkrate'].tkWidget().grid(row=row, column=1, sticky=W)
        self.widgets['blinkrate'].set(100)
        
        row += 1
        Label(pane, text="Number of blinks:").grid(row=row, column=0, sticky=E)	
        self.widgets['blinkrepeat'] = TkIntEntry(pane, 2)
        self.widgets['blinkrepeat'].tkWidget().grid(row=row, column=1, sticky=W)
        self.widgets['blinkrepeat'].set(4)
        
        pane.pack(expand=1, fill=BOTH, padx=4, pady=4, side=BOTTOM)
        
        #------------------ pane ------------------------------------------
        pane = self.pane(master, "Algorithm Font", "")
        row = 1
        Label(pane, text="Font:").grid(row=row, column=0, sticky=E)	
        self.widgets['algofont'] = TkStringPopupSelector(pane, self.gatoconfig.fonts)
        self.widgets['algofont'].tkWidget().grid(row=row, column=1, 
                                                 sticky=W, columnspan=2)
        
        row += 1
        Label(pane, text="Font Size:").grid(row=row, column=0, sticky=E)	
        self.widgets['algofontsize'] = TkIntEntry(pane, 2)
        self.widgets['algofontsize'].tkWidget().grid(row=row, column=1, sticky=W)
        self.widgets['algofontsize'].set(12)
        
        pane.pack(expand=1, fill=BOTH, padx=4, pady=4, side=BOTTOM)
        #------------------ pane ------------------------------------------
        pane = self.pane(master, "Algorithm Colors", "")
        
        row = 1
        Label(pane, text="Foreground").grid(row=row, column=1, sticky=W)
        Label(pane, text="Background").grid(row=row, column=2, sticky=W)
        
        row += 1
        Label(pane, text="Font Color:").grid(row=row, column=0, sticky=E)	
        self.widgets['algofg'] = TkColorSelector(pane, 'black')
        self.widgets['algofg'].tkWidget().grid(row=row, column=1, sticky=W)
        self.widgets['algobg'] = TkColorSelector(pane, 'black')
        self.widgets['algobg'].tkWidget().grid(row=row, column=2, sticky=W)
        
        row += 1
        Label(pane, text="Breakpoint Font Color:").grid(row=row, column=0, sticky=E)	
        self.widgets['breakpointfg'] = TkColorSelector(pane, 'black')
        self.widgets['breakpointfg'].tkWidget().grid(row=row, column=1, sticky=W)
        self.widgets['breakpointbg'] = TkColorSelector(pane, 'black')
        self.widgets['breakpointbg'].tkWidget().grid(row=row, column=2, sticky=W)
        
        row += 1
        Label(pane, text="Interactive Font Color:").grid(row=row, column=0, sticky=E)	
        self.widgets['interactivefg'] = TkColorSelector(pane, 'black')
        self.widgets['interactivefg'].tkWidget().grid(row=row, column=1, sticky=W)
        self.widgets['interactivebg'] = TkColorSelector(pane, 'black')
        self.widgets['interactivebg'].tkWidget().grid(row=row, column=2, sticky=W)
        
        row += 1
        Label(pane, text="Active lines:").grid(row=row, column=0, sticky=E)	
        self.widgets['activefg'] = TkColorSelector(pane, 'black')
        self.widgets['activefg'].tkWidget().grid(row=row, column=1, sticky=W)
        self.widgets['activebg'] = TkColorSelector(pane, 'black')
        self.widgets['activebg'].tkWidget().grid(row=row, column=2, sticky=W)
        
        pane.pack(expand=1, fill=BOTH, padx=4, pady=4, side=BOTTOM)
        
        for pref in self.gatoconfig.editkeys:
            self.widgets[pref].set(self.gatoconfig.get(pref))
            
    def validate(self):
        ## Colors need no validating
    
        # Everything is valid
        for pref in self.gatoconfig.editkeys:
            self.gatoconfig.set(pref, self.widgets[pref].get())
        return 1
        
        
        
        
        #---------------- Test code ---------------------------------------------
class TkTestFrame(Frame):

    def __init__(self, parent=None):
        Frame.__init__(self,parent)
        Pack.config(self)
        self.createWidgets()
        #self.fonts = tkFont.families(self)
        self.config = GatoConfiguration(self) 
        self.fonts = ['Helvetica','Times']
        
    def createWidgets(self):
        self.QUIT = Button(self, text='QUIT', foreground='red', 
                           command=self.quit)
        self.QUIT.pack(side=LEFT)
        self.About = Button(self, text='Preferences', foreground='red', 
                           command=self.About)
        self.About.pack(side=LEFT)
        
    def About(self):
        self.config.edit()
        
        
if __name__ == '__main__':
    app = TkTestFrame()
    app.mainloop()
    
    
    
    


syntax highlighted by Code2HTML, v. 0.9.1