/* Copywrite 2016-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.uielements.panels; import com.willwinder.universalgcodesender.i18n.Localization; import com.willwinder.universalgcodesender.listeners.ControllerListener; import com.willwinder.universalgcodesender.listeners.ControllerStatus; import com.willwinder.universalgcodesender.listeners.UGSEventListener; import com.willwinder.universalgcodesender.model.BackendAPI; import com.willwinder.universalgcodesender.model.Position; import com.willwinder.universalgcodesender.model.UGSEvent; import com.willwinder.universalgcodesender.types.GcodeCommand; import com.willwinder.universalgcodesender.uielements.components.CommandTextArea; import com.willwinder.universalgcodesender.uielements.components.LengthLimitedDocument; import net.miginfocom.swing.MigLayout; import javax.swing.*; import javax.swing.text.DefaultCaret; public class CommandPanel extends JPanel implements UGSEventListener, ControllerListener { private final int consoleSize = 1024 * 1024; private final BackendAPI backend; private final JScrollPane scrollPane = new JScrollPane(); private final JTextArea consoleTextArea = new JTextArea(); private final CommandTextArea commandTextField; private final JLabel commandLabel = new JLabel(Localization.getString("mainWindow.swing.commandLabel")); private final JPopupMenu menu = new JPopupMenu(); private final JCheckBoxMenuItem showVerboseMenuItem = new JCheckBoxMenuItem( Localization.getString("mainWindow.swing.showVerboseOutputCheckBox")); private final JCheckBoxMenuItem scrollWindowMenuItem = new JCheckBoxMenuItem( Localization.getString("mainWindow.swing.scrollWindowCheckBox")); /** * No-Arg constructor to make this control work in the UI builder tools * @deprecated Use constructor with BackendAPI. */ @Deprecated public CommandPanel() { this(null); } public CommandPanel(BackendAPI backend) { this.backend = backend; if (backend != null) { backend.addUGSEventListener(this); backend.addControllerListener(this); } commandTextField = new CommandTextArea(backend); initComponents(); loadSettings(); } private void initComponents() { 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)); scrollPane.setViewportView(consoleTextArea); scrollWindowMenuItem.addActionListener(e -> checkScrollWindow()); menu.add(showVerboseMenuItem); menu.add(scrollWindowMenuItem); setComponentPopupMenu(menu); setLayout(new MigLayout("inset 0 0 5 0, fill, wrap 1", "", "[][min!]")); add(scrollPane, "grow, growy"); add(commandLabel, "gapleft 5, al left, split 2"); add(commandTextField, "gapright 5, r, grow"); } @Override public void UGSEvent(UGSEvent evt) { if (evt.isSettingChangeEvent()) { loadSettings(); } } @Override public void controlStateChange(UGSEvent.ControlState state) { } @Override public void fileStreamComplete(String filename, boolean success) { } @Override public void commandSkipped(GcodeCommand command) { } @Override public void commandSent(GcodeCommand command) { } @Override public void commandComplete(GcodeCommand command) { } @Override public void commandComment(String comment) { } @Override public void probeCoordinates(Position p) { } @Override public void statusStringListener(ControllerStatus status) { } @Override public void postProcessData(int numRows) { } @Override public void messageForConsole(MessageType type, String msg) { java.awt.EventQueue.invokeLater(() -> { boolean verbose = MessageType.VERBOSE.equals(type); if (!verbose || showVerboseMenuItem.isSelected()) { if (verbose) { consoleTextArea.append("[" + type.getLocalizedString() + "] "); } consoleTextArea.append(msg); if (consoleTextArea.isVisible() && scrollWindowMenuItem.isSelected()) { consoleTextArea.setCaretPosition(consoleTextArea.getDocument().getLength()); } } }); } private void checkScrollWindow() { // Console output. DefaultCaret caret = (DefaultCaret)consoleTextArea.getCaret(); if (scrollWindowMenuItem.isSelected()) { caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE); consoleTextArea.setCaretPosition(consoleTextArea.getDocument().getLength()); } else { caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE); } } public void loadSettings() { scrollWindowMenuItem.setSelected(backend.getSettings().isScrollWindowEnabled()); showVerboseMenuItem.setSelected(backend.getSettings().isVerboseOutputEnabled()); checkScrollWindow(); } public void saveSettings() { backend.getSettings().setScrollWindowEnabled(scrollWindowMenuItem.isSelected()); backend.getSettings().setVerboseOutputEnabled(showVerboseMenuItem.isSelected()); } }