################################################################################
#
#       This file is part of Gato (Graph Animation Toolbox) 
#
#	file:   GatoUtil.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.1 $ 
#                       from $Date: 2007/10/04 14:36:39 $
#             last change by $Author: edream $.
#
################################################################################

from Tkinter import *
import time

def gatoPath():
    """ Returns the path to the directory containint Gato.py or Gred.py """
    import os
    return os.path.dirname(__name__ == '__main__' and sys.argv[0] or __file__)
    
def extension(pathAndFile):
    """ Return ext if path/filename.ext is given """
    import string
    return string.split(stripPath(pathAndFile),".")[-1]
    
def stripPath(pathAndFile):
    """ Return filename.ext if path/filename.ext is given """
    import os 
    return os.path.split(pathAndFile)[1]
    
def orthogonal(u):
    """ Return a unit length vector (v1,v2) which has an angle of
        90 degrees clockwise to the vector u = (u1,u2) """
    from math import sqrt
    (u1,u2) = u
    length = sqrt(u1**2 + u2**2)
    if length < 0.001:
        length = 0.001
    u1 = u1 / length
    u2 = u2 / length
    return (-u2,u1)
    
    
def ArgMin(list,val):
    """ Returns the element e of list for which val[e] is minimal """
    if len(list) > 0:
        min     = val[list[0]]
        minElem = list[0]
    for e in list:
        if val[e] < min:
            min     = val[e]
            minElem = e
    return minElem
    
    
def ArgMax(list,val):
    """ Returns the element e of list for which val[e] is maximal """
    if len(list) > 0:
        max     = val[list[0]]
        maxElem = list[0]
    for e in list:
        if val[e] > max:
            max     = val[e]
            maxElem = e
    return maxElem
    
    
class MethodLogger:
    """ Provide logging of method calls with parameters 
        E.g., for regression testing
    
        XXX specify output channel (or do it via redirect ?)
    """
    
    def __init__(self, object):
        self.object = object
        
    def __getattr__(self,arg):
        self.methodName = arg
        self.method = getattr(self.object,arg)
        return getattr(self,'caller')
        
    def caller(self,*args):
        print self.methodName,"(",args,")"
        return apply(self.method,args)
        
        
        
class TimedMethodLogger:
    """ Provide logging of method calls with parameters 
        E.g., for regression testing
    
        XXX specify output channel (or do it via redirect ?)
    """
    
    def __init__(self, object):
        self.object = object
        self.tml_calls = []
        self.tml_log_method_names = ['SetEdgeColor','SetVertexColor']
        self.tml_log_method_argnr = {'SetEdgeColor':2,
                                     'SetVertexColor':1}
        
        
    def __getattr__(self,arg):
        self.methodName = arg
        self.method = getattr(self.object,arg)
        return getattr(self,'caller')
        
    def caller(self,*args):
        if self.methodName in self.tml_log_method_names:
            i = self.tml_log_method_argnr[self.methodName]
            self.tml_calls.append( (time.time(), self.methodName, tuple(args[0:i])) + args[i:])
            print self.tml_calls[-1]
        return apply(self.method,args)
        
    def getLog(self):
        return self.tml_calls
        
        
class ImageCache:
    """ Provides a global cache for PhotoImages displayed in the 
        application. Singleton Pattern """
    
    images = None	
    
    def __init__(self):
        if ImageCache.images == None:
            ImageCache.images = {}
            
    def __getitem__(self, relURL):
        """ Given a relative URL to an image file return the 
            corresponding PhotoImage. """
        try:    
            if relURL not in self.images.keys():
                ImageCache.images[relURL] = PhotoImage(file=relURL)
            return ImageCache.images[relURL]
        except IndexError, IOError:
            import logging
            log = logging.getLogger("GatoUtil.py")
            log.exception("Error finding image %s" % relURL)
            
    def AddImage(self, relURL, imageData):
        ImageCache.images[relURL] = PhotoImage(data=imageData)
