Package

Source Code of Vokabeln

/**
* Oberflache fur MySQL Vokabeln
* @author Lukas Schreiner
* @version 0.5
*/
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.KeyStroke;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;
import javax.swing.UIManager;
import java.text.MessageFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import com.toedter.calendar.JDateChooser;
import com.toedter.calendar.JSpinnerDateEditor;
import java.awt.BorderLayout;
import java.awt.event.FocusListener;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import javax.swing.filechooser.FileNameExtensionFilter;

public class Vokabeln extends JFrame{
    // Anfang Attribute
    private Vokabeln self;
    private String title;
    private Container con;
    private ImageIcon image;
    // Registerkarten
    private JTabbedPane register;
    private JComponent tab1; // Vokabeln
    private JComponent tab2; // Kategorie
    // Tabelle Kategorien
    private JScrollPane scrollKate;
    private JTable tabKate;
    private TableModel modelKate;
    // Tabelle Vokabeln
    private JScrollPane tabelle;
    private JTable tabvok;
    private TableModel model;
    private JComboBox kateg;
    private JLabel startDate;
    private JLabel endDate;
    private JDateChooser startStamp;
    private JDateChooser endStamp;
    private boolean category = true;
    private String categoryName = "";
    // Menu Attribute:   
    private JMenuBar mainMenu;
    private JMenu fileMenu;
    private JMenu trainMenu;
    private JMenu helpMenu;
    private JMenuItem newDBItem;
    private JMenuItem loadDBItem;
    private JMenuItem newVokabelItem;
    private JMenuItem newCategoryItem;
    private JMenuItem printItem;
    // Recent Menu
    private JMenu recentFiles;
    private ArrayList<JMenuItem> recentFilesItems;
    private JMenuItem exitItem;
    private JMenuItem resetVokabeln;
    private JMenuItem traineer[] = new JMenuItem[4];
    private JMenuItem aboutItem;
    private JMenuItem lizenz;
    //private JMenuItem updateItem;
    // Suchfunktion
    private JTextField searchField;
    // Ende Menu Attribute
    // Objekte
    private IniManager im;
    private MySQL ms;
    private VokabelnBackend ba;
    // Ende Attribute

    // Anfang Methoden
    public Vokabeln(){
        super();
        this.self = this;
        this.title = "Thematische Vokabellisten";
        this.con = this.getContentPane();
        this.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        this.setResizable(true);
        this.addIcon();
        this.initConfig();
        this.connect();
        this.initMenu();
        this.initWindow();
        this.addActions();
        this.pack();
    }
    private void addIcon(){
        image = new ImageIcon("icons/application_form.png");
        this.setIconImage(image.getImage());
    }
    private void initConfig(){
        this.im = new IniManager("config.ini");
    }
    private void connect(){
        // Variablen initializieren
        this.ba = new VokabelnBackend(this.im);
        if(im.get("useSQLite", "SQLite").equals("true")){
            String sqdb = "vokabeln.db";
            sqdb = this.ba.pathToDB();
            System.err.println(":: "+sqdb);
            this.ms = new MySQL(im.get("driver", "SQLite"), sqdb, true);
        }else{
            this.ms = new MySQL(im.get("driver", "MySQL"), im.get("database", "MySQL"), im.get("host", "MySQL"), im.get("user", "MySQL"), im.get("password", "MySQL"), im.get("port", "MySQL"), false);
        }
        if(im.get("useProxy", "Proxy").equals("true")){
            this.ms.useProxy(im.get("host", "Proxy"), im.get("port", "Proxy"));
        }
        this.ba.setMySQL(this.ms);
    }
    private void initMenu(){
        // Alles erzeugen
        this.mainMenu = new JMenuBar();
        this.fileMenu = new JMenu("Datei");
        this.recentFiles = new JMenu("Zuletzt verwendet");
        this.trainMenu = new JMenu("Trainieren");
        this.helpMenu = new JMenu("Hilfe");

        // Items
        this.newDBItem = new JMenuItem("Neue Datenbank");
        this.loadDBItem = new JMenuItem("Datenbank laden");
        this.newVokabelItem = new JMenuItem("Neue Vokabel");
        this.newCategoryItem = new JMenuItem("Neue Kategorie");
        this.printItem = new JMenuItem("Liste drucken");
        this.exitItem = new JMenuItem("Beenden");
        this.lizenz = new JMenuItem("Lizenz");
        this.aboutItem = new JMenuItem("Credits");

        this.resetVokabeln = new JMenuItem("Status resetten");
        this.trainMenu.add(resetVokabeln);
        String bezeich[] = {"Alle Vokabeln","10 Vokabeln","20 Vokabeln","30 Vokabeln"};
        for(int i = 0; i < traineer.length; i++){
            this.traineer[i] = new JMenuItem(bezeich[i]);

            switch(i){
                case 0:
                    this.traineer[i].setAccelerator(KeyStroke.getKeyStroke('G', InputEvent.CTRL_DOWN_MASK));
                break;
                case 1:
                    this.traineer[i].setAccelerator(KeyStroke.getKeyStroke('H', InputEvent.CTRL_DOWN_MASK));
                break;
                case 2:
                    this.traineer[i].setAccelerator(KeyStroke.getKeyStroke('J', InputEvent.CTRL_DOWN_MASK));
                break;
                case 3:
                    this.traineer[i].setAccelerator(KeyStroke.getKeyStroke('L', InputEvent.CTRL_DOWN_MASK));
                break;
                default:
                break;
            }

            this.trainMenu.add(traineer[i]);
        }
        // Recent Files
        this.recentFilesItems = new ArrayList<JMenuItem>();
        ArrayList<String> tmple = this.ba.getRecentDatabases();
        for(String item: tmple){
            JMenuItem tmp = new JMenuItem(item);
            this.recentFilesItems.add(tmp);
            this.recentFiles.add(tmp);
        }

        // Tastenkombinationen
        this.loadDBItem.setAccelerator(KeyStroke.getKeyStroke('O', InputEvent.CTRL_DOWN_MASK));
        this.newVokabelItem.setAccelerator(KeyStroke.getKeyStroke('N', InputEvent.CTRL_DOWN_MASK));
        this.newCategoryItem.setAccelerator(KeyStroke.getKeyStroke('K', InputEvent.CTRL_DOWN_MASK));
        this.printItem.setAccelerator(KeyStroke.getKeyStroke('P', InputEvent.CTRL_DOWN_MASK));
        this.exitItem.setAccelerator(KeyStroke.getKeyStroke('Q', InputEvent.CTRL_DOWN_MASK));

        // Items den Eltern adden
        this.fileMenu.add(this.newDBItem);
        this.fileMenu.add(this.loadDBItem);
        this.fileMenu.addSeparator();
        this.fileMenu.add(this.newVokabelItem);
        this.fileMenu.add(this.newCategoryItem);
        this.fileMenu.add(this.printItem);
        this.fileMenu.add(this.recentFiles);
        this.fileMenu.addSeparator();
        this.fileMenu.add(this.exitItem);
        this.helpMenu.add(this.lizenz);
        this.helpMenu.addSeparator();
        this.helpMenu.add(this.aboutItem);

        // Menus der Bar hinzufugen
        this.mainMenu.add(this.fileMenu);
        this.mainMenu.add(this.trainMenu);
        this.mainMenu.add(this.helpMenu);

        this.buildFilesMenu(false);

        // Menubar dem Frame hinzufugen
        this.setJMenuBar(this.mainMenu);
    }
   
