/* Copywrite 2016 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.uielements.macros; import com.willwinder.universalgcodesender.MacroHelper; import com.willwinder.universalgcodesender.i18n.Localization; import com.willwinder.universalgcodesender.listeners.UGSEventListener; import com.willwinder.universalgcodesender.model.BackendAPI; import com.willwinder.universalgcodesender.model.UGSEvent; import com.willwinder.universalgcodesender.types.Macro; import com.willwinder.universalgcodesender.utils.GUIHelpers; import com.willwinder.universalgcodesender.utils.Settings; import net.miginfocom.swing.MigLayout; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.*; public class MacroPanel extends JPanel implements UGSEventListener { private final BackendAPI backend; private final List<JButton> customGcodeButtons = new ArrayList<>(); private final List<JTextField> macroNameFields = new ArrayList<>(); private final List<JTextField> macroGcodeFields = new ArrayList<>(); private final List<JTextField> macroDescriptionFields = new ArrayList<>(); private final String helpText = Localization.getString("mainWindow.swing.macroInstructions"); private final JButton helpButton = new JButton(Localization.getString("help")); private final JLabel buttonHeader = new JLabel(""); private final JLabel nameHeader = new JLabel(Localization.getString("macroPanel.name")); private final JLabel gcodeHeader = new JLabel(Localization.getString("macroPanel.text")); private final JLabel descriptionHeader = new JLabel(Localization.getString("macroPanel.description")); /** * Helper for updating macros and creating the different fields. */ private enum MACRO_FIELD { NAME, CODE, DESCRIPTION } public MacroPanel(BackendAPI backend) { if (backend == null) { throw new RuntimeException(); } this.backend = backend; backend.addUGSEventListener(this); this.helpButton.addActionListener(l -> { GUIHelpers.displayHelpDialog(helpText); }); } @Override public void doLayout() { Integer lastMacroIndex = backend.getSettings().getLastMacroIndex()+1; // Create components if needed for (int i = customGcodeButtons.size(); i <= lastMacroIndex; i++) { Macro macro = backend.getSettings().getMacro(i); customGcodeButtons.add(createMacroButton(i)); macroGcodeFields.add(createMacroField(i, MACRO_FIELD.CODE, macro.getGcode())); macroNameFields.add(createMacroField(i, MACRO_FIELD.NAME, macro.getName())); macroDescriptionFields.add(createMacroField(i, MACRO_FIELD.DESCRIPTION, macro.getDescription())); } MigLayout layout = new MigLayout("fill, wrap 4", "[fill, sg 1]r[fill]r[fill, grow 50]r[fill, grow 50]"); setLayout(layout); add(this.helpButton, "span 4"); add(buttonHeader, "sg 1"); add(nameHeader, "w 75!"); add(gcodeHeader); add(descriptionHeader); for (int i = 0; i < customGcodeButtons.size(); i++) { add(customGcodeButtons.get(i), "sg 1"); add(macroNameFields.get(i), "w 75!"); add(macroGcodeFields.get(i)); add(macroDescriptionFields.get(i)); } updateCustomGcodeControls(backend.isIdle()); super.doLayout(); } /** * Updates a macro and saves it in the settings. * @param index macro index * @param field field to update * @param text updated text */ private void update(int index, MACRO_FIELD field, String text) { Settings s = backend.getSettings(); Macro macro = s.getMacro(index); switch (field) { case NAME: macro.setName(text); break; case CODE: macro.setGcode(text); break; case DESCRIPTION: macro.setDescription(text); break; } s.updateMacro(index, macro); } private JTextField createMacroField(int index, MACRO_FIELD f, String text) { JTextField textField = new JTextField(text); textField.addKeyListener(new KeyListener() { @Override public void keyTyped(KeyEvent e) { update(index, f, textField.getText()); } @Override public void keyPressed(KeyEvent e) { update(index, f, textField.getText()); } @Override public void keyReleased(KeyEvent e) { update(index, f, textField.getText()); } }); return textField; } private JButton createMacroButton(int i) { JButton button = new JButton(i+""); button.setEnabled(false); this.setToolTipText(Localization.getString("macroPanel.button")); button.addActionListener((ActionEvent evt) -> { customGcodeButtonActionPerformed(i); }); return button; } private void customGcodeButtonActionPerformed(int i) { Macro macro = backend.getSettings().getMacro(i); MacroHelper.executeCustomGcode(macro.getGcode(), backend); } private void updateCustomGcodeControls(boolean enabled) { for (JButton button : customGcodeButtons) { button.setEnabled(enabled); } } @Override public void UGSEvent(UGSEvent evt) { updateCustomGcodeControls(backend.isIdle()); } }