/** * A component which should be embedded in a status bar. */ /* 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.toolbars; import com.willwinder.universalgcodesender.Utils; import com.willwinder.universalgcodesender.model.BackendAPI; import com.willwinder.universalgcodesender.listeners.ControllerListener; import com.willwinder.universalgcodesender.listeners.ControllerStatus; import com.willwinder.universalgcodesender.listeners.UGSEventListener; import com.willwinder.universalgcodesender.model.Position; import com.willwinder.universalgcodesender.model.UGSEvent; import static com.willwinder.universalgcodesender.model.UGSEvent.ControlState.COMM_SENDING; import static com.willwinder.universalgcodesender.model.UGSEvent.FileState.FILE_LOADED; import com.willwinder.universalgcodesender.types.GcodeCommand; import com.willwinder.universalgcodesender.utils.GUIHelpers; import com.willwinder.universalgcodesender.utils.GcodeStreamReader; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import javax.swing.JLabel; import javax.swing.Timer; /** * * @author wwinder */ public class SendStatusLine extends JLabel implements UGSEventListener, ControllerListener { private static final String SEND_PREFIX = "Send Status: "; private static final String LOAD_PREFIX = "Loaded File: "; private static final String SEND_FORMAT = SEND_PREFIX + "(%d/%d) %s / %s "; private static final String COMPLETED_FORMAT = SEND_PREFIX + "completed after %s "; private static final String ROWS_FORMAT = LOAD_PREFIX + "%d rows "; private final BackendAPI backend; private Timer timer; public SendStatusLine(BackendAPI b) { backend = b; if (backend != null) { backend.addUGSEventListener(this); backend.addControllerListener(this); } if (backend.isSendingFile()) { beginSend(); } else { setRows(); } } private void beginSend() { // 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 { setText(String.format(SEND_FORMAT, backend.getNumSentRows(), backend.getNumRows(), Utils.formattedMillis(backend.getSendDuration()), Utils.formattedMillis(backend.getSendRemainingDuration()))); } catch (Exception e) { e.printStackTrace(); } } }); } }; if (timer != null){ timer.stop(); } timer = new Timer(1000, actionListener); try { timer.start(); } catch (Exception e) { timer.stop(); GUIHelpers.displayErrorDialog(e.getMessage()); } } private void endSend() { if (timer != null && timer.isRunning()) { timer.stop(); setText(String.format(COMPLETED_FORMAT, Utils.formattedMillis(backend.getSendDuration()))); } } private void setRows() { if (backend.getProcessedGcodeFile() != null) { try { try (GcodeStreamReader gsr = new GcodeStreamReader(backend.getProcessedGcodeFile())) { setText(String.format(ROWS_FORMAT, gsr.getNumRows())); } } catch (IOException ex){} } } @Override public void UGSEvent(com.willwinder.universalgcodesender.model.UGSEvent evt) { // Start/Restart timer when sending starts. if (evt.isStateChangeEvent()) { switch (evt.getControlState()) { case COMM_SENDING: if (backend.isSendingFile()) { beginSend(); } break; default: endSend(); break; } } // Display the number of rows when a file is loaded. if (evt.isFileChangeEvent() && evt.getFileState() == FILE_LOADED) { setRows(); } } /////////////////////////////// // ControllerListener events // /////////////////////////////// @Override public void controlStateChange(UGSEvent.ControlState state) { } @Override public void fileStreamComplete(String filename, boolean success) { endSend(); } @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 messageForConsole(MessageType type, String msg) { } @Override public void statusStringListener(ControllerStatus status) { } @Override public void postProcessData(int numRows) { } }