
import java.awt.*;

import javax.swing.*;
import javax.swing.table.*;
import javax.swing.border.*;

import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.Color;

import java.util.Vector;

// Schalter Event
import java.awt.event.*;

import java.util.Collection;
import java.util.Collections;



// Tabelle mit einer Klasse  und sortierung

public class Tabelle20 extends JFrame {

   JComboBox comboSort;
   JTable tabelle;
   Vector sortListe;


   Vector liste = new Vector();

   final String[]
   names = {"Vorname", "Nachname", "MatrNr", "UNumer", "Farbe"};

    public Tabelle20() {
      // setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setGUI();
      setSize(600,400);
    }


  //Überschreiben, damit das Programm bei Herunterfahren des Systems beendet werden kann
  protected void processWindowEvent(WindowEvent e) {
    super.processWindowEvent(e);
    if(e.getID() == WindowEvent.WINDOW_CLOSING) {
      System.exit(0);
    }
  }


    private void setGUI() {

        this.getContentPane().setLayout( new BorderLayout() );

        JToolBar toolBar = new JToolBar();
        JLabel  label1 = new JLabel("Sortierung");
        toolBar.add( label1 );
        label1.setFont( new Font("Arial", Font.BOLD,18)  );

        toolBar.addSeparator( new Dimension(20,5) );

        sortListe = new Vector();
        sortListe.add("keine");
        sortListe.add("Vorname");
        sortListe.add("Nachname");
        sortListe.add("MatrNr");
        sortListe.add("UNummer");
        //sortListe.add("Farbe");
        comboSort = new JComboBox(sortListe);

        comboSort.setSelectedIndex( 0 );
        toolBar.add( comboSort );
        comboSort.setFont( new Font("Arial", Font.BOLD,18)  );

        this.getContentPane().add(toolBar, BorderLayout.NORTH);

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

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


        setdata();
        tabelle = createTable();
        tabelle.setFont( new Font("Arial", Font.PLAIN,18)  );
        JTableHeader th = tabelle.getTableHeader();
        th.setFont( new Font("Arial", Font.BOLD,18));


        // Finish setting up the table.
        JScrollPane scrollpane = new JScrollPane(tabelle);
      	scrollpane.setBorder(new BevelBorder(BevelBorder.LOWERED));

        scrollpane.setPreferredSize(new Dimension(430, 200));

        this.getContentPane().add(scrollpane, BorderLayout.CENTER);
        // this.pack();
        /*scrollpane.addMouseListener(new java.awt.event.MouseAdapter() {

          public void mouseClicked(MouseEvent e) {
            tabelle_mouseClicked(e);
          }
        });
         */
        tabelle.addMouseListener(new java.awt.event.MouseAdapter() {

          public void mouseClicked(MouseEvent e) {
            tabelle_mouseClicked(e);
          }
        });

    }


  // createTable
  public JTable createTable() {
    // Create a model of the data.
        TableModel dataModel = new AbstractTableModel() {
            // These methods always need to be implemented.
            public int getColumnCount() {
              return names.length;
            }
            public int getRowCount() {
              return liste.size();
            }

            public Object getValueAt(int row, int col) {
              CData2 data = (CData2) liste.elementAt(row);
             // return data.returnTableData(col);

              switch (col) {
                case 0: return data.getVorname();
                case 1: return data.getName();
                case 2: return data.getMatrNummer();
                case 3: return data.getUNummer();
                case 4: return data.getFarbe();
                default: return "xxxxx"+Integer.toString(col);
              }
            }

            // The default implementations of these methods in
              // AbstractTableModel would work, but we can refine them.
            public String getColumnName(int column) {
              return names[column];
            }
            public Class getColumnClass(int c) {
              return getValueAt(0, c).getClass();
            }
            public boolean isCellEditable(int row, int col) {
              return false; // true;
            }
            public void setValueAt(Object aValue, int row, int column) {
              CData2 data = (CData2) liste.elementAt(row);
              switch( column ) {
                case 0: data.setName( (String) aValue );
                case 1: data.setVorname( (String) aValue );
                case 2: //data.setMatrNummer( aValue );
                case 3: data.setUNummer( (String) aValue );
              }
            }
         };

     JTable table = new JTable(dataModel);


        return table;
  } // createTable

    public 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



    void tabelle_mouseClicked(MouseEvent e) {
      if (  getButton(e) == 1) {
         if ( e.getClickCount() == 2) {
          System.out.println("doppel");
          editTabellenEintrag();
         }
         if ( e.getClickCount() == 1) {
          System.out.println("einfach");
         }
       }
      if (  getButton(e) == 3) {
          System.out.println("rechte Maustaste");
       }

    }

      void editTabellenEintrag() {
        int k= tabelle.getSelectedRow();
        CData2 data = (CData2) liste.elementAt(k);
        // Aufruf JDialog
        myDialog d = new myDialog(this, data);
        if ( d.result ) {
          // Ok wurde gedrückt, daten übernehmen
          System.out.println("Ok wurde gedrückt, daten übernehmen");
          data.setVorname( d.getVorname()  );
          data.setName( d.getName()  );
          data.setMatrNummer( d.getMatrnr()  );
          data.setUNummer( d.getUnr()  );
          tabelle.updateUI();
        }
      }

