package gederedem.ihm;
import gederedem.Gederedem;
import gederedem.data.DataSet;
import gederedem.data.Job;
import java.awt.Component;
import java.awt.HeadlessException;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.text.DateFormat;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
/**
* Main GUI class, display a list of offers and details of selected offer.
*
* @author chrelaix
*
*/
public class MainWindow extends JFrame implements WindowListener {
public DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
// TODO : transform to private and create getters to handle it
public JTable jobTable;
//TODO : virtualise all the menus
private JMenuBar menuBar = new JMenuBar();
private JMenu fileMenu;
private JMenu editMenu;
private JMenuItem openMenu;
private JMenuItem exitMenu;
private JMenuItem newRowMenu;
// TODO : create menuIcons to handle standards functions
/**
* UID
*/
private static final long serialVersionUID = 8085282185758428962L;
/**
* The parent which created the GUI.
*/
private Gederedem dad;
/**
* Main display.
* @throws HeadlessException
*/
public MainWindow(Gederedem builder) throws HeadlessException {
super();
dad = builder;
// Initialization
build();
dad.log.exiting(this.getClass().getName(), "MainWindow Constructor");
}
/**
* Initialization of the displayed window.
*/
private void build() {
dad.log.entering(this.getClass().getName(), "build()");
// Give a name to the app
setTitle(dad.labels.getString("labels.info.main.title") + " - " + Gederedem.VERSION);
setResizable(true);
// We want to exit with the "x" icon
addWindowListener(this);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
// Init menus
//--------------------------
// TODO : edit menus
fileMenu = new JMenu(dad.labels.getString("labels.action.file"));
editMenu = new JMenu(dad.labels.getString("labels.action.edit"));
openMenu = new JMenuItem(dad.labels.getString("labels.action.openProfile"));
exitMenu = new JMenuItem(dad.labels.getString("labels.action.exit"));
newRowMenu = new JMenuItem(dad.labels.getString("labels.action.addJob"));
// this.fileMenu.add(openMenu);
this.fileMenu.add(exitMenu);
exitMenu.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
exit();
}
});
this.editMenu.add(newRowMenu);
newRowMenu.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
createRow();
}
});
this.menuBar.add(fileMenu);
this.menuBar.add(editMenu);
//-------------------------
this.setJMenuBar(menuBar);
// TODO : set IconBar
//--------------------------
// TODO : set Table
//--------------------------
/**
* The table columns titles to display in main gui
*/
String[] tableTitles = {dad.labels.getString("labels.info.data.id"),
dad.labels.getString("labels.info.data.title"),
dad.labels.getString("labels.info.data.enterprise"),
dad.labels.getString("labels.info.data.publication"),
dad.labels.getString("labels.action.delete")};
dad.log.allDebug("logs.gui.MainWindow.addTable");
JobTableModel tableModel = new JobTableModel(tableTitles);
jobTable = new JTable(tableModel);
// TODO : set Delete button
jobTable.getColumn(dad.labels.getString("labels.action.delete")).setCellRenderer(new ButtonRenderer());
jobTable.getColumn(dad.labels.getString("labels.action.delete")).setCellEditor(new ButtonEditor(new JCheckBox()));
/*
* TODO�: fix contextual menu
jobTable.getTableHeader().addMouseListener(new MouseAdapter(){
public void mouseReleased(MouseEvent event){
if(event.getButton() == event.BUTTON3){
// Test if we are into the table
if (jobTable.columnAtPoint(new Point(event.getX(), event.getY())) != -1) {
//add an item
JMenuItem add = new JMenuItem("Add a row");
add.addActionListener(new AddListener());
//Delete an item
JMenuItem erase = new JMenuItem("delete the line");
erase.addActionListener(new EraseListener(new Point(event.getX(), event.getY())));
//Add to the contextual menu
JPopupMenu menu = new JPopupMenu();
menu.add(add);
menu.add(erase);
menu.show(jobTable, event.getX(), event.getY());
}
}
}
});
*/
//Add the table to a contentPane in a scroll
//If not, the title will not be visible !
this.getContentPane().add(new JScrollPane(jobTable));
// Display the gui
this.setVisible(true);
dad.log.exiting(this.getClass().getName(), "build()");
}
@Override
public void windowActivated(WindowEvent arg0) {
dad.log.entering(this.getClass().getName(), "windowActivated(" + arg0.toString() + ")");
}
@Override
public void windowClosed(WindowEvent arg0) {
dad.log.entering(this.getClass().getName(), "windowClosed(" + arg0.toString() + ")");
}
@Override
public void windowClosing(WindowEvent arg0) {
dad.log.entering(this.getClass().getName(), "windowClosing(" + arg0.toString() + ")");
exit();
}
@Override
public void windowDeactivated(WindowEvent arg0) {
dad.log.entering(this.getClass().getName(), "windowDeactivated(" + arg0.toString() + ")");
}
@Override
public void windowDeiconified(WindowEvent arg0) {
dad.log.entering(this.getClass().getName(), "windowDeiconified(" + arg0.toString() + ")");
}
@Override
public void windowIconified(WindowEvent arg0) {
dad.log.entering(this.getClass().getName(), "windowIconified(" + arg0.toString() + ")");
}
@Override
public void windowOpened(WindowEvent arg0) {
dad.log.entering(this.getClass().getName(), "windowOpened(" + arg0.toString() + ")");
}
public void loadTable(DataSet ds) {
dad.log.entering(this.getClass().getName(), "loadTable(DataSet)");
int nextId = 0;
// TODO : test the empty indexes
int maxSize = ds.jobArray.size();
String msg = MessageFormat.format(dad.labels.getString("logs.gui.MainWindow.nbRowTable"),
maxSize);
dad.log.info(msg);
Job tmpJob;
Object[] donnee;
while (nextId < maxSize) {
tmpJob = ds.jobArray.get(nextId);
// TODO use addRowInDisplay
donnee = new Object[]{Integer.valueOf(tmpJob.getId()).toString(),
tmpJob.getTitle(),
tmpJob.getEnterprise(),
df.format(tmpJob.getPublication()),
dad.labels.getString("labels.action.delete")};
msg = MessageFormat.format(dad.labels.getString("logs.gui.MainWindow.displayedDatas"),
tmpJob.getId(),
tmpJob.getTitle(),
tmpJob.getEnterprise(),
df.format(tmpJob.getPublication())
);
dad.log.debug(msg);
((JobTableModel)jobTable.getModel()).addRow(donnee);
nextId++;
}
dad.log.exiting(this.getClass().getName(), "loadTable()");
}
/*
public ArrayList<Job> getJobTable() {
// TODO change the log
dad.log.debug("Get the displayed data");
ArrayList<Job> jobArray = new ArrayList<Job>();
int nextId = 0;
int sizeTable = jobTable.getRowCount();
// TODO : test the empty indexes
Job tmpJob;
Object[] donnee;
while (nextId < sizeTable) {
// TODO change the log
dad.log.debug("Processing line " + nextId);
*/
/* // TODO : test the column numbers
// TODO : made the location got from JobTableModel class
int nextCol = 1;
int nbCol = jobTable.getColumnCount();
while (nextCol < (nbCol +1)) {
String colName = jobTable.getColumnName(nbCol);
if (colName == Job.ID) {
}
} */
// TODO : made method in JobTableModel to get Value with column name and cast type in this case
/*
tmpJob = new Job(Integer.parseInt((String) jobTable.getValueAt(nextId, 1)),
(String)jobTable.getValueAt(nextId, 2),
(String)jobTable.getValueAt(nextId, 3),
"",
(Date)jobTable.getValueAt(nextId, 4),
(Date)jobTable.getValueAt(nextId, 5),
"", "");
nextId++;
}
}
*/
private void createRow() {
dad.log.entering(this.getClass().getName(), "createRow()");
// We do not need to add 1 because array of job begin to 0
int maxId = jobTable.getRowCount();
int tmpId = 0;
int selectedId = 0;
boolean indexTaken = true;
String rowId;
// seek first free Id
while (indexTaken == true) {
indexTaken = false;
tmpId = 0;
while (tmpId < maxId) {
// TODO�: change column definition
rowId = (String)jobTable.getValueAt(tmpId, 0);
if (selectedId == Integer.parseInt(rowId)) {
// Index already taken, we increment to find first free index
selectedId++;
indexTaken = true;
break;
}
tmpId++;
}
}
String msg = MessageFormat.format(dad.labels.getString("logs.gui.MainWindow.createRow"),
selectedId);
dad.log.debug(msg);
Job newJob = new Job(selectedId);
dad.addJobInProfile(newJob);
addRowInDisplay(newJob);
dad.log.exiting(this.getClass().getName(), "createRow()");
}
private void deleteRow(int index) {
dad.log.entering(this.getClass().getName(), "deleteRow(" + Integer.toString(index) + ")");
// Display a confirmation message
int option = JOptionPane.showConfirmDialog(null,
MessageFormat.format(dad.labels.getString("labels.info.deleteRow.msg"), Integer.toString(index)),
dad.labels.getString("labels.info.deleteRow.title"),
JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if(option == JOptionPane.OK_OPTION) {
((JobTableModel)jobTable.getModel()).removeRow(index);
dad.removeJobInProfile(index);
}
dad.log.exiting(this.getClass().getName(), "deleteRow()");
}
private void addRowInDisplay(Job jobToDisplay) {
dad.log.entering(this.getClass().getName(), "addRowInDisplay(" + jobToDisplay.getTitle() + ")");
// TODO mutualize with loadTable method
Object[] donnee = new Object[]{Integer.valueOf(jobToDisplay.getId()).toString(),
jobToDisplay.getTitle(),
jobToDisplay.getEnterprise(),
df.format(jobToDisplay.getPublication()),
dad.labels.getString("labels.action.delete")};
((JobTableModel)jobTable.getModel()).addRow(donnee);
dad.log.exiting(this.getClass().getName(), "addRowInDisplay()");
}
/**
* Exit and close the display.
*/
public void exit() {
dad.log.entering(this.getClass().getName(), "exit()");
dad.ToDoBeforeExit();
dad.log.exiting(this.getClass().getName(), "exit()");
}
/**
* Class to handle the line deleting
* @author CHerby, modified by chrelaix
*/
class EraseListener implements ActionListener{
private Point point = null;
private Object[][] data;
private Object[] title;
public EraseListener(Point col){
this.point = col;
}
public void actionPerformed(ActionEvent event) {
//Get the line index
deleteRow(jobTable.rowAtPoint(this.point));
}
}
/**
* add a line to the table (to be exact to the table model)
* @author CHerby
*/
/* class AddListener implements ActionListener{
public void actionPerformed(ActionEvent event) {
//add a line to the model
Object[] donnee = new Object[]{"1", "new Enterprise", "", "", ""};
((DefaultTableModel)jobTable.getModel()).addRow(donnee);
}
}
*/
public class ButtonRenderer extends JButton implements TableCellRenderer{
/**
* Serial UID
*/
private static final long serialVersionUID = 1654176059478593423L;
public Component getTableCellRendererComponent( JTable table, Object value,
boolean isSelected, boolean isFocus, int row, int col) {
setText((value != null) ? value.toString() : "not defined");
// Return the JButton
return this;
}
}
public class ButtonEditor extends DefaultCellEditor {
/**
* Serial UID
*/
private static final long serialVersionUID = 5109059534647588227L;
protected JButton button;
private boolean isPushed;
private ButtonListener bListener = new ButtonListener();
/**
* CheckBox constructor
* @param checkBox
* @param count
*/
public ButtonEditor(JCheckBox checkBox) {
// By default this object type work with a JCheckBox
super(checkBox);
// create the button
button = new JButton();
button.setOpaque(true);
// set a listener
button.addActionListener(bListener);
}
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
// Set the line
bListener.setRow(row);
// set the column
bListener.setColumn(column);
// Set the table for potential actions
bListener.setTable(table);
// Set the label
button.setText( (value ==null) ? "not defined" : value.toString() );
// return the result
return button;
}
/**
* Listener for the button
* @author CHerby
*
*/
class ButtonListener implements ActionListener{
private int column, row;
private JTable table;
private int nbre = 0;
private JButton button;
public void setColumn(int col){this.column = col;}
public void setRow(int row){this.row = row;}
public void setTable(JTable table){this.table = table;}
public JButton getButton(){return this.button;}
public void actionPerformed(ActionEvent event) {
//TODO : change the log
System.out.println("delete line " + row);
deleteRow(row);
//Tell to the table there is a change
//� l'emplacement d�termin� par les valeur pass�e en param�tre
// ((AbstractTableModel)table.getModel()).fireTableCellUpdated(this.row, this.column - 1);
// this.button = ((JButton)event.getSource());
}
}
}
}