package br.ufpr.c3sl.view.footer;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Collection;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import br.ufpr.c3sl.connection.Internet;
import br.ufpr.c3sl.dao.MistakeDAO;
import br.ufpr.c3sl.dao.RetroactionDAO;
import br.ufpr.c3sl.dao.UserDAO;
import br.ufpr.c3sl.daoFactory.DAOFactory;
import br.ufpr.c3sl.exception.UserException;
import br.ufpr.c3sl.model.Mistake;
import br.ufpr.c3sl.model.Retroaction;
import br.ufpr.c3sl.model.User;
import br.ufpr.c3sl.session.Session;
import br.ufpr.c3sl.util.Util;
import br.ufpr.c3sl.view.calculator.Calculator;
import br.ufpr.c3sl.view.footer.paginator.JpPaginator;
import br.ufpr.c3sl.view.glossary.GlossaryGUI;
import br.ufpr.c3sl.view.notepad.NotePad;
import br.ufpr.c3sl.view.principal.JpCarrie;
import br.ufpr.c3sl.view.retroaction.PaginateMistakes;
import br.ufpr.c3sl.view.retroaction.PaginateRetroFrame;
import br.ufpr.c3sl.view.util.ImageButton;
@SuppressWarnings("serial")
public class JpMenuBarFooter extends JPanel {
private ImageButton imgButtonSendServer;
private ImageButton imgButtonCalc;
private ImageButton imgButtonGlossary;
private ImageButton imgButtonNotePad;
private ImageButton imgButtonRetroaction;
private JpPaginator jpPaginator;
private PaginateMistakes paginateMistakes;
private Calculator calc;
public JpMenuBarFooter() {
super(true);
calc = new Calculator();
createImagesButtons();
addListeners();
}
private JpPaginator paginator() {
if (jpPaginator == null){
jpPaginator = new JpPaginator();
this.add(jpPaginator, FlowLayout.LEFT);
}
return jpPaginator;
}
public PaginateMistakes getPaginateMistakes(){
if (imgButtonRetroaction == null){
paginateMistakes = new PaginateMistakes();
imgButtonRetroaction = configureImageButton(imgButtonRetroaction, "error", "Retroação a Erros");
imgButtonRetroaction.addActionListener(new ActionListener() {
private JFrame frame;
public void actionPerformed(ActionEvent e) {
if (frame == null){
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame = new PaginateRetroFrame(paginateMistakes);
}
});
}else{
if (!frame.isVisible()){
}
frame.setVisible(!frame.isVisible());
}
}
});
}
showButtonServerIfNecessary();
return paginateMistakes;
}
private void createImagesButtons(){
imgButtonCalc = configureImageButton(imgButtonCalc, "calc", "Calculadora");
imgButtonGlossary = configureImageButton(imgButtonGlossary, "glossary", "Glossário");
imgButtonNotePad = configureImageButton(imgButtonNotePad, "notepad", "Bloco de Notas");
}
private ImageButton configureImageButton(ImageButton imgButton,
String image,
String toolTipText){
imgButton = new ImageButton(
Util.getIconURL(getClass(), image+"_down"),
Util.getIconURL(getClass(), image+"_up"));
imgButton.setName(toolTipText);
imgButton.setToolTipText(toolTipText);
this.add(imgButton);
return imgButton;
}
private void addListeners(){
imgButtonCalc.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
calc.setVisible(!calc.isVisible());
if (calc.isVisible())
calc.toFront();
}
});
imgButtonGlossary.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
GlossaryGUI.getInstance().
setVisible(!GlossaryGUI.getInstance().isVisible());
if (GlossaryGUI.getInstance().isVisible())
GlossaryGUI.getInstance().toFront();
}
});
imgButtonNotePad.addActionListener(new ActionListener() {
JFrame notePadFrame;
public void actionPerformed(ActionEvent e) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
if (notePadFrame == null)
notePadFrame = NotePad.createAndShowGUI();
else{
notePadFrame.setVisible(!notePadFrame.isVisible());
if (notePadFrame.isVisible())
notePadFrame.toFront();
}
}
});
}
});
}
public void addButtonServer(){
imgButtonSendServer = configureImageButton(imgButtonSendServer, "server", "Enviar Dados Para Servidor");
imgButtonSendServer.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sendToServer();
}
});
validate();
}
private void sendToServer(){
if (Internet.isNotReachable()){
JOptionPane.showMessageDialog(null, "Não foi impossível enviar os dados para o servidor! \n" +
"Não foi possível estabelecer conexão com a internet \n\nPor favor, tente mais tarde!",
"Erro de conexão", JOptionPane.ERROR_MESSAGE);
}else{
updateServer();
}
}
private void updateServer() {
JpCarrie.getInstance().showLoading();
DAOFactory daoServer = DAOFactory.getDAOFactory(DAOFactory.MYSQL);
MistakeDAO mistakeDaoS = daoServer.getMistakeDAO();
UserDAO userDao = daoServer.getUserDAO();
RetroactionDAO retroactionDAOS = daoServer.getRetroactionDAO();
DAOFactory daoLocal = DAOFactory.getDAOFactory(DAOFactory.DB4O);
MistakeDAO mistakeDaoL = daoLocal.getMistakeDAO();
RetroactionDAO retroactionDAOL = daoLocal.getRetroactionDAO();
try {
User user = userDao.findOrCreateByEmail(Session.getCurrentUser().getEmail());
List<Mistake> list = mistakeDaoL.getAll(user,
JpCarrie.getInstance().getName());
for (Mistake mistake : list) {
List<Retroaction> retroactionList = retroactionDAOL.getAll(mistake);
mistakeDaoL.delete(mistake);
mistake.setUser(user);
mistake = mistakeDaoS.insert(mistake);
for (Retroaction retroaction : retroactionList) {
retroactionDAOL.delete(retroaction);
retroaction.setMistake(mistake);
retroactionDAOS.insert(retroaction);
}
}
//TODO: Implementing send Hits to server
JOptionPane.showMessageDialog(null, "Os dados foram atualizados com sucesso!!!");
imgButtonSendServer.setVisible(false);
resetPaginateMistakes();
} catch (UserException e) {
e.printStackTrace();
}
JpCarrie.getInstance().hideLoading();
}
private void resetPaginateMistakes(){
this.remove(imgButtonRetroaction);
imgButtonRetroaction = null;
validate();
}
/**
* add a panel to the paginator
* @param jPanel to be added
*/
public void addPanelToPaginator(JPanel jPanel){
paginator().addPanel(jPanel);
}
/**
* Get the paginator Object
* @return paginator Objetc
*/
public JpPaginator getPaginator(){
return paginator();
}
/**
* getAllPanels
* @return all panels added at the CARRIE
*/
public Collection<JPanel> getAllPanels() {
return paginator().getAllPanels();
}
/**
* Add a error in the menu bar
* @param errorInfo A object who has all information about the error
*/
public void addErrorToMenu(Mistake mistake){
getPaginateMistakes().addMistake(mistake);
}
private void showButtonServerIfNecessary() {
if(DAOFactory.DATABASE_CHOOSE == DAOFactory.DB4O &&
imgButtonSendServer == null){
addButtonServer();
}else if (DAOFactory.DATABASE_CHOOSE == DAOFactory.DB4O && !imgButtonSendServer.isVisible())
imgButtonSendServer.setVisible(true);
SwingUtilities.updateComponentTreeUI(this);
}
}