"""A translation of an example from the Java Tutorial
http://java.sun.com/docs/books/tutorial/

This example converts between metric and english units
"""

from java import awt
from java.applet import Applet
from java.awt.event import ActionListener, ItemListener, AdjustmentListener
from pawt import GridBag

basicUnits = [['Metric System', [('Centimeters', 0.01),
				 ('Meters', 1.0),
				 ('Kilometers', 1000.0)]],
	      ['U.S. System', [('Inches', 0.0254),
			       ('Feet', 0.305),
			       ('Yards', 0.914),
			       ('Miles', 1613.0)]]
	      ]



class SimpleBorder:
    def paint(self, g):
	g.drawRect(0,0,self.size.width-1, self.size.height-1)

    def getInsets(self):
	return awt.Insets(5,5,5,5)



class Converter(Applet, SimpleBorder):
    def init(self, unitSets=basicUnits):
	self.setLayout(awt.GridLayout(2,0,5,5))
	self.panels = []
	for name, units in unitSets:
	    panel = ConversionPanel(name, units, self)
	    self.panels.append(panel)
	    self.add(panel)

    def convert(self, master):
	value = master.getValue()
	multiplier = master.getMultiplier()

	for panel in self.panels:
	    if panel is not master:
		panel.setValue(multiplier/panel.getMultiplier()*value)



class ConversionPanel(awt.Panel, SimpleBorder,
		      ActionListener, AdjustmentListener, ItemListener):
    max, block = 10000, 100

    def __init__(self, title, units, controller):
	self.units = units
	self.controller = controller

	bag = GridBag(self, fill='HORIZONTAL')

	label = awt.Label(title, awt.Label.CENTER)
	bag.addRow(label)

	self.text = awt.TextField('0', 10, actionListener=self)
	bag.add(self.text, weightx=1.0)

	self.chooser = awt.Choice(itemListener=self)
	for name, multiplier in units:
	    self.chooser.add(name)
	bag.addRow(self.chooser)

	self.slider = awt.Scrollbar(awt.Scrollbar.HORIZONTAL,
				    maximum=self.max+10,
				    blockIncrement=self.block,
				    adjustmentListener=self)
	bag.add(self.slider)

    def getMultiplier(self):
	return self.units[self.chooser.selectedIndex][1]

    def getValue(self):
	try:
	    return float(self.text.getText())
	except:
	    return 0.0

    def actionPerformed(self, e):
	self.setSlider(self.getValue())
	self.controller.convert(self)

    def itemStateChanged(self, e):
	self.controller.convert(self)

    def adjustmentValueChanged(self, e):
	self.text.setText(str(e.getValue()))
	self.controller.convert(self)

    def setValue(self, v):
	self.text.setText(str(v))
	self.setSlider(v)

    def setSlider(self, f):
	if f > self.max:
	    f = self.max
	if f < 0:
	    f = 0
	self.slider.value = int(f)



if __name__ == '__main__':
    import pawt
    pawt.test(Converter())
