content: package aliview.subprocesses;
  
  import java.awt.BorderLayout;
  import java.awt.Component;
  import java.awt.Dimension;
  import java.awt.Toolkit;
  import java.awt.event.WindowAdapter;
  import java.awt.event.WindowEvent;
  
  import javax.swing.JFrame;
  import javax.swing.JScrollPane;
  import javax.swing.JTextArea;
  import javax.swing.SwingUtilities;
  
  import org.apache.log4j.Logger;
  
  import aliview.AliViewWindow;
  import aliview.gui.AppIcons;
  
  
  public class SubThreadProgressWindow{
  
  	private JFrame frame;
  	private static final Logger logger = Logger.getLogger(SubThreadProgressWindow.class);
  	private Thread subThread;
  	private JTextArea consoleTextArea;
  	private boolean subThreadInterruptedByUser = false;
  	//	private Dimension PREF_SIZE = new Dimension(300,200);
  
  
  	public SubThreadProgressWindow(){
  		init();
  	}
  
  	public void init(){
  
  		frame = new JFrame();
  		//		frame.setPreferredSize(PREF_SIZE);
  		consoleTextArea = new JTextArea();
  		JScrollPane scrollPane = new JScrollPane(consoleTextArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
  
  		frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
  		frame.addWindowListener(new WindowAdapter() {		
  			public void windowClosing(WindowEvent e) {
  				if(subThread != null){
  					subThread.interrupt();
  					subThreadInterruptedByUser = true;
  				}
  				frame.dispose();
  			}
  		});
  
  		frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
  		frame.setTitle("Working");
  		frame.setIconImage(AppIcons.getProgramIconImage());
  		frame.setIconImage(Toolkit.getDefaultToolkit().getImage(SubThreadProgressWindow.class.getResource("/img/alignment_ico_128x128.png")));
  	}
  
  	public void pack(){
  		frame.pack();
  	}
  
  	public void show(){
  		frame.pack();
  		frame.setVisible(true);
  	}
  
  
  	public SubThreadProgressWindow(Thread subthread) {
  		super();
  		this.subThread = subthread;
  	}
  
  	public boolean wasSubThreadInterruptedByUser() {
  		return subThreadInterruptedByUser;
  	}
  
  	public void setActiveThread(Thread subThread){
  		this.subThread = subThread;	
  	}	
  
  	public void centerLocationToThisComponentOrScreen(Component parent){
  		// align to middle of parent window
  		if(parent != null){
  			int newX = parent.getX() + parent.getWidth()/2 - frame.getPreferredSize().width/2;
  			int newY = parent.getY() + parent.getHeight()/2 - frame.getPreferredSize().height/2;
  			logger.info(parent.getX());
  			logger.info(parent.getWidth());
  			logger.info(frame.getWidth());
  			setLocation(newX, newY);
  		}
  		else{
  			centerLocationToCenterOfScreen();
  		}
  	}	
  
  	public void setBottomRightRelativeThisComponent(Component parent) {
  		// align to middle of parent window
  		if(parent != null){
  			int newX = parent.getX() + parent.getWidth() - frame.getPreferredSize().width - 50;
  			int newY = parent.getY() + parent.getHeight() - frame.getPreferredSize().height - 50;
  			logger.info(parent.getX());
  			logger.info(parent.getWidth());
  			logger.info(frame.getWidth());
  			setLocation(newX, newY);
  		}
  		else{
  			centerLocationToCenterOfScreen();
  		}
  	}
  
  	public void setTopRightRelativeThisComponent(Component parent) {
  		// align to middle of parent window
  		if(parent != null){
  			int newX = parent.getX() + parent.getWidth() - frame.getPreferredSize().width - 20;
  			int newY = parent.getY() + 150;
  			logger.info(parent.getX());
  			logger.info(parent.getWidth());
  			logger.info(frame.getWidth());
  			setLocation(newX, newY);
  		}
  		else{
  			centerLocationToCenterOfScreen();
  		}
  	}
  
  	public void centerLocationToCenterOfScreen() {
  		Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
  		int x = (int) ((dimension.getWidth() - frame.getPreferredSize().getWidth()) / 2);
  		int y = (int) ((dimension.getHeight() - frame.getPreferredSize().getHeight()) / 2);
  		logger.info(frame.getPreferredSize());
  		setLocation(x, y);
  	}
  
  
  	private void setLocation(final int x, final int y) {
  		SwingUtilities.invokeLater(new Runnable() {
  			public void run() {
  				frame.setLocation(x, y);
  			}
  		});
  	}
  
  	public void upperLeftLocationOfThisComponent(Component parent){
  		// align to middle of parent window
  		if(parent != null){
  			int newX = parent.getX() + 100;
  			int newY = parent.getY() + 100;
  			setLocation(newX, newY);
  		}
  	}	
  
  	public void appendOutput(final String output){
  		SwingUtilities.invokeLater(new Runnable() {
  			public void run() {
  				consoleTextArea.append(output);
  				// Make it scroll to end
  				consoleTextArea.setCaretPosition(consoleTextArea.getDocument().getLength());
  			}
  		});
  	}
  
  	public void setInitialMessage(final String output){
  		consoleTextArea.setText(output);
  		// Make it scroll to end
  		consoleTextArea.setCaretPosition(consoleTextArea.getDocument().getLength());
  	}
  
  	public void setMessage(final String output){
  		SwingUtilities.invokeLater(new Runnable() {
  			public void run() {
  				consoleTextArea.setText(output);
  				// Make it scroll to end
  				consoleTextArea.setCaretPosition(consoleTextArea.getDocument().getLength());
  			}
  		});
  	}
  
  	public void setOutput(final String output){
  		SwingUtilities.invokeLater(new Runnable() {
  			public void run() {
  				consoleTextArea.setText(output);
  				// Make it scroll to end
  				consoleTextArea.setCaretPosition(consoleTextArea.getDocument().getLength());
  			}
  		});
  	}
  
  
  	public void setTitle(final String title) {
  		SwingUtilities.invokeLater(new Runnable() {		
  			public void run() {
  				frame.setTitle(title);		
  			}
  		});	
  	}
  
  	public void setAlwaysOnTop(boolean alwaysOnTop) {
  		frame.setAlwaysOnTop(alwaysOnTop);
  	}
  
  	public void dispose() {
  		if(frame != null){
  			frame.dispose();		
  		}
  	}
  
  	public Component getFrame() {
  		return frame;
  	}
  
  	public void setVisible(final boolean b) {
  		SwingUtilities.invokeLater(new Runnable() {		
  			public void run() {
  				frame.setVisible(b);
  			}
  		});	
  	}
  
  
  
  
  }
  