/* Autor:           Dipl.-Inf., Dipl.-Ing. (FH) Michael Wilhelm
   Firma:           HS Harz, FB AI
   Version:         1.1
   Ersterstellung:  07.06.2006
   Letzte Änderung: 12.11.2010
*/

//  PlainDocument, //  PlainDocument mit DVal

import java.awt.*;
import javax.swing.*;

import java.awt.event.*;


// Plain Dokument
import javax.swing.text.PlainDocument;
import javax.swing.text.BadLocationException;
import javax.swing.text.AttributeSet;



import javax.swing.text.Document;
import javax.swing.event.DocumentListener;
import javax.swing.event.DocumentEvent;


public class Plausi5 extends JFrame  {

  JLabel jLabel1 = new JLabel();
  JDblTextField TNote = new JDblTextField();

  JButton BnOk = new JButton();
  JButton BnESC = new JButton();


  public Plausi5() {
    setSize(400, 200);
    setTitle("Plausibilität 5. Beispiel");
    setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    setGUI();
  }

  private void setGUI() {
    String s;
    this.getContentPane().setLayout( new GridBagLayout() );

    jLabel1.setText("Note");
    TNote.setText("-");


    this.getContentPane().add(jLabel1, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0
            ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,20,0,0), 0, 6));

    this.getContentPane().add(TNote,   new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0
            ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0,20,0,20), 00, 0));

    JPanel panel1 = new JPanel();
    panel1.setLayout( new FlowLayout() );
    panel1.add(BnOk);
    panel1.add(BnESC);

    this.getContentPane().add(panel1,
                new GridBagConstraints(0, 1, 2, 1, 1.0, 0.0
            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(30,00,0,0), 0, 0));

    BnOk.setText("Ok");
    BnOk.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(ActionEvent e) {
        BnOk_actionPerformed(e);
      }
    });
    BnESC.setText("Abbruch");
    BnESC.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(ActionEvent e) {
        BnESC_actionPerformed(e);
      }
    });


    // TMatrikelNr.setDocument(new PlainDocument());


  }




  void BnOk_actionPerformed(ActionEvent e) {
   String s;
   s = TNote.getText();
   if ( basis.DVal(s) ) {
     basis.Message("Eingabeprüfung","Alles Okay");
   }
   else {
     basis.Message("Fehler","Fehlerhafte Matrikelnummer");
     TNote.requestFocus();
   }
  }  // BnOk


  void BnESC_actionPerformed(ActionEvent e) {
    System.exit(0);
  }  // BnESC

  public static void main(String[] args) {
    Plausi5 frame = new Plausi5();
    frame.setVisible(true);

 }



}

class JDblTextField extends JTextField {
  gDoubleTextDocument DoubleTextDocument;

    // hier alle Konstruktoren der super-Klasse einbauen
  public JDblTextField() {
    DoubleTextDocument = new gDoubleTextDocument();
    this.setDocument( DoubleTextDocument );
    String s = DoubleTextDocument.lineLimitAttribute;
      System.out.println("           gDoubleTextDocument: "+s);
  }



     // Constructs a new JTextField that uses the given text
    // storage model and the given number of columns.
  public JDblTextField(Document doc, String text, int columns) {
      super(doc, text, columns);
    DoubleTextDocument = new gDoubleTextDocument();
    this.setDocument( DoubleTextDocument );
    String s = DoubleTextDocument.lineLimitAttribute;
      System.out.println("           gDoubleTextDocument: "+s);
  }

    // Constructs a new empty TextField with the specified number of columns.
  public JDblTextField(int columns) {
      super(columns);
    DoubleTextDocument = new gDoubleTextDocument();
    this.setDocument( DoubleTextDocument );
    String s = DoubleTextDocument.lineLimitAttribute;
      System.out.println("           gDoubleTextDocument: "+s);
  }

   // Constructs a new TextField initialized with the specified text.
  public JDblTextField(String text) {
    super(text);
    DoubleTextDocument = new gDoubleTextDocument();
    this.setDocument( DoubleTextDocument );
    String s = DoubleTextDocument.lineLimitAttribute;
      System.out.println("           gDoubleTextDocument: "+s);
  }

    //  Constructs a new TextField initialized with the specified text and columns.
  public JDblTextField(String text, int columns) {
      super(text, columns);
    DoubleTextDocument = new gDoubleTextDocument();
    this.setDocument( DoubleTextDocument );
    String s = DoubleTextDocument.lineLimitAttribute;
      System.out.println("           gDoubleTextDocument: "+s);
  }


}  // JDblTextField


class gDoubleTextDocument extends PlainDocument {

