
__doc__="a class for logging"

from gtk import *
import time

class log_widget:
    #last log time
    __log_time=0.0
    #list of levels
    __levels=[]
    #list of messages
    __messages=[]
    #pop is running
    __popping=FALSE
    
    def __init__(self):

    
        st=GtkStatusbar()
        st.show()
        self.statusbar_status=st
        #for outside
        self.widget=st
        self.__widget=st                

        #FIXME: I dont really understand this
        self.context=st.get_context_id ('any case')

        st.connect("destroy",self.stop)

        self.def_style=st.get_style()

    def __del__(self):
        self.__popping=FALSE
        
    def stop(self,data):
        self.__popping=FALSE
        
    #methods
    def pop(self,data):
        if self.__levels and self.__popping:
            self.statusbar_status.pop(self.__levels[0])
            self.__levels=self.__levels[1:]
            self.__messages=self.__messages[1:]
            if self.__levels and self.__popping:
                n=len(self.__levels)-1
                m=self.__messages[0]
                if n>0:
                    m=m+ ('\n(%s more)' % n)
                self.statusbar_status.push(self.__levels[0],
                                           m)
            #FIXME doesnt work..
            else:
                self.statusbar_status.bg = self.def_style.fg[STATE_NORMAL]
            return TRUE
        else:
            self.__popping=FALSE
            return FALSE
    
    def log(self,level,text):
        #FIXME: I dont know the right way to use this... and it shows!
        level=self.context
        
        self.__levels.append(level)
        self.__messages.append(text)
        if not self.__popping:
            self.statusbar_status.push(self.__levels[0],
                                       self.__messages[0])
        #FIXME doesnt work..
        self.statusbar_status.bg = self.def_style.black
        
        #no:self.statusbar_status.push(level,text)
        #it is a first in-first out
        while events_pending():
            #this is not main_iteration... but instead:
            mainiteration()
        self.__log_time=time.time()

        if not self.__popping:
            self.__popping=TRUE
            timeout_add(2500,self.pop,self)
    
        
