#!/usr/bin/env python
# -*- coding: ISO-8859-1 -*-


import wx,time
from pydispatch import dispatcher  #new version 2.0
#from dispatch import dispatcher  ### old version 1.02


class MyGaugeFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.panel = wx.Panel(self, -1)
        
        # table definition
        self.cols=4
        self.lastnum=5
        self.fields={}
        self.active_process=wx.StaticText(self.panel, -1, "Running:", (45, 15))
        self.start=wx.StaticText(self.panel, -1, "Beginn: ", (45, 15))
        self.end=wx.StaticText(self.panel, -1, "End: ", (45, 15))
        self.gauge= wx.Gauge(self.panel, -1, 50, (110, 50), (250, 25),wx.GA_SMOOTH)
        
        #headlines
        font = wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD)
        self.table_col_1=wx.StaticText(self.panel, -1, "Task", (45, 15))
        self.table_col_2=wx.StaticText(self.panel, -1, "Total", (45, 15))
        self.table_col_3=wx.StaticText(self.panel, -1, "remind", (45, 15))
        self.table_col_4=wx.StaticText(self.panel, -1, "Status", (45, 15))
        self.table_col_1.SetFont(font)
        self.table_col_2.SetFont(font)
        self.table_col_3.SetFont(font)
        self.table_col_4.SetFont(font)
        

        
        

        
        self.__set_properties()
        self.__do_layout()
        dispatcher.connect(self.update_field,signal='upd_field',sender=dispatcher.Any)
        dispatcher.connect(self.update_gauge,signal='upd_gauge',sender=dispatcher.Any)
        dispatcher.connect(self.set_gauge,signal='set_gauge',sender=dispatcher.Any)
        dispatcher.connect(self.create_task,signal='create_task',sender=dispatcher.Any)
        self.Bind(wx.EVT_ACTIVATE,self.OnActivate)
        

    def OnActivate(self,evt):
        self.Update()
        evt.Skip()

    def __set_properties(self):
        self.SetTitle("Gauge with pydispatch")
        

    def __do_layout(self):
        #def sizer
        self.main_sizer = wx.BoxSizer(wx.VERTICAL)
        self.table_sizer = wx.BoxSizer(wx.VERTICAL)
        self.grid_main_sizer = wx.GridSizer(4, 4, 0, 0)
        
        #set sizers
        self.table_sizer.AddSpacer((10,10))
        self.table_sizer.Add(self.active_process, 0, wx.EXPAND, 0)
        self.table_sizer.AddSpacer((10,10))
        self.table_sizer.Add(self.gauge, 0, wx.EXPAND, 0)
        self.table_sizer.AddSpacer((10,10))
        self.table_sizer.Add(self.start, 0, wx.EXPAND, 0)
        self.table_sizer.Add(self.end, 0, wx.EXPAND, 0)
        self.table_sizer.AddSpacer((10,10))
        self.table_sizer.Add(self.grid_main_sizer, 10, wx.EXPAND, 0)
        #headlines
        self.grid_main_sizer.Add(self.table_col_1, 0, wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL, 0)
        self.grid_main_sizer.Add(self.table_col_2, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
        self.grid_main_sizer.Add(self.table_col_3, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 0)
        self.grid_main_sizer.Add(self.table_col_4, 0, wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL, 0)
        

        
        #layout sizers
        self.panel.SetSizer(self.table_sizer)
        self.main_sizer.Add(self.panel, 1, wx.EXPAND, 0)
        self.SetSizer(self.main_sizer)



   
    def set_gauge(self,range):
        self.gauge.SetRange(range)
        self.gauge.SetValue(0)
        self.Update()
    def update_gauge(self,step):
        if self.gauge.GetValue()+step >= self.gauge.GetRange():
            self.gauge.SetValue(0)
        else:
            self.gauge.SetValue(self.gauge.GetValue()+step)
            self.Update()

    def update_field(self,name,pos,data):
        field=self.fields[name][pos]
        eval(field+'.SetLabel("'+data+'")')
        self.main_sizer.SetSizeHints(self)
    def create_task(self,name):
        item_list=[]
        styles=[wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL,wx.ALIGN_CENTER,
                wx.ALIGN_CENTER,wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL]
        
        i=0
        for item in range(self.lastnum,self.lastnum+self.cols):
            exec('self.table_col_'+str(item)+'=wx.StaticText(self.panel, -1, "", (45, 15))')
            self.grid_main_sizer.Add(eval('self.table_col_'+str(item)), 1, styles[i], 0)
            item_list.append('self.table_col_'+str(item))
            i+=1
        eval('self.table_col_'+str(self.lastnum)).SetLabel(name)
        self.lastnum=self.lastnum+self.cols
        self.active_process.SetLabel('Running: '+name)
        self.main_sizer.SetSizeHints(self)
        self.fields[name]=item_list


if __name__ == "__main__":
    app = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    frame_1 = MyGaugeFrame(None, -1, "")
    app.SetTopWindow(frame_1)
    frame_1.Show()
    app.MainLoop()
