package br.ufpr.c3sl.view.principal; import java.awt.BorderLayout; import java.util.List; import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.border.Border; import br.ufpr.c3sl.deepClone.ObjectByteArray; import br.ufpr.c3sl.exception.UserException; import br.ufpr.c3sl.model.Mistake; import br.ufpr.c3sl.model.MistakeInfo; import br.ufpr.c3sl.pageHTML.Html; import br.ufpr.c3sl.session.Session; import br.ufpr.c3sl.util.Util; import br.ufpr.c3sl.view.PageHTML.JPanelHTML; import br.ufpr.c3sl.view.footer.JpMenuBarFooter; import br.ufpr.c3sl.view.footer.paginator.JpPaginator; import br.ufpr.c3sl.view.header.HeaderPane; import br.ufpr.c3sl.view.util.EnableDisable; /** * CARRIE Framework * class JpCarrie the main panel of CARRIE framework * @author Diego Marczal * @version Outubro 16, 2010 */ @SuppressWarnings("serial") public class JpCarrie extends JPanel{ private JPanel jpBody; private JPanel jpMain; private JPanel jpFooter; private JPanel paneToSave = null; private JpMenuBarFooter jpMenuFooter; private HeaderPane jpHeader; private static final Border BORDER = BorderFactory.createEtchedBorder(); private static JpCarrie carrie = new JpCarrie(); public static JpCarrie getInstance(){ return carrie; } public static void newInstance(){ String name = null; if (carrie != null) name = carrie.getName(); carrie = new JpCarrie(); carrie.setName(name); } /** * Private Constructor , initialize variables */ private JpCarrie(){ jpHeader = new HeaderPane(); jpBody = new JPanel(new BorderLayout()); jpFooter = new JPanel(); jpMenuFooter = new JpMenuBarFooter(); create(); } /* * Create Component JpCarrie */ private void create(){ configure(); addComponents(); addBorder(); } /* * Configure layout of JpCarrie */ private void configure(){ setLookAndFell(); this.setLayout(new BorderLayout()); configureFooter(); } /* * Add Components in JpCarrie */ private void addComponents(){ this.add(jpHeader, BorderLayout.NORTH); this.add(jpBody, BorderLayout.CENTER); this.add(jpFooter, BorderLayout.SOUTH); } private void addBorder(){ configureBorder(this); configureBorder(jpBody); configureBorder(jpFooter); } private void configureHeader(){ jpHeader.configureHeader(); configureBorder(jpHeader); } public void updateHeader(){ jpHeader.updateHeader(); } private void updateTitle(){ String parte = jpMain.getName().split(":")[0]; jpHeader.updateTitle(this.getName() + " - " + parte); } /* * Configure border of a JPanel * @param JPanel jpanel */ private void configureBorder(JPanel jpanel){ jpanel.setBorder(BORDER); } private void configureFooter(){ jpFooter.add(jpMenuFooter); } private void setLookAndFell() { try { // UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); // UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); // UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); } catch (Exception e) { e.printStackTrace(); } } /*----------------------------------------*/ /** * After page of configure this method must be * executed; * This will update the header and load the DATa */ public void finalConfiguration(){ configureHeader(); loadDataFromBD(); } /** * get main panel * @return JPanel the main panel */ public JPanel getMainPanel(){ return jpMain; } /** * update main panel * @param JPanel newPanel new main panel */ public void updateMainPanel(JPanel newPanel){ if (jpMain != null) this.jpBody.remove(jpMain); this.jpMain = newPanel; this.jpBody.add(jpMain, BorderLayout.CENTER); updateTitle(); SwingUtilities.updateComponentTreeUI(jpBody); } /** * Get the paginator Object * @return paginator Objetc */ public JpPaginator getPaginator(){ return jpMenuFooter.getPaginator(); } /** * add a panel to the paginator * @param String the identifier panel's name * @param JPanel panel to be added */ public void addPanel(String name, JPanel panel){ panel.setName(name); jpMenuFooter.addPanelToPaginator(panel); } /** * add a panel to the paginator from a html file * @param String filepath path */ public void addPageFromHtmlFile(String filepath) { addHtmlContent(Util.getTextFromFile(getClass(), filepath)); } /** * Show loading Message on the top of application */ public void showLoading(){ jpHeader.showLoading(); EnableDisable.setComponentsEnabled(this, false); } /** * Hidden loading message */ public void hideLoading(){ jpHeader.hideLoading(); EnableDisable.setComponentsEnabled(this, true); } /*----------------------------------------*/ private void addHtmlContent(String code) { JPanelHTML panel = new JPanelHTML(); Html html = new Html(code); panel.setTextualContent(html.getCode()); panel.setTitle(html.getTitle()); panel.create(); addPanel(html.getLegend(), panel); } /** * Save the main panel state * @param mistake information about the mistake */ public void saveState(final MistakeInfo mistakeInfo){ //Internet.verifyConnection(); final Mistake mistake = new Mistake(); SwingUtilities.invokeLater(new Runnable() { public void run() { JPanel toSave = null; if (paneToSave == null) toSave = jpMain; else toSave = paneToSave; mistake.setExercise(toSave.getName()); mistake.setLearningObject(JpCarrie.this.getName()); mistake.setMistakeInfo(mistakeInfo); mistake.setObject(ObjectByteArray.getByteOfArray(toSave)); mistake.setUser(Session.getCurrentUser()); Thread sendToBd = new Thread(new Runnable() { @Override public void run() { try { jpMenuFooter.addErrorToMenu(mistake.save()); } catch (UserException e) { e.printStackTrace(); } } }); sendToBd.start(); } }); } public void setPanelToSave(JPanel paneToSave){ this.paneToSave = paneToSave; } private void loadDataFromBD() { Thread loadData = new Thread(new Runnable() { @Override public void run() { List<Mistake> list = Mistake.all(Session.getCurrentUser(), JpCarrie.this.getName()); if(list.size() > 0) jpMenuFooter.getPaginateMistakes().addMistakes(list); } }); loadData.start(); } }