import gtk
import gtk.glade
import os

from Progress import Progress, ProgressCanceled
from gtk import TRUE
from gtk import FALSE
from config import *

class ProgressDialog (Progress):
    def __init__ (self, parent=None):
        Progress.__init__ (self)
        self.parent = parent
        if parent:
            self.dialog.set_transient_for (parent)

    def prepare_block (self, block_size, info=None):
        Progress.prepare_block (self, block_size, info)
        if self.dialog == None: return

        if info:
            self.info_label.set_markup ("<i>"+info+"</i>")
        self.progressbar.set_fraction (self.block_start)

        while gtk.events_pending ():
            gtk.mainiteration ()
        # Raise an exception if it gets set during the mainiteration
        if self.canceled:
            raise ProgressCanceled

    def clear (self):
        Progress.clear (self)
        self.info_label.set_markup ("<i> </i>")
        while gtk.events_pending ():
            gtk.mainiteration ()
        # Raise an exception if it gets set during the mainiteration
        if self.canceled:
            raise ProgressCanceled

    def update (self, percent):
        fraction = self.fraction
        Progress.update (self, percent)
        if self.dialog == None: return

        # Only update if it's changed a significant amount
        if int (self.fraction*100) == int (fraction*100):
            return
        self.progressbar.set_fraction (self.fraction)

        while gtk.events_pending ():
            gtk.mainiteration ()
        if self.canceled:
            raise ProgressCanceled

    def destroy (self):
        if self.dialog == None: return

        while gtk.events_pending ():
            gtk.mainiteration ()
        self.dialog.destroy ()
        self.dialog = None

    def get_dialog (self):
        return self.dialog

# Simple usable Progress Dialog
class SimpleProgressDialog (ProgressDialog):
    def __init__ (self, message, info, title, parent=None):
        glade_file = 'ProgressDialog.glade'
        if not os.path.isfile(glade_file):
            glade_file = GLADEDIR + glade_file
        xml = gtk.glade.XML (glade_file, domain=PROGNAME)

        #Get the necessary widgets
        self.label = xml.get_widget ('progress_label')
        self.info_label = xml.get_widget ('progress_info_label')
        self.progressbar = xml.get_widget ('progress_progressbar')
        self.dialog = xml.get_widget ('progress_dialog')

        ProgressDialog.__init__ (self, parent)

        self.label.set_markup (message)
        self.info_label.set_markup ("<i>" + info + "</i>")
        self.dialog.set_title (title)


