/* * MainWindow.java * * Created on Jun 26, 2012, 3:04:38 PM */ /* Copywrite 2012-2017 Will Winder This file is part of Universal Gcode Sender (UGS). UGS 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. UGS 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 UGS. If not, see <http://www.gnu.org/licenses/>. */ package com.willwinder.universalgcodesender; import com.willwinder.universalgcodesender.uielements.components.StepSizeSpinnerModel; import com.willwinder.universalgcodesender.uielements.components.GcodeFileTypeFilter; import com.willwinder.universalgcodesender.uielements.panels.ConnectionSettingsPanel; import com.willwinder.universalgcodesender.uielements.panels.ControllerProcessorSettingsPanel; import com.willwinder.universalgcodesender.uielements.*; import com.willwinder.universalgcodesender.utils.CommUtils; import com.willwinder.universalgcodesender.utils.FirmwareUtils; import com.willwinder.universalgcodesender.utils.Settings; import com.willwinder.universalgcodesender.utils.SettingsFactory; import com.willwinder.universalgcodesender.utils.Version; import com.willwinder.universalgcodesender.i18n.Localization; import com.willwinder.universalgcodesender.model.BackendAPI; import com.willwinder.universalgcodesender.pendantui.PendantUI; import com.willwinder.universalgcodesender.types.GcodeCommand; import com.willwinder.universalgcodesender.visualizer.VisualizerWindow; import com.willwinder.universalgcodesender.model.UGSEvent; import com.willwinder.universalgcodesender.listeners.ControllerListener; import com.willwinder.universalgcodesender.listeners.ControllerStatus; import com.willwinder.universalgcodesender.model.GUIBackend; import com.willwinder.universalgcodesender.model.UnitUtils.Units; import com.willwinder.universalgcodesender.uielements.components.LengthLimitedDocument; import static com.willwinder.universalgcodesender.utils.GUIHelpers.displayErrorDialog; import java.awt.Color; import java.awt.KeyEventDispatcher; import java.awt.KeyboardFocusManager; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.awt.event.KeyEvent; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.ParseException; import java.util.*; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.*; import javax.swing.Timer; import javax.swing.text.DefaultCaret; import com.willwinder.universalgcodesender.listeners.UGSEventListener; import com.willwinder.universalgcodesender.model.Position; import com.willwinder.universalgcodesender.model.UGSEvent.ControlState; import com.willwinder.universalgcodesender.pendantui.PendantURLBean; import com.willwinder.universalgcodesender.services.JogService; import com.willwinder.universalgcodesender.uielements.jog.JogPanel; import com.willwinder.universalgcodesender.utils.GUIHelpers; import com.willwinder.universalgcodesender.utils.GcodeStreamReader; import java.awt.BorderLayout; import java.awt.Toolkit; import javax.swing.text.DefaultEditorKit; import org.apache.commons.lang3.SystemUtils; /** * * @author wwinder */ public class MainWindow extends JFrame implements ControllerListener, UGSEventListener { private static final Logger logger = Logger.getLogger(MainWindow.class.getName()); final private static String VERSION = Version.getVersion() + " / " + Version.getTimestamp(); private PendantUI pendantUI; public Settings settings; BackendAPI backend; // My Variables private javax.swing.JFileChooser fileChooser; private final int consoleSize = 1024 * 1024; // TODO: Move command history box into a self contained object. private final int commandNum = -1; private List<String> manualCommandHistory; // Other windows VisualizerWindow vw = null; String gcodeFile = null; String processedGcodeFile = null; // Duration timer private Timer timer; // Services private JogService jogService; private JogPanel jogPanel; /** Creates new form MainWindow */ public MainWindow(BackendAPI backend) { this.backend = backend; this.settings = SettingsFactory.loadSettings(); boolean fullyLocalized = Localization.initialize(settings.getLanguage()); if (!fullyLocalized) { GUIHelpers.displayErrorDialog(Localization.getString("incomplete.localization")); } try { backend.applySettings(settings); } catch (Exception e) { throw new RuntimeException(e); } this.jogService = new JogService(backend); this.jogPanel = new JogPanel(backend, jogService, true); if (settings.isShowNightlyWarning() && MainWindow.VERSION.contains("nightly")) { java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { String message = "This version of Universal Gcode Sender is a nightly build.\n" + "It contains all of the latest features and improvements, \n" + "but may also have bugs that still need to be fixed.\n" + "\n" + "If you encounter any problems, please report them on github."; JOptionPane.showMessageDialog(new JFrame(), message, "", JOptionPane.INFORMATION_MESSAGE); }}); } initComponents(); this.jogPanelPanel.setLayout(new BorderLayout()); this.jogPanelPanel.add(jogPanel, BorderLayout.CENTER); initProgram(); backend.addControllerListener(this); backend.addUGSEventListener(this); boolean unitsAreMM = settings.getDefaultUnits().equals(Units.MM.abbreviation); fileChooser = new JFileChooser(settings.getLastOpenedFilename()); commPortComboBox.setSelectedItem(settings.getPort()); baudrateSelectionComboBox.setSelectedItem(settings.getPortRate()); scrollWindowCheckBox.setSelected(settings.isScrollWindowEnabled()); checkScrollWindow(); showVerboseOutputCheckBox.setSelected(settings.isVerboseOutputEnabled()); showCommandTableCheckBox.setSelected(settings.isCommandTableEnabled()); firmwareComboBox.setSelectedItem(settings.getFirmwareVersion()); setSize(settings.getMainWindowSettings().width, settings.getMainWindowSettings().height); setLocation(settings.getMainWindowSettings().xLocation, settings.getMainWindowSettings().yLocation); // mw.setSize(java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().width, java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().width); initFileChooser(); Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { if (fileChooser.getSelectedFile() != null ) { settings.setLastOpenedFilename(fileChooser.getSelectedFile().getAbsolutePath()); } settings.setPort(commPortComboBox.getSelectedItem().toString()); settings.setPortRate(baudrateSelectionComboBox.getSelectedItem().toString()); settings.setScrollWindowEnabled(scrollWindowCheckBox.isSelected()); settings.setVerboseOutputEnabled(showVerboseOutputCheckBox.isSelected()); settings.setCommandTableEnabled(showCommandTableCheckBox.isSelected()); settings.setFirmwareVersion(firmwareComboBox.getSelectedItem().toString()); SettingsFactory.saveSettings(settings); if(pendantUI!=null){ pendantUI.stop(); } } }); } /** * @param args the command line arguments */ public static void main(String args[]) { /* Set the Nimbus look and feel */ //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> /* 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(MainWindow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(MainWindow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(MainWindow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(MainWindow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } //</editor-fold> // Fix look and feel to use CMD+C/X/V/A instead of CTRL if (SystemUtils.IS_OS_MAC) { Collection<InputMap> ims = new ArrayList<>(); ims.add((InputMap) UIManager.get("TextField.focusInputMap")); ims.add((InputMap) UIManager.get("TextArea.focusInputMap")); ims.add((InputMap) UIManager.get("EditorPane.focusInputMap")); ims.add((InputMap) UIManager.get("FormattedTextField.focusInputMap")); ims.add((InputMap) UIManager.get("PasswordField.focusInputMap")); ims.add((InputMap) UIManager.get("TextPane.focusInputMap")); int c = KeyEvent.VK_C; int v = KeyEvent.VK_V; int x = KeyEvent.VK_X; int a = KeyEvent.VK_A; int meta = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); for (InputMap im : ims) { im.put(KeyStroke.getKeyStroke(c, meta), DefaultEditorKit.copyAction); im.put(KeyStroke.getKeyStroke(v, meta), DefaultEditorKit.pasteAction); im.put(KeyStroke.getKeyStroke(x, meta), DefaultEditorKit.cutAction); im.put(KeyStroke.getKeyStroke(a, meta), DefaultEditorKit.selectAllAction); } } /* Create the form */ GUIBackend backend = new GUIBackend(); final MainWindow mw = new MainWindow(backend); /* Apply the settings to the MainWindow bofore showing it */ boolean unitsAreMM = mw.settings.getDefaultUnits().equals(Units.MM.abbreviation); mw.fileChooser = new JFileChooser(mw.settings.getLastOpenedFilename()); mw.commPortComboBox.setSelectedItem(mw.settings.getPort()); mw.baudrateSelectionComboBox.setSelectedItem(mw.settings.getPortRate()); mw.scrollWindowCheckBox.setSelected(mw.settings.isScrollWindowEnabled()); mw.showVerboseOutputCheckBox.setSelected(mw.settings.isVerboseOutputEnabled()); mw.showCommandTableCheckBox.setSelected(mw.settings.isCommandTableEnabled()); mw.showCommandTableCheckBoxActionPerformed(null); mw.firmwareComboBox.setSelectedItem(mw.settings.getFirmwareVersion()); mw.setSize(mw.settings.getMainWindowSettings().width, mw.settings.getMainWindowSettings().height); mw.setLocation(mw.settings.getMainWindowSettings().xLocation, mw.settings.getMainWindowSettings().yLocation); mw.addComponentListener(new ComponentListener() { @Override public void componentResized(ComponentEvent ce) { mw.settings.getMainWindowSettings().height = ce.getComponent().getSize().height; mw.settings.getMainWindowSettings().width = ce.getComponent().getSize().width; } @Override public void componentMoved(ComponentEvent ce) { mw.settings.getMainWindowSettings().xLocation = ce.getComponent().getLocation().x; mw.settings.getMainWindowSettings().yLocation = ce.getComponent().getLocation().y; } @Override public void componentShown(ComponentEvent ce) {} @Override public void componentHidden(ComponentEvent ce) {} }); /* Display the form */ java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { mw.setVisible(true); } }); mw.initFileChooser(); Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { if (mw.fileChooser.getSelectedFile() != null ) { mw.settings.setLastOpenedFilename(mw.fileChooser.getSelectedFile().getAbsolutePath()); } mw.settings.setPort(mw.commPortComboBox.getSelectedItem().toString()); mw.settings.setPortRate(mw.baudrateSelectionComboBox.getSelectedItem().toString()); mw.settings.setScrollWindowEnabled(mw.scrollWindowCheckBox.isSelected()); mw.settings.setVerboseOutputEnabled(mw.showVerboseOutputCheckBox.isSelected()); mw.settings.setCommandTableEnabled(mw.showCommandTableCheckBox.isSelected()); mw.settings.setFirmwareVersion(mw.firmwareComboBox.getSelectedItem().toString()); SettingsFactory.saveSettings(mw.settings); if(mw.pendantUI!=null){ mw.pendantUI.stop(); } } }); // Check command line for a file to open. boolean open = false; for (String arg : args) { if (open) { try { backend.setGcodeFile(new File(arg)); open = false; } catch (Exception ex) { Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex); System.exit(1); } } if (arg.equals("--open") || arg.equals("-o")) { open = true; } } } /** 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 Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; lineBreakGroup = new javax.swing.ButtonGroup(); jTabbedPane1 = new javax.swing.JTabbedPane(); jMenuItem1 = new javax.swing.JMenuItem(); jMenuItem3 = new javax.swing.JMenuItem(); jMenuItem4 = new javax.swing.JMenuItem(); jogUnitsGroup = new javax.swing.ButtonGroup(); scrollWindowCheckBox = new javax.swing.JCheckBox(); bottomTabbedPane = new javax.swing.JTabbedPane(); commandsPanel = new javax.swing.JPanel(); commandLabel = new javax.swing.JLabel(); commandTextField = new com.willwinder.universalgcodesender.uielements.components.CommandTextArea(backend); consoleScrollPane = new javax.swing.JScrollPane(); consoleTextArea = new javax.swing.JTextArea(); commandTableScrollPane = new javax.swing.JScrollPane(); commandTable = new com.willwinder.universalgcodesender.uielements.components.GcodeTable(); controlContextTabbedPane = new javax.swing.JTabbedPane(); machineControlPanel = new javax.swing.JPanel(); actionPanel = new javax.swing.JPanel(); resetCoordinatesButton = new javax.swing.JButton(); returnToZeroButton = new javax.swing.JButton(); softResetMachineControl = new javax.swing.JButton(); killAlarmLock = new javax.swing.JButton(); performHomingCycleButton = new javax.swing.JButton(); requestStateInformation = new javax.swing.JButton(); helpButtonMachineControl = new javax.swing.JButton(); toggleCheckMode = new javax.swing.JButton(); resetZButton = new javax.swing.JButton(); resetYButton = new javax.swing.JButton(); resetXButton = new javax.swing.JButton(); jogPanelPanel = new javax.swing.JPanel(); macroEditPanel = new javax.swing.JScrollPane(); macroPanel = new com.willwinder.universalgcodesender.uielements.macros.MacroPanel(backend); connectionPanel = new javax.swing.JPanel(); commPortComboBox = new javax.swing.JComboBox(); baudrateSelectionComboBox = new javax.swing.JComboBox(); opencloseButton = new javax.swing.JButton(); refreshButton = new javax.swing.JButton(); baudLabel = new javax.swing.JLabel(); portLabel = new javax.swing.JLabel(); firmwareLabel = new javax.swing.JLabel(); firmwareComboBox = new javax.swing.JComboBox(); showVerboseOutputCheckBox = new javax.swing.JCheckBox(); statusPanel = new javax.swing.JPanel(); activeStateLabel = new javax.swing.JLabel(); activeStateValueLabel = new javax.swing.JLabel(); machinePosition = new javax.swing.JLabel(); machinePositionXLabel = new javax.swing.JLabel(); machinePositionYLabel = new javax.swing.JLabel(); machinePositionZLabel = new javax.swing.JLabel(); workPositionLabel = new javax.swing.JLabel(); workPositionXLabel = new javax.swing.JLabel(); workPositionYLabel = new javax.swing.JLabel(); workPositionZLabel = new javax.swing.JLabel(); machinePositionXValueLabel = new javax.swing.JLabel(); machinePositionYValueLabel = new javax.swing.JLabel(); machinePositionZValueLabel = new javax.swing.JLabel(); workPositionXValueLabel = new javax.swing.JLabel(); workPositionYValueLabel = new javax.swing.JLabel(); workPositionZValueLabel = new javax.swing.JLabel(); latestCommentValueLabel = new javax.swing.JLabel(); latestCommentLabel = new javax.swing.JLabel(); showCommandTableCheckBox = new javax.swing.JCheckBox(); fileModePanel = new javax.swing.JPanel(); sendButton = new javax.swing.JButton(); pauseButton = new javax.swing.JButton(); cancelButton = new javax.swing.JButton(); visualizeButton = new javax.swing.JButton(); browseButton = new javax.swing.JButton(); saveButton = new javax.swing.JButton(); fileRunPanel = new javax.swing.JPanel(); remainingTimeValueLabel = new javax.swing.JLabel(); sentRowsValueLabel = new javax.swing.JLabel(); remainingRowsLabel = new javax.swing.JLabel(); rowsValueLabel = new javax.swing.JLabel(); remainingTimeLabel = new javax.swing.JLabel(); durationValueLabel = new javax.swing.JLabel(); durationLabel = new javax.swing.JLabel(); remainingRowsValueLabel = new javax.swing.JLabel(); sentRowsLabel = new javax.swing.JLabel(); rowsLabel = new javax.swing.JLabel(); mainMenuBar = new javax.swing.JMenuBar(); settingsMenu = new javax.swing.JMenu(); grblConnectionSettingsMenuItem = new javax.swing.JMenuItem(); firmwareSettings = new javax.swing.JMenuItem(new com.willwinder.universalgcodesender.uielements.actions.ConfigureFirmwareAction(backend)); gcodeProcessorSettings = new javax.swing.JMenuItem(); PendantMenu = new javax.swing.JMenu(); startPendantServerButton = new javax.swing.JMenuItem(); stopPendantServerButton = new javax.swing.JMenuItem(); jMenuItem1.setText("jMenuItem1"); jMenuItem3.setText("jMenuItem3"); jMenuItem4.setText("jMenuItem4"); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setMinimumSize(new java.awt.Dimension(640, 520)); scrollWindowCheckBox.setSelected(true); scrollWindowCheckBox.setText("Scroll output window"); scrollWindowCheckBox.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { scrollWindowCheckBoxActionPerformed(evt); } }); bottomTabbedPane.setBorder(javax.swing.BorderFactory.createTitledBorder("")); bottomTabbedPane.setMinimumSize(new java.awt.Dimension(0, 0)); bottomTabbedPane.setPreferredSize(new java.awt.Dimension(468, 100)); commandsPanel.setLayout(new java.awt.GridBagLayout()); commandLabel.setText("Command"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; commandsPanel.add(commandLabel, gridBagConstraints); commandTextField.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { commandTextFieldActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; commandsPanel.add(commandTextField, gridBagConstraints); consoleTextArea.setEditable(false); consoleTextArea.setColumns(20); consoleTextArea.setDocument(new LengthLimitedDocument(consoleSize)); consoleTextArea.setRows(5); consoleTextArea.setMaximumSize(new java.awt.Dimension(32767, 32767)); consoleTextArea.setMinimumSize(new java.awt.Dimension(0, 0)); consoleScrollPane.setViewportView(consoleTextArea); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; commandsPanel.add(consoleScrollPane, gridBagConstraints); bottomTabbedPane.addTab("Commands", commandsPanel); commandTable.setMaximumSize(new java.awt.Dimension(32767, 32767)); commandTable.getTableHeader().setReorderingAllowed(false); commandTableScrollPane.setViewportView(commandTable); bottomTabbedPane.addTab("Command Table", commandTableScrollPane); controlContextTabbedPane.setBorder(javax.swing.BorderFactory.createTitledBorder("")); controlContextTabbedPane.setMinimumSize(new java.awt.Dimension(395, 175)); controlContextTabbedPane.addComponentListener(new java.awt.event.ComponentAdapter() { public void componentShown(java.awt.event.ComponentEvent evt) { controlContextTabbedPaneComponentShown(evt); } }); resetCoordinatesButton.setText("Reset Zero"); resetCoordinatesButton.setEnabled(false); resetCoordinatesButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { resetCoordinatesButtonActionPerformed(evt); } }); returnToZeroButton.setText("Return to Zero"); returnToZeroButton.setEnabled(false); returnToZeroButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { returnToZeroButtonActionPerformed(evt); } }); softResetMachineControl.setText("Soft Reset"); softResetMachineControl.setEnabled(false); softResetMachineControl.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { softResetMachineControlActionPerformed(evt); } }); killAlarmLock.setText("$X"); killAlarmLock.setEnabled(false); killAlarmLock.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { killAlarmLockActionPerformed(evt); } }); performHomingCycleButton.setText("$H"); performHomingCycleButton.setEnabled(false); performHomingCycleButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { performHomingCycleButtonActionPerformed(evt); } }); requestStateInformation.setText("$G"); requestStateInformation.setEnabled(false); requestStateInformation.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { requestStateInformationActionPerformed(evt); } }); helpButtonMachineControl.setText("Help"); helpButtonMachineControl.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { helpButtonMachineControlActionPerformed(evt); } }); toggleCheckMode.setText("$C"); toggleCheckMode.setEnabled(false); toggleCheckMode.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { toggleCheckModeActionPerformed(evt); } }); resetZButton.setText("Reset Z Axis"); resetZButton.setEnabled(false); resetZButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { resetZCoordinateButtonActionPerformed(evt); } }); resetYButton.setText("Reset Y Axis"); resetYButton.setEnabled(false); resetYButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { resetYCoordinateButtonActionPerformed(evt); } }); resetXButton.setText("Reset X Axis"); resetXButton.setEnabled(false); resetXButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { resetXCoordinateButtonActionPerformed(evt); } }); org.jdesktop.layout.GroupLayout actionPanelLayout = new org.jdesktop.layout.GroupLayout(actionPanel); actionPanel.setLayout(actionPanelLayout); actionPanelLayout.setHorizontalGroup( actionPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(actionPanelLayout.createSequentialGroup() .add(actionPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false) .add(actionPanelLayout.createSequentialGroup() .add(requestStateInformation, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 49, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(helpButtonMachineControl)) .add(resetCoordinatesButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 159, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(returnToZeroButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 159, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(softResetMachineControl, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 159, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(actionPanelLayout.createSequentialGroup() .add(performHomingCycleButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 49, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(6, 6, 6) .add(killAlarmLock, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 49, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(6, 6, 6) .add(toggleCheckMode, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 49, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))) .add(6, 6, 6) .add(actionPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(resetXButton) .add(resetYButton) .add(resetZButton)) .add(0, 0, Short.MAX_VALUE)) ); actionPanelLayout.setVerticalGroup( actionPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(actionPanelLayout.createSequentialGroup() .add(actionPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(actionPanelLayout.createSequentialGroup() .add(resetCoordinatesButton) .add(6, 6, 6) .add(returnToZeroButton) .add(6, 6, 6) .add(softResetMachineControl) .add(6, 6, 6) .add(actionPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(performHomingCycleButton) .add(killAlarmLock) .add(toggleCheckMode)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(actionPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(requestStateInformation) .add(helpButtonMachineControl))) .add(actionPanelLayout.createSequentialGroup() .add(resetXButton) .add(6, 6, 6) .add(resetYButton) .add(6, 6, 6) .add(resetZButton))) .add(0, 58, Short.MAX_VALUE)) ); org.jdesktop.layout.GroupLayout jogPanelPanelLayout = new org.jdesktop.layout.GroupLayout(jogPanelPanel); jogPanelPanel.setLayout(jogPanelPanelLayout); jogPanelPanelLayout.setHorizontalGroup( jogPanelPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(0, 288, Short.MAX_VALUE) ); jogPanelPanelLayout.setVerticalGroup( jogPanelPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(0, 0, Short.MAX_VALUE) ); org.jdesktop.layout.GroupLayout machineControlPanelLayout = new org.jdesktop.layout.GroupLayout(machineControlPanel); machineControlPanel.setLayout(machineControlPanelLayout); machineControlPanelLayout.setHorizontalGroup( machineControlPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(machineControlPanelLayout.createSequentialGroup() .addContainerGap() .add(actionPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(18, 18, Short.MAX_VALUE) .add(jogPanelPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); machineControlPanelLayout.setVerticalGroup( machineControlPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(machineControlPanelLayout.createSequentialGroup() .add(actionPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addContainerGap()) .add(jogPanelPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); controlContextTabbedPane.addTab("Machine Control", machineControlPanel); org.jdesktop.layout.GroupLayout macroPanelLayout = new org.jdesktop.layout.GroupLayout(macroPanel); macroPanel.setLayout(macroPanelLayout); macroPanelLayout.setHorizontalGroup( macroPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(0, 595, Short.MAX_VALUE) ); macroPanelLayout.setVerticalGroup( macroPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(0, 229, Short.MAX_VALUE) ); macroEditPanel.setViewportView(macroPanel); controlContextTabbedPane.addTab("Macros", macroEditPanel); connectionPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Connection")); connectionPanel.setMaximumSize(new java.awt.Dimension(247, 100)); connectionPanel.setMinimumSize(new java.awt.Dimension(247, 100)); connectionPanel.setName("Connection"); // NOI18N connectionPanel.setPreferredSize(new java.awt.Dimension(247, 100)); commPortComboBox.setEditable(true); baudrateSelectionComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "2400", "4800", "9600", "19200", "38400", "57600", "115200", "230400" })); baudrateSelectionComboBox.setSelectedIndex(2); baudrateSelectionComboBox.setToolTipText("Select baudrate to use for the serial port."); baudrateSelectionComboBox.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { baudrateSelectionComboBoxActionPerformed(evt); } }); opencloseButton.setText("Open"); opencloseButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { opencloseButtonActionPerformed(evt); } }); refreshButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/icons/refresh.gif"))); // NOI18N refreshButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { refreshButtonActionPerformed(evt); } }); baudLabel.setText("Baud:"); portLabel.setText("Port:"); firmwareLabel.setText("Firmware:"); org.jdesktop.layout.GroupLayout connectionPanelLayout = new org.jdesktop.layout.GroupLayout(connectionPanel); connectionPanel.setLayout(connectionPanelLayout); connectionPanelLayout.setHorizontalGroup( connectionPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(connectionPanelLayout.createSequentialGroup() .addContainerGap() .add(connectionPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false) .add(org.jdesktop.layout.GroupLayout.TRAILING, connectionPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(connectionPanelLayout.createSequentialGroup() .add(portLabel) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(commPortComboBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 183, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(connectionPanelLayout.createSequentialGroup() .add(baudLabel) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(baudrateSelectionComboBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(refreshButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 25, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(opencloseButton))) .add(connectionPanelLayout.createSequentialGroup() .add(firmwareLabel) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(firmwareComboBox, 0, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addContainerGap()) ); connectionPanelLayout.setVerticalGroup( connectionPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(connectionPanelLayout.createSequentialGroup() .add(connectionPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(commPortComboBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(portLabel)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(connectionPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(connectionPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(baudLabel) .add(baudrateSelectionComboBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(refreshButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 24, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(opencloseButton)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(connectionPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(firmwareLabel) .add(firmwareComboBox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); showVerboseOutputCheckBox.setText("Show verbose output"); statusPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Machine status")); statusPanel.setMinimumSize(new java.awt.Dimension(247, 160)); statusPanel.setPreferredSize(new java.awt.Dimension(247, 160)); activeStateLabel.setText("Active State:"); activeStateLabel.setOpaque(true); activeStateValueLabel.setText(" "); activeStateValueLabel.setOpaque(true); machinePosition.setText("Machine Position:"); machinePositionXLabel.setText("X:"); machinePositionYLabel.setText("Y:"); machinePositionZLabel.setText("Z:"); workPositionLabel.setText("Work Position:"); workPositionXLabel.setText("X:"); workPositionYLabel.setText("Y:"); workPositionZLabel.setText("Z:"); machinePositionXValueLabel.setText("0"); machinePositionYValueLabel.setText("0"); machinePositionZValueLabel.setText("0"); workPositionXValueLabel.setText("0"); workPositionYValueLabel.setText("0"); workPositionZValueLabel.setText("0"); latestCommentValueLabel.setText(" "); latestCommentLabel.setText("Latest Comment:"); org.jdesktop.layout.GroupLayout statusPanelLayout = new org.jdesktop.layout.GroupLayout(statusPanel); statusPanel.setLayout(statusPanelLayout); statusPanelLayout.setHorizontalGroup( statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(statusPanelLayout.createSequentialGroup() .addContainerGap() .add(statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(statusPanelLayout.createSequentialGroup() .add(latestCommentLabel) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(latestCommentValueLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .add(statusPanelLayout.createSequentialGroup() .add(statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(statusPanelLayout.createSequentialGroup() .add(activeStateLabel) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(activeStateValueLabel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 120, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(statusPanelLayout.createSequentialGroup() .add(statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(workPositionLabel) .add(statusPanelLayout.createSequentialGroup() .add(17, 17, 17) .add(statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false) .add(statusPanelLayout.createSequentialGroup() .add(workPositionZLabel) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(workPositionZValueLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .add(statusPanelLayout.createSequentialGroup() .add(workPositionYLabel) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(workPositionYValueLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .add(statusPanelLayout.createSequentialGroup() .add(workPositionXLabel) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(workPositionXValueLabel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 65, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))))) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(machinePosition) .add(statusPanelLayout.createSequentialGroup() .add(17, 17, 17) .add(statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false) .add(statusPanelLayout.createSequentialGroup() .add(machinePositionZLabel) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(machinePositionZValueLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .add(statusPanelLayout.createSequentialGroup() .add(machinePositionYLabel) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(machinePositionYValueLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .add(statusPanelLayout.createSequentialGroup() .add(machinePositionXLabel) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(machinePositionXValueLabel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 65, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))))))) .add(0, 0, Short.MAX_VALUE))) .addContainerGap()) ); statusPanelLayout.setVerticalGroup( statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(statusPanelLayout.createSequentialGroup() .add(statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(activeStateLabel) .add(activeStateValueLabel)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(latestCommentLabel) .add(latestCommentValueLabel)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING) .add(statusPanelLayout.createSequentialGroup() .add(workPositionLabel) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(workPositionXLabel) .add(workPositionXValueLabel)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(workPositionYLabel) .add(workPositionYValueLabel)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(workPositionZLabel) .add(workPositionZValueLabel))) .add(statusPanelLayout.createSequentialGroup() .add(machinePosition) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(machinePositionXLabel) .add(machinePositionXValueLabel)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(machinePositionYLabel) .add(machinePositionYValueLabel)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(statusPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(machinePositionZLabel) .add(machinePositionZValueLabel)))) .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); showCommandTableCheckBox.setSelected(true); showCommandTableCheckBox.setText("Enable command table"); showCommandTableCheckBox.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { showCommandTableCheckBoxActionPerformed(evt); } }); fileModePanel.setMinimumSize(new java.awt.Dimension(389, 150)); fileModePanel.setPreferredSize(new java.awt.Dimension(247, 258)); fileModePanel.setLayout(new java.awt.GridBagLayout()); sendButton.setText("Send"); sendButton.setEnabled(false); sendButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { sendButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; fileModePanel.add(sendButton, gridBagConstraints); pauseButton.setText("Pause"); pauseButton.setEnabled(false); pauseButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { pauseButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.ipadx = 6; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; fileModePanel.add(pauseButton, gridBagConstraints); cancelButton.setText("Cancel"); cancelButton.setEnabled(false); cancelButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cancelButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; fileModePanel.add(cancelButton, gridBagConstraints); visualizeButton.setText("Visualize"); visualizeButton.setEnabled(false); visualizeButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { visualizeButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; fileModePanel.add(visualizeButton, gridBagConstraints); browseButton.setText("Browse"); browseButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { browseButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; fileModePanel.add(browseButton, gridBagConstraints); saveButton.setText("Save"); saveButton.setEnabled(false); saveButton.setMaximumSize(new java.awt.Dimension(88, 29)); saveButton.setMinimumSize(new java.awt.Dimension(88, 29)); saveButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { saveButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; fileModePanel.add(saveButton, gridBagConstraints); remainingTimeValueLabel.setText("--:--:--"); sentRowsValueLabel.setText("0"); remainingRowsLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); remainingRowsLabel.setText("Remaining Rows:"); remainingRowsLabel.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); remainingRowsLabel.setMaximumSize(null); remainingRowsLabel.setMinimumSize(new java.awt.Dimension(106, 14)); remainingRowsLabel.setPreferredSize(new java.awt.Dimension(106, 14)); rowsValueLabel.setText("0"); remainingTimeLabel.setText("Estimated Time Remaining:"); durationValueLabel.setText("00:00:00"); durationLabel.setText("Duration:"); remainingRowsValueLabel.setText("0"); sentRowsLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); sentRowsLabel.setText("Sent Rows:"); sentRowsLabel.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); sentRowsLabel.setMaximumSize(null); sentRowsLabel.setMinimumSize(new java.awt.Dimension(106, 14)); sentRowsLabel.setPreferredSize(new java.awt.Dimension(106, 14)); rowsLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); rowsLabel.setText("Rows In File:"); rowsLabel.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); rowsLabel.setMinimumSize(new java.awt.Dimension(106, 14)); rowsLabel.setPreferredSize(new java.awt.Dimension(106, 14)); org.jdesktop.layout.GroupLayout fileRunPanelLayout = new org.jdesktop.layout.GroupLayout(fileRunPanel); fileRunPanel.setLayout(fileRunPanelLayout); fileRunPanelLayout.setHorizontalGroup( fileRunPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(fileRunPanelLayout.createSequentialGroup() .add(0, 0, 0) .add(fileRunPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(org.jdesktop.layout.GroupLayout.TRAILING, remainingRowsLabel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(org.jdesktop.layout.GroupLayout.TRAILING, remainingTimeLabel) .add(org.jdesktop.layout.GroupLayout.TRAILING, sentRowsLabel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(org.jdesktop.layout.GroupLayout.TRAILING, durationLabel) .add(org.jdesktop.layout.GroupLayout.TRAILING, rowsLabel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(fileRunPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false) .add(durationValueLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(remainingRowsValueLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(sentRowsValueLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(remainingTimeValueLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(rowsValueLabel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 56, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); fileRunPanelLayout.setVerticalGroup( fileRunPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(fileRunPanelLayout.createSequentialGroup() .addContainerGap() .add(fileRunPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(rowsValueLabel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 14, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(rowsLabel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 14, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(fileRunPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(sentRowsValueLabel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 14, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(sentRowsLabel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 14, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(fileRunPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(remainingRowsValueLabel) .add(remainingRowsLabel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(fileRunPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(remainingTimeLabel) .add(remainingTimeValueLabel)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(fileRunPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(durationLabel) .add(durationValueLabel)) .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.gridwidth = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; fileModePanel.add(fileRunPanel, gridBagConstraints); settingsMenu.setText("Settings"); grblConnectionSettingsMenuItem.setText("Sender Settings"); grblConnectionSettingsMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { grblConnectionSettingsMenuItemActionPerformed(evt); } }); settingsMenu.add(grblConnectionSettingsMenuItem); firmwareSettings.setText("Firmware Settings"); settingsMenu.add(firmwareSettings); gcodeProcessorSettings.setText("Gcode Processor Settings"); gcodeProcessorSettings.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { gcodeProcessorSettingsActionPerformed(evt); } }); settingsMenu.add(gcodeProcessorSettings); mainMenuBar.add(settingsMenu); PendantMenu.setText("Pendant"); startPendantServerButton.setText("Start..."); startPendantServerButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { startPendantServerButtonActionPerformed(evt); } }); PendantMenu.add(startPendantServerButton); stopPendantServerButton.setText("Stop..."); stopPendantServerButton.setEnabled(false); stopPendantServerButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { stopPendantServerButtonActionPerformed(evt); } }); PendantMenu.add(stopPendantServerButton); mainMenuBar.add(PendantMenu); setJMenuBar(mainMenuBar); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false) .add(connectionPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(statusPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .add(fileModePanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(org.jdesktop.layout.GroupLayout.TRAILING, bottomTabbedPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(layout.createSequentialGroup() .add(scrollWindowCheckBox) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(showVerboseOutputCheckBox) .add(18, 18, 18) .add(showCommandTableCheckBox) .addContainerGap()) .add(controlContextTabbedPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) ); layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(connectionPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 144, Short.MAX_VALUE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(statusPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 162, Short.MAX_VALUE)) .add(layout.createSequentialGroup() .add(controlContextTabbedPane, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 283, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(scrollWindowCheckBox) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(showVerboseOutputCheckBox) .add(showCommandTableCheckBox))))) .add(4, 4, 4) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(fileModePanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 203, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(0, 0, Short.MAX_VALUE)) .add(bottomTabbedPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 407, Short.MAX_VALUE)) .add(4, 4, 4)) ); pack(); }// </editor-fold>//GEN-END:initComponents /** End of generated code. */ /** Generated callback functions, hand coded. */ private void scrollWindowCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_scrollWindowCheckBoxActionPerformed checkScrollWindow(); }//GEN-LAST:event_scrollWindowCheckBoxActionPerformed private void opencloseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_opencloseButtonActionPerformed if( this.opencloseButton.getText().equalsIgnoreCase(Localization.getString("open")) ) { this.commandTable.clear(); this.sentRowsValueLabel.setText("0"); String firmware = this.firmwareComboBox.getSelectedItem().toString(); String port = commPortComboBox.getSelectedItem().toString(); int baudRate = Integer.parseInt(baudrateSelectionComboBox.getSelectedItem().toString()); try { this.backend.connect(firmware, port, baudRate); // Let the command field grab focus. commandTextField.grabFocus(); } catch (Exception e) { e.printStackTrace(); displayErrorDialog(e.getMessage()); } } else { try { this.backend.disconnect(); } catch (Exception e) { displayErrorDialog(e.getMessage()); } } }//GEN-LAST:event_opencloseButtonActionPerformed private void refreshButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_refreshButtonActionPerformed loadPortSelector(); }//GEN-LAST:event_refreshButtonActionPerformed private void baudrateSelectionComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_baudrateSelectionComboBoxActionPerformed }//GEN-LAST:event_baudrateSelectionComboBoxActionPerformed // TODO: It would be nice to streamline this somehow... private void grblConnectionSettingsMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_grblConnectionSettingsMenuItemActionPerformed UGSSettingsDialog gcsd = new UGSSettingsDialog( Localization.getString("sender.header"), settings, new ConnectionSettingsPanel(settings), this, true); gcsd.setVisible(true); if (gcsd.saveChanges()) { try { backend.applySettings(settings); } catch (Exception e) { displayErrorDialog(e.getMessage()); } } }//GEN-LAST:event_grblConnectionSettingsMenuItemActionPerformed private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseButtonActionPerformed int returnVal = fileChooser.showOpenDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { try { File gcodeFile = fileChooser.getSelectedFile(); backend.setGcodeFile(gcodeFile); } catch (Exception ex) { logger.log(Level.SEVERE, "Problem while browsing.", ex); displayErrorDialog(ex.getMessage()); } } else { // Canceled file open. } }//GEN-LAST:event_browseButtonActionPerformed private void visualizeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_visualizeButtonActionPerformed // Create new object if it is null. if (this.vw == null) { this.vw = new VisualizerWindow(settings.getVisualizerWindowSettings()); final MainWindow mw = this; vw.addComponentListener(new ComponentListener() { @Override public void componentResized(ComponentEvent ce) { mw.settings.getVisualizerWindowSettings().height = ce.getComponent().getSize().height; mw.settings.getVisualizerWindowSettings().width = ce.getComponent().getSize().width; } @Override public void componentMoved(ComponentEvent ce) { mw.settings.getVisualizerWindowSettings().xLocation = ce.getComponent().getLocation().x; mw.settings.getVisualizerWindowSettings().yLocation = ce.getComponent().getLocation().y; } @Override public void componentShown(ComponentEvent ce) {} @Override public void componentHidden(ComponentEvent ce) {} }); setVisualizerFile(); // Add listener this.backend.addControllerListener(vw); } // Display the form java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { vw.setVisible(true); } }); }//GEN-LAST:event_visualizeButtonActionPerformed public void cancelButtonActionPerformed() { try { backend.cancel(); } catch (Exception e) { displayErrorDialog(e.getMessage()); } } private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed cancelButtonActionPerformed(); }//GEN-LAST:event_cancelButtonActionPerformed public void pauseButtonActionPerformed() { try { this.backend.pauseResume(); } catch (Exception e) { displayErrorDialog(e.getMessage()); } } private void pauseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pauseButtonActionPerformed pauseButtonActionPerformed(); }//GEN-LAST:event_pauseButtonActionPerformed private void sendButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_sendButtonActionPerformed // Timer for updating duration labels. ActionListener actionListener = new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { try { durationValueLabel.setText(Utils.formattedMillis(backend.getSendDuration())); remainingTimeValueLabel.setText(Utils.formattedMillis(backend.getSendRemainingDuration())); //sentRowsValueLabel.setText(""+sentRows); sentRowsValueLabel.setText(""+backend.getNumSentRows()); remainingRowsValueLabel.setText("" + backend.getNumRemainingRows()); } catch (Exception e) { e.printStackTrace(); } } }); } }; this.resetTimerLabels(); if (timer != null){ timer.stop(); } timer = new Timer(1000, actionListener); // Note: there is a divide by zero error in the timer because it uses // the rowsValueLabel that was just reset. try { this.backend.send(); this.resetSentRowLabels(backend.getNumRows()); timer.start(); } catch (Exception e) { timer.stop(); logger.log(Level.INFO, "Exception in sendButtonActionPerformed.", e); displayErrorDialog(e.getMessage()); } }//GEN-LAST:event_sendButtonActionPerformed private void saveButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveButtonActionPerformed //displayErrorDialog("Disabled for refactoring."); int returnVal = fileChooser.showSaveDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { try { File newFile = fileChooser.getSelectedFile(); AbstractController control = FirmwareUtils.getControllerFor("GRBL").get(); backend.applySettingsToController(settings, control); backend.preprocessAndExportToFile(newFile); } catch (FileNotFoundException ex) { displayErrorDialog(Localization.getString("mainWindow.error.openingFile") + ": " + ex.getMessage()); } catch (IOException e) { displayErrorDialog(Localization.getString("mainWindow.error.processingFile") + ": "+e.getMessage()); } catch (Exception e) { logger.log(Level.INFO, "Exception in saveButtonActionPerformed.", e); displayErrorDialog(Localization.getString("mainWindow.error.duringSave") + ": " + e.getMessage()); } } }//GEN-LAST:event_saveButtonActionPerformed private void startPendantServerButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_startPendantServerButtonActionPerformed this.pendantUI = new PendantUI(backend); Collection<PendantURLBean> results = this.pendantUI.start(); for (PendantURLBean result : results) { this.messageForConsole(MessageType.INFO, "Pendant URL: " + result.getUrlString()); } this.startPendantServerButton.setEnabled(false); this.stopPendantServerButton.setEnabled(true); this.backend.addControllerListener(pendantUI); }//GEN-LAST:event_startPendantServerButtonActionPerformed private void stopPendantServerButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_stopPendantServerButtonActionPerformed this.pendantUI.stop(); this.startPendantServerButton.setEnabled(true); this.stopPendantServerButton.setEnabled(false); }//GEN-LAST:event_stopPendantServerButtonActionPerformed private void showCommandTableCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_showCommandTableCheckBoxActionPerformed showCommandTable(showCommandTableCheckBox.isSelected()); }//GEN-LAST:event_showCommandTableCheckBoxActionPerformed private void commandTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_commandTextFieldActionPerformed // TODO add your handling code here: }//GEN-LAST:event_commandTextFieldActionPerformed private void controlContextTabbedPaneComponentShown(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_controlContextTabbedPaneComponentShown // TODO add your handling code here: }//GEN-LAST:event_controlContextTabbedPaneComponentShown private void resetZCoordinateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_resetZCoordinateButtonActionPerformed try { this.backend.resetCoordinateToZero('Z'); } catch (Exception ex) { displayErrorDialog(ex.getMessage()); } }//GEN-LAST:event_resetZCoordinateButtonActionPerformed private void resetXCoordinateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_resetXCoordinateButtonActionPerformed try { this.backend.resetCoordinateToZero('X'); } catch (Exception ex) { displayErrorDialog(ex.getMessage()); } }//GEN-LAST:event_resetXCoordinateButtonActionPerformed private void killAlarmLockActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_killAlarmLockActionPerformed try { this.backend.killAlarmLock(); } catch (Exception ex) { displayErrorDialog(ex.getMessage()); } }//GEN-LAST:event_killAlarmLockActionPerformed private void performHomingCycleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_performHomingCycleButtonActionPerformed try { this.backend.performHomingCycle(); } catch (Exception ex) { displayErrorDialog(ex.getMessage()); } }//GEN-LAST:event_performHomingCycleButtonActionPerformed private void resetCoordinatesButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_resetCoordinatesButtonActionPerformed try { this.backend.resetCoordinatesToZero(); } catch (Exception ex) { displayErrorDialog(ex.getMessage()); } }//GEN-LAST:event_resetCoordinatesButtonActionPerformed private void toggleCheckModeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_toggleCheckModeActionPerformed try { this.backend.toggleCheckMode(); } catch (Exception ex) { displayErrorDialog(ex.getMessage()); } }//GEN-LAST:event_toggleCheckModeActionPerformed private void returnToZeroButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_returnToZeroButtonActionPerformed try { backend.returnToZero(); } catch (Exception ex) { displayErrorDialog(ex.getMessage()); } }//GEN-LAST:event_returnToZeroButtonActionPerformed private void requestStateInformationActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_requestStateInformationActionPerformed try { this.backend.requestParserState(); } catch (Exception ex) { displayErrorDialog(ex.getMessage()); } }//GEN-LAST:event_requestStateInformationActionPerformed private void softResetMachineControlActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_softResetMachineControlActionPerformed try { this.backend.issueSoftReset(); } catch (Exception ex) { displayErrorDialog(ex.getMessage()); } }//GEN-LAST:event_softResetMachineControlActionPerformed private void resetYCoordinateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_resetYCoordinateButtonActionPerformed try { this.backend.resetCoordinateToZero('Y'); } catch (Exception ex) { displayErrorDialog(ex.getMessage()); } }//GEN-LAST:event_resetYCoordinateButtonActionPerformed private void helpButtonMachineControlActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_helpButtonMachineControlActionPerformed StringBuilder message = new StringBuilder() .append(Localization.getString("mainWindow.resetZero")).append("\n") .append(Localization.getString("mainWindow.returnToZero")).append("\n") .append(Localization.getString("mainWindow.softReset")).append("\n") .append(Localization.getString("mainWindow.homing")).append("\n") .append(Localization.getString("mainWindow.alarmLock")).append("\n") .append(Localization.getString("mainWindow.checkMode")).append("\n") .append(Localization.getString("mainWindow.getState")).append("\n") .append(Localization.getString("mainWindow.helpKeyboard")).append("\n") .append(Localization.getString("mainWindow.helpKeyX")).append("\n") .append(Localization.getString("mainWindow.helpKeyY")).append("\n") .append(Localization.getString("mainWindow.helpKeyZ")).append("\n") .append(Localization.getString("mainWindow.helpKeyPlusMinus")).append("\n") .append(Localization.getString("mainWindow.helpKeyDivMul")).append("\n") .append(Localization.getString("mainWindow.helpKeyZero")).append("\n") ; JOptionPane.showMessageDialog(new JFrame(), message, Localization.getString("mainWindow.helpDialog"), JOptionPane.INFORMATION_MESSAGE); }//GEN-LAST:event_helpButtonMachineControlActionPerformed private void gcodeProcessorSettingsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_gcodeProcessorSettingsActionPerformed UGSSettingsDialog gcsd = new UGSSettingsDialog( Localization.getString("settings.processors.header"), settings, new ControllerProcessorSettingsPanel(settings, FirmwareUtils.getConfigFiles()), this, true); gcsd.setVisible(true); if (gcsd.saveChanges()) { // TODO: Reprocess gcode file? /* try { backend.applySettings(settings); } catch (Exception e) { displayErrorDialog(e.getMessage()); } if (this.vw != null) { vw.setMinArcLength(backend.getSettings().getSmallArcThreshold()); vw.setArcLength(backend.getSettings().getSmallArcSegmentLength()); } */ } }//GEN-LAST:event_gcodeProcessorSettingsActionPerformed private void showCommandTable(Boolean enabled) { if (enabled && (backend.isConnected() && !backend.isIdle())) { displayErrorDialog(Localization.getString("mainWindow.error.showTableActive")); showCommandTableCheckBox.setSelected(false); return; } this.commandTable.clear(); this.bottomTabbedPane.setEnabledAt(1, enabled); commandTableScrollPane.setEnabled(enabled); if (!enabled) { this.bottomTabbedPane.setSelectedIndex(0); } else { this.bottomTabbedPane.setSelectedIndex(1); } } /** * FileChooser has to be initialized after JFrame is opened, otherwise the settings will not be applied. */ private void initFileChooser() { this.fileChooser = GcodeFileTypeFilter.getGcodeFileChooser(settings.getLastOpenedFilename()); } private void initProgram() { Localization.initialize(this.settings.getLanguage()); try { backend.applySettings(settings); } catch (Exception e) { displayErrorDialog(e.getMessage()); } this.setLocalLabels(); this.loadPortSelector(); this.checkScrollWindow(); this.loadFirmwareSelector(); this.setTitle(Localization.getString("title") + " (" + Localization.getString("version") + " " + VERSION + ")"); // Command History this.manualCommandHistory = new ArrayList<>(); // Add keyboard listener for manual controls. KeyboardFocusManager.getCurrentKeyboardFocusManager() .addKeyEventDispatcher(new KeyEventDispatcher() { @Override public boolean dispatchKeyEvent(KeyEvent e) { // Check context. if (((jogPanel.isKeyboardMovementEnabled()) && e.getID() == KeyEvent.KEY_PRESSED)) { switch (e.getKeyCode()) { case KeyEvent.VK_RIGHT: case KeyEvent.VK_KP_RIGHT: case KeyEvent.VK_NUMPAD6: jogPanel.xPlusButtonActionPerformed(); e.consume(); return true; case KeyEvent.VK_LEFT: case KeyEvent.VK_KP_LEFT: case KeyEvent.VK_NUMPAD4: jogPanel.xMinusButtonActionPerformed(); e.consume(); return true; case KeyEvent.VK_UP: case KeyEvent.VK_KP_UP: case KeyEvent.VK_NUMPAD8: jogPanel.yPlusButtonActionPerformed(); e.consume(); return true; case KeyEvent.VK_DOWN: case KeyEvent.VK_KP_DOWN: case KeyEvent.VK_NUMPAD2: jogPanel.yMinusButtonActionPerformed(); e.consume(); return true; case KeyEvent.VK_PAGE_UP: case KeyEvent.VK_NUMPAD9: jogPanel.zPlusButtonActionPerformed(); e.consume(); return true; case KeyEvent.VK_PAGE_DOWN: case KeyEvent.VK_NUMPAD3: jogPanel.zMinusButtonActionPerformed(); e.consume(); return true; case KeyEvent.VK_ADD: jogPanel.increaseStepActionPerformed(); e.consume(); return true; case KeyEvent.VK_SUBTRACT: jogPanel.decreaseStepActionPerformed(); e.consume(); return true; case KeyEvent.VK_DIVIDE: jogPanel.divideStepActionPerformed(); e.consume(); return true; case KeyEvent.VK_MULTIPLY: jogPanel.multiplyStepActionPerformed(); e.consume(); return true; case KeyEvent.VK_INSERT: case KeyEvent.VK_NUMPAD0: //resetCoordinatesButtonActionPerformed(null); e.consume(); return true; default: break; } } return false; } }); } private void setStatusColorForState(String state) { if (settings.isDisplayStateColor()) { java.awt.Color color = null; // default to a transparent background. if (state.equals(Localization.getString("mainWindow.status.alarm"))) { color = Color.RED; } else if (state.equals(Localization.getString("mainWindow.status.hold"))) { color = Color.YELLOW; } else if (state.equals(Localization.getString("mainWindow.status.queue"))) { color = Color.YELLOW; } else if (state.equals(Localization.getString("mainWindow.status.run"))) { color = Color.GREEN; } else { color = Color.WHITE; } this.activeStateLabel.setBackground(color); this.activeStateValueLabel.setBackground(color); } else { this.activeStateLabel.setBackground(null); this.activeStateValueLabel.setBackground(null); } } private void updateControls() { this.cancelButton.setEnabled(backend.canCancel()); this.pauseButton.setEnabled(backend.canPause() || backend.isPaused()); this.pauseButton.setText(backend.getPauseResumeText()); this.sendButton.setEnabled(backend.canSend()); boolean hasFile = backend.getGcodeFile() != null; if (hasFile) { this.saveButton.setEnabled(true); this.visualizeButton.setEnabled(true); } switch (backend.getControlState()) { case COMM_DISCONNECTED: this.updateConnectionControlsStateOpen(false); this.updateWorkflowControls(false); this.setStatusColorForState(""); break; case COMM_IDLE: this.updateConnectionControlsStateOpen(true); this.updateWorkflowControls(true); break; case COMM_SENDING: // Workflow tab this.updateWorkflowControls(false); break; case COMM_SENDING_PAUSED: break; default: } } /** * Enable/disable connection frame based on connection state. */ private void updateConnectionControlsStateOpen(boolean isOpen) { this.commPortComboBox.setEnabled(!isOpen); this.baudrateSelectionComboBox.setEnabled(!isOpen); this.refreshButton.setEnabled(!isOpen); this.commandTextField.setEnabled(isOpen); if (isOpen) { this.opencloseButton.setText(Localization.getString("close")); } else { this.opencloseButton.setText(Localization.getString("open")); } } private void updateWorkflowControls(boolean enabled) { this.resetCoordinatesButton.setEnabled(enabled); this.resetXButton.setEnabled(enabled); this.resetYButton.setEnabled(enabled); this.resetZButton.setEnabled(enabled); this.returnToZeroButton.setEnabled(enabled); this.performHomingCycleButton.setEnabled(enabled); this.softResetMachineControl.setEnabled(enabled); this.killAlarmLock.setEnabled(enabled); this.toggleCheckMode.setEnabled(enabled); this.requestStateInformation.setEnabled(enabled); } private void resetTimerLabels() { // Reset labels this.durationValueLabel.setText("00:00:00"); if (this.backend.isConnected()) { if (this.backend.getSendDuration() < 0) { this.remainingTimeValueLabel.setText("estimating..."); } else if (this.backend.getSendDuration() == 0) { this.remainingTimeValueLabel.setText("--:--:--"); } else { this.remainingTimeValueLabel.setText(Utils.formattedMillis(this.backend.getSendDuration())); } } } private void resetSentRowLabels(long numRows) { // Reset labels String totalRows = String.valueOf(numRows); resetTimerLabels(); this.sentRowsValueLabel.setText("0"); this.remainingRowsValueLabel.setText(totalRows); this.rowsValueLabel.setText(totalRows); } /** * Updates all text labels in the GUI with localized labels. */ private void setLocalLabels() { this.baudLabel.setText(Localization.getString("mainWindow.swing.baudLabel")); this.browseButton.setText(Localization.getString("mainWindow.swing.browseButton")); this.cancelButton.setText(Localization.getString("mainWindow.swing.cancelButton")); this.commandLabel.setText(Localization.getString("mainWindow.swing.commandLabel")); this.connectionPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(Localization.getString("mainWindow.swing.connectionPanel"))); this.controlContextTabbedPane.setTitleAt(0, Localization.getString("mainWindow.swing.controlContextTabbedPane.machineControl")); this.controlContextTabbedPane.setTitleAt(1, Localization.getString("mainWindow.swing.controlContextTabbedPane.macros")); this.durationLabel.setText(Localization.getString("mainWindow.swing.durationLabel")); this.fileModePanel.setBorder(javax.swing.BorderFactory.createTitledBorder(Localization.getString("mainWindow.swing.fileLabel"))); //this.jogPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(Localization.getString("mainWindow.swing.keyboardMovementPanel"))); this.firmwareLabel.setText(Localization.getString("mainWindow.swing.firmwareLabel")); this.firmwareSettings.setText(Localization.getString("mainWindow.swing.firmwareSettingsMenu")); this.grblConnectionSettingsMenuItem.setText(Localization.getString("mainWindow.swing.grblConnectionSettingsMenuItem")); this.helpButtonMachineControl.setText(Localization.getString("help")); this.settingsMenu.setText(Localization.getString("mainWindow.swing.settingsMenu")); this.statusPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(Localization.getString("mainWindow.swing.statusPanel"))); this.bottomTabbedPane.setTitleAt(0, Localization.getString("mainWindow.swing.bottomTabbedPane.console")); this.bottomTabbedPane.setTitleAt(1, Localization.getString("mainWindow.swing.bottomTabbedPane.table")); this.latestCommentLabel.setText(Localization.getString("mainWindow.swing.latestCommentLabel")); this.machinePosition.setText(Localization.getString("mainWindow.swing.machinePosition")); this.opencloseButton.setText(Localization.getString("mainWindow.swing.opencloseButton")); this.pauseButton.setText(Localization.getString("mainWindow.swing.pauseButton")); this.portLabel.setText(Localization.getString("mainWindow.swing.portLabel")); this.remainingRowsLabel.setText(Localization.getString("mainWindow.swing.remainingRowsLabel")); this.remainingTimeLabel.setText(Localization.getString("mainWindow.swing.remainingTimeLabel")); this.resetCoordinatesButton.setText(Localization.getString("mainWindow.swing.resetCoordinatesButton")); this.returnToZeroButton.setText(Localization.getString("mainWindow.swing.returnToZeroButton")); this.rowsLabel.setText(Localization.getString("mainWindow.swing.rowsLabel")); this.saveButton.setText(Localization.getString("save")); this.scrollWindowCheckBox.setText(Localization.getString("mainWindow.swing.scrollWindowCheckBox")); this.sendButton.setText(Localization.getString("mainWindow.swing.sendButton")); this.sentRowsLabel.setText(Localization.getString("mainWindow.swing.sentRowsLabel")); this.showVerboseOutputCheckBox.setText(Localization.getString("mainWindow.swing.showVerboseOutputCheckBox")); this.showCommandTableCheckBox.setText(Localization.getString("mainWindow.swing.showCommandTableCheckBox")); this.softResetMachineControl.setText(Localization.getString("mainWindow.swing.softResetMachineControl")); this.visualizeButton.setText(Localization.getString("mainWindow.swing.visualizeButton")); this.workPositionLabel.setText(Localization.getString("mainWindow.swing.workPositionLabel")); this.macroPanel.setToolTipText(Localization.getString("mainWindow.swing.macroInstructions")); this.resetXButton.setText(Localization.getString("mainWindow.swing.resetX")); this.resetYButton.setText(Localization.getString("mainWindow.swing.resetY")); this.resetZButton.setText(Localization.getString("mainWindow.swing.resetZ")); this.activeStateLabel.setText(Localization.getString("mainWindow.swing.activeStateLabel")); this.PendantMenu.setText(Localization.getString("mainWindow.swing.pendant")); this.gcodeProcessorSettings.setText(Localization.getString("settings.processors.header")); this.startPendantServerButton.setText(Localization.getString("PendantMenu.item.StartServer")); this.stopPendantServerButton.setText(Localization.getString("PendantMenu.item.StopServer")); } // Scans for comm ports and puts them in the comm port combo box. private void loadPortSelector() { commPortComboBox.removeAllItems(); String[] portList = CommUtils.getSerialPortList(); if (portList.length < 1) { if (settings.isShowSerialPortWarning()) { displayErrorDialog(Localization.getString("mainWindow.error.noSerialPort")); } } else { // Sort? //java.util.Collections.sort(portList); for (String port : portList) { commPortComboBox.addItem(port); } commPortComboBox.setSelectedIndex(0); } } private void loadFirmwareSelector() { firmwareComboBox.removeAllItems(); List<String> firmwareList = FirmwareUtils.getFirmwareList(); if (firmwareList.size() < 1) { displayErrorDialog(Localization.getString("mainWindow.error.noFirmware")); } else { java.util.Iterator<String> iter = firmwareList.iterator(); while ( iter.hasNext() ) { firmwareComboBox.addItem(iter.next()); } } } private void checkScrollWindow() { // Console output. DefaultCaret caret = (DefaultCaret)consoleTextArea.getCaret(); if (scrollWindowCheckBox.isSelected()) { caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE); consoleTextArea.setCaretPosition(consoleTextArea.getDocument().getLength()); } else { caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE); } // Command table. this.commandTable.setAutoWindowScroll(scrollWindowCheckBox.isSelected()); } void clearTable() { this.commandTable.clear(); } /** * SerialCommunicatorListener implementation. */ @Override public void controlStateChange(ControlState state) { } @Override public void fileStreamComplete(String filename, boolean success) { remainingTimeValueLabel.setText(Utils.formattedMillis(0)); remainingRowsValueLabel.setText("" + backend.getNumRemainingRows()); final String durationLabelCopy = this.durationValueLabel.getText(); if (success) { java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { JOptionPane.showMessageDialog(new JFrame(), Localization.getString("mainWindow.ui.jobComplete") + " " + Utils.formattedMillis(backend.getSendDuration()), Localization.getString("success"), JOptionPane.INFORMATION_MESSAGE); try { Thread.sleep(1000); } catch (InterruptedException ex) {} // Stop the timer after a delay to make sure it is updated. timer.stop(); }}); } else { displayErrorDialog(Localization.getString("mainWindow.error.jobComplete")); } } @Override public void commandSkipped(GcodeCommand command) { commandSent(command); } @Override public void commandSent(final GcodeCommand command) { java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { // sent if (commandTableScrollPane.isEnabled()) { commandTable.addRow(command); } //commandTable.updateRow(command); }}); } @Override public void commandComment(String comment) { latestCommentValueLabel.setText(comment); } @Override public void commandComplete(final GcodeCommand command) { //String gcodeString = command.getCommandString().toLowerCase(); // update gui java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { if (commandTableScrollPane.isEnabled()) { commandTable.updateRow(command); } if (backend.isSendingFile()) { if (vw != null) { vw.setCompletedCommandNumber(command.getCommandNumber()); } } }}); } @Override public void probeCoordinates(Position p) { } // TODO: Change verbose into an enum to toggle regular/verbose/error. @Override public void messageForConsole(final MessageType type, final String msg) { //final javax.swing.JTextArea consoleTextArea = this.consoleTextArea; //final javax.swing.JCheckBox showVerboseOutputCheckBox = this.showVerboseOutputCheckBox; //final javax.swing.JCheckBox scrollWindowCheckBox = this.scrollWindowCheckBox; java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { boolean verbose = type == MessageType.VERBOSE; if (!verbose || showVerboseOutputCheckBox.isSelected()) { String verboseS = "[" + Localization.getString("verbose") + "]"; consoleTextArea.append((verbose ? verboseS : "") + msg); if (consoleTextArea.isVisible() && scrollWindowCheckBox.isSelected()) { consoleTextArea.setCaretPosition(consoleTextArea.getDocument().getLength()); } } } }); } @Override public void statusStringListener(ControllerStatus status) { this.activeStateValueLabel.setText( status.getState() ); this.setStatusColorForState( status.getState() ); if (status.getMachineCoord() != null) { this.machinePositionXValueLabel.setText( Utils.formatter.format(status.getMachineCoord().x) + status.getMachineCoord().getUnits().abbreviation ); this.machinePositionYValueLabel.setText( Utils.formatter.format(status.getMachineCoord().y) + status.getMachineCoord().getUnits().abbreviation ); this.machinePositionZValueLabel.setText( Utils.formatter.format(status.getMachineCoord().z) + status.getMachineCoord().getUnits().abbreviation ); } if (status.getWorkCoord() != null) { this.workPositionXValueLabel.setText( Utils.formatter.format(status.getWorkCoord().x) + status.getWorkCoord().getUnits().abbreviation ); this.workPositionYValueLabel.setText( Utils.formatter.format(status.getWorkCoord().y) + status.getWorkCoord().getUnits().abbreviation ); this.workPositionZValueLabel.setText( Utils.formatter.format(status.getWorkCoord().z) + status.getWorkCoord().getUnits().abbreviation ); } } @Override public void postProcessData(int numRows) { } /** * Updates the visualizer with the processed gcode file if it is available, * otherwise uses the unprocessed file. */ private void setVisualizerFile() { if (vw == null) return; if (processedGcodeFile == null) { if (gcodeFile == null) { return; } vw.setGcodeFile(gcodeFile); } else { vw.setProcessedGcodeFile(processedGcodeFile); } } @Override public void UGSEvent(UGSEvent evt) { if (evt.isFileChangeEvent() || evt.isStateChangeEvent()) { this.updateControls(); } if (evt.isFileChangeEvent()) { switch(evt.getFileState()) { case FILE_LOADING: File f = backend.getGcodeFile(); fileModePanel.setBorder(javax.swing.BorderFactory.createTitledBorder(Localization.getString("mainWindow.swing.fileLabel") + ": " + backend.getGcodeFile().getName())); fileModePanel.setToolTipText(backend.getGcodeFile().getAbsolutePath()); processedGcodeFile = null; gcodeFile = evt.getFile(); break; case FILE_LOADED: processedGcodeFile = evt.getFile(); try { try (GcodeStreamReader gsr = new GcodeStreamReader(backend.getProcessedGcodeFile())) { resetSentRowLabels(gsr.getNumRows()); } } catch (IOException ex) {} break; default: break; } setVisualizerFile(); } } // Generated variables. // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JMenu PendantMenu; private javax.swing.JPanel actionPanel; private javax.swing.JLabel activeStateLabel; private javax.swing.JLabel activeStateValueLabel; private javax.swing.JLabel baudLabel; private javax.swing.JComboBox baudrateSelectionComboBox; private javax.swing.JTabbedPane bottomTabbedPane; private javax.swing.JButton browseButton; private javax.swing.JButton cancelButton; private javax.swing.JComboBox commPortComboBox; private javax.swing.JLabel commandLabel; private com.willwinder.universalgcodesender.uielements.components.GcodeTable commandTable; private javax.swing.JScrollPane commandTableScrollPane; private javax.swing.JTextField commandTextField; private javax.swing.JPanel commandsPanel; private javax.swing.JPanel connectionPanel; private javax.swing.JScrollPane consoleScrollPane; private javax.swing.JTextArea consoleTextArea; private javax.swing.JTabbedPane controlContextTabbedPane; private javax.swing.JLabel durationLabel; private javax.swing.JLabel durationValueLabel; private javax.swing.JPanel fileModePanel; private javax.swing.JPanel fileRunPanel; private javax.swing.JComboBox firmwareComboBox; private javax.swing.JLabel firmwareLabel; private javax.swing.JMenuItem firmwareSettings; private javax.swing.JMenuItem gcodeProcessorSettings; private javax.swing.JMenuItem grblConnectionSettingsMenuItem; private javax.swing.JButton helpButtonMachineControl; private javax.swing.JMenuItem jMenuItem1; private javax.swing.JMenuItem jMenuItem3; private javax.swing.JMenuItem jMenuItem4; private javax.swing.JTabbedPane jTabbedPane1; private javax.swing.JPanel jogPanelPanel; private javax.swing.ButtonGroup jogUnitsGroup; private javax.swing.JButton killAlarmLock; private javax.swing.JLabel latestCommentLabel; private javax.swing.JLabel latestCommentValueLabel; private javax.swing.ButtonGroup lineBreakGroup; private javax.swing.JPanel machineControlPanel; private javax.swing.JLabel machinePosition; private javax.swing.JLabel machinePositionXLabel; private javax.swing.JLabel machinePositionXValueLabel; private javax.swing.JLabel machinePositionYLabel; private javax.swing.JLabel machinePositionYValueLabel; private javax.swing.JLabel machinePositionZLabel; private javax.swing.JLabel machinePositionZValueLabel; private javax.swing.JScrollPane macroEditPanel; private javax.swing.JPanel macroPanel; private javax.swing.JMenuBar mainMenuBar; private javax.swing.JButton opencloseButton; private javax.swing.JButton pauseButton; private javax.swing.JButton performHomingCycleButton; private javax.swing.JLabel portLabel; private javax.swing.JButton refreshButton; private javax.swing.JLabel remainingRowsLabel; private javax.swing.JLabel remainingRowsValueLabel; private javax.swing.JLabel remainingTimeLabel; private javax.swing.JLabel remainingTimeValueLabel; private javax.swing.JButton requestStateInformation; private javax.swing.JButton resetCoordinatesButton; private javax.swing.JButton resetXButton; private javax.swing.JButton resetYButton; private javax.swing.JButton resetZButton; private javax.swing.JButton returnToZeroButton; private javax.swing.JLabel rowsLabel; private javax.swing.JLabel rowsValueLabel; private javax.swing.JButton saveButton; private javax.swing.JCheckBox scrollWindowCheckBox; private javax.swing.JButton sendButton; private javax.swing.JLabel sentRowsLabel; private javax.swing.JLabel sentRowsValueLabel; private javax.swing.JMenu settingsMenu; private javax.swing.JCheckBox showCommandTableCheckBox; private javax.swing.JCheckBox showVerboseOutputCheckBox; private javax.swing.JButton softResetMachineControl; private javax.swing.JMenuItem startPendantServerButton; private javax.swing.JPanel statusPanel; private javax.swing.JMenuItem stopPendantServerButton; private javax.swing.JButton toggleCheckMode; private javax.swing.JButton visualizeButton; private javax.swing.JLabel workPositionLabel; private javax.swing.JLabel workPositionXLabel; private javax.swing.JLabel workPositionXValueLabel; private javax.swing.JLabel workPositionYLabel; private javax.swing.JLabel workPositionYValueLabel; private javax.swing.JLabel workPositionZLabel; private javax.swing.JLabel workPositionZValueLabel; // End of variables declaration//GEN-END:variables }