package fplot;
import java.awt.*;
import java.awt.event.*;
/**
* Das Dialogfenster, in dem der Darstellungsbereich und die Funktionen
* angegeben werden.
* @author Christian Semrau
*
* Christian.Semrau@student.uni-magdeburg.de
*
Homepage
*/
class DialogFenster extends Frame
implements ActionListener, ItemListener, FocusListener{
private PlotFrame applet;
private GraphFlaeche flaeche;
private int numFormeln;
private boolean extended;
private boolean wantExtended;
private Panel theContentsPane = null;
private Panel extendedPane = null;
private Panel parameterPane = null;
private BorderLayout theLayout = null;
private Button SetButton = null;
private Button GetButton = null;
private Button ExtendedButton = null;
private Checkbox PostfixCheckbox = null;
private CheckboxGroup KlammerungCbg = null;
private Checkbox[] KlammerungCheckbox = null;
private Checkbox EinheitskreisCheckbox = null;
private Label xMaxLabel = null;
private Label xMinLabel = null;
private Label yMaxLabel = null;
private Label yMinLabel = null;
private TextField xMaxField = null;
private TextField xMinField = null;
private TextField yMaxField = null;
private TextField yMinField = null;
private Label[] FormelLabel = null;
private TextField[] FormelField = null;
private Checkbox[] ShowFormelCheckbox = null;
private Label pLabel = null;
private TextField pField = null;
private Label qLabel = null;
private TextField qField = null;
private Choice NumFormelnChoice = null;
private Label XYKoordLabel = null;
private Choice XKoordChoice = null;
private Choice YKoordChoice = null;
private Label TLabel = null;
private TextField TStartField = null;
private TextField TStopField = null;
private TextField TStepField = null;
private int __sy_e; // Zeile des erweiterten Panels
private int __sy_f; // Zeile der Funktion 0
private int __cc_f; // ComponentCount der ersten Funktion
private GridBagLayout __gbl; // Layoutmanager
// einige Konstanten die das Leben erleichtern
final int NONE = GridBagConstraints.NONE;
final int HORIZONTAL = GridBagConstraints.HORIZONTAL;
final int VERTICAL = GridBagConstraints.VERTICAL;
final int CENTER = GridBagConstraints.CENTER;
final int WEST = GridBagConstraints.WEST;
final int EAST = GridBagConstraints.EAST;
final int NORTH = GridBagConstraints.NORTH;
final int SOUTH = GridBagConstraints.SOUTH;
final int NORTHWEST = GridBagConstraints.NORTHWEST;
final int NORTHEAST = GridBagConstraints.NORTHEAST;
final int SOUTHWEST = GridBagConstraints.SOUTHWEST;
final int SOUTHEAST = GridBagConstraints.SOUTHEAST;
/** Konstruktor des Dialogfensters */
public DialogFenster(PlotFrame app, boolean ext) {
super();
applet = app;
flaeche = (app!=null) ? applet.getFlaeche() : null;
numFormeln = applet==null ? 3 : flaeche.getNumFormeln();
wantExtended = extended = ext;
initialize();
}
/** Debugging-Methode. */
private void a() {
// if (applet!=null) System.out.println(applet.getFlaeche());
}
/** Reagiert auf die Buttons */
public void actionPerformed(ActionEvent e) {
if (e.getSource() == getSetButton()) {
// bei Fehlern wird das entsprechende Feld fokussiert
if (setzeFormel() && schreibeBereich() && setzeT()){
if (flaeche!=null){
flaeche.repaint();
}
}
a();
return;
}
if (e.getSource() == getGetButton()) {
holeBereich();
holeT();
return;
}
if (e.getSource() == getExtendedButton()) {
wantExtended = !extended;
if (extended) {
closeExtended();
}else{
openExtended();
}
packHeight();
return;
}
for (int index=0; index=FormelField.length){
TextField[] ff = new TextField[Math.max(index+1, numFormeln)];
for(int i=0; i=FormelLabel.length){
Label[] fl = new Label[Math.max(index+1, numFormeln)];
for(int i=0; i=KlammerungCheckbox.length){
throw new IllegalArgumentException(
index+">"+KlammerungCheckbox.length);
}
return KlammerungCheckbox[index];
}
/** Konstruiert und liefert die NumFormelChoice */
private Choice getNumFormelnChoice() {
if (NumFormelnChoice == null) {
NumFormelnChoice = new Choice();
NumFormelnChoice.addItem(1+" Funktion");
for (int i=2; i<=5; i++)
NumFormelnChoice.addItem(i+" Funktionen");
NumFormelnChoice.select(0);
NumFormelnChoice.addItemListener(this);
}
return NumFormelnChoice;
}
/** Konstruiert und liefert das pField */
private TextField getPField() {
if (pField == null) {
pField = new java.awt.TextField(8);
pField.addActionListener(this);
}
return pField;
}
/** Konstruiert und liefert das pLabel */
private Label getPLabel() {
if (pLabel == null) {
pLabel = new java.awt.Label("p", Label.RIGHT);
}
return pLabel;
}
/** Konstruiert und liefert die PostfixCheckbox */
private Checkbox getPostfixCheckbox() {
if (PostfixCheckbox == null) {
PostfixCheckbox = new java.awt.Checkbox("Postfix");
PostfixCheckbox.setState(false);
}
return PostfixCheckbox;
}
/** Konstruiert und liefert das qField */
private TextField getQField() {
if (qField == null) {
qField = new java.awt.TextField(8);
qField.addActionListener(this);
}
return qField;
}
/** Konstruiert und liefert das qLabel */
private Label getQLabel() {
if (qLabel == null) {
qLabel = new java.awt.Label("q", Label.RIGHT);
}
return qLabel;
}
/** Konstruiert und liefert den SetButton */
private Button getSetButton() {
if (SetButton == null) {
SetButton = new java.awt.Button("Setzen");
SetButton.setActionCommand("Set");
SetButton.addActionListener(this);
}
return SetButton;
}
/** Konstruiert und liefert eine ShowFormelCheckbox */
private Checkbox getShowFormelCheckbox(int index) {
if (index<0) throw new IllegalArgumentException(index+"<0");
if (ShowFormelCheckbox == null) {
ShowFormelCheckbox = new Checkbox[Math.max(index+1, numFormeln)];
for(int i=0; i=ShowFormelCheckbox.length){
Checkbox[] sf = new Checkbox[Math.max(index+1, numFormeln)];
for(int i=0; i= num; index--)
closeFormula(index);
packHeight();
if (flaeche!=null){
flaeche.setNumFormeln(num);
flaeche.repaint();
a();
}
numFormeln = num;
}
return;
}
for(int index = 0; index0){
expon = s.substring(s.indexOf("E"));
s = s.substring(0, s.indexOf("E"));
}
if (s.substring(0, s.length()-1).endsWith("00")){
do{
s = s.substring(0, s.length()-1);
}while (s.endsWith("0"));
// am Dezimalpunkt oder einer von 0 verschiedenen Ziffer aufhoeren
if (s.endsWith(".")){
// wenn das letzte Zeichen der Punkt ist, entfernen wir ihn
s = s.substring(0, s.length()-1);
}
}else
if (s.substring(0, s.length()-1).endsWith("99")){
// sind wir schon vor dem Dezimalpunkt
boolean nachPunkt = s.indexOf(".")>=0;
// wenn wir vor dem Komma sind, muessen wir die Neunen mit Nullen nachfuellen
int vorPunktStellen = 0;
do{
s = s.substring(0, s.length()-1);
if (!nachPunkt) vorPunktStellen++;
if (s.endsWith(".")){
s = s.substring(0, s.length()-1);
nachPunkt = false;
}
}while (s.endsWith("9"));
// das entfernen von Zeichen kostet nichts, aber das anhaengen
// ist mit Strings eine aufwendige Operation
StringBuffer sb;
int len = s.length();
if (len==0)
// keine Ziffern mehr da
sb = new StringBuffer("1");
else{
//die letzte Ziffer wird um 1 erhoeht (sie ist ungleich 9)
sb = new StringBuffer(s);
sb.setCharAt(len-1, (char)(s.charAt(len-1)+1));
}
for(; vorPunktStellen>0; vorPunktStellen--, sb.append("0"));
s = sb.toString();
}
return s + expon;
}
/**
* Setzt den Darstellungsbereich des Anzeigefensters auf die aktuellen
* Werte im Dialogfenster. Liefert false, wenn ein Fehler bei der Zahlen-
* umwandlung auftrat, und fokussiert das Feld, das den Fehler verursacht.
*/
public boolean schreibeBereich() {
double xmin, xmax, ymin, ymax;
if (flaeche!=null) flaeche.setKlammerung(getKlammerung());
try{
xmin = Double.valueOf(getxMinField().getText()).doubleValue();
}catch(NumberFormatException exc){
getxMinField().requestFocus();
getxMinField().selectAll();
return false;
}
try{
xmax = Double.valueOf(getxMaxField().getText()).doubleValue();
}catch(NumberFormatException exc){
getxMaxField().requestFocus();
getxMaxField().selectAll();
return false;
}
try{
ymin = Double.valueOf(getyMinField().getText()).doubleValue();
}catch(NumberFormatException exc){
getyMinField().requestFocus();
getyMinField().selectAll();
return false;
}
try{
ymax = Double.valueOf(getyMaxField().getText()).doubleValue();
}catch(NumberFormatException exc){
getyMaxField().requestFocus();
getyMaxField().selectAll();
return false;
}
boolean ek = getEinheitskreisCheckbox().getState();
int kl = getKlammerung();
if (flaeche!=null){
flaeche.setCoords(xmin, xmax, ymin, ymax);
flaeche.setEinheitskreis(ek);
flaeche.setKlammerung(kl);
}
return true;
}
/**
*
* @param kl int
*/
private void setKlammerung(int kl) {
switch(kl){
case FuncNode.KLAMMERUNG_ALLES:
getKlammerungCheckbox(0).setState(true); break;
case FuncNode.KLAMMERUNG_MITTEL:
getKlammerungCheckbox(1).setState(true); break;
case FuncNode.KLAMMERUNG_WENIG:
getKlammerungCheckbox(2).setState(true); break;
}
}
/**
*
* @return boolean
*/
boolean setzeFormel() {
boolean b = true;
// Rueckwaerts abarbeiten, damit die oberste falsche Formel
// fokussiert ist
for (int index=FormelField.length-1; index>=0; index--){
b = b && setzeFormel(index);
}
return b;
}
/**
* Setzt die Formel des Anzeigefensters, setzt auch den Parameter p.
* Wenn p fehlerhaft ist, wird p auf 0 gesetzt.
* Wenn die Formel fehlerhaft ist, wird die Formel fokussiert und false
* geliefert.
*/
private boolean setzeFormel(int index) {
if (!setzeP()) return false;
if (!setzeQ()) return false;
if (flaeche==null) return true;
TextField f = getFormelField(index);
if (flaeche.setFormula(index, f.getText(),
getPostfixCheckbox().getState())){
return true;
}else{
f.requestFocus();
f.selectAll();
return false;
}
}
/**
*
*/
private boolean setzeP() {
double p = 0;
try{
p = new Double(getPField().getText()).doubleValue();
}catch(NumberFormatException exc){
getPField().requestFocus();
getPField().selectAll();
return false;
}
if (flaeche!=null)
flaeche.setP(p);
return true;
}
/**
*
*/
private boolean setzeQ() {
double q = 0;
try{
q = new Double(getQField().getText()).doubleValue();
}catch(NumberFormatException exc){
getQField().requestFocus();
getQField().selectAll();
return false;
}
if (flaeche!=null)
flaeche.setQ(q);
return true;
}
/**
*
*/
private boolean setzeT() {
double tstart, tstop;
long tstep;
int Xi, Yi;
try{
tstart = new Double(getTStartField().getText()).doubleValue();
}catch(NumberFormatException exc){
getTStartField().requestFocus();
getTStartField().selectAll();
return false;
}
try{
tstop = new Double(getTStopField().getText()).doubleValue();
}catch(NumberFormatException exc){
getTStopField().requestFocus();
getTStopField().selectAll();
return false;
}
try{
tstep = new Long(getTStepField().getText()).longValue();
}catch(NumberFormatException exc){
getTStepField().requestFocus();
getTStepField().selectAll();
return false;
}
Xi = getXKoordChoice().getSelectedIndex()-1;
Yi = getYKoordChoice().getSelectedIndex()-1;
if (flaeche!=null)
flaeche.setT(tstart, tstop, tstep, Xi, Yi);
return true;
}
/**
* Zeigt das Dialogfenster an. Beim ersten anzeigen wird das
* erste Formelfeld fokussiert.
*/
public void show() {
boolean first = !isVisible();
super.show();
if (first){
TextField f = getFormelField(0);
f.requestFocus();
f.setCaretPosition(f.getText().length());
}
}
/**
*
* @return boolean
*/
public boolean wantExtended() {
return wantExtended;
}
}