#!/usr/bin/env python
#
# Graphical User Interface program for base conversion
# Based on work by yyy ... (range.py)
# Yotam Medini  yotam.medini@gmail.com -- Created: 2008/June/20
#

import sys
import gtk

# local
import ymtools

class BaseConv:


    def warning(self, msg):
        dlg = gtk.MessageDialog(self.topwin, gtk.DIALOG_MODAL,
                                gtk.MESSAGE_ERROR,
                                gtk.BUTTONS_OK, msg)
        dlg.run()
        dlg.destroy()


    def __init__(self):
        # create a new window
        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.topwin = window
        window.set_size_request(450, 100)
        window.set_title("Base Convertor")
        window.connect("delete_event", lambda w, e: gtk.main_quit())

        vbox = gtk.VBox(False, 0)
        window.add(vbox)
        vbox.show()

        hbox_from = gtk.HBox(False, 0)
        vbox.add(hbox_from)
        hbox_from.show()

        self.add_label(hbox_from, "Number: ")
        self.entry_num_from = self.add_entry(hbox_from)
        self.add_label(hbox_from, "Base: ")
        self.entry_base_from = self.add_entry(hbox_from)

        hbox_to = gtk.HBox(False, 0)
        vbox.add(hbox_to)
        hbox_to.show()

        self.add_label(hbox_to, "Number: ")
        self.entry_num_to = self.add_entry(hbox_to)
        self.entry_num_to.set_editable(False)
        self.add_label(hbox_to, "Base: ")
        self.entry_base_to = self.add_entry(hbox_to)

        button = gtk.Button("convert")
        button.connect("clicked", self.convert, None)
        vbox.pack_start(button, True, True, 0)
        button.show()

        window.show()


    def add_label(self, hbox, s):
        label = gtk.Label(s)
        hbox.pack_start(label, True, True, 0)
        label.show()


    def add_entry(self, hbox):
        e = gtk.Entry()
        hbox.pack_start(e, True, True, 0)
        e.show()
        return e


    def convert(self, w, dummy):
        sfrom = self.entry_num_from.get_text()
        sbase_from = self.entry_base_from.get_text()
        sbase_to = self.entry_base_to.get_text()
        base_from = ymtools.intbase(sbase_from, 10)
        base_to = ymtools.intbase(sbase_to, 10)
        if (not (self.legal_base(base_from) and self.legal_base(base_to))):
            self.warning(
                "Bases '%s' '%s' must both be numeric within [2..16]" %
                (sbase_from, sbase_to))
        else:
            num = ymtools.intbase(sfrom, base_from)
            if num == None:
                self.warning("'%s' does not represent a number in base %d" %
                    (sfrom, base_from))
            else:
                strto = ymtools.strbase(num, base_to)
                self.entry_num_to.set_text(strto)


    def legal_base(self, base):
        return (base != None and 2 <= base <= 16)


# Main program
bc = BaseConv()
gtk.main()
sys.exit(0)
