/****************************************************************************** * Product: Adempiere ERP & CRM Smart Business Solution * * Copyright (C) 1999-2006 Adempiere, Inc. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * * under the terms version 2 of the GNU General Public License as published * * by the Free Software Foundation. This program 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 this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * *****************************************************************************/ package org.compiere.pos; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.math.BigDecimal; import java.text.ParseException; import java.util.HashMap; import java.util.logging.Level; import javax.swing.JFormattedTextField; import javax.swing.JTextField; import net.miginfocom.swing.MigLayout; import org.compiere.apps.ConfirmPanel; import org.compiere.model.MPOSKey; import org.compiere.model.MPOSKeyLayout; import org.compiere.swing.CDialog; import org.compiere.swing.CPanel; import org.compiere.util.CLogger; import org.compiere.util.Env; /** * On Screen Keyboard * @author Paul Bowden * Adaxa Pty Ltd */ public class POSKeyboard extends CDialog implements ActionListener, PosKeyListener { /** * */ private static final long serialVersionUID = 3296839634889851637L; private PosTextField field; private MPOSKeyLayout keylayout; /** * Constructor * @param posPanel POS Panel */ public POSKeyboard (PosBasePanel posPanel, int C_POSKeyLayout_ID, PosTextField field, String title) { this(posPanel, C_POSKeyLayout_ID); setTitle(title); setPosTextField(field); } public POSKeyboard(PosBasePanel posPanel, int keyLayoutId) { super(Env.getFrame(posPanel), true); keylayout = MPOSKeyLayout.get(posPanel.getCtx(), keyLayoutId); init( keyLayoutId ); } private JFormattedTextField text = new JFormattedTextField(); private HashMap<Integer, MPOSKey> keys; /** Logger */ private static CLogger log = CLogger.getCLogger(POSKeyboard.class); /** * Initialize * @param startText * @param POSKeyLayout_ID */ public void init(int POSKeyLayout_ID ) { CPanel panel = new CPanel(); getContentPane().add(panel); // Content panel.setLayout(new MigLayout("fill")); if ( keylayout.getPOSKeyLayoutType().equals(MPOSKeyLayout.POSKEYLAYOUTTYPE_Numberpad)) text.setHorizontalAlignment(JTextField.TRAILING); panel.add(text, "north, growx, h 30!, wrap, gap 10 10 10 10"); PosKeyPanel keys = new PosKeyPanel(POSKeyLayout_ID, this); panel.add(keys, "center, growx, growy"); ConfirmPanel confirm = new ConfirmPanel(true, false, true, false, false, false, false); confirm.addActionListener(this); Dimension buttonDim = new Dimension(50,50); confirm.getResetButton().setPreferredSize(buttonDim); confirm.getOKButton().setPreferredSize(buttonDim); confirm.getCancelButton().setPreferredSize(buttonDim); panel.add(confirm, "south"); pack(); setLocationByPlatform(true); text.requestFocusInWindow(); } // init /** * Dispose - Free Resources */ public void dispose() { if (keys != null) { keys.clear(); keys = null; } super.dispose(); } // dispose /** * Action Listener * @param e event */ public void actionPerformed (ActionEvent e) { String action = e.getActionCommand(); if (action == null || action.length() == 0) return; else if ( action.equals(ConfirmPanel.A_RESET)) { if ( keylayout.getPOSKeyLayoutType().equals(MPOSKeyLayout.POSKEYLAYOUTTYPE_Numberpad)) text.setText("0"); else text.setText(""); try { text.commitEdit(); } catch (ParseException e1) { log.log(Level.FINE, "JFormattedTextField commit failed"); } } else if ( action.equals(ConfirmPanel.A_CANCEL)) { dispose(); } else if (action.equals(ConfirmPanel.A_OK)) { field.setText(text.getText()); try { field.commitEdit(); } catch (ParseException e1) { log.log(Level.FINE, "JFormattedTextField commit failed"); } dispose(); } log.info( "PosSubBasicKeys - actionPerformed: " + action); } // actionPerformed public void keyReturned(MPOSKey key) { String entry = key.getText(); String old = text.getText(); int caretPos = text.getCaretPosition(); if ( text.getSelectedText() != null ) caretPos = text.getSelectionStart(); String head = old.substring(0, caretPos); if ( text.getSelectedText() != null ) caretPos = text.getSelectionEnd(); String tail = old.substring(caretPos, old.length()); if ( entry != null && !entry.isEmpty() ) { if ( keylayout.getPOSKeyLayoutType().equals(MPOSKeyLayout.POSKEYLAYOUTTYPE_Keyboard)) { if ( key.getText() != null ) text.setText( head + entry + tail); } else if ( keylayout.getPOSKeyLayoutType().equals(MPOSKeyLayout.POSKEYLAYOUTTYPE_Numberpad)) { if ( entry.equals(".") ) { text.setText(head + entry + tail); } if ( entry.equals(",") ) { text.setText(head + entry + tail); } else if ( entry.equals("C") ) { text.setText("0"); } else { try { int number = Integer.parseInt(entry); // test if number if ( number >= 0 && number <= 9 ) { text.setText(head + number + tail); } // greater than 9, add to existing else { Object current = text.getValue(); if ( current == null ) { text.setText(Integer.toString(number)); } else if ( current instanceof BigDecimal ) { text.setText(((BigDecimal) current).add( new BigDecimal(Integer.toString(number))).toPlainString()); } else if ( current instanceof Integer ) { text.setText(Integer.toString(((Integer) current) + number)); } else if ( current instanceof Long ) { text.setText(Long.toString(((Long) current) + number)); } else if ( current instanceof Double ) { text.setText(Double.toString(((Double) current) + number)); } } } catch (NumberFormatException e) { // ignore non-numbers } } try { text.commitEdit(); } catch (ParseException e) { log.log(Level.FINE, "JFormattedTextField commit failed"); } } } } public void setPosTextField(PosTextField posTextField) { field = posTextField; text.setFormatterFactory(field.getFormatterFactory()); text.setText(field.getText()); text.setValue(field.getValue()); getContentPane().invalidate(); } } // PosSubBasicKeys