   private void   comboSort_click() {
       int i = comboSort.getSelectedIndex();
       if (i>0) {
        CData2.sorttyp =i;
        // Statische Methode
        Collections.sort( liste );
        tabelle.updateUI();
          System.out.println("" );
          System.out.println("" );
          System.out.println("" );
        for (i=0; i<liste.size(); i++) {
          CData2 d = (CData2) liste.elementAt(i);
          System.out.println(d.toString() );
        }

       }

   }


     // Eintragen
    private void setdata() {
      CData2 data;

      data = new CData2( "Müller","Kai", 4722, "U12345","Yellow");
        liste.add(data);

      data = new CData2( "Meyer","Uwe", 4712, "U12345","Red");
        liste.add(data);

      data = new CData2( "Schmidt","Petra", 4714, "U12325","Blue");
        liste.add(data);

      data = new CData2( "Brian","Adams", 6714, "U13325","Pink");
        liste.add(data);

      data = new CData2( "Hold","Toni", 6614, "U13345","White");
        liste.add(data);

      data = new CData2( "Boll","Toni", 6613, "U13345","Maroon");
        liste.add(data);

      data = new CData2( "Seneca","Toni", 6314, "U13341","Gray");
        liste.add(data);

      data = new CData2( "Kredel","Helmut", 8613, "U23345","Phthalo Blue");
        liste.add(data);


      data = new CData2( "Bräunl","Thomas", 8700, "U23315","Maroon");
        liste.add(data);
      data = new CData2( "Doug","Lea", 3613, "U11345","Blue");
        liste.add(data);
      data = new CData2( "Rauber","Rünger", 5612, "U53344","Red");
        liste.add(data);
      data = new CData2( "Walrath","Kathy", 4613, "U33345","Green");
        liste.add(data);
      data = new CData2( "Weber","Harald", 9613, "U23345","Black");
        liste.add(data);

    }


    public static void main(String[] args) {
      Tabelle20 frame = new Tabelle20();
      frame.validate();
      frame.setVisible(true);
      frame.show();
      CData2 d;
      //System.out.println( CData2.getColumns() );
    }

}


class CData2 implements  Comparable{
    public static int sorttyp=0;


    private String _Name;
    private String _Vorname;
    private int _MatrNummer;
    private String _UNummer;
    private String _Farbe;

    public CData2() {
    }

    public int getColumns() {
      return 5;
    }

    public CData2( String Name, String Vorname, int MatrNummer, String UNummer, String Farbe) {
      _Name = Name;
      _Vorname = Vorname;
      _MatrNummer = MatrNummer;
      _UNummer = UNummer;
      _Farbe = Farbe;
    }


  public int compareTo(Object obj) {
     CData2 myD;
     myD = (CData2) obj;
     System.out.println(_Vorname+"   "+_Name+"    "+_MatrNummer+"    "+sorttyp );
     switch (sorttyp) {
      case 1: return _Vorname.compareToIgnoreCase(myD._Vorname );
      case 2: return _Name.compareToIgnoreCase(myD._Name );
      case 3: if (_MatrNummer < myD._MatrNummer )
                 return -1;
               else {
                 if (_MatrNummer > myD._MatrNummer )
                   return 1;
                 else
                   return 0;
               }
      case 4: return _UNummer.compareToIgnoreCase(myD._UNummer );
      default: return 0;
     }

   }

   public String toString() {
     return _Vorname+"   "+_Name+"    "+_MatrNummer+"    "+_UNummer;


   }

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


   public String getVorname() {
     return _Vorname;
   }
   public void setVorname(String Vorname) {
     _Vorname = Vorname;
   }

   public String getMatrNummer() {
     return Integer.toString(_MatrNummer);
   }
   public void setMatrNummer(int MatrNummer) {
     _MatrNummer = MatrNummer;
   }



   public String getUNummer() {
     return _UNummer;
   }
   public void setUNummer(String UNummer) {
     _UNummer = UNummer;
   }


   public String getFarbe() {
     return _Farbe;
   }
   public void setFarbe(String Farbe) {
     _Farbe = Farbe;
   }

}  // CData2



class myDialog extends JDialog {
    private JLabel label1= new JLabel("Vorname");
    private JLabel label2= new JLabel("Nachname");

    private JLabel label3= new JLabel("MatrNr");
    private JLabel label4= new JLabel("UNummer");

    private JTextField vorname= new JTextField();
    private JTextField name= new JTextField();
    private JTextField matrnr= new JTextField();
    private JTextField unummer= new JTextField();

    private String sVorname;
    private String sName;
    private int iMatrnr;
    private String sUnummer;

    public boolean result;  // gibt an, ob Ok oder Esc gedrückt wurde

  public myDialog( Frame parent, CData2 data) {
   super(parent);
   setModal(true);
   setTitle("Bearbeiten eines Datensatzes");
   setSize(400,350);
   result=false;
   setGUI(data);

   setVisible(true);

  }

