package org.openslx.dozmod.gui.activity; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.GridLayout; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JPanel; import org.openslx.dozmod.filetransfer.TransferEvent; import org.openslx.dozmod.filetransfer.TransferEventEmitter; import org.openslx.dozmod.filetransfer.TransferEventListener; import org.openslx.dozmod.gui.Gui; import org.openslx.dozmod.gui.control.BlockProgressBar; import org.openslx.dozmod.gui.control.QLabel; import org.openslx.dozmod.gui.helper.I18n; public abstract class TransferPanel extends ActivityPanel implements TransferEventListener { /** * Version for serialization. */ private static final long serialVersionUID = -8094141830153862958L; protected final QLabel lblStatus; protected final QLabel lblError; protected final QLabel lblSpeed; protected final QLabel lblRemaining; protected final QLabel lblFilename; protected final JButton btnClose; protected final BlockProgressBar progress; private final TransferEventEmitter transfer; private final TransferPanel panel = this; private final Color defaultLabelColor; protected final JPanel header; private int errorCountdown = 0; private JPanel progressWrapper; protected JPanel footer; public TransferPanel(TransferEventEmitter transfer, String displayName, String fileName) { setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); // Header: [status] VM-Name ---- fileName [Button] header = new JPanel(); header.setLayout(new BoxLayout(header, BoxLayout.LINE_AXIS)); lblStatus = new QLabel(I18n.ACTIVITY.getString("TransferPanel.TransferState.initialize")); header.add(lblStatus); header.add(Box.createHorizontalStrut(10)); QLabel vmName = new QLabel(displayName); vmName.setMinimumSize(new Dimension(0, 0)); vmName.setFont(vmName.getFont().deriveFont(Font.BOLD)); header.add(vmName); header.add(Box.createHorizontalGlue()); lblFilename = new QLabel(fileName); lblFilename.setMinimumSize(new Dimension(0, 0)); header.add(lblFilename); header.add(Box.createHorizontalStrut(10)); btnClose = new JButton(I18n.ACTIVITY.getString("TransferPanel.Button.close.text.0")); header.add(btnClose); add(header); progressWrapper = new JPanel(); progressWrapper.setLayout(new GridLayout(1, 1)); progressWrapper.setMinimumSize(Gui.getScaledDimension(0, 50)); progressWrapper.setPreferredSize(progressWrapper.getMinimumSize()); progress = new BlockProgressBar(null); progressWrapper.add(progress); add(progressWrapper); footer = new JPanel(); footer.setLayout(new BoxLayout(footer, BoxLayout.LINE_AXIS)); lblError = new QLabel(); lblSpeed = new QLabel("-"); lblRemaining = new QLabel("-"); lblSpeed.setMinimumSize(Gui.getScaledDimension(50, 0)); lblRemaining.setMinimumSize(Gui.getScaledDimension(60, 0)); footer.add(lblError); footer.add(Box.createGlue()); footer.add(lblSpeed); footer.add(Box.createRigidArea(Gui.getScaledDimension(6, 6))); footer.add(lblRemaining); add(footer); this.transfer = transfer; defaultLabelColor = lblError.getForeground(); } @Override public boolean wantConfirmQuit() { return transfer != null && !transfer.isCanceled(); } @Override public void update(final TransferEvent event) { Gui.asyncExec(new Runnable() { @Override public void run() { // Any error message? if (event.errorMessage != null && !event.errorMessage.isEmpty()) { lblError.setText(event.errorMessage); lblError.setForeground(Color.RED); errorCountdown = 20; } else if (errorCountdown > 0) { errorCountdown--; if (errorCountdown == 10) { lblError.setForeground(defaultLabelColor); } else if (errorCountdown == 0) { lblError.setText(""); } } // Status? if (event.state != null) { String status; switch (event.state) { case ERROR: errorCountdown = 20; status = I18n.ACTIVITY.getString("TransferPanel.TransferState.error"); if (transfer.isCanceled()) { transfer.removeListener(panel); } break; case FINISHED: transferDone(); status = I18n.ACTIVITY.getString("TransferPanel.TransferState.finished"); break; case IDLE: status = I18n.ACTIVITY.getString("TransferPanel.TransferState.idle"); break; case WORKING: status = I18n.ACTIVITY.getString("TransferPanel.TransferState.working"); break; default: status = event.state.toString(); break; } lblStatus.setText(status); } // Remaining + Speed if (event.remainingRaw != 0) { lblRemaining.setText(event.remaining); } if (event.speedRaw != 0) { if (event.virtualSpeedRaw != 0) { lblSpeed.setText(event.speed + " (" + event.virtualSpeed + ")"); } else { lblSpeed.setText(event.speed); } } // Progress bar if (event.progress != null) { progress.setStatus(event.progress); } panel.validate(); } }); } private void transferDone() { transfer.removeListener(panel); lblRemaining.setText("-"); btnClose.setText(I18n.ACTIVITY.getString("TransferPanel.Button.close.text.1")); lblFilename.setText(""); footer.setVisible(false); progressWrapper.setVisible(false); } }