/*
* ShearDialog
*
* Copyright (c) 2001, 2002, 2003 Marco Schmidt.
* All rights reserved.
*/
package net.sourceforge.jiu.gui.awt.dialogs;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import net.sourceforge.jiu.apps.Strings;
import net.sourceforge.jiu.geometry.Shear;
/**
* An AWT dialog to enter the angle for a shearing operation.
* @author Marco Schmidt
*/
public class ShearDialog extends Dialog implements ActionListener, KeyListener
{
private Button ok;
private Button cancel;
private TextField angleTextField;
private boolean pressedOk;
private Double result;
private Label newWidthLabel;
private int imageWidth;
private int imageHeight;
/**
* Creates a ShearDialog.
* @param owner the Frame this dialog will belong to
*/
public ShearDialog(Frame owner, Strings strings, double initialValue, int imageWidth, int imageHeight)
{
super(owner, strings.get(Strings.SHEAR_IMAGE) + " (" + imageWidth + " x " + imageHeight + ")", true);
this.imageWidth = imageWidth;
this.imageHeight = imageHeight;
Panel panel = new Panel(new GridLayout(0, 2));
panel.add(new Label(strings.get(Strings.SHEAR_ENTER_ANGLE)));
angleTextField = new TextField(Double.toString(initialValue));
angleTextField.addKeyListener(this);
panel.add(angleTextField);
panel.add(new Label(strings.get(Strings.NEW_WIDTH)));
newWidthLabel = new Label("");
panel.add(newWidthLabel);
add(panel, BorderLayout.CENTER);
panel = new Panel();
ok = new Button(strings.get(Strings.OK));
ok.addActionListener(this);
cancel = new Button(strings.get(Strings.CANCEL));
cancel.addActionListener(this);
panel.add(ok);
panel.add(cancel);
add(panel, BorderLayout.SOUTH);
handleKeys(null);
pack();
Dialogs.center(this);
}
/**
* Hides (closes) this dialog if the OK button was source of the action event
* (e.g. if the button was pressed).
*/
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == ok)
{
pressedOk = true;
result = getValue(angleTextField);
setVisible(false);
}
else
if (e.getSource() == cancel)
{
setVisible(false);
}
}
private Double getValue(TextField tf)
{
if (tf == null)
{
return null;
}
double d;
try
{
d = (Double.valueOf(tf.getText())).doubleValue();
}
catch(NumberFormatException nfe)
{
return null;
}
if (d <= -90.0 || d >= 90.0)
{
return null;
}
return new Double(d);
}
public Double getValue()
{
return result;
}
public boolean hasPressedOk()
{
return pressedOk;
}
public void handleKeys(KeyEvent e)
{
Double d = getValue(angleTextField);
double angle = -90.0;
if (d != null)
{
angle = d.doubleValue();
}
String labelText;
if (angle > -90.0 && angle < 90.0)
{
ok.setEnabled(true);
int newWidth = Shear.computeNewImageWidth(imageWidth, imageHeight, angle);
labelText = Integer.toString(newWidth);
}
else
{
ok.setEnabled(false);
labelText = "-";
}
newWidthLabel.setText(labelText);
}
public void keyPressed(KeyEvent e)
{
handleKeys(e);
}
public void keyReleased(KeyEvent e)
{
handleKeys(e);
}
public void keyTyped(KeyEvent e)
{
handleKeys(e);
}
}