// Chromis POS - The New Face of Open Source POS // Copyright (c) (c) 2015-2016 // http://www.chromis.co.uk // // This file is part of Chromis POS // // Chromis POS is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Chromis POS is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Chromis POS. If not, see <http://www.gnu.org/licenses/> // package uk.chromis.pos.forms; import java.awt.CardLayout; import java.awt.ComponentOrientation; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; import java.net.URLClassLoader; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.Driver; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.Properties; import java.util.Scanner; import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.AbstractAction; import javax.swing.AbstractButton; import javax.swing.Action; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; import javax.swing.WindowConstants; import javax.swing.table.DefaultTableModel; import net.miginfocom.swing.MigLayout; import org.apache.commons.io.FileUtils; import uk.chromis.basic.BasicException; import uk.chromis.beans.JFlowPanel; import uk.chromis.beans.JPasswordDialog; import uk.chromis.data.gui.JMessageDialog; import uk.chromis.data.gui.MessageInf; import uk.chromis.data.loader.Session; import uk.chromis.format.Formats; import uk.chromis.pos.dialogs.JOpenWarningDlg; import uk.chromis.pos.dialogs.JProcessingDlg; import uk.chromis.pos.printer.DeviceTicket; import uk.chromis.pos.printer.TicketParser; import uk.chromis.pos.printer.TicketPrinterException; import uk.chromis.pos.scale.DeviceScale; import uk.chromis.pos.scanpal2.DeviceScanner; import uk.chromis.pos.scanpal2.DeviceScannerFactory; import uk.chromis.pos.sync.Sync; import uk.chromis.pos.util.AltEncrypter; import uk.chromis.pos.util.OSValidator; public class JRootApp extends JPanel implements AppView { private AppProperties m_props; private Session session; private DataLogicSystem m_dlSystem; private Properties m_propsdb = null; private String m_sActiveCashIndex; private int m_iActiveCashSequence; private Date m_dActiveCashDateStart; private Date m_dActiveCashDateEnd; private String m_sInventoryLocation; private StringBuilder inputtext; public static DeviceScale m_Scale; private DeviceScanner m_Scanner; private DeviceTicket m_TP; private TicketParser m_TTP; private Map<String, BeanFactory> m_aBeanFactories; private JPrincipalApp m_principalapp = null; private static HashMap<String, String> m_oldclasses; // This is for backwards compatibility purposes private String m_clock; private String m_date; private Connection con; private ResultSet rs; private Statement stmt; private String SQL; private String roles; private DatabaseMetaData md; private SimpleDateFormat formatter; private MessageInf msg; private String db_user; private String db_url; private String db_password; static { m_oldclasses = new HashMap<>(); } private class PrintTimeAction implements ActionListener { @Override public void actionPerformed(ActionEvent evt) { m_clock = getLineTimer(); m_date = getLineDate(); m_jLblTitle.setText(m_dlSystem.getResourceAsText("Window.Title")); jLabel2.setText(" " + m_date + " " + m_clock); } } private String getLineTimer() { return Formats.TIME.formatValue(new Date()); } private String getLineDate() { return Formats.DATE.formatValue(new Date()); } private void runRepair() throws SQLException { // this routine checks for a repair script in the folder if it is found then it will execute it String s = new String(); StringBuffer sb = new StringBuffer(); db_user = (AppConfig.getInstance().getProperty("db.user")); db_url = (AppConfig.getInstance().getProperty("db.URL")); db_password = (AppConfig.getInstance().getProperty("db.password")); if (db_user != null && db_password != null && db_password.startsWith("crypt:")) { AltEncrypter cypher = new AltEncrypter("cypherkey" + db_user); db_password = cypher.decrypt(db_password.substring(6)); } FileReader fr; File file; try { file = new File(System.getProperty("user.dir") + "/repair.sql"); fr = new FileReader(file); } catch (FileNotFoundException ex) { return; } try { ClassLoader cloader = new URLClassLoader(new URL[]{new File(AppConfig.getInstance().getProperty("db.driverlib")).toURI().toURL()}); DriverManager.registerDriver(new DriverWrapper((Driver) Class.forName(AppConfig.getInstance().getProperty("db.driver"), true, cloader).newInstance())); Class.forName(AppConfig.getInstance().getProperty("db.driver")); con = DriverManager.getConnection(db_url, db_user, db_password); stmt = (Statement) con.createStatement(); BufferedReader br = new BufferedReader(fr); while ((s = br.readLine()) != null) { sb.append(s); } br.close(); String[] inst = sb.toString().split(";"); for (int i = 0; i < inst.length; i++) { if (!inst[i].trim().equals("")) { stmt.executeUpdate(inst[i]); System.out.println(">>" + inst[i]); } } file.delete(); } catch (Exception e) { System.out.println("*** Error : " + e.toString()); System.out.println("*** "); System.out.println("*** Error : "); e.printStackTrace(); System.out.println("################################################"); System.out.println(sb.toString()); } finally { con.close(); } } /** * Creates new form JRootApp */ public JRootApp() { try { //Lets check if there is repair script to execute runRepair(); } catch (SQLException ex) { Logger.getLogger(JRootApp.class.getName()).log(Level.SEVERE, null, ex); } // get some default settings db_user = (AppConfig.getInstance().getProperty("db.user")); db_url = (AppConfig.getInstance().getProperty("db.URL")); db_password = (AppConfig.getInstance().getProperty("db.password")); if (db_user != null && db_password != null && db_password.startsWith("crypt:")) { // the password is encrypted AltEncrypter cypher = new AltEncrypter("cypherkey" + db_user); db_password = cypher.decrypt(db_password.substring(6)); } m_aBeanFactories = new HashMap<>(); // Inicializo los componentes visuales initComponents(); jScrollPane1.getVerticalScrollBar().setPreferredSize(new Dimension(30, 30)); } public static final int INIT_SUCCESS = 0; public static final int INIT_FAIL_CONFIG = 1; public static final int INIT_FAIL_EXIT = 2; public static final int INIT_FAIL_RETRY = 3; /** * * @param props * @return */ public int initApp(AppProperties props) { m_props = props; m_jPanelDown.setVisible(!AppConfig.getInstance().getBoolean("till.hideinfo")); // support for different component orientation languages. applyComponentOrientation(ComponentOrientation.getOrientation(Locale.getDefault())); // Database start int rc = INIT_FAIL_RETRY; while (rc == INIT_FAIL_RETRY) { rc = INIT_SUCCESS; try { session = AppViewConnection.createSession(m_props); } catch (BasicException e) { JOpenWarningDlg wDlg = new JOpenWarningDlg(e.getMessage(), AppLocal.getIntString("message.retryorconfig"), true, true); wDlg.setModal(true); wDlg.setVisible(true); rc = JOpenWarningDlg.CHOICE; } } if (rc != INIT_SUCCESS) { return rc; } m_dlSystem = (DataLogicSystem) getBean("uk.chromis.pos.forms.DataLogicSystem"); String sDBVersion = readDataBaseVersion(); if (!AppConfig.getInstance().getBoolean("chromis.tickettype") && sDBVersion != null) { UpdateTicketType.updateTicketType(); } if (!AppLocal.APP_VERSION.equals(sDBVersion)) { // Lets check if this is a historic version of the jar and it is in the database /* if (m_dlSystem.checkHistoricVersion(AppLocal.APP_VERSION) != 0) { StartupDialog dialog = new StartupDialog(); JFrame frame = new JFrame(""); JPanel dialogPanel = new JPanel(); dialogPanel.add(dialog); dialog.jTextArea1.setText("\n Unable to run Chromis. \n \n You are trying to run an incompatible version of Chromis." + "\n\n The database found is v" + sDBVersion); JOptionPane.showMessageDialog(frame, dialogPanel, "Incompatible version ", JOptionPane.PLAIN_MESSAGE); System.exit(1); } */ if (getDbVersion().equals("x")) { JMessageDialog.showMessage(this, new MessageInf(MessageInf.SGN_DANGER, AppLocal.getIntString("message.databasenotsupported", session.DB.getName()))); } else { String changelog = (sDBVersion == null) || ("0.00".equals(sDBVersion)) ? "uk/chromis/pos/liquibase/create/chromis.xml" : "uk/chromis/pos/liquibase/upgradeorig/updatesystem.xml"; JProcessingDlg dlg = new JProcessingDlg(AppLocal.getIntString(sDBVersion == null ? "message.createdatabase" : "message.updatedatabase"), (sDBVersion == null), changelog); dlg.setModal(true); dlg.setVisible(true); if (JProcessingDlg.CHOICE == -1 || JProcessingDlg.DBFAILED) { session.close(); JOpenWarningDlg wDlg; if (!"".equals(JProcessingDlg.ERRORMSG)) { wDlg = new JOpenWarningDlg(JProcessingDlg.ERRORMSG, AppLocal.getIntString(sDBVersion == null ? "message.createfailure" : "message.updatefailure"), false, false); wDlg.setModal(true); wDlg.setVisible(true); } System.exit(0); } } } // Clear the cash drawer table as required, by setting try { if ("d".equals(getDbVersion())) { SQL = "DELETE FROM DRAWEROPENED WHERE OPENDATE < {fn TIMESTAMPADD(SQL_TSI_DAY ,-" + AppConfig.getInstance().getProperty("dbtable.retaindays") + ", CURRENT_TIMESTAMP)}"; } else { SQL = "DELETE FROM DRAWEROPENED WHERE OPENDATE < (NOW() - INTERVAL '" + AppConfig.getInstance().getProperty("dbtable.retaindays") + "' DAY)"; } stmt.execute(SQL); } catch (Exception e) { } m_propsdb = m_dlSystem.getResourceAsProperties(AppConfig.getInstance().getHost() + "/properties"); try { String sActiveCashIndex = m_propsdb.getProperty("activecash"); Object[] valcash = sActiveCashIndex == null ? null : m_dlSystem.findActiveCash(sActiveCashIndex); if (valcash == null || !AppConfig.getInstance().getHost().equals(valcash[0])) { setActiveCash(UUID.randomUUID().toString(), m_dlSystem.getSequenceCash(AppConfig.getInstance().getHost()) + 1, new Date(), null); m_dlSystem.execInsertCash( new Object[]{getActiveCashIndex(), AppConfig.getInstance().getHost(), getActiveCashSequence(), getActiveCashDateStart(), getActiveCashDateEnd(), 0}); } else { setActiveCash(sActiveCashIndex, (Integer) valcash[1], (Date) valcash[2], (Date) valcash[3]); } } catch (BasicException e) { session.close(); JOpenWarningDlg wDlg = new JOpenWarningDlg(e.getMessage(), AppLocal.getIntString("message.retryorconfig"), false, true); wDlg.setModal(true); wDlg.setVisible(true); return JOpenWarningDlg.CHOICE; } m_sInventoryLocation = m_propsdb.getProperty("location"); if (m_sInventoryLocation == null) { m_sInventoryLocation = "0"; m_propsdb.setProperty("location", m_sInventoryLocation); m_dlSystem.setResourceAsProperties(AppConfig.getInstance().getHost() + "/properties", m_propsdb); } // setup the display m_TP = new DeviceTicket(this, m_props); // Inicializamos m_TTP = new TicketParser(getDeviceTicket(), m_dlSystem); printerStart(); // Inicializamos la bascula m_Scale = new DeviceScale(this, m_props); // Inicializamos la scanpal m_Scanner = DeviceScannerFactory.createInstance(m_props); new javax.swing.Timer( 250, new PrintTimeAction()).start(); String sWareHouse; try { sWareHouse = m_dlSystem.findLocationName(m_sInventoryLocation); } catch (BasicException e) { sWareHouse = null; // no he encontrado el almacen principal } // Show Hostname, Warehouse and URL in taskbar String url; try { url = session.getURL(); } catch (SQLException e) { url = ""; } m_jHost.setText( "<html>" + AppConfig.getInstance().getHost() + " - " + sWareHouse + "<br>" + url); // display the new logo if set String newLogo = AppConfig.getInstance().getProperty("start.logo"); if (newLogo != null) { if ("".equals(newLogo)) { jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/uk/chromis/fixedimages/chromis.png"))); } else { jLabel1.setIcon(new javax.swing.ImageIcon(newLogo)); } } // change text under logo String newText = AppConfig.getInstance().getProperty("start.text"); if (newText != null) { if (newText.equals("")) { jLabel1.setText("<html><center>Chromis POS - The New Face of Open Source POS<br>" + "Copyright \u00A9 (c) 2015-2016Chromis <br>" + "<br>" + "http://www.chromis.co.uk<br>" + "<br>" + " Chromis POS is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.<br>" + "<br>" + " Chromis POS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.<br>" + "<br>" + "You should have received a copy of the GNU General Public License along with Chromis POS. If not, see http://www.gnu.org/licenses/<br>" + "</center>"); } else { try { String newTextCode = new Scanner(new File(newText), "UTF-8").useDelimiter("\\A").next(); jLabel1.setText(newTextCode); } catch (Exception e) { } jLabel1.setAlignmentX(0.5F); jLabel1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); jLabel1.setMaximumSize(new java.awt.Dimension(800, 1024)); jLabel1.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); } } // Lets copy any database specific reports to the reports folder // Get the database version first File dbReportsSource = null; String currentPath = new File("").getAbsolutePath(); if (OSValidator.isMac()) { try { currentPath = new File(JRootApp.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()).toString(); currentPath = currentPath.replaceAll("/chromispos.jar", ""); } catch (URISyntaxException ex) { currentPath = "/Applications/chromispos"; } } else { currentPath = System.getProperty("user.dir"); } switch (getDbVersion()) { case "d": dbReportsSource = new File(currentPath + "/reports/uk/chromis/derby"); break; case "m": dbReportsSource = new File(currentPath + "/reports/uk/chromis/mysql"); break; case "p": dbReportsSource = new File(currentPath + "/reports/uk/chromis/postgresql"); break; } File reportsDestination = new File(currentPath + "/reports/uk/chromis/reports"); try { File reportsSource = new File(currentPath + "/reports/uk/chromis/default"); FileUtils.copyDirectory(reportsSource, new File(currentPath + "/reports/uk/chromis/reports")); if ((dbReportsSource) != null) { FileUtils.copyDirectory(dbReportsSource, new File(currentPath + "/reports/uk/chromis/reports")); } } catch (IOException ex) { Logger.getLogger(JRootApp.class.getName()).log(Level.SEVERE, null, ex); } showLogin(); return INIT_SUCCESS; } private class doWork implements Runnable { @Override public void run() { } } private String readDataBaseVersion() { try { return m_dlSystem.findVersion(); } catch (BasicException ed) { return null; } } public String getDbVersion() { String sdbmanager = m_dlSystem.getDBVersion(); if (("HSQL Database Engine".equals(sdbmanager)) | ("HSQLDB".equals(sdbmanager))) { return ("h"); } else if ("MySQL".equals(sdbmanager)) { return ("m"); } else if ("PostgreSQL".equals(sdbmanager)) { return ("p"); } else if ("Oracle".equals(sdbmanager)) { return ("o"); } else if ("Apache Derby".equals(sdbmanager)) { return ("d"); } else if ("Derby".equals(sdbmanager)) { return ("d"); } else { return ("x"); } } public void tryToClose() { if (closeAppView()) { // success. continue with the shut down m_TP.getDeviceDisplay().clearVisor(); session.close(); // Download Root form SwingUtilities.getWindowAncestor(this).dispose(); } } @Override public DeviceTicket getDeviceTicket() { return m_TP; } @Override public DeviceScale getDeviceScale() { return m_Scale; } @Override public DeviceScanner getDeviceScanner() { return m_Scanner; } @Override public Session getSession() { return session; } @Override public String getInventoryLocation() { return m_sInventoryLocation; } @Override public String getActiveCashIndex() { return m_sActiveCashIndex; } @Override public int getActiveCashSequence() { return m_iActiveCashSequence; } @Override public Date getActiveCashDateStart() { return m_dActiveCashDateStart; } /** * * @return */ @Override public Date getActiveCashDateEnd() { return m_dActiveCashDateEnd; } /** * * @param sIndex * @param iSeq * @param dStart * @param dEnd */ @Override public void setActiveCash(String sIndex, int iSeq, Date dStart, Date dEnd) { m_sActiveCashIndex = sIndex; m_iActiveCashSequence = iSeq; m_dActiveCashDateStart = dStart; m_dActiveCashDateEnd = dEnd; m_propsdb.setProperty("activecash", m_sActiveCashIndex); m_dlSystem.setResourceAsProperties(AppConfig.getInstance().getHost() + "/properties", m_propsdb); } /** * * @return */ @Override public AppProperties getProperties() { return m_props; } /** * * @param beanfactory * @return * @throws BeanFactoryException */ @Override public Object getBean(String beanfactory) throws BeanFactoryException { // For backwards compatibility beanfactory = mapNewClass(beanfactory); BeanFactory bf = m_aBeanFactories.get(beanfactory); if (bf == null) { // testing sripts if (beanfactory.startsWith("/")) { bf = new BeanFactoryScript(beanfactory); } else { try { Class bfclass = Class.forName(beanfactory); if (BeanFactory.class .isAssignableFrom(bfclass)) { bf = (BeanFactory) bfclass.newInstance(); } else { // the old construction for beans... Constructor constMyView = bfclass.getConstructor(new Class[]{AppView.class }); Object bean = constMyView.newInstance(new Object[]{this}); bf = new BeanFactoryObj(bean); } } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | NoSuchMethodException | SecurityException | IllegalArgumentException | InvocationTargetException e) { throw new BeanFactoryException(e); } } // cache the factory m_aBeanFactories.put(beanfactory, bf); // Initialize if it is a BeanFactoryApp if (bf instanceof BeanFactoryApp) { ((BeanFactoryApp) bf).init(this); } } return bf.getBean(); } private static String mapNewClass(String classname) { String newclass = m_oldclasses.get(classname); return newclass == null ? classname : newclass; } /** * */ @Override public void waitCursorBegin() { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); } /** * */ @Override public void waitCursorEnd() { setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } /** * * @return */ @Override public AppUserView getAppUserView() { return m_principalapp; } private void printerStart() { String sresource = m_dlSystem.getResourceAsXML("Printer.Start"); if (sresource == null) { m_TP.getDeviceDisplay().writeVisor(AppLocal.APP_NAME, AppLocal.APP_VERSION); } else { try { m_TTP.printTicket(sresource); } catch (TicketPrinterException eTP) { m_TP.getDeviceDisplay().writeVisor(AppLocal.APP_NAME, AppLocal.APP_VERSION); } } } private void listPeople() { try { jScrollPane1.getViewport().setView(null); JFlowPanel jPeople = new JFlowPanel(); jPeople.applyComponentOrientation(getComponentOrientation()); java.util.List people = m_dlSystem.listPeopleVisible(); for (int i = 0; i < people.size(); i++) { AppUser user = (AppUser) people.get(i); JButton btn = new JButton(new AppUserAction(user)); btn.applyComponentOrientation(getComponentOrientation()); btn.setFocusPainted(false); btn.setFocusable(false); btn.setRequestFocusEnabled(false); btn.setMaximumSize(new Dimension(130, 60)); btn.setPreferredSize(new Dimension(130, 60)); btn.setMinimumSize(new Dimension(130, 60)); btn.setHorizontalAlignment(SwingConstants.CENTER); btn.setHorizontalTextPosition(AbstractButton.CENTER); btn.setVerticalTextPosition(AbstractButton.BOTTOM); jPeople.add(btn); } jScrollPane1.getViewport().setView(jPeople); } catch (BasicException ee) { } } // La accion del selector private class AppUserAction extends AbstractAction { private final AppUser m_actionuser; public AppUserAction(AppUser user) { m_actionuser = user; putValue(Action.SMALL_ICON, m_actionuser.getIcon()); putValue(Action.NAME, m_actionuser.getName()); } public AppUser getUser() { return m_actionuser; } @Override public void actionPerformed(ActionEvent evt) { // String sPassword = m_actionuser.getPassword(); if (m_actionuser.authenticate()) { // p'adentro directo, no tiene password openAppView(m_actionuser); } else { // comprobemos la clave antes de entrar... String sPassword = JPasswordDialog.showEditPassword(JRootApp.this, AppLocal.getIntString("Label.Password"), m_actionuser.getName(), m_actionuser.getIcon()); if (sPassword != null) { if (m_actionuser.authenticate(sPassword)) { openAppView(m_actionuser); } else { JOptionPane.showMessageDialog(null, AppLocal.getIntString("message.BadPassword"), "Password Error", JOptionPane.WARNING_MESSAGE); } } } } } private void showView(String view) { CardLayout cl = (CardLayout) (m_jPanelContainer.getLayout()); cl.show(m_jPanelContainer, view); } private void openAppView(AppUser user) { if (closeAppView()) { m_principalapp = new JPrincipalApp(this, user); jPanel3.add(m_principalapp.getNotificator()); jPanel3.revalidate(); m_jPanelContainer.add(m_principalapp, "_" + m_principalapp.getUser().getId()); showView("_" + m_principalapp.getUser().getId()); m_principalapp.activate(); } } /** * */ public void exitToLogin() { closeAppView(); showLogin(); } /** * * @return */ public boolean closeAppView() { if (m_principalapp == null) { return true; } else if (!m_principalapp.deactivate()) { return false; } else { // the status label jPanel3.remove(m_principalapp.getNotificator()); jPanel3.revalidate(); jPanel3.repaint(); m_jPanelContainer.remove(m_principalapp); m_principalapp = null; showLogin(); return true; } } private void showLogin() { listPeople(); showView("login"); printerStart(); // keyboard listener activation inputtext = new StringBuilder(); m_txtKeys.setText(null); java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { m_txtKeys.requestFocus(); } }); } private void processKey(char c) { if ((c == '\n') || (c == '?')) { AppUser user = null; try { user = m_dlSystem.findPeopleByCard(inputtext.toString()); } catch (BasicException e) { } if (user == null) { // user not found JOptionPane.showMessageDialog(null, AppLocal.getIntString("message.nocard"), "User Card", JOptionPane.WARNING_MESSAGE); } else { openAppView(user); } inputtext = new StringBuilder(); } else { inputtext.append(c); } } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the FormEditor. */ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { m_jPanelTitle = new javax.swing.JPanel(); m_jLblTitle = new javax.swing.JLabel(); poweredby = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); m_jPanelContainer = new javax.swing.JPanel(); m_jPanelLogin = new javax.swing.JPanel(); jPanel4 = new javax.swing.JPanel(); filler2 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 10), new java.awt.Dimension(32767, 0)); jLabel1 = new javax.swing.JLabel(); jPanel5 = new javax.swing.JPanel(); m_jLogonName = new javax.swing.JPanel(); jPanel2 = new javax.swing.JPanel(); jPanel8 = new javax.swing.JPanel(); jScrollPane1 = new javax.swing.JScrollPane(); jPanel1 = new javax.swing.JPanel(); m_txtKeys = new javax.swing.JTextField(); m_jClose = new javax.swing.JButton(); m_jPanelDown = new javax.swing.JPanel(); panelTask = new javax.swing.JPanel(); m_jHost = new javax.swing.JLabel(); jPanel3 = new javax.swing.JPanel(); setEnabled(false); setPreferredSize(new java.awt.Dimension(1024, 768)); setLayout(new java.awt.BorderLayout()); m_jPanelTitle.setBorder(javax.swing.BorderFactory.createMatteBorder(0, 0, 1, 0, javax.swing.UIManager.getDefaults().getColor("Button.darkShadow"))); m_jPanelTitle.setLayout(new java.awt.BorderLayout()); m_jLblTitle.setFont(new java.awt.Font("Arial", 1, 14)); // NOI18N m_jLblTitle.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); m_jLblTitle.setText("Window.Title"); m_jPanelTitle.add(m_jLblTitle, java.awt.BorderLayout.CENTER); poweredby.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); poweredby.setIcon(new javax.swing.ImageIcon(getClass().getResource("/uk/chromis/fixedimages/poweredby.png"))); // NOI18N poweredby.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 5, 0, 5)); poweredby.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT); poweredby.setMaximumSize(new java.awt.Dimension(222, 34)); poweredby.setPreferredSize(new java.awt.Dimension(180, 34)); poweredby.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { poweredbyMouseClicked(evt); } }); m_jPanelTitle.add(poweredby, java.awt.BorderLayout.LINE_END); jLabel2.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N jLabel2.setForeground(new java.awt.Color(102, 102, 102)); jLabel2.setPreferredSize(new java.awt.Dimension(280, 34)); jLabel2.setRequestFocusEnabled(false); m_jPanelTitle.add(jLabel2, java.awt.BorderLayout.LINE_START); add(m_jPanelTitle, java.awt.BorderLayout.NORTH); m_jPanelContainer.setLayout(new java.awt.CardLayout()); m_jPanelLogin.setLayout(new java.awt.BorderLayout()); jPanel4.setMinimumSize(new java.awt.Dimension(518, 177)); jPanel4.setPreferredSize(new java.awt.Dimension(518, 177)); jPanel4.setLayout(new javax.swing.BoxLayout(jPanel4, javax.swing.BoxLayout.Y_AXIS)); jPanel4.add(filler2); jLabel1.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/uk/chromis/fixedimages/chromis.png"))); // NOI18N jLabel1.setText("<html><center>Chromis POS - The New Face of open source POS<br>" + "Copyright \u00A9 2015 Chromis <br>" + "http://www.chromis.co.uk<br>" + "<br>" + "Chromis POS is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.<br>" + "<br>" + "Chromis POS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.<br>" + "<br>" + "You should have received a copy of the GNU General Public License along with Chromis POS. If not, see http://www.gnu.org/licenses/<br>" + "</center>"); jLabel1.setAlignmentX(0.5F); jLabel1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); jLabel1.setMaximumSize(new java.awt.Dimension(800, 1024)); jLabel1.setMinimumSize(new java.awt.Dimension(518, 177)); jLabel1.setPreferredSize(new java.awt.Dimension(518, 177)); jLabel1.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); jPanel4.add(jLabel1); m_jPanelLogin.add(jPanel4, java.awt.BorderLayout.CENTER); jPanel5.setPreferredSize(new java.awt.Dimension(300, 400)); m_jLogonName.setBorder(javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5)); m_jLogonName.setLayout(new java.awt.BorderLayout()); jPanel2.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 5, 0, 5)); jPanel2.setPreferredSize(new java.awt.Dimension(100, 100)); jPanel2.setLayout(new java.awt.BorderLayout()); jPanel8.setLayout(new java.awt.GridLayout(0, 1, 5, 5)); jPanel2.add(jPanel8, java.awt.BorderLayout.NORTH); m_jLogonName.add(jPanel2, java.awt.BorderLayout.LINE_END); jScrollPane1.setBackground(new java.awt.Color(255, 255, 255)); jScrollPane1.setBorder(null); jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); jScrollPane1.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N m_txtKeys.setPreferredSize(new java.awt.Dimension(0, 0)); m_txtKeys.addKeyListener(new java.awt.event.KeyAdapter() { public void keyTyped(java.awt.event.KeyEvent evt) { m_txtKeysKeyTyped(evt); } }); m_jClose.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N m_jClose.setIcon(new javax.swing.ImageIcon(getClass().getResource("/uk/chromis/images/exit.png"))); // NOI18N m_jClose.setText(AppLocal.getIntString("Button.Close")); // NOI18N m_jClose.setFocusPainted(false); m_jClose.setFocusable(false); m_jClose.setPreferredSize(new java.awt.Dimension(100, 50)); m_jClose.setRequestFocusEnabled(false); m_jClose.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { m_jCloseActionPerformed(evt); } }); org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jPanel1Layout.createSequentialGroup() .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(m_txtKeys, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(m_jClose, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 289, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .addContainerGap(24, Short.MAX_VALUE)) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jPanel1Layout.createSequentialGroup() .add(m_txtKeys, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(m_jClose, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) ); org.jdesktop.layout.GroupLayout jPanel5Layout = new org.jdesktop.layout.GroupLayout(jPanel5); jPanel5.setLayout(jPanel5Layout); jPanel5Layout.setHorizontalGroup( jPanel5Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jPanel5Layout.createSequentialGroup() .addContainerGap() .add(jPanel5Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false) .add(jPanel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(jScrollPane1)) .add(104, 104, 104) .add(m_jLogonName, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(0, 0, Short.MAX_VALUE)) ); jPanel5Layout.setVerticalGroup( jPanel5Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jPanel5Layout.createSequentialGroup() .add(15, 15, 15) .add(m_jLogonName, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(434, 565, Short.MAX_VALUE)) .add(jPanel5Layout.createSequentialGroup() .add(jScrollPane1) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addContainerGap()) ); m_jPanelLogin.add(jPanel5, java.awt.BorderLayout.EAST); m_jPanelContainer.add(m_jPanelLogin, "login"); add(m_jPanelContainer, java.awt.BorderLayout.CENTER); m_jPanelDown.setBorder(javax.swing.BorderFactory.createMatteBorder(1, 0, 0, 0, javax.swing.UIManager.getDefaults().getColor("Button.darkShadow"))); m_jPanelDown.setLayout(new java.awt.BorderLayout()); m_jHost.setFont(new java.awt.Font("Arial", 0, 11)); // NOI18N m_jHost.setIcon(new javax.swing.ImageIcon(getClass().getResource("/uk/chromis/images/display.png"))); // NOI18N m_jHost.setText("*Hostname"); panelTask.add(m_jHost); m_jPanelDown.add(panelTask, java.awt.BorderLayout.LINE_START); m_jPanelDown.add(jPanel3, java.awt.BorderLayout.LINE_END); add(m_jPanelDown, java.awt.BorderLayout.SOUTH); }// </editor-fold>//GEN-END:initComponents private void m_jCloseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_m_jCloseActionPerformed tryToClose(); }//GEN-LAST:event_m_jCloseActionPerformed private void m_txtKeysKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_m_txtKeysKeyTyped if (evt.getModifiers() != 0) { String keys = evt.getKeyModifiersText(evt.getModifiers()) + "+" + evt.getKeyChar(); if ((keys.equals("Alt+Shift+P")) || (keys.equals("Alt+Shift+p"))) { superUserLogin(); } } m_txtKeys.setText("0"); processKey(evt.getKeyChar()); }//GEN-LAST:event_m_txtKeysKeyTyped private void superUserLogin() { //lets check if the super user exists AppUser user = null; try { user = m_dlSystem.getsuperuser(); if (user == null) { ClassLoader cloader = new URLClassLoader(new URL[]{new File(AppConfig.getInstance().getProperty("db.driverlib")).toURI().toURL()}); DriverManager.registerDriver(new DriverWrapper((Driver) Class.forName(AppConfig.getInstance().getProperty("db.driver"), true, cloader).newInstance())); Class.forName(AppConfig.getInstance().getProperty("db.driver")); con = DriverManager.getConnection(db_url, db_user, db_password); PreparedStatement stmt = con.prepareStatement("INSERT INTO PEOPLE (ID, NAME, ROLE, VISIBLE) VALUES ('99', 'SuperAdminUser', '0', true)"); stmt.executeUpdate(); user = m_dlSystem.getsuperuser(); } } catch (BasicException e) { } catch (SQLException | MalformedURLException | ClassNotFoundException | InstantiationException | IllegalAccessException ex) { Logger.getLogger(JRootApp.class .getName()).log(Level.SEVERE, null, ex); } openAppView(user); } private void poweredbyMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_poweredbyMouseClicked JFrame sampleFrame = new JFrame(); final Action exit = new AbstractAction("Exit") { @Override public final void actionPerformed(final ActionEvent e) { sampleFrame.setVisible(false); sampleFrame.dispose(); } }; String currentPath = null; if (OSValidator.isMac()) { try { currentPath = new File(JRootApp.class .getProtectionDomain().getCodeSource().getLocation().toURI().getPath()).toString(); } catch (URISyntaxException ex) { } } else { currentPath = System.getProperty("user.dir") + "\\chromispos.jar"; } String md5 = null; try { FileInputStream fis = new FileInputStream(new File(currentPath)); md5 = org.apache.commons.codec.digest.DigestUtils.md5Hex(fis); fis.close(); } catch (FileNotFoundException ex) { Logger.getLogger(JRootApp.class .getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(JRootApp.class .getName()).log(Level.SEVERE, null, ex); } /* int mb = 1024*1024; //Getting the runtime reference from system Runtime runtime = Runtime.getRuntime(); System.out.println("##### Heap utilization statistics [MB] #####"); //Print used memory System.out.println("Used Memory:" + (runtime.totalMemory() - runtime.freeMemory()) / mb); //Print free memory System.out.println("Free Memory:" + runtime.freeMemory() / mb); //Print total available memory System.out.println("Total Memory:" + runtime.totalMemory() / mb); //Print Maximum available memory System.out.println("Max Memory:" + runtime.maxMemory() / mb); */ AboutDialog dialog = new AboutDialog(); JPanel dialogPanel = new JPanel(); MigLayout layout = new MigLayout("", "[fill]"); DefaultTableModel model = new DefaultTableModel(); JTable table = new JTable(model); model.addColumn("Details"); model.addColumn("Value"); model.addRow(new Object[]{"Database Version", readDataBaseVersion()}); model.addRow(new Object[]{"Java Version", System.getProperty("java.version")}); model.addRow(new Object[]{"Jar MD5", md5}); model.addRow(new Object[]{"Operating System", System.getProperty("os.name")}); model.addRow(new Object[]{"Sync library", Sync.getVersion()}); JScrollPane scrollPane = new JScrollPane(table); JPanel mainPanel = new JPanel(layout); JLabel label = new JLabel(); JPanel btnPanel = new JPanel(); dialogPanel.add(dialog); mainPanel.add(dialogPanel, "wrap"); mainPanel.add(scrollPane, "wrap"); JButton btnExit = new JButton(exit); btnPanel.add(btnExit, "width 100!"); mainPanel.add(btnPanel, "right, wrap"); mainPanel.add(new JLabel(), "wrap"); sampleFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); sampleFrame.setPreferredSize(new Dimension(500, 300)); Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); sampleFrame.setLocation(dim.width / 2 - 250, dim.height / 2 - 150); sampleFrame.setUndecorated(true); mainPanel.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0), 4)); sampleFrame.add(mainPanel); sampleFrame.pack(); sampleFrame.setVisible(true); }//GEN-LAST:event_poweredbyMouseClicked // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.Box.Filler filler2; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JPanel jPanel4; private javax.swing.JPanel jPanel5; private javax.swing.JPanel jPanel8; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JButton m_jClose; private javax.swing.JLabel m_jHost; private javax.swing.JLabel m_jLblTitle; private javax.swing.JPanel m_jLogonName; private javax.swing.JPanel m_jPanelContainer; private javax.swing.JPanel m_jPanelDown; private javax.swing.JPanel m_jPanelLogin; private javax.swing.JPanel m_jPanelTitle; private javax.swing.JTextField m_txtKeys; private javax.swing.JPanel panelTask; private javax.swing.JLabel poweredby; // End of variables declaration//GEN-END:variables }