    public gDoubleTextDocument() {
      System.out.println("           gDoubleTextDocument");
    }

    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
      System.out.println("           gDoubleTextDocument: insertString");
        if (str == null) {
            return;
        }
        int n = getLength(); // alter Wert
            System.out.println("         Eingabe: "+str);
        String oldString = getText(0, getLength());
        // Parameters:
        // beginIndex - the beginning index, inclusive.
        // endIndex - the ending index, exclusive.
        String newString = oldString.substring(0, offs) + str + oldString.substring(offs);
        try {
            Double.valueOf(newString + "0"); //  hinzufügen, falls nur ein Punkt eingegeben wird
            super.insertString(offs, str, a);
        }
        catch (NumberFormatException e) {
             System.out.println("           exception");
        }
    }

  public void remove(int offs, int len)  throws BadLocationException {
      System.out.println("           gDoubleTextDocument: remove: "+getText(0, getLength()) );
      String oldString = getText(0, getLength() );

      if (len == 0) return;
      int n = getLength();
      // Parameters:
      // beginIndex - the beginning index, inclusive.
      // endIndex - the ending index, exclusive.
      String newString = oldString.substring(0,offs) + oldString.substring(offs+len);

      //                           0 bis offs-1
      try {
        Double.parseDouble(newString + "0");  //
        super.remove(offs, len);
      }
      catch(NumberFormatException e) {
        // super.remove(offs, len); ??????
      }
  }
}



  // --------------------------------------------------------------
  // --------------------------------------------------------------
  // --------------------------------------------------------------
  // --------------------------------------------------------------


// Die folgende Klasse dient zur Konvertierung von String in Zahlen
// Sie kapselt die Konvertierung
// Beispiel für int
/*
  String s;
  int erg;
  s = "1234";
    // Abfrage
  if ( basis.IVal(s) ) {
     erg = basis.getIValResult();   // Ergebnis holen
  }
*/

/*  METHODEN:
/*  METHODEN:
/*  METHODEN:

// DIALOGFENSTER
    public static void Error( String sTitle, String sMessage) {
    public static void Message( String sTitle, String sMessage) {
    public static boolean YesNo( String sTitle, String sMessage) {
    public static int YesNoEsc( String sTitle, String sMessage) {
    public static boolean OkEsc( String sTitle, String sMessage) {
        // gibt einen Klartext für die Konvertierung aus
    public static String getErrorCode() {
    public static String getInput( String sTitle, String sMessage) {


// UMWANDLUNG STRING ->  int, long, double
    public static boolean IVal(String szText) {
    public static int getIValResult() {
    public static boolean LVal(String szText) {
    public static long getLValResult() {
    public static boolean DVal(String szText) {
    public static double getDValResult() {


// AUSGABE EINER FORMATIERTEN ZAHL
      Parameter nk beschreibt die Nachkommastelle
    public static String DStr(double d, int nk) {
    public static String IStr2(int iZahl) {
    public static String LStr2(long lZahl) {
    public static String Komma2Point(String szZ) {
    public static String Point2Komma(String szZ) {

// MATHEMATIK
    public static double log10(double x) {

// DATEI FUNKTIONEN
    public static String changeFileExt(String szDateiname, String szExt) {
    public static String getFileExt(String szDateiname) {
    public static String getFileNameExt(String szDateiname) {

     // Schneidet die Extension ab
    public static String getFileName(String szDateiname) {
    public static boolean FileExists(String szDateiname) {

    public static void centerScreen(java.awt.Window frame, java.awt.Dimension preset) {

*/
class basis {

    public static final int C_LEER = 1;
    public static final int C_KEINEZAHL = 2;
    public static final int C_ZUKLEIN = 3;
    public static final int C_ZUGROSS = 4;

      // Konstanten für den Error Code als String
    public static final String SZ_LEER = "Leerer Text";
    public static final String SZ_KEINEZAHL = "Konvertierung schlug fehl";
    public static final String SZ_ZUKLEIN = "Für den Bereich zu klein";
    public static final String SZ_ZUGROSS = "Für den Bereich zu groß";



    private static int intVal;          // speichert das Ergebnis
    private static long longVal;        // speichert das Ergebnis
    private static double dblVal;       // speichert das Ergebnis

    private static int ValError = 0;   // speichert den Konvertierungfehler


    // Zeigt eine Fehlermeldung an
  public static void Error( String sTitle, String sMessage) {
    JOptionPane.showConfirmDialog(null,sMessage,sTitle,
      JOptionPane.DEFAULT_OPTION,
      JOptionPane.ERROR_MESSAGE);  // Symbol
  } // Fehler

    // Zeigt eine Fehlermeldung an
  public static void Message( String sTitle, String sMessage) {
    JOptionPane.showConfirmDialog(null,sMessage,sTitle,
      JOptionPane.DEFAULT_OPTION,
      JOptionPane.INFORMATION_MESSAGE);  // Symbol
  } // Fehler




    // -------------------------------------------

      // gibt einen Klartext für die Konvertierung aus
    public static String getErrorCode() {
      switch (ValError) {
        case C_LEER :      return SZ_LEER;
        case C_KEINEZAHL : return SZ_KEINEZAHL;
        case C_ZUKLEIN :   return SZ_ZUKLEIN;
        case C_ZUGROSS :   return SZ_ZUGROSS;
        default:           return "Fehlerhafter Index in Methode getErrorCode: "+Integer.toString(ValError);
      } // switch
    }


