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