/*
* MogensenPlanetDisplay.java 1.0 98/06/03 Carl Burke
*
* Provides a simple interface to Torben AE. Mogensen's planet generator.
*
* Copyright (c) 1998 Carl Burke.
*/
import java.awt.*;
import java.awt.image.*;
import java.applet.*;
class MogensenPlanetPanel extends Panel implements ImageObserver
{
private Dimension panelDimensions;
private ImageProjection ip;
private Image img;
private Button working;
private boolean creatingImage;
public MogensenPlanetPanel(Button w)
{
super();
panelDimensions = new Dimension(400, 400);
working = w;
creatingImage = false;
}
public Dimension getMinimumSize()
{
return new Dimension(panelDimensions);
}
public Dimension getMaximumSize()
{
return new Dimension(panelDimensions);
}
public Dimension getPreferredSize()
{
return new Dimension(panelDimensions);
}
public Dimension minimumSize()
{
return new Dimension(panelDimensions);
}
public Dimension preferredSize()
{
return new Dimension(panelDimensions);
}
public void setImageProjection(ImageProjection IP)
{
ip = IP;
recalculateProjection();
}
public void recalculateProjection()
{
img = null;
ip.forcePixelRecalc();
repaint();
}
public void paint(Graphics g)
{
g.setColor(Color.white);
if (ip==null)
{
Color c = g.getColor();
g.setColor(Color.black);
g.fillRect(0, 0, panelDimensions.width, panelDimensions.height);
g.setColor(c);
}
else
{
if (img==null)
{
creatingImage = true;
working.setBackground(Color.red);
working.setForeground(Color.black);
working.setLabel("working");
working.repaint();
img = createImage(ip);
}
g.drawImage(img, 0, 0, Color.black, this);
}
}
public boolean imageUpdate(
Image img,
int infoflags,
int x, int y,
int width, int height)
{
int doneflags = ImageObserver.ALLBITS |
ImageObserver.ERROR |
ImageObserver.ABORT;
if (creatingImage && ((infoflags & doneflags) != 0))
{
creatingImage = false;
working.setBackground(Color.black);
working.setForeground(Color.black);
working.setLabel(null);
working.repaint();
}
return super.imageUpdate(img, infoflags, x, y, width, height);
}
}
public class MogensenPlanetDisplay extends Applet
{
private Choice projection;
private String selectedProjection;
private Button working;
private Button redraw;
private MogensenPlanetPanel mainPanel;
private MogensenSolidNoiseGenerator msng;
private ImageProjection ip;
private double latitude;
private double longitude;
private TextField latField;
private TextField longField;
private Label latLabel;
private Label longLabel;
private double latgrid;
private double longrid;
private TextField latGridField;
private TextField lonGridField;
private Label latGridLabel;
private Label lonGridLabel;
private double magnification;
private TextField magField;
private Label magLabel;
private double seed;
private TextField seedField;
private Label seedLabel;
private Checkbox changeColorsWithLatitude;
private void setImageProjection()
{
if (selectedProjection.equals("Azimuth"))
ip = new AzimuthImageProjection(400, 400, msng);
else if (selectedProjection.equals("Conical"))
{
if (latitude==0.0)
ip = new MercatorImageProjection(400, 400, msng);
else
ip = new ConicalImageProjection(400, 400, msng);
}
else if (selectedProjection.equals("Gnomonic"))
ip = new GnomonicImageProjection(400, 400, msng);
else if (selectedProjection.equals("Mercator"))
ip = new MercatorImageProjection(400, 400, msng);
else if (selectedProjection.equals("Mollweide"))
ip = new MollweideImageProjection(400, 400, msng);
else if (selectedProjection.equals("Orthographic"))
ip = new OrthographicImageProjection(400, 400, msng);
else if (selectedProjection.equals("Peter"))
ip = new PeterImageProjection(400, 400, msng);
else if (selectedProjection.equals("Sinusoid"))
ip = new SinusoidImageProjection(400, 400, msng);
else if (selectedProjection.equals("Square"))
ip = new SquareImageProjection(400, 400, msng);
else if (selectedProjection.equals("Stereo"))
ip = new StereoImageProjection(400, 400, msng);
ip.setCenterOfProjection(longitude, latitude);
ip.setGridSpacing(longrid, latgrid);
ip.setMagnification(magnification);
mainPanel.setImageProjection(ip);
}
private void extractTextFieldValues()
{
double dblval;
// check text fields for changed values
String latText = latField.getText();
String longText = longField.getText();
String latGridText = latGridField.getText();
String lonGridText = lonGridField.getText();
String magText = magField.getText();
String seedText = seedField.getText();
try {
dblval = Double.valueOf(latText).doubleValue();
if (dblval <= 90.0 && dblval >= -90.0)
{
dblval *= ImageProjection.DEG2RAD;
if (latitude != dblval)
ip.setCenterOfProjection(longitude, latitude=dblval);
}
} catch (NumberFormatException nfe) {
latField.setText(String.valueOf(latitude));
}
try {
dblval = Double.valueOf(longText).doubleValue();
if (dblval <= 360.0 && dblval >= -360.0)
{
dblval *= ImageProjection.DEG2RAD;
if (longitude != dblval)
ip.setCenterOfProjection(longitude=dblval, latitude);
}
} catch (NumberFormatException nfe) {
longField.setText(String.valueOf(longitude));
}
try {
dblval = Double.valueOf(latGridText).doubleValue();
if (dblval <= 90.0 && dblval >= 0.0)
{
if (latgrid != dblval)
ip.setGridSpacing(longrid, latgrid=dblval);
}
} catch (NumberFormatException nfe) {
latGridField.setText(String.valueOf(latgrid));
}
try {
dblval = Double.valueOf(lonGridText).doubleValue();
if (dblval <= 360.0 && dblval >= 0.0)
{
if (longrid != dblval)
ip.setGridSpacing(longrid=dblval, latgrid);
}
} catch (NumberFormatException nfe) {
lonGridField.setText(String.valueOf(longrid));
}
try {
dblval = Double.valueOf(magText).doubleValue();
if (dblval > 1.0)
{
if (magnification != dblval)
ip.setMagnification(magnification=dblval);
}
} catch (NumberFormatException nfe) {
magField.setText(String.valueOf(magnification));
}
try {
dblval = Double.valueOf(seedText).doubleValue();
if (seed != dblval)
msng.setSeed(seed=dblval);
} catch (NumberFormatException nfe) {
seedField.setText(String.valueOf(seed));
}
}
private void setGadgetColors()
{
// set background color
working.setBackground(Color.black);
projection.setBackground(Color.black);
latLabel.setBackground(Color.black);
longLabel.setBackground(Color.black);
latField.setBackground(Color.black);
longField.setBackground(Color.black);
latGridLabel.setBackground(Color.black);
lonGridLabel.setBackground(Color.black);
latGridField.setBackground(Color.black);
lonGridField.setBackground(Color.black);
changeColorsWithLatitude.setBackground(Color.black);
magLabel.setBackground(Color.black);
seedLabel.setBackground(Color.black);
magField.setBackground(Color.black);
seedField.setBackground(Color.black);
redraw.setBackground(Color.black);
setBackground(Color.black);
// set foreground color
working.setForeground(Color.black);
projection.setForeground(Color.white);
latLabel.setForeground(Color.white);
longLabel.setForeground(Color.white);
latField.setForeground(Color.white);
longField.setForeground(Color.white);
latGridLabel.setForeground(Color.white);
lonGridLabel.setForeground(Color.white);
latGridField.setForeground(Color.white);
lonGridField.setForeground(Color.white);
changeColorsWithLatitude.setForeground(Color.white);
magLabel.setForeground(Color.white);
seedLabel.setForeground(Color.white);
magField.setForeground(Color.white);
seedField.setForeground(Color.white);
redraw.setForeground(Color.white);
setForeground(Color.white);
}
public void init()
{
latitude = 0.0;
longitude = 0.0;
latgrid = 0.0;
longrid = 0.0;
magnification = 1.0;
seed = 0.123;
setLayout(new FlowLayout());
working = new Button("Working");
add(working);
projection=new Choice();
projection.addItem("Azimuth");
projection.addItem("Conical");
projection.addItem("Gnomonic");
projection.addItem("Mercator");
projection.addItem("Mollweide");
projection.addItem("Orthographic");
projection.addItem("Peter");
projection.addItem("Sinusoid");
projection.addItem("Square");
projection.addItem("Stereo");
projection.select("Mercator");
selectedProjection = null;
add(projection);
add(latLabel = new Label("Lat:"));
add(latField = new TextField("0.0"));
add(longLabel = new Label("Long:"));
add(longField = new TextField("0.0"));
add(latGridLabel = new Label("LatGrid:"));
add(latGridField = new TextField("0.0"));
add(lonGridLabel = new Label("LonGrid:"));
add(lonGridField = new TextField("0.0"));
add(changeColorsWithLatitude = new Checkbox("Icy poles", null, false));
add(magLabel = new Label("Mag:"));
add(magField = new TextField("1.0"));
add(seedLabel = new Label("Seed:"));
add(seedField = new TextField("0.123"));
add(redraw = new Button("Redraw"));
mainPanel = new MogensenPlanetPanel(working);
msng = new MogensenSolidNoiseGenerator();
msng.setSeed(0.123);
add(mainPanel);
setGadgetColors();
}
public void paint(Graphics g)
{
if (selectedProjection == null)
{
selectedProjection = projection.getSelectedItem();
setImageProjection();
}
super.paint(g);
}
public boolean action(Event evt, Object obj)
{
double dblval;
if (evt.target instanceof Button)
{
Button btn = (Button)(evt.target);
if (btn.getLabel().equals("Redraw"))
{
extractTextFieldValues();
mainPanel.recalculateProjection();
}
return true;
}
else if (evt.target instanceof TextField)
{
if (evt.target == latField)
{
String latText = latField.getText();
try {
dblval = Double.valueOf(latText).doubleValue();
if (dblval <= 90.0 && dblval >= -90.0)
{
dblval *= ImageProjection.DEG2RAD;
if (latitude != dblval)
ip.setCenterOfProjection(longitude, latitude=dblval);
}
} catch (NumberFormatException nfe) {
latField.setText(String.valueOf(latitude));
}
}
else if (evt.target == longField)
{
String longText = longField.getText();
try {
dblval = Double.valueOf(longText).doubleValue();
if (dblval <= 360.0 && dblval >= -360.0)
{
dblval *= ImageProjection.DEG2RAD;
if (longitude != dblval)
ip.setCenterOfProjection(longitude=dblval, latitude);
}
} catch (NumberFormatException nfe) {
longField.setText(String.valueOf(longitude));
}
}
else if (evt.target == latGridField)
{
String latGridText = latGridField.getText();
try {
dblval = Double.valueOf(latGridText).doubleValue();
if (dblval <= 90.0 && dblval >= 0.0)
{
if (latgrid != dblval)
ip.setGridSpacing(longrid, latgrid=dblval);
}
} catch (NumberFormatException nfe) {
latGridField.setText(String.valueOf(latgrid));
}
}
else if (evt.target == lonGridField)
{
String lonGridText = lonGridField.getText();
try {
dblval = Double.valueOf(lonGridText).doubleValue();
if (dblval <= 360.0 && dblval >= 0.0)
{
if (longrid != dblval)
ip.setGridSpacing(longrid=dblval, latgrid);
}
} catch (NumberFormatException nfe) {
lonGridField.setText(String.valueOf(longrid));
}
}
else if (evt.target == magField)
{
String magText = magField.getText();
try {
dblval = Double.valueOf(magText).doubleValue();
if (dblval > 1.0)
{
if (magnification != dblval)
ip.setMagnification(magnification=dblval);
}
} catch (NumberFormatException nfe) {
magField.setText(String.valueOf(magnification));
}
}
else if (evt.target == seedField)
{
String seedText = seedField.getText();
try {
dblval = Double.valueOf(seedText).doubleValue();
if (seed != dblval)
msng.setSeed(seed=dblval);
} catch (NumberFormatException nfe) {
seedField.setText(String.valueOf(seed));
}
}
else
{
System.out.println("data from unknown TextField");
}
return true;
}
else if (evt.target instanceof Checkbox)
{
msng.latic = changeColorsWithLatitude.getState();
return true;
}
else if (evt.target instanceof Choice)
{
selectedProjection = new String((String)(evt.arg));
extractTextFieldValues();
setImageProjection();
return true;
}
return false;
}
}