//Titel:            Beispiele eines datenbank-Designer unter Java
//Version:          1.0
//Copyright:        HS-Harz, FB AI
//Autor:            Dipl.-Inf. Dipl.-Ing. Michael Wlhelm
//Firma:
//Beschreibung:     Ableitung, Superklasse
//                  Interface
//                  Singleton-Pattern
//                  Abfangen des Klick auf ein Tree-Object
//                  Darstellen eines Entity als Client (JInternalframe)


// Klassen fürs Einlesen
import java.io.Reader;
import java.io.FileReader;
import java.io.IOException;


// Klassen fürs Einlesen
import javax.swing.tree.DefaultMutableTreeNode;
import java.util.Vector;
import javax.swing.tree.*;
import javax.swing.event.*;  // TreeListener



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

// Packages für Opendialog
import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.filechooser.*;
import java.util.Hashtable;
import java.util.Enumeration;


// Packages für Filter
import javax.swing.filechooser.*;
import java.io.File;
import java.util.Hashtable;
import java.util.Enumeration;


// Startklasse, muss außerhlab, da Singleton-Pattern benutzt werden
public class designer1 {
   // Hauptprogramm
  static public void main(String[] args) {
    try  {
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }
    catch(Exception e) {
    }
    designer desktop = designer.getInstance();
    desktop.setVisible(true);
  }
}



// Hauptklasse
class designer extends JFrame {

  // Container für die Clientfenster
  private JDesktopPane _desktopPane = new JDesktopPane();

  private JTree                   _dbTree;
  private DefaultTreeModel        _treeModel;
  private DefaultMutableTreeNode  _root;

    // Speichert alle HauptKnoten, fürs Einfügen
  DefaultMutableTreeNode[]        _Knoten;


    // Variablen für die Menüs
  private JMenuBar menuBar1;   // MenüContainer
  private JMenu MainFile;      // Hauptmenü
  private JMenuItem MnNew;     // Menüeintrag
  private JMenuItem MnClose;   // Menüeintrag

  private JMenu MainInsert;      // Hauptmenü
  private JMenuItem MnIns_Entity;
  private JMenuItem MnIns_Relation;

  private static designer instance = null;

   // Konstruktor
  private designer() {
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    try {
      jbInit();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }

   // gib die aktuelle Instanz zurück
   // Thread sicher
  public static designer getInstance(){
     if (instance == null) {
         synchronized(designer.class) {
            if (instance == null) {
                 instance = new designer();
            }
         }
     }
     return instance;
  }  // getInstance



  public void jbInit() throws Exception {
      // BorderLayout setzen
    this.getContentPane().setLayout( new BorderLayout() );

    this.setSize( 800, 600);

    setGUI();
    setMenus();
  } // jbInit()


  private void setGUI() {
      // hole den gesamtem Tree
    _root = BuildTree();
    // Tree wird über datenmodell erzeugt
    // _dbTree = new javax.swing.JTree(_root);
    _treeModel = new DefaultTreeModel(_root);
    _dbTree = new javax.swing.JTree(_treeModel);  //  kein Root !!!
      //  hier nur einfache Markierung
    _dbTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);

      //  Splitpane hat GUI-Elemente (links und rechts)
    JSplitPane split = new JSplitPane(
            JSplitPane.HORIZONTAL_SPLIT,_dbTree, _desktopPane);
    this.getContentPane().add(split, BorderLayout.CENTER);


      // Horizontale Linien im Tree
    _dbTree.putClientProperty("JTree.lineStyle","Horizontal");
      // Mit Linien zwischen den Knoten
    _dbTree.putClientProperty("JTree.lineStyle","Angled");


     // Abfangen des Klick Ereignis mit einem Modell
     MouseListener ml = new MyTreeMouseAdapter(_dbTree);
     _dbTree.addMouseListener(ml);

  } // setGUI()



  // erzeugt einen Tree-Knoten, nur für die Hauptknoten !!!
  // MvcTreeNodeRec liefert Zusatzinformationen
  DefaultMutableTreeNode createMVCNode(String nodeString, int nodeId) {
    MvcTreeNodeRec myNode;
    DefaultMutableTreeNode Node;

      // Verwendet den ersten Konstruktor
    myNode = new  MvcTreeNodeRec(nodeString, nodeId);
    Node = new DefaultMutableTreeNode(myNode);
    //Node.setUserObject(myNode);
    return Node;
 } // createMVCNode


  // erzeugt einen Tree-Knoten, für alle CObjekte
  // MvcTreeNodeRec liefert Zusatzinformationen
 DefaultMutableTreeNode createCObjectNode(CObject cobj) {
    MvcTreeNodeRec myNode;
    DefaultMutableTreeNode Node;

      // Verwendet den zweiten Konstruktor
      // Damit Pointer auf Objekt
    myNode = new  MvcTreeNodeRec(cobj.getName(), cobj.getObjectId(), cobj );
    Node = new DefaultMutableTreeNode(myNode);
    //Node.setUserObject(myNode);
    return Node;
 } // createCObjectNode