  private void setGUI(CData2 data) {
        this.getContentPane().setLayout( new GridBagLayout() );

        vorname.setText( data.getVorname() );
        name.setText( data.getName() );
        matrnr.setText( data.getMatrNummer() );
        unummer.setText( data.getUNummer() );

       label1.setFont( new Font("Arial", Font.BOLD,18)  );
       label2.setFont( new Font("Arial", Font.BOLD,18)  );
       label3.setFont( new Font("Arial", Font.BOLD,18)  );
       label4.setFont( new Font("Arial", Font.BOLD,18)  );

       vorname.setFont( new Font("Arial", Font.BOLD,18)  );
       name.setFont( new Font("Arial", Font.BOLD,18)  );
       matrnr.setFont( new Font("Arial", Font.BOLD,18)  );
       unummer.setFont( new Font("Arial", Font.BOLD,18)  );

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

      this.getContentPane().add(vorname,
           new GridBagConstraints(1, 0, 1, 1, 1.0, 0.0,
            GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
            new Insets(30,40,0,20), 00, 0));
      // -------------------------------

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

      this.getContentPane().add(name,
           new GridBagConstraints(1, 1, 1, 1, 1.0, 0.0,
            GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
            new Insets(30,40,0,20), 00, 0));
      // -------------------------------

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

      this.getContentPane().add(matrnr,
           new GridBagConstraints(1, 2, 1, 1, 1.0, 0.0,
            GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
            new Insets(30,40,0,20), 00, 0));
      // -------------------------------

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

      this.getContentPane().add(unummer,
           new GridBagConstraints(1, 3, 1, 1, 1.0, 0.0,
            GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
            new Insets(30,40,0,20), 00, 0));
      // -------------------------------

        JPanel pn = new JPanel();
        pn.setLayout( new FlowLayout() );


        JButton BnOk = new JButton("Ok");
        BnOk.setFont( new Font("Arial", Font.BOLD,18)  );
        pn.add( BnOk);

        JButton BnESC = new JButton("Abbruch");
        BnESC.setFont( new Font("Arial", Font.BOLD,18)  );
        pn.add( BnESC);

        this.getContentPane().add(pn,   new GridBagConstraints(0, 4, 2, 1, 0.0, 0.0
            ,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(25,0,0,0), 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();
        }
      });


  }

  void BnESC_click() {
    result=false;
    setVisible(false);
    dispose();
  }

  void BnOk_click() {
    // check der Daten
    String s = vorname.getText().trim();  // Leerstellen links rechts löschen
    if ( s.length()==0) {
      basis.Error("Eingabe","Bitte eine gültige im Vornamen");
      vorname.requestFocus();  // erhaelt Fokus
      return;
    }
    sVorname = s;

    s = name.getText().trim();  // Leerstellen links rechts löschen
    if ( s.length()<2) {
      basis.Error("Eingabe","Bitte eine gültige Eingabe im Namen");
      name.requestFocus();  // erhaelt Fokus
      return;
    }
    sName = s;


    s = matrnr.getText().trim();  // Leerstellen links rechts löschen
    if ( s.length()==0) {
      basis.Error("Eingabe","Keine Eingabe in der MatrNr");
      matrnr.requestFocus();  // erhaelt Fokus
      return;
    }
    if ( ! basis.IVal(s) ) {
      basis.Error("Eingabe","Fehlerhafte numerische Eingabe in der MatrNr");
      matrnr.requestFocus();  // erhaelt Fokus
      return;
    }
    iMatrnr = basis.getIValResult();


    s = unummer.getText().trim();  // Leerstellen links rechts löschen
    if ( s.length()==0) {
      basis.Error("Eingabe","Keine Eingabe in der UNummer");
      unummer.requestFocus();  // erhaelt Fokus
      return;
    }
    // Format   U12345,  trennen  U mit Zahl
    String s2 = s.substring(1);  // alles ab position 1
    if ( ! basis.IVal(s2) ) {
      basis.Error("Eingabe","Fehlerhafte numerische Eingabe in der UNummer");
      unummer.requestFocus();  // erhaelt Fokus
      return;
    }
    sUnummer = s;

    result=true;
    // Speichern in lokale variable
    setVisible(false);
    dispose();
  }

  // Rückgabe-Methoden
  public String getVorname() {
    return sVorname;
  }
  public String getName() {
    return sName;
  }

  public int getMatrnr() {
    return iMatrnr;
  }
  public String  getUnr() {
    return sUnummer;
  }




}



class basis {
    // Konstanten
    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

    public static boolean IVal(String sText) {
        // erläuterung von iIVal = Integer.valueOf(szText).intValue();
        boolean result = true;
        String s;
        s = new String(sText); // neues Objekt
        s.trim();
        if (s.length() == 0) {
            ValError = C_LEER;
            intVal = 0;
            result = false;
        }
        else {
            try {
                intVal = Integer.valueOf(sText).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(sText).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



    public static int getIValResult() {
       return intVal;
    }
    

  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
     */

  } // Error


}
