"""
A  basic widget for showing the progress
being made in a task.

"""

from Tkinter import *

class ProgressBar:
    def __init__(self, master=None, orientation="horizontal",
                 min=0, max=100, width=100, height=18,
                 doLabel=1, appearance="sunken",
		 fillColor="blue", background="gray",
                 labelColor="yellow", labelFont="Verdana",
                 labelText="", labelFormat="%d%%",
                 value=50, bd=2):
	# preserve various values
	self.master=master
	self.orientation=orientation
	self.min=min
	self.max=max
	self.width=width
	self.height=height
	self.doLabel=doLabel
	self.fillColor=fillColor
        self.labelFont= labelFont
	self.labelColor=labelColor
	self.background=background
	self.labelText=labelText
	self.labelFormat=labelFormat
	self.value=value
	self.frame=Frame(master, relief=appearance, bd=bd)
	self.canvas=Canvas(self.frame, height=height, width=width, bd=0,
                           highlightthickness=0, background=background)
	self.scale=self.canvas.create_rectangle(0, 0, width, height,
						fill=fillColor)
	self.label=self.canvas.create_text(self.canvas.winfo_reqwidth() / 2,
					   height / 2, text=labelText,
					   anchor="c", fill=labelColor,
					   font=self.labelFont)
	self.update()
	self.canvas.pack(side='top', fill='x', expand='no')

    def updateProgress(self, newValue, newMax=None):
        if newMax:
            self.max = newMax
        self.value = newValue
        self.update()

    def update(self):
	# Trim the values to be between min and max
	value=self.value
	if value > self.max:
	    value = self.max
	if value < self.min:
	    value = self.min
	# Adjust the rectangle
	if self.orientation == "horizontal":
	    self.canvas.coords(self.scale, 0, 0,
		     float(value) / self.max * self.width, self.height)
	else:
	    self.canvas.coords(self.scale, 0,
                     self.height - (float(value) / self.max*self.height),
		     self.width, self.height)
	# Now update the colors
	self.canvas.itemconfig(self.scale, fill=self.fillColor)
	self.canvas.itemconfig(self.label, fill=self.labelColor)
	# And update the label
	if self.doLabel:
            if value:
                if value >= 0:
                    pvalue = int((float(value) / float(self.max)) * 100.0)
                else:
                    value = 0
                self.canvas.itemconfig(self.label, text=self.labelFormat % value)
            else:
                self.canvas.itemconfig(self.label, text='')
	else:
	    self.canvas.itemconfig(self.label, text=self.labelFormat % self.labelText)
	self.canvas.update_idletasks()