  // ----------------------------------------
  // BuildTree, erzeugt die Hauptkonoten
  // ----------------------------------------
  DefaultMutableTreeNode BuildTree() {
    DefaultMutableTreeNode root;

    _Knoten = new DefaultMutableTreeNode[7];

    root = new DefaultMutableTreeNode("root");

      // liefert einen DefaultMutableTreeNode
    _Knoten[0] = createMVCNode(  "Entities",-1);
    root.add( _Knoten[0] );

    _Knoten[1] = createMVCNode(  "Beziehungen",-2);
    root.add( _Knoten[1] );

    _Knoten[2] = createMVCNode(  "Domains",-3);
    root.add( _Knoten[2] );

     _Knoten[3] = createMVCNode(  "Generator",-4);
    root.add( _Knoten[3] );

    _Knoten[4] = createMVCNode(  "Sequenz",-5);
    root.add( _Knoten[4] );

    _Knoten[5] = createMVCNode(  "Prozeduren",-6);
    root.add( _Knoten[5] );

    _Knoten[6] = createMVCNode(  "Views",-7);
    root.add( _Knoten[6] );

    return root;
  } // BuildTree



    // setzt die Menüs
  private void setMenus() {
    menuBar1 = new JMenuBar();

      // DATEI
    MainFile = new JMenu("Datei");
    MnNew = new JMenuItem("Neu");
    MnClose = new JMenuItem("Schließen");

      // Event definieren
    MnNew.addActionListener(new ActionListener()  {
      public void actionPerformed(ActionEvent e) {
        MnNew_Click();
      }
    });
      // Short Key definieren  STRG+N
    MnNew.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK));
    MainFile.add(MnNew);

    MainFile.addSeparator();

    // --------------------------
      // Event definieren
    MnClose.addActionListener(new ActionListener()  {

      public void actionPerformed(ActionEvent e) {
        MnClose_actionPerformed(e);
      }
    });
    MainFile.add(MnClose);

      // Hauptmenü FILE in den MenüBar einfügen
    menuBar1.add(MainFile);

    // -------------------------
    MainInsert = new JMenu("Insert");
    menuBar1.add(MainInsert);

    MnIns_Entity = new JMenuItem("Entity");
    MnIns_Entity.addActionListener(new ActionListener()  {
      public void actionPerformed(ActionEvent e) {
        MnIns_Entity_Click();
      }
    });
    MainInsert.add(MnIns_Entity);


    MnIns_Relation = new JMenuItem("Relation");
    MnIns_Relation.addActionListener(new ActionListener()  {
      public void actionPerformed(ActionEvent e) {
        MnIns_Relation_Click();
      }
    });
    MainInsert.add(MnIns_Relation);

      // darf erst freigeschaltet werden, wenn Projekt geladen
    MnIns_Entity.setEnabled(false);
    MnIns_Relation.setEnabled(false);


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

    this.setJMenuBar(menuBar1);
  } // setMenus



   // Event definieren, CODE
   //	public CEntity (String Name, JDesktopPane dpane)
     // Beispiel Daten !
  void MnNew_Click() {
      CEntity e1;
      CRelation r1;
      DefaultMutableTreeNode Node;

        // _desktopPane wird gebraucht,
        // um gleich das Clientframe im Entity einzutragen
      e1 = new CEntity("Kunde",_desktopPane);
      Node = createCObjectNode( e1);
      _Knoten[0].add( Node );

      e1 = new CEntity("Buch",_desktopPane);
      Node = createCObjectNode( e1);
      _Knoten[0].add( Node );


      e1 = new CEntity("Bestellung",_desktopPane);
      Node = createCObjectNode( e1);
      _Knoten[0].add( Node );


      r1 = new CRelation("Kunden_Bestellung");
      Node = createCObjectNode( r1);
      _Knoten[1].add( Node );


      r1 = new CRelation("Buch_Bestellung");
      Node = createCObjectNode( r1);
      _Knoten[1].add( Node );

      // darf erst freigeschaltet werden, wenn Projekt geladen
    MnIns_Entity.setEnabled(true);
    MnIns_Relation.setEnabled(true);
  }  // New  Click




   // wird aufgerufen von den Clientfenster
  public void NewObject(int nr) {
    switch (nr) {
      case 1: MnIns_Entity_Click();
              break;
      case 2: MnIns_Relation_Click();
              break;
      default: basis.Error("Fehler","Fehler in Modul designer, Methode NewObject"
              + '\n'+ "Nr: "+Integer.toString(nr) );
    }
  } // NewObject


   // Neues Entity ins System
   // Menü-Eintrag
  public void MnIns_Entity_Click() {
     String sName;
      CEntity e1;
      DefaultMutableTreeNode Node;
     sName =   basis.getInput( "Neues Entity","Name","");
     sName = sName.trim();
     if (sName.length()>0) {
       System.out.println(sName);
        e1 = new CEntity(sName,_desktopPane);
        Node = createCObjectNode( e1);
       _Knoten[0].add( Node );
     }
  } // MnIns_Entity_Click()


   // Neue Beziehung ins System
   // Menü-Eintrag
  public void MnIns_Relation_Click() {
     String sName;
      CRelation r1;
      DefaultMutableTreeNode Node;
     sName =   basis.getInput( "Neue Beziehung","Name","");
     sName = sName.trim();
     if (sName.length()>0) {
       r1 = new CRelation(sName);
       Node = createCObjectNode( r1);
       _Knoten[1].add( Node );
     }
  } //MnIns_Relation_Click()




   // wird aufgerufen beim Schließen des Hauptfensters
  void MnClose_actionPerformed(ActionEvent e) {
    System.exit(0);
  }




    // zum korrekten Beenden benötigt
  protected void processWindowEvent(WindowEvent e) {
    super.processWindowEvent(e);
    if(e.getID() == WindowEvent.WINDOW_CLOSING) {
      System.exit(0);
    }
  }


}  // designer




