import gobject
import gtk


class Downloader(gtk.Dialog):

    def __init__(self, path):

        self.__is_cancelled = False

        gtk.Dialog.__init__(self, title = "", buttons = (gtk.STOCK_CANCEL,
                                                         gtk.RESPONSE_CANCEL))
        self.set_default_size(300, 100)
        self.connect("response", self.__on_cancel)

        vbox = self.vbox

        hbox = gtk.HBox(False, 12)
        hbox.set_border_width(12)
        vbox.pack_start(hbox, True, True)
        import os
        img = gtk.Image()
        img.set_from_file(os.path.join(path, "download.png"))
        hbox.pack_start(img, False, False)

        vbox = gtk.VBox()
        hbox.pack_end(vbox, True, True)

        lbl = gtk.Label("<b>" + _("Retrieving:") + "</b>")
        lbl.set_use_markup(True)
        align = gtk.Alignment(0.0, 0.0)
        align.add(lbl)
        vbox.add(align)

        self.__label = gtk.Label("")
        self.__label.set_use_markup(True)
        align = gtk.Alignment(0.0, 0.0)
        align.add(self.__label)
        vbox.add(align)

        self.__bar = gtk.ProgressBar()
        vbox.add(self.__bar)


    def __on_cancel(self, src, response):

        self.__is_cancelled = True


    def download(self, url, dest):

        name = url
        if (len(name) >= 60):
            name = name[:30] + "..." + name[-30:]
        gobject.timeout_add(0, self.__label.set_text, "%s" % (name))
        gobject.timeout_add(0, self.__bar.set_fraction, 0)
        gobject.timeout_add(0, self.__bar.set_text, "Contacting...")

        gobject.timeout_add(0, self.show_all)
        self.__is_cancelled = False

        dest_fd = open(dest, "w")
        import urllib2
        src_fd = urllib2.urlopen(url)
        total_size = src_fd.info().get("Content-Length", 0)
        so_far = 0
        while (not self.__is_cancelled):
            data = src_fd.read(4096)
            if (not data):
                break
            dest_fd.write(data)
            so_far += len(data)
            value = (100 * so_far / max(0.1, float(total_size)))
            gobject.timeout_add(0, self.__bar.set_fraction, value / 100.0)
            gobject.timeout_add(0, self.__bar.set_text, "%i%%" % (value))

        src_fd.close()
        dest_fd.close()

        gobject.timeout_add(0, self.hide)

