/*
* 1.1+Swing version.
*/
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class Converter {
ConversionPanel metricPanel, usaPanel;
Unit[] metricDistances = new Unit[3];
Unit[] usaDistances = new Unit[4];
final static boolean COLORS = false;
final static boolean DEBUG = false;
final static String LOOKANDFEEL = null;
ConverterRangeModel dataModel = new ConverterRangeModel();
JPanel mainPane;
/**
* Create the ConversionPanels (one for metric, another for U.S.).
* I used "U.S." because although Imperial and U.S. distance
* measurements are the same, this program could be extended to
* include volume measurements, which aren't the same.
*
* Put the ConversionPanels into a frame, and bring up the frame.
*/
public Converter() {
//Create Unit objects for metric distances, and then
//instantiate a ConversionPanel with these Units.
metricDistances[0] = new Unit("Centimeters", 0.01);
metricDistances[1] = new Unit("Meters", 1.0);
metricDistances[2] = new Unit("Kilometers", 1000.0);
metricPanel = new ConversionPanel(this, "Metric System",
metricDistances,
dataModel);
//Create Unit objects for U.S. distances, and then
//instantiate a ConversionPanel with these Units.
usaDistances[0] = new Unit("Inches", 0.0254);
usaDistances[1] = new Unit("Feet", 0.305);
usaDistances[2] = new Unit("Yards", 0.914);
usaDistances[3] = new Unit("Miles", 1613.0);
usaPanel = new ConversionPanel(this, "U.S. System",
usaDistances,
new FollowerRangeModel(dataModel));
//Create a JPanel, and add the ConversionPanels to it.
mainPane = new JPanel();
if (COLORS) {
mainPane.setBackground(Color.red);
}
mainPane.setLayout(new GridLayout(2, 1, 5, 5));
mainPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
mainPane.add(metricPanel);
mainPane.add(usaPanel);
resetMaxValues(true);
}
public void resetMaxValues(boolean resetCurrentValues) {
double metricMultiplier = metricPanel.getMultiplier();
double usaMultiplier = usaPanel.getMultiplier();
int maximum = ConversionPanel.MAX;
if (metricMultiplier > usaMultiplier) {
maximum = (int)(ConversionPanel.MAX *
(usaMultiplier / metricMultiplier));
}
if (DEBUG) {
System.out.println("in Converter resetMaxValues");
System.out.println(" metricMultiplier = "
+ metricMultiplier
+ "; usaMultiplier = "
+ usaMultiplier
+ "; maximum = "
+ maximum);
}
dataModel.setMaximum(maximum);
if (resetCurrentValues) {
dataModel.setDoubleValue(maximum);
}
}
private static void initLookAndFeel() {
String lookAndFeel = null;
if (LOOKANDFEEL != null) {
if (LOOKANDFEEL.equals("Metal")) {
lookAndFeel = UIManager.getCrossPlatformLookAndFeelClassName();
} else if (LOOKANDFEEL.equals("System")) {
lookAndFeel = UIManager.getSystemLookAndFeelClassName();
} else if (LOOKANDFEEL.equals("Mac")) {
lookAndFeel = "com.sun.java.swing.plaf.mac.MacLookAndFeel";
//PENDING: check!
} else if (LOOKANDFEEL.equals("Windows")) {
lookAndFeel = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
} else if (LOOKANDFEEL.equals("Motif")) {
lookAndFeel = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
}
if (DEBUG) {
System.out.println("About to request look and feel: "
+ lookAndFeel);
}
try {
UIManager.setLookAndFeel(lookAndFeel);
} catch (ClassNotFoundException e) {
System.err.println("Couldn't find class for specified look and feel:"
+ lookAndFeel);
System.err.println("Did you include the L&F library in the class path?");
System.err.println("Using the default look and feel.");
} catch (UnsupportedLookAndFeelException e) {
System.err.println("Can't use the specified look and feel ("
+ lookAndFeel
+ ") on this platform.");
System.err.println("Using the default look and feel.");
} catch (Exception e) {
System.err.println("Couldn't get specified look and feel ("
+ lookAndFeel
+ "), for some reason.");
System.err.println("Using the default look and feel.");
e.printStackTrace();
}
}
}
public static void main(String[] args) {
initLookAndFeel();
Converter converter = new Converter();
//Create a new window.
JFrame f = new JFrame("Converter");
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
//Add the JPanel to the window and display the window.
//We can use a JPanel for the content pane because
//JPanel is opaque.
f.setContentPane(converter.mainPane);
if (COLORS) {
//This has no effect, since the JPanel completely
//covers the content pane.
f.getContentPane().setBackground(Color.green);
}
f.pack(); //Resizes the window to its natural size.
f.setVisible(true);
}
}