// Ein zusätzliches Objekt pro Knoten
class MvcTreeNodeRec  {
    private int _NodeId;
    private CObject _cobj;  // für Zugriff aufs Objekt

    public String _sNodeString;


     // erster Konstruktor
   public MvcTreeNodeRec(String nodeString, int NodeId) {
      this(nodeString, NodeId, null);
   }

     // zweiter Konstruktor
   public MvcTreeNodeRec(String nodeString, int NodeId, CObject cobj) {
      _sNodeString = nodeString;  // für JTree;
      _NodeId = NodeId;
      _cobj = cobj;
   }

   public CObject getCObject() {
     return _cobj;
   }

   public int getNodeId() {
     return _NodeId;
   }

   // sehr wichtig
   public String toString() {
     return _sNodeString;
   }
}  // MvcTreeNodeRec



// fängt die Mausklick ab
class MyTreeMouseAdapter extends MouseAdapter {
   private JTree jTree1;
   private TreeModel _modell;

  public MyTreeMouseAdapter(JTree jTree1) {
     this.jTree1 = jTree1;
     _modell = jTree1.getModel();
  }

   public void mouseClicked(MouseEvent e) {
      MvcTreeNodeRec mvcNode;
      int selRow = jTree1.getRowForLocation(e.getX(), e.getY());
      TreePath selPath = jTree1.getPathForLocation(e.getX(), e.getY());
      if(selRow != -1) {
         if(e.getClickCount() == 1) {
             mySingleClick(selRow, selPath);
         }
         else if(e.getClickCount() == 2) {
             // System.out.println("myDoubleClick: "+selPath);
             // System.out.println("myDoubleClick: "+selRow);
               myDoubleClick(selRow, selPath);
         }
     }
  }
    // falls eine Aktion auf das Ereignis-SingleClick
    // notwendig ist
    // Achtung:  Jeder Doppelklick ist auch ein Einzelklick
  void  mySingleClick(int selRow, TreePath selPath) {
//    System.out.println("mySingleClick: "+selRow);
  }

  void  myDoubleClick(int selRow, TreePath selPath) {
    MvcTreeNodeRec mvcNode;
    int NodeId;
    DefaultMutableTreeNode node;

    node = (DefaultMutableTreeNode) jTree1.getLastSelectedPathComponent();
    if (node == null) return;
    mvcNode = (MvcTreeNodeRec) node.getUserObject();

    NodeId = mvcNode.getNodeId();
      // System.out.println( "Double Clicked NodeId: "+Integer.toString(NodeId) );
    if (NodeId>0) {
      CObject cobj = mvcNode.getCObject();
      if (cobj==null) {
        System.out.println( "cobj ist null" );
      }
      else {
        // System.out.println( cobj.toString()  );
        // Aufruf des Einstellungsfenster
        cobj.showEinst();
      }
    }
  }  // Double Clicked

}  // MyMouseAdapter





//  Schnittstellen Definition
interface IShowEinst {

  public abstract void showEinst();

}


// Basisklasse für ALLE Objekte im Designer
class CObject implements IShowEinst {
  private static int count = 0;
	int _Object_Id;
	int _Object_Type;
	String _Name;

	public CObject (String Name, int Object_Type) {
    count ++;
		_Object_Id =  count; //Counter.getNew_ID();
		_Object_Type = Object_Type;
    _Name = Name;
	}

  public String toString() {
    return _Name;
  }

  public String getName() {
    return _Name;
  }
  public void setName(String Name) {
    _Name = Name;
  }

  public int getObjectId() {
    return _Object_Id;
  }
  public void setObjectId(int Id) {
    _Object_Id = Id;
  }

  public int getObject_Type() {
    return _Object_Type;
  }

  public void showEinst() {
  }

	// get / set
}  // Cobject



// Oberklasse  hat _Name
class CEntity extends CObject {
	String _KurzName;
	String _Description;
	String _ToDo;
	Vector _Attribut_liste;
	GUI_Entity _GUI_Entity;