    private void initWindow(){
        // Ttiel setzen
        this.setTitle(this.title+" : "+this.ms.getDatabase());
        this.setSize(800,800);
        this.setMinimumSize(new Dimension(800, 300));
        register = new JTabbedPane();

            // Nimbus Design
            try{
                UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
            }catch(Exception e){
                System.out.println("Nimbus ist nicht installiert!");
            }
            // Nimbus Design ENDE

        // Liste
        this.showVokabeln("Alle", false);

        // Register anzeigen:
        register1();
        register2();
        this.register.addTab("Vokabeln", this.tab1);
        this.register.addTab("Kategorien", this.tab2);
        this.register.setMnemonicAt(0, KeyEvent.VK_1);
        this.register.setMnemonicAt(1, KeyEvent.VK_2);


        // Adden
        this.con.add(register);
    }
   
    public void register1(){
        // Elemente
        Date dd = new Date(System.currentTimeMillis());
        this.kateg = new JComboBox(ba.getCategories());
        this.startDate = new JLabel("\tDatum ");
        this.startStamp = new JDateChooser(dd, "dd.MM.yyyy", new JSpinnerDateEditor());
        this.endDate = new JLabel(" und ");
        this.endStamp = new JDateChooser(dd, "dd.MM.yyyy", new JSpinnerDateEditor());
       
        // Panels
        JPanel underTab = new JPanel();
        underTab.setLayout(new BoxLayout(underTab, BoxLayout.X_AXIS));
        underTab.add(this.kateg);
        underTab.add(Box.createRigidArea(new Dimension(5,0)));
        underTab.add(this.startDate);
        underTab.add(this.startStamp);
        underTab.add(this.endDate);
        underTab.add(this.endStamp);
        underTab.add(Box.createRigidArea(new Dimension(5,0)));
        // Suchfeld
        this.searchField = new JTextField("Suche...");
        underTab.add(this.searchField);
        // Register 1
        this.tab1 = new JPanel();
        this.tab1.setLayout(new BorderLayout());
        this.tab1.add(underTab, BorderLayout.NORTH);
        this.tab1.add(this.tabelle, BorderLayout.CENTER);
    }
   
    public void register2(){
        // Tab 2:
        this.showCategories();
        tab2 = new JPanel();
        tab2.setLayout(new BoxLayout(tab2, BoxLayout.Y_AXIS));
        tab2.add(scrollKate);
    }
   
    public void showCategories(){
        this.showCategories(false);
    }
   
    public void showCategories(boolean reset){
        this.showCategories(reset, "");
    }
   
    public void showCategories(boolean reset, String toMark){
        if(reset){
            this.modelKate = null;
        }
        // Tabelle
        String[] columnNames = {
            "#", "Name"
        };
       
        try{
            ms.connect();
            ms.exec("SELECT * FROM franz_category");
            ms.closeConnection();
        }catch(Exception ex){}
       
        String[][] rowData = ms.getResult();
        if(rowData.length > 0){
        // zum Objekt umwandeln
        Object data[][] = new Object[rowData.length][rowData[0].length];
            for(int i = 0; i < rowData.length; i++){
                for(int j = 0; j < rowData[i].length; j++){
                    if(j == 4){
                        data[i][j] = new ImageIcon(rowData[i][j]);
                    }else{
                        data[i][j] = rowData[i][j];
                    }
                }
            }
        }
       
        this.modelKate = new DefaultTableModel(rowData, columnNames);
        if(!reset){
            this.tabKate = new JTable(this.modelKate) {
                @Override
                public boolean isCellEditable(int x, int y) {
                    return false;
                }
            };
           
            this.scrollKate = new JScrollPane(this.tabKate);
            this.tabKate.setSelectionMode( ListSelectionModel.SINGLE_INTERVAL_SELECTION );
            this.tabKate.setColumnSelectionAllowed( false );
            this.tabKate.setRowSelectionAllowed( true );
            this.tabKate.getTableHeader().setReorderingAllowed( false );
            this.tabKate.getTableHeader().setResizingAllowed( true );
        }else{
            this.tabKate.setModel(this.modelKate);
        }
       
        // Setze ID Feldlaenge fest auf 25.
        TableColumn col = this.tabKate.getColumnModel().getColumn( 0 );
        col.setMinWidth( 25 );
        col.setMaxWidth( 25 );
    }

