summaryrefslogblamecommitdiffstats
path: root/dozentenmodul/src/main/java/org/openslx/dozmod/gui/activity/TransferPanel.java
blob: 95464f24ff2c515701e4c35b02703abf793c7998 (plain) (tree)
1
2
3
4
5
6
7
8
9
10


                                        
                          


                           


                             


                                                     
                                                            
                                                             

                                                       
                                             
                                          
 

                                                                                            




                                                                           
                                         
 
                                        
 
                                        
 
                                            
 

                                           



                                                  
                                                    




                                                 

                                      

                                       

                                       
                                
 
                                                                                                  
                                                                    
                                                                  
                                      
                                                                             
                                                                                                          

                                                          
                                                        
                                                           


                                                                       


                                                                
                                                          
                                                                                                     

                                     
                                               
                                                                
                                                                              



                                                                                   
                                      
                                                                             


                                               

                                                                           


                                             
                                                                              






                                                             




                                                                  


















                                                                                                  
                                                      


                                                                    
                                                                                                                      

                                                                                       
                                                                           
                                                 

                                                      
                                                               
                                                                                                                         
                                                                   

                                                      
                                                                                                                     

                                                      
                                                                                                                        

                                                      
                                                                                

                                                      
                                                                  





                                                                              




                                                                                                                








                                                                           




                                                                             
 


                                               
                                                                                               
                                        

                                                  

         
 
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);
							releaseResources();
						}
						break;
					case FINISHED:
						transferDone();
						status = I18n.ACTIVITY.getString("TransferPanel.TransferState.finished");
						releaseResources();
						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();
			}
		});
	}
	
	/**
	 * Called when the transfer is finished, or cancelled due to an error
	 */
	protected abstract void releaseResources();

	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);
	}

}