	public CEntity (String Name, JDesktopPane dpane) {
		super( Name, 1);
		_GUI_Entity = new GUI_Entity( this, super.getName() );  // Clientfenster
		dpane.add(_GUI_Entity , new Integer(1));
    dpane.moveToFront(_GUI_Entity);

    _Description = "Beschreibung "+Name;
    _ToDo = "";

      // Dieser Teil fügt automatisch Attribut in das Entity
      // müßte ausgebaut werden
    if (Name.compareToIgnoreCase("Kunde")==0) {
      _GUI_Entity.addGUI( new JLabel("KName") );
      _GUI_Entity.addGUI( new JLabel("Name") );
      _GUI_Entity.addGUI( new JLabel("VorName") );
      _GUI_Entity.setLocation(10,10);
      return;
    }
    if (Name.compareToIgnoreCase("Buch")==0) {
      _GUI_Entity.addGUI( new JLabel("ISBN") );
      _GUI_Entity.addGUI( new JLabel("Titel") );
      _GUI_Entity.addGUI( new JLabel("Stichworte") );
      _GUI_Entity.addGUI( new JLabel("Preis") );
      _GUI_Entity.setLocation(300,50);
      return;
    }
    if (Name.compareToIgnoreCase("Bestellung")==0) {
      _GUI_Entity.addGUI( new JLabel("Best_Nr") );
      _GUI_Entity.addGUI( new JLabel("B_Nr") );
      _GUI_Entity.addGUI( new JLabel("KNr") );
      _GUI_Entity.addGUI( new JLabel("Anzahl") );
      _GUI_Entity.setLocation(150,200);
    }
    else {
      _GUI_Entity.addGUI( new JLabel("Attribut1") );
      _GUI_Entity.addGUI( new JLabel("Attribut2") );
      _GUI_Entity.addGUI( new JLabel("Attribut3") );
      _GUI_Entity.addGUI( new JLabel("Attribut4") );
      _GUI_Entity.addGUI( new JLabel("Attribut5") );
      _GUI_Entity.addGUI( new JLabel("Attribut6") );
      _GUI_Entity.addGUI( new JLabel("Attribut7") );
      _GUI_Entity.addGUI( new JLabel("Attribut8") );
      _GUI_Entity.setLocation(50,200);
    }
	}
	// get / set

  public void showEinst() {
    System.out.println("Entity showEinst: "+getName() );
    CEntity_Einst frame = new CEntity_Einst(this);
    frame.setVisible(true);
  }


  public String getDescription() {
    return _Description;
  }
  public void setDescription(String Description) {
    _Description = Description;
  }

}  // CEntity


  // GUI-Klasse für die Klasse CEntity
class GUI_Entity extends JInternalFrame {
  private Box _box1;
  private JPopupMenu _PopupMenu1 = new JPopupMenu();
  private CEntity _entity;


  public GUI_Entity(CEntity entity, String Name) {
     _entity = entity;
    setSize(100,100);
    this.setClosable(false);
    this.setIconifiable(true);
    this.setMaximizable(false);
    this.setResizable(true);
    this.getContentPane().setLayout( new BorderLayout() );
    this.setTitle(Name);
    _box1 = Box.createVerticalBox();
    this.getContentPane().add(_box1, BorderLayout.CENTER);

    this.addMouseListener(new java.awt.event.MouseAdapter() {
      public void mouseClicked(MouseEvent e) {
        this_mouseClicked(e);
      }
    });
    setMenus();
  }

  private void setMenus() {
    JMenuItem MnItem;
    MnItem = new JMenuItem("Neues Entity");
    _PopupMenu1.add(MnItem);
      // Event definieren
    MnItem.addActionListener(new ActionListener()  {
      public void actionPerformed(ActionEvent e) {
        Lk_NewObject(1);
      }
    });

    MnItem = new JMenuItem("Neue Beziehung");
    _PopupMenu1.add(MnItem);
    _PopupMenu1.addSeparator();
    MnItem.addActionListener(new ActionListener()  {
      public void actionPerformed(ActionEvent e) {
        Lk_NewObject(2);
      }
    });

    MnItem = new JMenuItem("Eigenschaften");
    _PopupMenu1.add(MnItem);
    MnItem.addActionListener(new ActionListener()  {
      public void actionPerformed(ActionEvent e) {
        Lk_ViewEigenschaften();
      }
    });

  }


  void this_mouseClicked(MouseEvent e) {
     int anz = e.getClickCount();
     if (anz==2) {
       System.out.println("Doppel Klick");
     }
     else {
        //  Linke , mittlere rechte Maustaste
       switch ( getButton(e) ) {
         case 1:  System.out.println("links");
                  break;
         case 2:  System.out.println("Mitte");
                  break;
         case 3:  System.out.println("rechts");
                  _PopupMenu1.show(this, e.getX(),e.getY());
                  break;
       }
     }
  }

