content: package aliview.subprocesses;
  
  import java.awt.BorderLayout;
  import java.awt.Color;
  import java.awt.Component;
  import java.awt.Dimension;
  import java.awt.Toolkit;
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  import java.awt.event.WindowAdapter;
  import java.awt.event.WindowEvent;
  import java.io.IOException;
  import java.io.InputStream;
  
  import javax.swing.Icon;
  import javax.swing.JCheckBox;
  import javax.swing.JDialog;
  import javax.swing.JFrame;
  import javax.swing.JInternalFrame;
  import javax.swing.JPanel;
  import javax.swing.JScrollPane;
  import javax.swing.JTextArea;
  import javax.swing.SwingConstants;
  import javax.swing.SwingUtilities;
  
  import org.apache.log4j.Logger;
  
  import aliview.gui.AppIcons;
  import aliview.messenges.Messenger;
  import aliview.settings.Settings;
  import utils.DialogUtils;
  
  
  public class SubProcessWindow{
  
  	private JDialog dialog;
  	private static final Logger logger = Logger.getLogger(SubProcessWindow.class);
  	private Process subProcess;
  	private JTextArea consoleTextArea;
  	//JScrollPane scrollPane;
  	private boolean subProcessDestrouedByUser = false;
  	private Dimension preferredSize = new Dimension(500,350);
  	private JFrame parentFrame;
  	private JCheckBox closeAutomaticCbx = new JCheckBox("Default checkbox message");
  
  	public SubProcessWindow(JFrame parentFrame){
  		init(parentFrame, false);
  	}
  
  	public SubProcessWindow(JFrame parentFrame, boolean withAutoCloseWhenDoneCbx) {
  		init(parentFrame, true);
  	}
  
  	public static SubProcessWindow getProcessProgressWindow(JFrame parentFrame, boolean autoCloseWhenDoneCbxSelected){
  
  		SubProcessWindow procWin = new SubProcessWindow(parentFrame, true);
  
  		procWin.closeAutomaticCbx.setText("Close this type of progress window automatically when done");
  		procWin.closeAutomaticCbx.setSelected(autoCloseWhenDoneCbxSelected);
  		procWin.closeAutomaticCbx.addActionListener(new ActionListener() {
  			public void actionPerformed(ActionEvent e) {
  				JCheckBox box = (JCheckBox) e.getSource();
  				Settings.getHideProcessProgressWindowWhenDone().putBooleanValue(box.isSelected());
  			}
  		});
  
  		return procWin;
  	}
  
  
  	public void init(final JFrame parentFrame, boolean withAutocloseBox){
  
  		this.parentFrame = parentFrame;
  		dialog = new JDialog(parentFrame);
  
  		consoleTextArea = new JTextArea();
  		JScrollPane scrollPane = new JScrollPane(consoleTextArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
  
  		dialog.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
  		dialog.addWindowListener(new WindowAdapter() {		
  			public void windowClosing(WindowEvent e) {
  
  				// destroy subprocess if there is one
  				if(subProcess != null){
  					logger.info("destroy-subprocess");
  
  					// On windows there is a risk that closing stream command takes a long
  					// time to return or blocks - therefore do it in a separate thread
  
  					// Even better - Dont close streams - it might block on windows
  
  					//					Thread thread = new Thread(new Runnable(){
  					//						public void run(){
  					//								try {
  					//									subProcess.getInputStream().close();
  					//									subProcess.getOutputStream().close();
  					//								} catch (IOException e) {
  					//									// TODO Auto-generated catch block
  					//									e.printStackTrace();
  					//								}	
  					//							}
  					//					});
  					//					thread.start();
  
  
  					logger.info("before destroy");
  					subProcessDestrouedByUser = true;
  					subProcess.destroy();		
  					logger.info("now after destroy");
  					
  					Messenger.showOKOnlyMessage(Messenger.SUBPROCESS_CANCELLED_SUCCESSFULLY, parentFrame);
  					
  				}
  				// and close window
  				dialog.dispose();
  			}
  		});
  
  		dialog.getContentPane().add(scrollPane, BorderLayout.CENTER);
  
  
  
  		if(withAutocloseBox){
  			closeAutomaticCbx.setHorizontalAlignment(SwingConstants.CENTER);
  			dialog.getContentPane().add(closeAutomaticCbx, BorderLayout.SOUTH);
  		}
  
  
  		dialog.setTitle("Sub Process Window");
  		dialog.setIconImage(AppIcons.getProgramIconImage());
  		dialog.setIconImage(Toolkit.getDefaultToolkit().getImage(SubProcessWindow.class.getResource("/img/alignment_ico_128x128.png")));
  
  	}
  
  	public void show(){
  		dialog.setPreferredSize(this.preferredSize);
  		dialog.pack();
  		// center
  		if(parentFrame != null){
  			int newX = parentFrame.getX() + parentFrame.getWidth()/2 - dialog.getPreferredSize().width/2;
  			int newY = parentFrame.getY() + parentFrame.getHeight()/2 - dialog.getPreferredSize().height/2;
  			dialog.setLocation(newX, newY);
  		}
  		dialog.setVisible(true);
  	}
  
  	public void setPreferredSize(Dimension prefSize){
  		this.preferredSize = prefSize;
  	}	
  
  	public SubProcessWindow(Process subprocess) {
  		super();
  		this.subProcess = subprocess;
  	}
  
  	public boolean wasSubProcessDestrouedByUser() {
  		return subProcessDestrouedByUser;
  	}
  
  	public void setActiveProcess(Process subProcess){
  		this.subProcess = subProcess;	
  	}	
  
  	public void placeFrameupperLeftLocationOfThis(Component parent){
  		if(parent != null){
  			int newX = parent.getX() + 100;
  			int newY = parent.getY() + 100;
  			dialog.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 setMessage(final String output){
  		setOutput(output);
  	}
  
  	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(String title) {
  		dialog.setTitle(title);
  
  	}
  
  	public void setAlwaysOnTop(boolean alwaysOnTop) {
  		dialog.setAlwaysOnTop(alwaysOnTop);
  
  	}
  
  	public void dispose() {
  		if(dialog != null){
  			dialog.dispose();		
  		}
  	}
  
  	public Component getFrame() {
  		return dialog;
  	}
  
  	public void setVisible(boolean b) {
  		// TODO Auto-generated method stub	
  	}
  
  	public boolean isCloseWhenDoneCbxSelected() {
  		if(closeAutomaticCbx != null){
  			return closeAutomaticCbx.isSelected();
  		}else{
  			return false;
  		}
  	}
  
  	public void setCloseWhenDoneCbxSelection(boolean booleanValue) {
  		if(closeAutomaticCbx != null){
  			closeAutomaticCbx.setSelected(booleanValue);
  		}
  	}
  
  	public void setCloseWhenDoneCbxText(String text) {
  		if(closeAutomaticCbx != null){
  			closeAutomaticCbx.setText(text);
  		}
  	}
  
  }
  