package routine.view.gui;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.text.ParseException;
import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import org.apache.log4j.Logger;
import routine.model.RoutineCollection;
import routine.model.RunParams;
import util.awt.ComponentSizeHandler;
import util.serial.ObjectStreamUtil;
import util.settings.Settings;
import com.jeta.forms.components.panel.FormPanel;
import com.jeta.forms.gui.common.FormException;
/**
* Startar en gui som l�ter en v�lja att
* tr�na glosor, skriva in glosor och l�sa en text
* samtidigt som man skriver in glosor.
*
* Plus administrativa handlingar f�r olika databaser.
*
* @author igor piltz
*
*/
public class MainGUI extends JFrame {
private static org.apache.log4j.Logger log = Logger.getLogger(MainGUI.class);
private RoutineCollection routines = null;
private Settings settings;
/**
*
*/
private static final long serialVersionUID = -3858819775827952944L;
public MainGUI() throws FormException {
this.setDefaultCloseOperation ( JFrame. DO_NOTHING_ON_CLOSE );
WindowListener windowListener = new WindowAdapter() {
// anonymous WindowAdapter class
public void windowClosing (WindowEvent w) {
setVisible(false);
try {
ObjectStreamUtil.writeObject(settings.get("routineFile", null), routines);
} catch (IOException ex) {
log.error(ex);
JOptionPane.showMessageDialog(null,
"Unable to write data to disk.",
"File Error",
JOptionPane.ERROR_MESSAGE);
}
if (settings != null)
settings.save();
dispose();
System.exit(0);
}
};// end anonymous class
this.addWindowListener( windowListener );
JMenuItem createDatabase = new JMenuItem("Create");
createDatabase.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
createDatabaseHandler();
}
});
JMenuItem openDatabase = new JMenuItem("Open");
openDatabase.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
openDatabaseHandler();
}
});
JMenuItem closeDatabase = new JMenuItem("Close");
closeDatabase.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
closeDatabaseHandler();
}
});
JMenuItem users = new JMenuItem("Administrate");
users.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
administrateUserHandler();
}
});
JMenuItem about = new JMenuItem("About");
about.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
aboutHandler();
}
});
// Menyn
JMenuBar bar = new JMenuBar();
JMenu dbMenu = new JMenu("Database");
JMenu userMenu = new JMenu("User");
JMenu trainMenu = new JMenu("Train");
JMenu helpMenu = new JMenu("Help");
bar.add(dbMenu);
bar.add(userMenu);
bar.add(trainMenu);
bar.add(helpMenu);
dbMenu.add(openDatabase);
dbMenu.add(closeDatabase);
dbMenu.add(createDatabase);
userMenu.add(users);
helpMenu.add(about);
setJMenuBar(bar);
settings = new Settings("config.ini", true);
Settings.set(settings);
String routineFile = settings.get("routineFile", null);
try {
if (routineFile != null)
routines = (RoutineCollection)ObjectStreamUtil.readObject(routineFile);
else {
routines = new RoutineCollection();
routines.addRunParams(new RunParams());
ObjectStreamUtil.writeObject("data.xbl", routines);
settings.set("routineFile", "data.xbl");
}
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
InputStream resource = (InputStream)this.getClass().getResourceAsStream("/MainForm.jfrm");
System.out.println("Resource: " + resource);
FormPanel panel = new FormPanel( resource );
getContentPane().add( panel );
// Configure the GUI-components
((RoutinesTable)panel.getTable("routinesTable")).setRoutines(routines);
updateTitle();
}
protected void aboutHandler() {
JOptionPane.showMessageDialog(this, "Talking Routine 0.1");
}
private void createDatabaseHandler() {
final JFileChooser fc = new JFileChooser(".");
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = fc.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
int option = JOptionPane.showConfirmDialog(this, "This will delete and recreate " + file + ". Confirm that it is empty.");
if (JOptionPane.OK_OPTION == option) {
file.delete();
String database = file.getAbsolutePath();
/*
try {
trainer = DerbyLanguageTrainer.getInstance();
trainer.create(database);
} catch (SQLException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(this, "Unable to create database: " + e.getMessage());
return;
}
*/
updateTitle();
JOptionPane.showMessageDialog(this, "Datbase created: " + database);
settings.set("database", file.getAbsolutePath());
}
}
}
private void updateTitle() {
if (routines != null)
setTitle("VokabProgam: " + "@" + "Change ME");
else setTitle("Talking Routine: No file");
}
private void openDatabaseHandler() {
final JFileChooser fc = new JFileChooser(".");
fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = fc.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
/*
try {
trainer = DerbyLanguageTrainer.getInstance(file.getAbsolutePath());
} catch (SQLException e) {
e.printStackTrace();
log.error(e);
JOptionPane.showMessageDialog(this, "Unable to open database: " + file + ". " + e.getMessage());
return;
}
*/
settings.set("database", file.getAbsolutePath());
}
updateTitle();
}
private void closeDatabaseHandler() {
/*
if (trainer != null) {
trainer.close();
trainer = null;
setTitle("VokabProgram: No database");
}
*/
}
private void exportTextHandler() {
final JFileChooser fc = new JFileChooser(".");
fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
fc.showOpenDialog(this);
}
private void administrateUserHandler() {
/*
if (trainer == null) {
JOptionPane.showMessageDialog(this, "No database set.");
return;
}
UserFrame userFrame = new UserFrame(this, trainer);
userFrame.pack();
userFrame.setVisible(true);
updateTitle();
*/
}
private void trainButtonHandler() {
if (!readyToRun())
return;
/*
try {
new LanguageTrainerGUI(trainer);
} catch (Exception e) {
e.printStackTrace();
log.error(e);
JOptionPane.showMessageDialog(this, "Unable to open the trainer: " + e);
}
*/
}
private void writeButtonHandler() {
/*
if (!readyToRun())
return;
try {
new VocabInsertGUI(trainer);
} catch (Exception e) {
e.printStackTrace();
log.error(e);
JOptionPane.showMessageDialog(this, "Unable to open the add vocabulary interface: " + e);
}
*/
}
private void readButtonHandler() {
if (!readyToRun())
return;
/*
ReadFileGUI gui;
gui = new ReadFileGUI(trainer);
try {
ComponentSizeHandler.attach(gui, "readmain.siz", new Dimension(600, 400), true);
} catch (FileNotFoundException e) {
log.error(e);
} catch (IOException e) {
log.error(e);
}
gui.setVisible( true );
*/
}
private boolean readyToRun() {
/*
if (trainer == null) {
JOptionPane.showMessageDialog(this, "No database opened or created");
return false;
}
if (trainer.getDatabase() == null) {
JOptionPane.showMessageDialog(this, "Database not bound");
return false;
}
if (trainer.getCurrentUser() == null) {
JOptionPane.showMessageDialog(this, "User not selected");
return false;
}
*/
return true;
}
public static void main(String args[]) throws FileNotFoundException, IOException, FormException {
try {
UIManager.setLookAndFeel(new com.jgoodies.looks.plastic.PlasticXPLookAndFeel());
} catch (Exception e) {
log.error(e);
}
MainGUI main = new MainGUI();
// set the size and location of this frame
ComponentSizeHandler.attach(main, "MainGUI.size", new Dimension(600, 600), true);
main.setLocation( 200, 100 );
main.setVisible( true );
}
}