    /**
     * getButton
     * @return int taste
     * @param MouseEvent e
     * @exception none
     * @version      1.0
     * @author Thomas Schmidt, Michael Wilhelm FH MD, FB Bauwesen
     * @use Bestimmen, welche Maustaset gedrückt wurde Example
     * @see
     */
    public static int getButton(MouseEvent e) {
        int mode = e.getModifiers();
        if ((mode & e.BUTTON2_MASK) > 0) {
            return 2;
        }
        if ((mode & e.BUTTON3_MASK) > 0) {
            return 3;
        }
        return 1;
    } // getButton



  public void Lk_NewObject(int nr) {
    designer desktop = designer.getInstance();
    desktop.NewObject(nr);
    //desktop.NewObject(3);

  }

  public void Lk_ViewEigenschaften() {
     // ruft CEntity.showEinst() auf
     _entity.showEinst();
  }

   // Eintragen eines neuen "Attributs"
  public void addGUI( JLabel sItem) {
    _box1.add( sItem, null );
  }
} // GUI_Entity



class CAttrib extends CObject {
	int  _DBS_Data_Typ;  // C_INT, C_DOUBLE
  boolean _bDomainDataTyp;  // betrifft Attribut "_TypIndex"
  int _Len1, _Len2;  // Nachkommastellen, Länge String
	boolean _bNotNull;
	boolean _bPrimaryKey;
	String   _Description1;
	public CAttrib (String Name) {
		super( Name, 1001);
	}

  public void showEinst() {
    System.out.println("CAttrib  showEinst: "+getName() );
  }
	// get / set
}



class CRelation extends CObject {
  String  _Parent_Verb;
  String  _Child_Verb;
  int  _Parent_Cardinality;
	int _Child_Cardinality;
	String   _Description1;
	public CRelation (String Name) {
		super( Name, 2);
	}

  public void showEinst() {
    System.out.println("Relation  showEinst: "+getName() );
  }

	// get / set
}





class CEntity_Einst extends JFrame {

  JLabel jLabel1 = new JLabel("Name");
  JTextField TName = new JTextField();
  JLabel jLabel2 = new JLabel("Bescheibung");
  JTextField TDescription = new JTextField();
  CEntity _entity;

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

  public CEntity_Einst(CEntity entity) {
    _entity = entity;
    try  {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }

  private void jbInit() throws Exception {
    JPanel panelBn = new JPanel();

    setSize(400, 200);
    setTitle("Einstellung Entity");
    this.getContentPane().setLayout(gridBagLayout1);

    TName.setText( _entity.getName() );
    TDescription.setText( _entity.getDescription() );

    BnOk.setText("Ok");
    BnESC.setText("Abbruch");

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

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

    // ------------------------------------------------
    this.getContentPane().add(jLabel2,
            new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0
            ,GridBagConstraints.WEST, GridBagConstraints.NONE,
            new Insets(0,20,10,0), 0, 0));

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

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

    panelBn.setLayout( new FlowLayout() );
    panelBn.add(BnOk);
    panelBn.add(BnESC);

    this.getContentPane().add(panelBn,
             new GridBagConstraints(0, 2, 2, 1, 1.0, 0.0
            ,GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
            new Insets(0,0,0,20), 0, 0));

    BnOk.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(ActionEvent e) {
        BnOk_Click();
      }
    });
    BnESC.addActionListener(new java.awt.event.ActionListener() {

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

  }  // jbInit


  private void BnOk_Click() {
  }

  private void BnESC_Click() {
    // schließen des Fensters
     try {
       this.setVisible(false);
       this.dispose();
     }
     catch (Exception e) {
     }
  }

}  // CEntity_Einst




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