    public static boolean IVal(String szText) {
        // erläuterung von iIVal = Integer.valueOf(szText).intValue();
        boolean result = true;
        String s;
        s = new String(szText); // neues Objekt
        s.trim();
        if (s.length() == 0) {
            ValError = C_LEER;
            intVal = 0;
            result = false;
        }
        else {
            try {
                intVal = Integer.valueOf(szText).intValue();
                ValError = 0;
            }
            catch (NumberFormatException e) {
                // Check ob die "Zahl" für den Integerbereich zu klein oder zu groß
                // System.err.println(e);
                try {
                    dblVal = Double.valueOf(szText).doubleValue();
                    if ( dblVal<Integer.MIN_VALUE) {
                      ValError = C_ZUKLEIN;
                    }
                    if ( dblVal>Integer.MAX_VALUE) {
                      ValError = C_ZUGROSS;
                    }
                }
                catch (NumberFormatException e2) {
                    // Hier könnte noch eine genauere Abfrage integriert werde,
                    // ob die Zahl nicht zu groß für den int-Bereich ist
                    // System.err.println(e);
                    ValError = C_KEINEZAHL;
                    intVal = 0;
                    result = false;
                }
                intVal = 0;
                result = false;
            }
        }
        return result;
    } // IVal



    /**
     * getIValResult
     * @return int iIVal
     * @param none
     * @exception none
     * @version      1.0
     * @author Michael Wilhelm HS Harz, FB AI
     * @use gibt den Wert der Konvertierung aus, oder den Fehlerwert Example
     * @see #getIValError
     * @see #setIValError
     */
    public static int getIValResult() {
       return intVal;
    }




    /**
     * LVal
     * @return boolean StringIsLong
     * @param String szText
     * @exception none
     * @version      1.0
     * @author Michael Wilhelm HS Harz, FB AI
     * @use Ausgabe des Konvertierten String als long Wert Example
     * @see #getLValError
     * @see #getLValResult
     */
    public static boolean LVal(String szText) {
        // erläuterung von iIVal = Integer.valueOf(szText).intValue();
        boolean result = true;
        String s;
        s = new String(szText); // neues Objekt
        s.trim();
        if (s.length() == 0) {
            ValError = C_LEER;
            longVal = 0;
            result = false;
        }
        else {
            try {
                longVal = Long.valueOf(szText).longValue();
                ValError = 0;
            }
            catch (NumberFormatException e) {
                // Check ob die "Zahl" für den Integerbereich zu klein oder zu groß
                // System.err.println(e);
                try {
                    dblVal = Double.valueOf(szText).doubleValue();
                    if ( dblVal<Long.MIN_VALUE) {
                      ValError = C_ZUKLEIN;
                    }
                    if ( dblVal>Long.MAX_VALUE) {
                      ValError = C_ZUGROSS;
                    }
                }
                catch (NumberFormatException e2) {
                    // Hier könnte noch eine genauere Abfrage integriert werde,
                    // ob die Zahl nicht zu groß für den int-Bereich ist
                    // System.err.println(e);
                    ValError = C_KEINEZAHL;
                    longVal = 0;
                    result = false;
                }
                longVal = 0;
                result = false;
            }
        }
        return result;
    } // LVal



    /**
     * getLValResult
     * @return int lIVal
     * @param none
     * @exception none
     * @version      1.0
     * @author Michael Wilhelm HS Harz, FB AI
     * @use gibt den Wert der Konvertierung aus, oder den Fehlerwert Example
     * @see #getIValError
     * @see #setIValError
     */
    public static long getLValResult() {
       return longVal;
    }



     // Double
    /**
     * LVal
     * @return boolean StringIsLong
     * @param String szText
     * @exception none
     * @version      1.0
     * @author Michael Wilhelm HS Harz, FB AI
     * @use Ausgabe des Konvertierten String als long Wert Example
     * @see #getLValError
     * @see #getLValResult
     */
    public static boolean DVal(String szText) {
        // erläuterung von iIVal = Integer.valueOf(szText).intValue();
        boolean result = true;
        String s;
        s = new String(szText); // neues Objekt
        s.trim();
        if (s.length() == 0) {
            ValError = C_LEER;
            dblVal = 0;
            result = false;
        }
        else {
            try {
                dblVal = Double.valueOf(szText).doubleValue();
                ValError = 0;
            }
            catch (NumberFormatException e) {
                ValError = C_KEINEZAHL;
                dblVal = 0;
                result = false;
            }
        }
        return result;
    } // LVal



    /**
     * getDValResult
     * @return double DVal
     * @param none
     * @exception none
     * @version      1.0
     * @author Michael Wilhelm HS Harz, FB AI
     * @use gibt den Wert der Konvertierung aus, oder den Fehlerwert Example
     * @see #getDValError
     * @see #setDValError
     */
    public static double getDValResult() {
       return dblVal;
    }






}  // basis



