package ch.psi.mxsc; import ch.psi.pshell.core.Context; import ch.psi.pshell.swing.DataPanel; import ch.psi.utils.swing.MainFrame; import ch.psi.utils.swing.SwingUtils; import java.awt.Dimension; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JDialog; import javax.swing.Timer; import javax.swing.table.DefaultTableModel; /** * */ public class PuckLoadingDialog extends JDialog { Path dialogPersistPath; DefaultTableModel model; final boolean load; final int INDEX_DEWAR = 0; final int INDEX_DATAMATRIX = 1; final int INDEX_POSITION = 2; /** * Creates new form PuckLoadingDialog */ public PuckLoadingDialog(java.awt.Frame parent, boolean load, boolean modal) { super(parent, load ? "Puck Loading" : "Puck Unloading", modal); initComponents(); this.load = load; this.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE); this.setName("PuckLoadingDialog"); dialogPersistPath = Paths.get(Context.getInstance().getSetup().getContextPath(), getClass().getSimpleName()); setStatusLabel(null,-1); setSugestionLabel(null,-1); model = (DefaultTableModel) table.getModel(); table.getTableHeader().setFont(table.getTableHeader().getFont().deriveFont(16.0f)); panelTable.getVerticalScrollBar().setPreferredSize(new Dimension(30, 0)); } @Override public void setVisible(boolean value){ boolean visible = isVisible(); if (visible && !value){ try { MainFrame.save(PuckLoadingDialog.this, dialogPersistPath); } catch (Exception ex) { Logger.getLogger(DataPanel.class.getName()).log(Level.WARNING, null, ex); } } super.setVisible(value); if (!visible && value){ try { MainFrame.restore(PuckLoadingDialog.this, dialogPersistPath); } catch (Exception ex) { Logger.getLogger(DataPanel.class.getName()).log(Level.WARNING, null, ex); } update(); } } void update() { Map dms = Controller.getInstance().getPuckDatamatrixInfo(); if (dms == null) { dms = new HashMap(); } Object[] keys = dms.keySet().toArray(); Arrays.sort(keys); if (keys.length != model.getRowCount()){ model.setRowCount(keys.length); } for (int i=0; i< keys.length; i++) { model.setValueAt(keys[i], i, INDEX_DATAMATRIX); try{ Map info = (Map) dms.get(keys[i]); model.setValueAt(info.get("address"), i, INDEX_POSITION); model.setValueAt(info.get("dewar"), i, INDEX_DEWAR); } catch (Exception ex){ model.setValueAt("Unknown", i, INDEX_POSITION); model.setValueAt("Unknown", i, INDEX_DEWAR); } } } void onPuckScanned(String datamatrix){ textScannedDatamatrix.setText((datamatrix == null) ? "" : datamatrix.trim()); if ((datamatrix != null) && (!datamatrix.isEmpty())){ setStatusLabel("Scanned puck " + datamatrix, 5000); makeVisible(datamatrix); Puck puck = Controller.getInstance().getFreePuck(); Controller.getInstance().setLaserPos(puck.getName()); } else { setStatusLabel(null, -1); Controller.getInstance().setLaserPos((Puck)null); } setSugestionLabel(null, -1); buttonSet.setEnabled(false); detectedPuck = null; textDetectedPuck.setText(""); } Puck detectedPuck; String detectedDatamatrix; void onPuckMounted(Puck puck, String datamatrix){ Controller.getInstance().setLaserPos((Puck)null); if ((datamatrix != null) && (!datamatrix.isEmpty())) { Controller.getInstance().linkPuckDatamatrix(puck, datamatrix, false); setStatusLabel("Mounted puck " + datamatrix + " at " + puck.getName(), 5000); setSugestionLabel(null, -1); buttonSet.setEnabled(false); textDetectedPuck.setText(""); detectedPuck = null; } else { setStatusLabel("Detected puck at " + puck.getName(), -1); setSugestionLabel("Select the datamatrix and press 'Set'", -1); detectedPuck = puck; textDetectedPuck.setText(puck.getName()); buttonSet.setEnabled(true); table.clearSelection(); } update(); } Timer timerClear; void onPuckUnmounted(Puck puck){ if (puck == detectedPuck){ } Controller.getInstance().linkPuckDatamatrix(puck, null, false); setStatusLabel("Unmounted puck from "+ puck.getName(), 5000); if (puck == detectedPuck){ buttonSet.setEnabled(false); detectedPuck = null; } makeVisible(puck); update(); } void onManualSetPuckLocation(String datamatrix){ if (detectedPuck!=null){ Controller.getInstance().linkPuckDatamatrix(detectedPuck, datamatrix, false); setStatusLabel("Set puck " + datamatrix + " at " + detectedPuck.getName(), 5000); setSugestionLabel(null, -1); buttonSet.setEnabled(false); detectedPuck = null; textDetectedPuck.setText(""); } update(); } Timer timerLabelStatus; void setStatusLabel(String message, int delay){ final String defaultStatus = " "; //Waiting for Puck Detection"; if (timerLabelStatus!=null){ timerLabelStatus.stop(); timerLabelStatus = null; } labelStatus.setText(message==null ? defaultStatus : message); if (delay>0){ timerLabelStatus = new Timer(delay, (e)->{ labelStatus.setText(defaultStatus); }); timerLabelStatus.start(); } } Timer timerLabelSuggestion; void setSugestionLabel(String message, int delay){ final String defaultSuggestion = "Scan, Insert or Remove Pucks"; //Waiting for Puck Detection"; if (timerLabelSuggestion!=null){ timerLabelSuggestion.stop(); timerLabelSuggestion = null; } labelSuggestion.setText(message==null ? defaultSuggestion : message); if (delay>0){ timerLabelSuggestion = new Timer(delay, (e)->{ labelSuggestion.setText(defaultSuggestion); }); timerLabelSuggestion.start(); } } void makeVisible(String datamatrix){ if (datamatrix!=null){ for (int i=0; i//GEN-BEGIN:initComponents private void initComponents() { jLabel1 = new javax.swing.JLabel(); textScannedDatamatrix = new javax.swing.JTextField(); panelTable = new javax.swing.JScrollPane(); table = new javax.swing.JTable(); buttonSet = new javax.swing.JButton(); labelSuggestion = new javax.swing.JLabel(); labelStatus = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); textDetectedPuck = new javax.swing.JTextField(); buttonClearDatamatrix = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); jLabel1.setFont(new java.awt.Font("Lucida Grande", 0, 18)); // NOI18N jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); jLabel1.setText("Scanned Datamatrix:"); textScannedDatamatrix.setEditable(false); textScannedDatamatrix.setFont(new java.awt.Font("Lucida Grande", 0, 30)); // NOI18N textScannedDatamatrix.setHorizontalAlignment(javax.swing.JTextField.CENTER); table.setAutoCreateRowSorter(true); table.setFont(new java.awt.Font("Lucida Grande", 0, 30)); // NOI18N table.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { }, new String [] { "Dewar", "Puck Id/Datamatrix", "Puck Position" } ) { Class[] types = new Class [] { java.lang.String.class, java.lang.String.class, java.lang.String.class }; boolean[] canEdit = new boolean [] { false, false, false }; public Class getColumnClass(int columnIndex) { return types [columnIndex]; } public boolean isCellEditable(int rowIndex, int columnIndex) { return canEdit [columnIndex]; } }); table.setRowHeight(40); table.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); table.getTableHeader().setReorderingAllowed(false); panelTable.setViewportView(table); buttonSet.setFont(new java.awt.Font("Lucida Grande", 0, 24)); // NOI18N buttonSet.setText("Set"); buttonSet.setEnabled(false); buttonSet.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonSetActionPerformed(evt); } }); labelSuggestion.setFont(new java.awt.Font("Lucida Grande", 0, 24)); // NOI18N labelSuggestion.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); labelSuggestion.setText("Scan, Insert or Remove Pucks"); labelStatus.setFont(new java.awt.Font("Lucida Grande", 0, 24)); // NOI18N labelStatus.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); labelStatus.setText("Waiting for Puck Detection"); labelStatus.setBorder(javax.swing.BorderFactory.createEtchedBorder()); jLabel2.setFont(new java.awt.Font("Lucida Grande", 0, 18)); // NOI18N jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); jLabel2.setText("Detected Puck:"); textDetectedPuck.setEditable(false); textDetectedPuck.setFont(new java.awt.Font("Lucida Grande", 0, 30)); // NOI18N textDetectedPuck.setHorizontalAlignment(javax.swing.JTextField.CENTER); buttonClearDatamatrix.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N buttonClearDatamatrix.setText("Clear"); buttonClearDatamatrix.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { buttonClearDatamatrixActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(0, 0, Short.MAX_VALUE) .addComponent(buttonSet, javax.swing.GroupLayout.PREFERRED_SIZE, 201, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, Short.MAX_VALUE)) .addComponent(labelSuggestion, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(panelTable, javax.swing.GroupLayout.DEFAULT_SIZE, 484, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(textScannedDatamatrix) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(buttonClearDatamatrix)) .addGroup(layout.createSequentialGroup() .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(textDetectedPuck))) .addContainerGap()) .addComponent(labelStatus, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jLabel1, jLabel2}); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(labelSuggestion) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1) .addComponent(textScannedDatamatrix, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(buttonClearDatamatrix)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel2) .addComponent(textDetectedPuck, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(panelTable, javax.swing.GroupLayout.DEFAULT_SIZE, 235, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(buttonSet) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(labelStatus)) ); layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {buttonClearDatamatrix, textScannedDatamatrix}); pack(); }// //GEN-END:initComponents private void buttonSetActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonSetActionPerformed try { int row = table.getSelectedRow(); String datamatrix = (row >= 0) ? String.valueOf(table.getValueAt(row, INDEX_DATAMATRIX)) : null; if (datamatrix != null) { onManualSetPuckLocation(datamatrix); } } catch (Exception ex) { SwingUtils.showException(this, ex); } }//GEN-LAST:event_buttonSetActionPerformed private void buttonClearDatamatrixActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonClearDatamatrixActionPerformed try { Controller.getInstance().onPuckScanned(null); } catch (Exception ex) { SwingUtils.showException(this, ex); } }//GEN-LAST:event_buttonClearDatamatrixActionPerformed /** * @param args the command line arguments */ public static void main(String args[]) { /* Set the Nimbus look and feel */ // /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html */ try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(PuckLoadingDialog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(PuckLoadingDialog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(PuckLoadingDialog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(PuckLoadingDialog.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } // /* Create and display the dialog */ java.awt.EventQueue.invokeLater(new Runnable() { public void run() { PuckLoadingDialog dialog = new PuckLoadingDialog(new javax.swing.JFrame(), true, true); dialog.addWindowListener(new java.awt.event.WindowAdapter() { @Override public void windowClosing(java.awt.event.WindowEvent e) { System.exit(0); } }); dialog.setVisible(true); } }); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton buttonClearDatamatrix; javax.swing.JButton buttonSet; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel labelStatus; private javax.swing.JLabel labelSuggestion; private javax.swing.JScrollPane panelTable; javax.swing.JTable table; javax.swing.JTextField textDetectedPuck; javax.swing.JTextField textScannedDatamatrix; // End of variables declaration//GEN-END:variables }