// 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 int FreeButtons( String sTitle, String sMessage, Buttons []);

    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, String sInput) {


      // Welche Maustaste wurde gedrückt ?
    public static int getButton(MouseEvent e) {


// 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ß";



    // Damit braucht man nicht die Konstanten aus JOptionPane referenzieren
    public static final int YES = 1;
    public static final int NO = 2;
    public static final int ESC = 3;

    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



  // NL = '\n'

    // Zeigt eine Fehlermeldung an
  public static void Error( String sTitle, String sMessage) {
    JOptionPane.showConfirmDialog(null,sMessage,sTitle,
      JOptionPane.DEFAULT_OPTION,
      JOptionPane.ERROR_MESSAGE);  // Symbol
    /*  Optionen der Schalter:
         DEFAULT_OPTION    Ok
         YES_NO_OPTION
         YES_NO_CANCEL_OPTION
         OK_CANCEL_OPTION
     */
     /*  Symbole:
      ERROR_MESSAGE
      INFORMATION_MESSAGE
      WARNING_MESSAGE
      QUESTION_MESSAGE
      PLAIN_MESSAGE
     */

  } // 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
    /*  Optionen der Schalter:
         DEFAULT_OPTION    Ok
         YES_NO_OPTION
         YES_NO_CANCEL_OPTION
         OK_CANCEL_OPTION
     */
     /*  Symbole:
      ERROR_MESSAGE
      INFORMATION_MESSAGE
      WARNING_MESSAGE
      QUESTION_MESSAGE
      PLAIN_MESSAGE
     */

  } // Message

    // Zeigt eine Fehlermeldung an
  public static boolean YesNo( String sTitle, String sMessage) {
    int retcode;
    retcode = JOptionPane.showConfirmDialog(null,sMessage,sTitle,
      JOptionPane.YES_NO_OPTION,
      JOptionPane.QUESTION_MESSAGE);  // Symbol

    switch (retcode) {
       case JOptionPane.YES_OPTION:
         // ja, Änderungen speichern
         return true;
       case JOptionPane.NO_OPTION:
         return false;
       case JOptionPane.CANCEL_OPTION:
       default:
         // abbrechen
         return false;
    }
  } // Fehler


    // Zeigt eine Fehlermeldung an
  public static int YesNoEsc( String sTitle, String sMessage) {
    int retcode;
    retcode = JOptionPane.showConfirmDialog(null,sMessage,sTitle,
      JOptionPane.YES_NO_CANCEL_OPTION,
      JOptionPane.QUESTION_MESSAGE);  // Symbol

    switch (retcode) {
       case JOptionPane.YES_OPTION:
         // ja, Änderungen speichern
         return YES;
       case JOptionPane.NO_OPTION:
         return NO;
       case JOptionPane.CANCEL_OPTION:
       default:
         return ESC;
    }
  } // YES NO ESC

  public static int FreeButtons( String sTitle, String sMessage, String buttons[]) {
    int retcode;
    retcode = JOptionPane.showOptionDialog(null, sMessage,sTitle,
           JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, buttons, buttons[0]);

    return retcode;
  }





    // Zeigt eine Fehlermeldung an
  public static boolean OkEsc( String sTitle, String sMessage) {
    int retcode;
    retcode = JOptionPane.showConfirmDialog(null,sMessage,sTitle,
      JOptionPane.OK_CANCEL_OPTION,
      JOptionPane.INFORMATION_MESSAGE);  // Symbol

    switch (retcode) {
       case JOptionPane.OK_OPTION:
         // ja, Änderungen speichern
         return true;
       case JOptionPane.CANCEL_OPTION:
       default:
         // abbrechen
         return false;
    }
  } // Ok ESC


    // Eingabe eines String
/*  public static String getInput( String sTitle, String sMessage) {
    return JOptionPane.showInputDialog(null, sTitle, sMessage, 1);
  } //

*/
    // Eingabe eines String
  public static String getInput( String sTitle, String sMessage, String sInput) {
    String s = (String) JOptionPane.showInputDialog(null, sTitle, sMessage,
      JOptionPane.PLAIN_MESSAGE, null, null, sInput);
    if (s==null)
      return "";
    else
      return s;
  } //



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

      // 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;
    }


    


   // Ausgaben einer formatierten Zahl

   
   /* BESCHREIBUNG     : konvertiert einen double in einem String          */
   /*                    Parameter nk beschreibt die Nachkommastelle       */
   //                    nk = Anzahl der Nachkommastellen
    public static String DStr(double d, int nk) {
        java.text.NumberFormat NF = java.text.NumberFormat.getInstance();
        NF.setMinimumFractionDigits(nk);
        NF.setMaximumFractionDigits(nk);
        return NF.format(d);
    }  // DStr

  /*  BESCHREIBUNG     : konvertiert ein int einen String mit mindestens   */
  /*                     zwei gültigen Ziffern                             */
  /*                     12     --->   "12"                                */
  /*                     123    --->   "123"                               */
  /*                     2      --->   "02"                                */
  /*                     1      --->   "01"                                */
  /*                     8      --->   "08"                                */

    /**
     * IStr2
     * @return String ZweistelligeZahl
     * @param int izahl
     * @exception none
     * @version      1.0
     * @author Michael Wilhelm HS Harz, FB AI
     * @use wandelt den int Wert in einen zweistelligen String um Example 1 -> 01   123 ->  123
     * @see #IStr2
     * @see #LStr2
     */
    public static String IStr2(int iZahl) {
        String s;
        java.text.NumberFormat NF = java.text.NumberFormat.getInstance();
        s = NF.format(iZahl);
        if (s.length() < 2) s = "0" + s;
        return s;
    }  // IStr2



    /**
     * LStr2
     * @return String ZweistelligeZahl
     * @param long lzahl
     * @exception none
     * @version      1.0
     * @author Michael Wilhelm HS Harz, FB AI
     * @use wandelt den long Wert in einen zweistelligen String um Example 1 -> 01   123 ->  123
     * @see #IStr2
     * @see #LStr2
     */
    public static String LStr2(long lZahl) {
        String s;
        java.text.NumberFormat NF = java.text.NumberFormat.getInstance();
        s = NF.format(lZahl);
        if (s.length() < 2) s = "0" + s;
        return s;
    }  // LStr2


  /*  BESCHREIBUNG     : konvertiert alle Kommas in einem String          */
    /**
     * Komma2Point
     * @return String
     * @param String szZ
     * @exception none
     * @version      1.0
     * @author Michael Wilhelm HS Harz, FB AI
     * @use ersetzt die Kommas im Parameter durch Punkte Example 1,23  -> 1.23
     * @see #Point2Komma
     */
    public static String Komma2Point(String szZ) {
        return szZ.replace(',', '.');
    } // siehe Komma2Point



    /**
     * Point2Komma
     * @return String
     * @param String szZ
     * @exception none
     * @version      1.0
     * @author Michael Wilhelm HS Harz, FB AI
     * @use ersetzt die Kommas im Parameter durch Punkte Example 1.234  ->  1,234
     * @see #Komma2Point
     */
    public static String Point2Komma(String szZ) {
        return szZ.replace('.', ',');
    }



    // Numerik

    /**
     * log10
     * @return double zahl
     * @param double x
     * @exception none
     * @version      1.0
     * @author Michael Wilhelm HS Harz, FB AI
     * @use Normierung Example
     * @see #bestimme_xswD
     * @see #IntPowerD
     */
    public static double log10(double x) {
        return Math.log(x) / Math.log(10);
    }

    

    // Datei Methoden



  /*  FUNKTIONSNAME    : changeFileExt                                     */
  /*                                                                       */
  /*  AUTOR            : Michael Wilhelm                                   */
  /*                                                                       */
  /*  DATUM (1.Version): 30.07.1999                                        */
  /*                                                                       */
  /*  BESCHREIBUNG     : ändert die Extention eines Dateinamens            */
    //   Beispiel
    //   szMom = bas.ChangeFileExt(szUFileName, ".MOM");

    /**
     * changeFileExt
     * @return String NewFileName
     * @param String szDateiname, String szExt
     * @exception none
     * @version      1.0
     * @author Michael Wilhelm HS Harz, FB AI
     * @use Example
     * @see #CheckFileName
     * @see #getFileExt Ändern der Dateiwerweiterung  TXT  -> DAT
     */
    public static String changeFileExt(String szDateiname, String szExt) {
        String szErgDatei;
        char ch;
        szErgDatei = "";
        File f = null;
        try {
            // evnetuell kann auch f.pathSeparatorChar verwendet werden
            f = new File(szDateiname);
            szErgDatei = f.getParent();
            ch = szErgDatei.charAt(szErgDatei.length() - 1);
            if (ch != '\\') szErgDatei = szErgDatei + '\\';
            //  + GetName(f.getName())+".ERG";  // Path
            szErgDatei = szErgDatei + getFileName(f.getName()) + szExt;
        }
        catch (Exception e) {
        }
        return szErgDatei;
    }
    //   Beispiel
    //   szMom = bas.getFileExt(szUFileName);
    //   szMom = ".MOM"

    /**
     * getFileExt
     * @return String Extension (.SNP)
     * @param String szDateiname
     * @exception none
     * @version      1.0
     * @author Michael Wilhelm HS Harz, FB AI
     * @use Example
     * @see #CheckFileName
     * @see #ChangeFileExt Ausgabe der Dateierweiterung
     */
    public static String getFileExt(String szDateiname) {
        int k, i, n;
        n = szDateiname.length();
        k = -1;
        // suche von hinten erstes Auftreten eines Punktes
        for (i = n - 1; i >= 0; i--) {
            if (szDateiname.charAt(i) == '.') {
                k = i;
                break;
            }
        }
        if (k == -1) // kein Punkt vorhanden
            return new String("");
        else {
            // substring zählt von NULL
            // Anfangsindex   EndIndex
            String s;
            s = szDateiname.substring(k, n);
            return szDateiname.substring(k, n);
        }
    } // getFileExt

    /**
     * GetFileName
     * @return String Name+Ext
     * @param String szDateiname
     * @exception none
     * @version      1.0
     * @author Michael Wilhelm HS Harz, FB AI
     * @use Example
     * @see #CheckFileName
     * @see #ChangeFileExt
     * @see #getFileName extrahiert den Dateinamen ohne Pfad
     */
    /*
      getFileName
    File F = new File(szDateiname);
    return F.getName();
   */
    public static String getFileNameExt(String szDateiname) {

        int k, i, n;
        n = szDateiname.length();
        k = -1;
        for (i = n - 1; i >= 0; i--) {
            if (szDateiname.charAt(i) == '\\') {
                k = i + 1;
                break;
            }
            if (szDateiname.charAt(i) == '/') {
                k = i + 1;
                break;
            }
        }
        if (k == -1)
            return szDateiname;
        else // beginIndex   endIndex
            return szDateiname.substring(k, n); // ??????  n-1 ist zu klein
    }

    /**
     * GetName
     * @return String Name
     * @param String szDateiname, String szExt
     * @exception none
     * @version      1.0
     * @author Michael Wilhelm HS Harz, FB AI
     * @use interne Prozedur, trennt den Dateinamen und gibt ihn aus Example
     * @see #CheckFileName
     * @see #ChangeFileExt
     * @see #getFileNameExt
     */
     // Schneidet die Extension ab
    public static String getFileName(String szDateiname) {
        int k, i, n;
        n = szDateiname.length();
        k = -1;
        for (i = n - 1; i >= 0; i--) {
            if (szDateiname.charAt(i) == '.') {
                k = i - 1;
                break;
            }
        }
        if (k == -1)
            return szDateiname;
        else
            return szDateiname.substring(0, k + 1);
    }  // getFileName


    public static boolean FileExists(String szDateiname) {
        File f = null;
        try {
            // evnetuell kann auch f.pathSeparatorChar verwendet werden
            f = new File(szDateiname);
            if (f.exists())
                return true;
            else
                return false;
        }
        catch (Exception e) {
            return false;
        }
    }



  /*  FUNKTIONSNAME    : CheckFileName                                     */
  /*  AUTOR            : Michael Wilhelm                                   */
  /*  DATUM (1.Version): 30.07.1999                                        */
  /*                                                                       */
  /*  BESCHREIBUNG     : prüft ob ein Name ein gültiger Dateiname ist      */
  /*  GEHÖRT ZU        : Basis-Routinen                                    */
  /*                                                                       */
  /*  EINGABEPARAMETER : String - Object                                   */
  /*                                                                       */
  /*  AUSGABEPARAMETER : String - Object                                   */
  /*                                                                       */
  /*  DATEIEN          : none                                             */
  /*  (lesen/ändern)                                                       */
  /*                                                                       */
  /*  GLOBALE VARIABLEN:  none                                            */
  /*  (Benutzt/Ändern)                                                     */
  /*                                                                       */
  /*  VERFAHREN        :  Check ob folgende Zeichen vorhanden sind,        */
  /*                      dann falsch                                      */
  /*                      \  /   :  ?  *  "  <  >  |                       */
  /*                      Suche geschieht mit der Methode indexOf          */
  /*                                                                       */
  /*  (Entwurfsscheidungen:                                                */
  /*  EXTERNE AUFRUFE  :  none                                            */
  /*  (Modul.Name)                                                         */
  /*  ÄNDERUNGEN       :                                                   */
  /*  (b. changerequest)                                                   */
  /*  (Änderungsdatum)                                                     */
  /*                                                                       */
  /* ***********************************************************************/

    /**
     * CheckFileName
     * @return boolean FileNameOkay
     * @param String szDateiname
     * @exception none
     * @version      1.0
     * @author Michael Wilhelm HS Harz, FB AI
     * @use Prüft, ob der Dateiname gültig ist Example 1.234  ->  1,234
     * @see #getFileName
     * @see #ChangeFileExt
     */
    public static boolean CheckFileName(String szDateiname) {
        if (szDateiname.length() == 0) {
            return false;
        }
        else {
            int i;
            i = szDateiname.indexOf('\\', 0);
            if (i > 0) return false;
            i = szDateiname.indexOf('/', 0);
            if (i > 0) return false;
            i = szDateiname.indexOf(':', 0);
            if (i > 0) return false;
            i = szDateiname.indexOf('?', 0);
            if (i > 0) return false;
            i = szDateiname.indexOf('*', 0);
            if (i > 0) return false;
            i = szDateiname.indexOf('"', 0);
            if (i > 0) return false;
            i = szDateiname.indexOf('<', 0);
            if (i > 0) return false;
            i = szDateiname.indexOf('>', 0);
            if (i > 0) return false;
            i = szDateiname.indexOf('|', 0);
            if (i > 0) return false;
            return true;
        }
    } //   pruefe_dateinamen


    /**
     * Center a frame to the screen. The size can be presetted or the actual frame size can be used.
     * @param frame Specifies the frame that should be centered
     * @param preset Specifies a preset dimension. If this is null, the dimension of the frame is used.
     */
    public static void centerScreen(java.awt.Window frame, java.awt.Dimension preset) {
        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        java.awt.Dimension frameSize;
        if (preset == null)
            preset = frame.getSize();
        if (preset.height > screenSize.height)
            preset.height = screenSize.height;
        if (preset.width > screenSize.width)
            preset.width = screenSize.width;
        // set new pos:
        frame.setBounds((screenSize.width - preset.width) / 2, (screenSize.height - preset.height) / 2,
            preset.width, preset.height);
    }



    /**
     * getButton
     * @return int taste
     * @param MouseEvent e
     * @exception none
     * @version      1.0
     * @author Thomas Schmidt, Michael Wilhelm FH MD, FB Bauwesen
     * @use Bestimmen, welche Maustaset gedrückt wurde Example
     * @see
     */
    public static int getButton(MouseEvent e) {
        int mode = e.getModifiers();
        if ((mode & e.BUTTON2_MASK) > 0) {
            return 2;
        }
        if ((mode & e.BUTTON3_MASK) > 0) {
            return 3;
        }
        return 1;
    } // getButton




}  // basis