    public void searchInTable(){
        this.searchInTable(this.searchField.getText(), -1);
    }
    public void searchInTable(String sword){
        this.searchInTable(sword, -1);
    }

    public void searchInTable(String sword, int st){
        this.tabvok.requestFocus();

        boolean notfound = true;
        int start = 0;
        if(st == -1){
            start = this.tabvok.getSelectedRow();
            if(start == -1){
                start = 0;
            }else{
                start++;
            }
        }else{
            start = st;
        }


        while(start < this.tabvok.getRowCount() && notfound){
            if(this.tabvok.getModel().getValueAt(start, 2).equals(sword) ||
                    this.tabvok.getModel().getValueAt(start, 3).equals(sword)){
                this.tabvok.getSelectionModel().setSelectionInterval(start, start);
                notfound = false;
            }
            start++;
        }

        if(notfound){
            int t = JOptionPane.showConfirmDialog(this, "Leider konnte \""+sword+"\" nicht gefunden werden.\n"
                    + "Soll die Suche von Vorne begonnen werden?", "Suche: nicht gefunden", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
            if(t == 0){
                this.searchInTable(sword, 0);
            }
        }

    }

    public void buildFilesMenu(){
        this.buildFilesMenu(true);
    }
    public void buildFilesMenu(boolean ws){
        if(ws){
            // Recent Files
            // Position?
            int i = 0;
            boolean run = true;
            while(run && i < this.fileMenu.getItemCount()){
                if(this.fileMenu.getItem(i) == this.recentFiles){
                    run = false;
                }else{
                    i++;
                }
            }

            this.fileMenu.remove(this.recentFiles);
            this.recentFiles.removeAll();
            this.recentFilesItems = new ArrayList<JMenuItem>();
            ArrayList<String> tmple = this.ba.getRecentDatabases();
            for(String item: tmple){
                JMenuItem tmp = new JMenuItem(item);
                this.recentFilesItems.add(tmp);
                this.recentFiles.add(tmp);
            }


            this.fileMenu.add(this.recentFiles, i);
        }

        // Recent Files
        for(int i = 0; i < this.recentFilesItems.size(); i++){
            this.recentFilesItems.get(i).addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent evt){
                    changeDatabase(evt.getActionCommand());
                }
            });
        }

        this.validate();
        this.repaint();
    }

    private void addActions(){
        final VokabelnBackend b = this.ba;

        // Weitersuchen
        this.tabvok.addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent e) {
                //throw new UnsupportedOperationException("Not supported yet.");
            }

            @Override
            public void keyPressed(KeyEvent e) {
                //throw new UnsupportedOperationException("Not supported yet.");
            }

            @Override
            public void keyReleased(KeyEvent e) {
                if(e.getKeyCode() == KeyEvent.VK_F3){
                    searchInTable();
                }
                //throw new UnsupportedOperationException("Not supported yet.");
            }
        });
        // Datumauswahl
        startStamp.getDateEditor().addPropertyChangeListener(new PropertyChangeListener(){
            @Override
            public void propertyChange(PropertyChangeEvent evt){
                if(evt.getPropertyName().equals("date")){
                    SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
                    Date da;
                    try{
                        da = sdf.parse(sdf.format(evt.getNewValue()));
                        System.out.println(""+(da.getTime()/1000));
                        showVokabeln((da.getTime()/1000), (endStamp.getDate().getTime()/1000));
                    }catch(ParseException npe){
                        System.out.println("DEBUG :: Unknown Error in Line 337 in Vokabeln.java :: "+npe);
                    }
                   
                    startStamp.setMaxSelectableDate(endStamp.getDate());
                    startStamp.updateUI();
                    endStamp.setMinSelectableDate(startStamp.getDate());
                    endStamp.updateUI();
                    category = false;
                }
            }
        });
 
        endStamp.getDateEditor().addPropertyChangeListener(new PropertyChangeListener(){
            @Override
            public void propertyChange(PropertyChangeEvent evt){
                if(evt.getPropertyName().equals("date")){
                    SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
                    Date da;
                   
                    try{
                        da = sdf.parse(sdf.format(evt.getNewValue()));
                        System.out.println(""+(da.getTime()/1000));
                        showVokabeln((startStamp.getDate().getTime()/1000), (da.getTime()/1000));
                    }catch(ParseException npe){
                        System.out.println("DEBUG :: Unknown Error in Line 360 in Vokabeln.java :: "+npe);
                    }
                   
                    startStamp.setMaxSelectableDate(endStamp.getDate());
                    startStamp.updateUI();
                    endStamp.setMinSelectableDate(startStamp.getDate());
                    endStamp.updateUI();
                    category = false;
                }
            }
        });

        // Suchfeld
        this.searchField.addFocusListener(new FocusListener() {

            @Override
            public void focusGained(FocusEvent e) {
                searchField.setSelectionStart(0);
                searchField.setSelectionEnd(searchField.toString().length());
            }

            @Override
            public void focusLost(FocusEvent e) {
                //throw new UnsupportedOperationException("Not supported yet.");
            }
        });
        this.searchField.addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent e) {
                //throw new UnsupportedOperationException("Not supported yet.");
            }

            @Override
            public void keyPressed(KeyEvent e) {
                //throw new UnsupportedOperationException("Not supported yet.");
            }

            @Override
            public void keyReleased(KeyEvent e) {
                //throw new UnsupportedOperationException("Not supported yet.");
                // On Enter => Search
                if(e.getKeyCode() == KeyEvent.VK_ENTER){
                    searchInTable();
                }
            }
        });
        // Datumauswahl Ende
        // Drucken
        printItem.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent evt){
                try{
                    TableColumn col = tabvok.getColumnModel().getColumn( 0 );
                    col.setMinWidth( 0 );
                    col.setMaxWidth( 0 );
                    col = null;
                    col = tabvok.getColumnModel().getColumn( 1 );
                    col.setMinWidth( 0 );
                    col.setMaxWidth( 0 );
                    col = null;
                    col = tabvok.getColumnModel().getColumn( 4 );
                    col.setMinWidth(0);
                    col.setMaxWidth(0);
                    String title = "";
                    if(category){
                        title += getSelectedKategorie();
                    }else{
                        Calendar ca1 = Calendar.getInstance();
                        ca1.setTime(startStamp.getDate());
                        Calendar ca2 = Calendar.getInstance();
                        ca2.setTime(endStamp.getDate());
                        title += "Vokabeln von "+ca1.get(Calendar.DATE)+"."+(ca1.get(Calendar.MONTH)+1)+"."+ca1.get(Calendar.YEAR)+" bis "+ca2.get(Calendar.DATE)+"."+(ca2.get(Calendar.MONTH)+1)+"."+ca2.get(Calendar.YEAR);
                    }
                    tabvok.print(JTable.PrintMode.FIT_WIDTH, new MessageFormat(title), new MessageFormat(""));
                }catch(java.awt.print.PrinterException pe){
                    System.out.println("Fehler beim Drucken");
                }
            }
        });

        // Vokabeln anhand Kategorien
        kateg.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent evt){
                System.out.println(kateg.getSelectedItem());
                showVokabeln(""+kateg.getSelectedItem(), true);
            }
        });

        // Neue Vokabel
        newVokabelItem.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent evt){
                newVokForm();
            }
        });

        // Neue Kategorie
        newCategoryItem.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent evt){
                newCategorie();
                showCategories(true);
            }
        });
       
        // ANFANG Trainer MENU
        for(int i = 0; i < this.traineer.length; i++){
            final int tmp = i;
            this.traineer[i].addActionListener(new ActionListener(){
           
                @Override
                public void actionPerformed(ActionEvent evt){
                    // Hole erstmal alle
                    ArrayList<Integer> blub = new ArrayList<Integer>();
                    for(int j = 0; j < tabvok.getRowCount(); j++){
                        blub.add(Integer.parseInt(""+tabvok.getValueAt(j,0)));
                    }

                    showTrainer(b.getRandomVocabulary(blub, tabvok.getRowCount(), tmp));
                }
            });
        }
       
        // ENDE Trainer MENU
        tabvok.addMouseListener( new MouseAdapter(){
            @Override
            public void mouseReleased( MouseEvent me ) {
                if ( me.getButton() == 3 ) {
                    JPopupMenu popmen = new JPopupMenu();
                    JMenuItem menu1 = new JMenuItem("Löschen");
                    JMenuItem menu2 = new JMenuItem("Bearbeiten");
                    popmen.add( menu1 );
                    popmen.add( menu2 );
                    tabvok.changeSelection(tabvok.rowAtPoint(me.getPoint()), tabvok.columnAtPoint(me.getPoint()),false,false);
                    popmen.show( me.getComponent(), me.getX(), me.getY() );
                   
                    menu1.addActionListener(new ActionListener(){
                        @Override
                        public void actionPerformed(ActionEvent evt){
                            ba.removeItem(""+tabvok.getValueAt(tabvok.getSelectedRow(),0));
                            showVokabeln(""+kateg.getSelectedItem(), true);
                        }
                    });
                   
                    menu2.addActionListener(new ActionListener(){
                        @Override
                        public void actionPerformed(ActionEvent evt){
                            newVokForm(true, ""+tabvok.getValueAt(tabvok.getSelectedRow(),0));
                            showVokabeln(""+kateg.getSelectedItem(), true);
                        }
                    });
                }
            }
        } );
       
        tabKate.addMouseListener( new MouseAdapter(){
            @Override
            public void mouseReleased( MouseEvent me ) {
                if ( me.getButton() == 3 ) {
                    JPopupMenu popmen = new JPopupMenu();
                    JMenuItem menu1 = new JMenuItem("Löschen");
                    JMenuItem menu2 = new JMenuItem("Bearbeiten");
                    popmen.add( menu1 );
                    popmen.add( menu2 );
                    tabKate.changeSelection(tabKate.rowAtPoint(me.getPoint()), tabKate.columnAtPoint(me.getPoint()),false,false);
                    popmen.show( me.getComponent(), me.getX(), me.getY() );
                   
                    menu1.addActionListener(new ActionListener(){
                        @Override
                        public void actionPerformed(ActionEvent evt){
                            ba.removeCategory(""+tabKate.getValueAt(tabKate.getSelectedRow(),0));
                            showCategories(true);
                        }
                    });
       
                    menu2.addActionListener(new ActionListener(){
                        @Override
                        public void actionPerformed(ActionEvent evt){
                            String categ = "";
                            do{
                                categ = JOptionPane.showInputDialog(con, "Bitte geben Sie unten einen neuen Kategorie Name ein!", "Kategorie bearbeiten", JOptionPane.QUESTION_MESSAGE);
                            }while(categ != null && !ba.getCategoryID(categ,Integer.parseInt(""+tabKate.getValueAt(tabKate.getSelectedRow(),0))).equals("FALSE"));
                           
                            categ = (categ == null)?"":categ;
         
                            if(!categ.equals("")){
                                ba.saveNewCategory(categ,Integer.parseInt(""+tabKate.getValueAt(tabKate.getSelectedRow(),0)),true);
                            }
         
                            showCategories(true);
                        }
                    });
                }
            }
        } );
       
        exitItem.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent evt){
                dispose();
                System.exit(0);
            }
        });
       
        aboutItem.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent evt){
                credits();
            }
        });
        this.lizenz.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                lizenz();
            }
        });

        this.newDBItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                createNewDatabase();
            }
        });

        loadDBItem.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent evt){
                changeDatabase();
                buildFilesMenu();
            }
        });
       
        resetVokabeln.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent evt){
                try{
                    ms.connect();
                    ms.exec("UPDATE franz_vok SET vok_level = -1 WHERE vok_ID > 0");
                    ms.closeConnection();

                    // Ansicht aktualisieren
                    showVokabeln("Alle",true);
                }catch(Exception ex){}
            }
        });
    }
   
    public boolean exist(int items[], int id){
        boolean exist = false;
        int i = 0;
        while(i < items.length && !exist){
            if(items[i] == id){
                exist = true;
            }
        }
   
        return (id == -1)?true:exist;
    }
   
    public void newCategorie(){
        String categ = "";
        do{
            categ = JOptionPane.showInputDialog(con, "Bitte geben Sie unten den Kategorie Name ein!", "Neue Kategorie", JOptionPane.QUESTION_MESSAGE);
        }while(categ != null && !ba.getCategoryID(categ).equals("FALSE"));
        categ = (categ == null)?"":categ;
       
        if(!categ.equals("")){
            this.ba.saveNewCategory(categ);
            this.showCategories(true);
        }
    }
   
    public void credits(){
        JOptionPane.showMessageDialog(con, "Autor: Lukas Schreiner (Mono, LukSch)\n" +
                "Some rights reserved.\n" +
                "Copyright 2010 by Lukas Schreiner\n" +
                "http://lschreiner.de\n\n" +
                "Danke geht an:\n" +
                "Kai Toedter (Kalenderfunktion)\n" +
                "Sebastian Riedel [DaBASCHT] (INI Datei Manager)\n" +
                "David Crawshaw (SQLite JDBC)\n" +
                "Rich Midwinter (Google Übersetzungsanbindung)", "Credits...", JOptionPane.INFORMATION_MESSAGE);
    }
    public void lizenz(){
        final JDialog lz = new JDialog(this, "Lizenz", true);
        lz.setLayout(new BoxLayout(lz.getContentPane(), BoxLayout.Y_AXIS));
        lz.setPreferredSize(new Dimension(550,500));
        lz.setSize(550,500);
        lz.add(new JLabel("Lizenzbestimmungen für "+this.title));
        // Lizenz
        JTextPane jtp = new JTextPane();
        jtp.setAutoscrolls(true);
        jtp.setEditable(false);
        try{
            jtp.setPage("file://"+System.getProperty("user.dir")+File.separator+"lizenz.html");
        }catch(Exception ex){ System.err.println(ex.getMessage()); }
       
        JScrollPane jsp = new JScrollPane(jtp);
        jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        jsp.setPreferredSize(new Dimension(540, 450));
        jsp.setMinimumSize(new Dimension(300,300));

        lz.add(jsp);
        JButton jb = new JButton("OK");
        jb.setSize(80, 20);
        jb.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                lz.setVisible(false);
                lz.dispose();
            }
        });
        lz.add(jb);
        lz.setVisible(true);
    }
   
    public void newVokForm(){
        this.newVokForm(false, "");
    }
   
    public String getSelectedKategorie(){
        return ""+kateg.getSelectedItem();
    }
   
    public void newVokForm(final boolean edit, String id){
        // here are declarations for the controls you created
        JButton save = new JButton("Speichern");
        JLabel labCate = new JLabel("Kategorie");
        final JComboBox cate = new JComboBox(ba.getCategories(true));
        JLabel word = new JLabel("Wort/Satz");
        JButton cancel = new JButton("Abbrechen");
        final JTextField fieldWord = new JTextField();
        final JTextField fieldTransWord = new JTextField();
        JButton transWord = new JButton("Übersetzung",new ImageIcon("icons/asterisk_orange.png"));
        JLabel timeLab = new JLabel("Datum");
        final JDateChooser timestamp = new JDateChooser();

        transWord.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                String translation = (String)JOptionPane.showInputDialog(null, "Bitte wählen Sie die Zielsprache aus:", "Zielsprache",
                    JOptionPane.QUESTION_MESSAGE, null, new Object[] { "de",
                        "en", "fr", "es", "it" }, "fr");
                if(translation != null){
                    fieldTransWord.setText(ba.getTranslation(fieldWord.getText(), "", translation));
                }
            }
        });

        // Daten fuellen
        final String[] data = (!edit?new String[0]:ba.getVokabel(id));
        if(edit){
            // Daten holen
            fieldWord.setText(data[2]);
            fieldTransWord.setText(data[3]);
            timestamp.setDate(new Date(Long.parseLong(data[1])*1000));
            cate.setSelectedItem(data[5]);
        }

        final JDialog newVokWin;
        Container vokCon;
 
        newVokWin = new JDialog();
        newVokWin.setModalityType(JDialog.ModalityType.APPLICATION_MODAL);
        vokCon = newVokWin.getContentPane();
        vokCon.setLayout(new GridLayout(/*3*/ 0, 2, 6, 3));
        newVokWin.setTitle("Neue Vokabel eintragen");
        newVokWin.setSize(600,300);
        newVokWin.setLocation(300,300);

        // Tasten
        cancel.setMnemonic('A');
        save.setMnemonic('S');

        // here we add the controls to the container.
        vokCon.add(labCate, "labCate");
        vokCon.add(cate, "cate");
        vokCon.add(word, "word");
        vokCon.add(fieldWord, "fieldWord");
        vokCon.add(transWord, "transWord");
        vokCon.add(fieldTransWord, "fieldTransWord");
        vokCon.add(timeLab, "timeLab");
        vokCon.add(timestamp, "timestamp");
        vokCon.add(save, "save");
        vokCon.add(cancel, "cancel");
 
        // Aktionen
        cancel.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent evt){
                newVokWin.dispose();
            }
        });
       
        save.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent evt){
                if(ba.checkInput(fieldWord.getText(),fieldTransWord.getText())){
                    if(!edit){
                        ba.saveInput(""+cate.getSelectedItem(),fieldWord.getText(),fieldTransWord.getText(),timestamp.getDate());
                    }else{
                        ba.saveInput(""+cate.getSelectedItem(),fieldWord.getText(),fieldTransWord.getText(),timestamp.getDate(), data[0], true);
                    }
                    newVokWin.dispose();
                    if(category){
                        showVokabeln(categoryName, true);
                    }else{
                        showVokabeln((startStamp.getDate().getTime()/1000),(endStamp.getDate().getTime()/1000));
                    }
                    //showVokabeln(""+cate.getSelectedItem(), true);
                }else{
                    JOptionPane.showConfirmDialog( con, "Sie müssen alle Eingabefelder ausfüllen!", "Fehler", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE );
                }
            }
        });

        // Make it later....
        newVokWin.pack();
        newVokWin.setVisible(true);
    }
   
    public void showVokabeln(long timeStart, long timeEnd){
        showVokabeln("Alle", timeStart, timeEnd, true);
    }
   
    public void showVokabeln(String what, boolean reset){
        showVokabeln(what, 0, 0, reset);
        category = true;
    }
   
    public void showVokabeln(String what, long timeStart, long timeEnd, boolean reset){
        model = null;
        if(timeStart > 0){
            category = false;
        }else{
            category = true;
            categoryName = what;
        }
       
        String[] columnNames = {
            "#", "Datum", "Wort/Satz", "Übersetzung","Status"
        };
       
        String[][] rowData;
        if(timeStart == 0){
            rowData = ba.getVokabeln(what);
        }else{
            rowData = ba.getVokabeln(what, timeStart, timeEnd+138000);
        }
       
        // zum Objekt umwandeln
        Object data[][] = new Object[rowData.length][(rowData.length > 0?rowData[0].length:0)];
        for(int i = 0; i < rowData.length; i++){
            for(int j = 0; j < rowData[i].length; j++){
                if(j == 4){
                    data[i][j] = new ImageIcon(rowData[i][j]);
                }else{
                    data[i][j] = rowData[i][j];
                }
            }
        }
           
        this.model = new DefaultTableModel(data, columnNames);
        if(!reset){
            tabvok = new JTable(model) {
                @Override
                public boolean isCellEditable(int x, int y) {
                    return false;
                }
            };
            tabvok.getColumn("Status").setCellRenderer(
                // Standard-Renderer erweitern
                new DefaultTableCellRenderer() {
                    @Override
                    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,boolean hasFocus, int row, int column) {
                        // Label der Oberklasse erweitern
                        JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                       
                        // Lediglich Text und Grafik anpassen
                        if (value != null) {
                            label.setText("");
                            label.setIcon((ImageIcon) value);
                        }
                   
                        return label;
                    }
                }
            );
               
            tabelle = new JScrollPane(tabvok);
            tabvok.setSelectionMode( ListSelectionModel.SINGLE_INTERVAL_SELECTION );
            tabvok.setColumnSelectionAllowed( false );
            tabvok.setRowSelectionAllowed( true );
            tabvok.getTableHeader().setReorderingAllowed( false );
            tabvok.getTableHeader().setResizingAllowed( true );
        }else{
            tabvok.setModel(model);
      tabvok.getColumn("Status").setCellRenderer(
                // Standard-Renderer erweitern
                new DefaultTableCellRenderer() {
                    @Override
                    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,boolean hasFocus, int row, int column) {
                        // Label der Oberklasse erweitern
                        JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                       
                        // Lediglich Text und Grafik anpassen
                        if (value != null) {
                            label.setText("");
                            label.setIcon((ImageIcon) value);
                        }
                   
                        return label;
                    }
                }
            );
        }
        tabvok.setAutoCreateRowSorter(true);
       
        TableColumn col = tabvok.getColumnModel().getColumn( 0 );
        col.setMinWidth( 0 );
        col.setMaxWidth( 0 );
        col = null;
        col = tabvok.getColumnModel().getColumn( 1 );
        col.setMinWidth(75);
        col.setMaxWidth(75);
  col = null;
        col = tabvok.getColumnModel().getColumn( 4 );
        col.setMinWidth(50);
        col.setMaxWidth(50);
    }

    public void createNewDatabase(){
        JFileChooser db = null; // FileChooser
        FileNameExtensionFilter filter = new FileNameExtensionFilter(
        "SQLite Database (db, sqlite, sqlite3)", "db", "sqlite", "sqlite3"); // Filter
        File def = null; // Default
        File file = null; // Later
        def = new File(System.getProperty("user.home")+File.separator+".vokabeln"+File.separator);
        if(def.exists()){
            db = new JFileChooser(def); // Standard Pfad?
        }else{
            db = new JFileChooser();
        }
        db.setFileFilter(filter);
        int state = db.showSaveDialog(this);
        if (state == JFileChooser.APPROVE_OPTION){
            file = db.getSelectedFile();
            String filen = file.getAbsolutePath();
            if(!filen.endsWith("db") && !filen.endsWith("sqlite") && !filen.endsWith("sqlite3")){
                filen += ".db";
            }
            // Now copy it!
            if(this.ba.copyfile("vokabeln.db", filen)){
                // Open the new Database
                this.changeDatabase(filen, true);
                this.buildFilesMenu(true);
            }
        }
    }

    public void changeDatabase(){
        this.changeDatabase("", false);
    }
    public void changeDatabase(String filename){
        this.changeDatabase(filename, false);
    }
    public void changeDatabase(String filename, boolean saveRecent){
        File file = null;
        if(filename.equals("")){
            JFileChooser db = new JFileChooser();
            FileNameExtensionFilter filter = new FileNameExtensionFilter(
            "SQLite Database (db, sqlite, sqlite3)", "db", "sqlite", "sqlite3"); // Filter
            db.setFileFilter(filter);
            int state = db.showOpenDialog(this);
            if ( state == JFileChooser.APPROVE_OPTION ){
                file = db.getSelectedFile();
                this.ba.saveRecentDatabases(file.getAbsolutePath());
            }
        }else{
            file = new File(filename);
            if(saveRecent){
                this.ba.saveRecentDatabases(file.getAbsolutePath());
            }
        }
        if(file != null){
            ms.setDatabase(file.getAbsolutePath());
            ms.mergeAll();
        }

        // Neuladen
        this.setTitle(this.title+" : "+this.ms.getDatabase());
        showVokabeln("Alle", true);
        showCategories(true);
    }
   
    public void showTrainer(int[] ids){
        String info[][] = new String[ids.length][7];
        String idString = "";
        boolean laufen = true;
        // Hole Informationen
        for(int id :ids){
            idString += id+",";
        }
        idString = idString.substring(0,idString.length()-1);
        try{
            ms.connect();
            ms.exec("SELECT * FROM franz_vok WHERE vok_ID IN("+idString+") AND vok_level < 5 OR( vok_level >= 5 AND vok_trainTime < "+(System.currentTimeMillis() / 1000-86400)+")");
            ms.closeConnection();
            info = ms.getResult();
        }catch(Exception ex){}
       
        ArrayList<Integer> skills = new ArrayList<Integer>(info.length);
        ArrayList<String> eingetippt = new ArrayList<String>(info.length);
        int i = 0;
        this.setVisible(false);

        while(i < info.length && laufen){
            String[] ergebnis = this.queryVokabel(info[i][2],info[i][1],(i+1),info.length);
            skills.add(i, Integer.parseInt(ergebnis[0]));
            eingetippt.add(i, ergebnis[1]);
           
            if(skills.get(i) == -1){
                laufen = false;
            }
            i++;
        }

        if(info.length <= 0){
            JOptionPane.showMessageDialog(this, "Herzlichen Glückwunsch,\nSie können bereits alle Vokabeln.\n\nWeiter so!", "Keine ungeübten Vokabeln", JOptionPane.INFORMATION_MESSAGE);
        }else{
            this.queryResult(skills,eingetippt,info,(laufen?false:true));
        }
        this.setVisible(true);
    }

    /**
     * Fragt eine Vokabel ab
     * @param String toTranslate
     * @param String translation
     * @param int p
     * @param int e
     * @return String[] Ergebnis der Abfrage
     */
    public String[] queryVokabel(final String toTranslate, final String translation, int p, int e){
        final String result[] = new String[2];
        final VokabelnBackend vb = this.ba;
        result[0] = "-1";
        JDialog qv = new JDialog(this, "[TEST] Vokabel "+p+"/"+e, true);
        Container cp = qv.getContentPane();
        qv.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        qv.setAlwaysOnTop(true);
        qv.setLayout(new GridLayout(3,2,6,3));
        qv.setSize(400,200);
        qv.setResizable(false);
        qv.setIconImage(image.getImage())
 
        // Elemente
        JLabel msg0 = new JLabel("<html><body><b>Wort:</b></body></html>");
        JLabel wort = new JLabel(toTranslate);
        JLabel msg1 = new JLabel("<html><body><b>Deine Antwort:</b></body></html>");
        final JTextField trans = new JTextField();
        JLabel loesung = new JLabel(translation);
        JButton cancel = new JButton("Abbrechen");
        JButton next = new JButton("Weiter >>>");
 
        cp.add(msg0);
        cp.add(wort);
        cp.add(msg1);
        cp.add(trans);
        cp.add(cancel);
        cp.add(next);
 
        trans.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                int key = e.getKeyCode();
                if (key == KeyEvent.VK_ENTER) {
                    // Algorithmus zur Ueberpruefung auf VokabelnBackend ausgelagert!
                    result[0] = Integer.toString(ba.validateTrainerInput(translation, trans.getText()));
                    System.err.println(result[0]);
                    result[1] = trans.getText();
                    dispose();
                }
           }
        });

        cancel.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent evt){
                dispose();
            }
        });
 
        next.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent evt){
                // Algorithmus zur Ueberpruefung auf VokabelnBackend ausgelagert!
                result[0] = Integer.toString(ba.validateTrainerInput(translation, trans.getText()));
                System.err.println(result[0]);
                result[1] = trans.getText();
                dispose();
            }
        });

        qv.setVisible(true);
        qv.pack();
        qv.toFront();

        return result;
    }

    /**
     * Traegt Vokabelabfrageergebnisse in die Datenbank ein.
     * @param ArrayList<Integer> skills
     * @param ArrayList<String> userdata
     * @param String[][] data
     * @param boolean broken
     */
    public void queryResult(ArrayList<Integer> skills, ArrayList<String> userdata, String[][] data, boolean broken){
        // trainLevel anpassen
        int i = 0;
        int richtig = 0;
        int halbrichtig = 0;
        boolean valid = true;
        String allEnd[][];
       
        // Datenbank updaten
        while(i < data.length && valid){
            if(skills.get(i) != -1){       
                try{
                    int level = 0;
                    if(skills.get(i) == 2){
                        level = 1;
                        richtig++;
                    }else if(skills.get(i) == 1){
                        halbrichtig++;
                    } else if (skills.get(i) == 0 && Integer.parseInt(data[i][5]) > 0) {
                        level = -1;
                    }

                    ms.connect();
                    ms.exec("UPDATE franz_vok SET vok_level = "+(Integer.parseInt(data[i][5])+level)+", vok_trainTime = "+(System.currentTimeMillis() / 1000)+" WHERE vok_ID = "+data[i][0]);
                    ms.closeConnection();
                }catch(Exception ex){}
                i++;
            }else{
                valid = false;
            }
        }
 
        // Ende darstellen:
        allEnd = new String[i][4];
        String msgHead = "<html><body><b style=font-size:16px;>Ihr Endstand: </b></body></html>";
        int j = 0;
        for(j = 0; j < i; j++){
            allEnd[j][0] = data[j][2];
            allEnd[j][1] = data[j][1];
            allEnd[j][2] = userdata.get(j);
            allEnd[j][3] = (skills.get(j) == 2?"Ja":(skills.get(j) == 1?"Fast":"Nein"));
        }
       
        System.err.println("J: "+j+"\nRichtig: "+(richtig+(halbrichtig/2)));
        double blub = (j != 0) ? ((double)richtig/j)*100 : 0;
        System.err.println("Percent: "+blub+"\nOhne Variable: "+((j != 0) ? ((richtig/j)*100) : 0));
        String msgFoot = "<html><body><b>Prozente:</b> ";
        msgFoot += blub;
        msgFoot += "%<br>";
        blub = getNPunkteByPercent((int)blub);
        System.err.println("NPunkte: "+(int)blub);
        msgFoot += "<b>Die Note:</b> ";
        msgFoot += (int)blub;
        msgFoot += "</body></html>";

        String column[] = {"Wort","Lösung","Eingetippt","Richtig?"};
        // Dialog anzeigen:
        JLabel message = new JLabel(msgHead);
        JLabel messageFoot = new JLabel(msgFoot);
        DefaultTableModel dtm = new DefaultTableModel(allEnd, column){
            protected void createDefaultRenderers(){
                new DefaultTableCellRenderer(){
                    @Override
                    public void setValue(Object value){
                        if(value.toString().substring(0,5).equals("icons/")){
                            ImageIcon img = new ImageIcon(value.toString());
                            setIcon((Icon)img.getImage());
                        }else{
                            setText(value.toString());
                        }
                    }
                };
            };
        };
       
        JTable msg = new JTable(dtm){
            @Override
            public boolean isCellEditable(int x, int y) {
                return false;
            }
        };
     
        msg.setSelectionMode( ListSelectionModel.SINGLE_INTERVAL_SELECTION );
        msg.setColumnSelectionAllowed( false );
        msg.setRowSelectionAllowed( true );
        msg.getTableHeader().setReorderingAllowed( false );
        msg.getTableHeader().setResizingAllowed( true );
        JScrollPane jsp = new JScrollPane(msg);
        JButton finish = new JButton("<<< OK >>>");
        JDialog qv = new JDialog(this, "Vokabeltest Ergebnis", true);
        Container cp = qv.getContentPane();
        qv.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        qv.setAlwaysOnTop(true);
        qv.setLayout(new GridLayout(0,1));
        qv.setSize(400,400);
        qv.setResizable(true);
        qv.setIconImage(image.getImage());
 
        finish.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent evt){
                dispose();
            }
        });
 
        cp.add(message);
        cp.add(jsp);
        cp.add(messageFoot);
        cp.add(finish);
        qv.setVisible(true);
        qv.pack();
        qv.toFront();
    }
   
    public int getNPunkteByPercent(int percent){
        if(percent >= 96){
            return 15;
        }else if(percent >= 91){
            return 14;
        }else if(percent >= 86){
            return 13;
        }else if(percent >= 81){
            return 12;
        }else if(percent >= 76){
            return 11;
        }else if(percent >= 71){
            return 10;
        }else if(percent >= 66){
            return 9;
        }else if(percent >= 61){
            return 8;
        }else if(percent >= 56){
            return 7;
        }else if(percent >= 51){
            return 6;
        }else if(percent >= 46){
            return 5;
        }else if(percent >= 41){
            return 4;
        }else if(percent >= 34){
            return 3;
        }else if(percent >= 27){
            return 2;
        }else if(percent >= 20){
            return 1;
        }else{
            return 0;
        }
    }
   
    // MAIN METHODE
    public static void main(String args[]){
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Vokabeln().setVisible(true);
            }
        });
    }
    // Ende Methoden
}
TOP

Related Classes of Vokabeln

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.