View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2007 eviware.com 
3    *
4    *  soapUI is free software; you can redistribute it and/or modify it under the 
5    *  terms of version 2.1 of the GNU Lesser General Public License as published by 
6    *  the Free Software Foundation.
7    *
8    *  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 
9    *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
10   *  See the GNU Lesser General Public License for more details at gnu.org.
11   */
12  
13  package com.eviware.soapui.impl.wsdl.actions.iface.tools.support;
14  
15  import java.awt.BorderLayout;
16  import java.awt.Color;
17  import java.awt.Component;
18  import java.awt.Dimension;
19  import java.awt.HeadlessException;
20  import java.awt.event.ActionEvent;
21  import java.awt.event.WindowAdapter;
22  import java.awt.event.WindowEvent;
23  
24  import javax.swing.AbstractAction;
25  import javax.swing.BorderFactory;
26  import javax.swing.JButton;
27  import javax.swing.JDialog;
28  import javax.swing.JLabel;
29  import javax.swing.JPanel;
30  import javax.swing.JProgressBar;
31  import javax.swing.JScrollPane;
32  import javax.swing.JTextArea;
33  import javax.swing.text.BadLocationException;
34  
35  import org.apache.log4j.Logger;
36  
37  import com.eviware.soapui.SoapUI;
38  import com.eviware.soapui.support.UISupport;
39  import com.jgoodies.forms.builder.ButtonBarBuilder;
40  
41  /***
42   * Dialog for creating progress-dialogs
43   * 
44   * @author Ole.Matzura
45   */
46  
47  public class ProcessDialog extends JDialog implements RunnerContext
48  {
49     private JProgressBar progressBar;
50     private JLabel progressLabel;
51  	private JButton cancelButton;
52  	private JTextArea logArea;
53  	private JButton closeButton;
54  	private ToolRunner runner;
55  	private RunnerStatus status;
56  	private final static Logger log = Logger.getLogger("toolLogger");
57  
58     public ProcessDialog( String title, String description, boolean showLog, boolean allowCancel ) throws HeadlessException
59     {
60     	super( UISupport.getMainFrame() );
61     	setTitle( title );
62     	setModal( true );
63     	
64        setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
65        addWindowListener( new WindowAdapter() {
66  
67  			public void windowClosing(WindowEvent e)
68  			{
69  				if( runner != null && !runner.isRunning() )
70  					dispose();
71  				else 
72  					UISupport.showErrorMessage( "Cannot close while task is running.." );
73  			}} );
74  
75        progressBar = new JProgressBar( 0, 1 );
76        progressBar.setValue( 0 );
77        progressBar.setIndeterminate(false);
78        
79        getContentPane().setLayout(new BorderLayout());
80  
81        if( description != null )
82        {
83        	progressBar.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0));
84        	
85  	      JPanel p = new JPanel( new BorderLayout() );
86  	      p.add( new JLabel( description ), BorderLayout.NORTH );
87  	      p.add( progressBar, BorderLayout.CENTER );
88  	      p.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
89  	      
90  	      getContentPane().add( p, BorderLayout.NORTH);
91        }
92        else
93        {
94        	progressBar.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
95        	
96        	getContentPane().add(progressBar , BorderLayout.NORTH);
97        }
98        
99        if( showLog )
100       	getContentPane().add( buildLog(), BorderLayout.CENTER );
101       
102       if( allowCancel )
103       {
104 	      ButtonBarBuilder builder = ButtonBarBuilder.createLeftToRightBuilder();	
105 	      builder.addGlue();
106 	      cancelButton = new JButton( new CancelAction());
107 	      builder.addFixed( cancelButton );
108 	      builder.addUnrelatedGap();
109 	
110 	      if( showLog )
111 	      {
112 		      closeButton = new JButton( new CloseAction() );
113 				builder.addFixed( closeButton);
114 	      }
115 
116 	      builder.addGlue();
117 	      
118 	      builder.setBorder( BorderFactory.createEmptyBorder(0, 10, 10, 10) );
119 	      getContentPane().add( builder.getPanel(), BorderLayout.SOUTH );
120       }
121       
122       pack();
123    }
124    
125    private Component buildLog()
126 	{
127 		logArea = new JTextArea();
128 		logArea.setEditable( false );
129 		logArea.setBackground( Color.WHITE );
130 		JScrollPane scrollPane = new JScrollPane( logArea );
131 		scrollPane.setPreferredSize( new Dimension (500, 300 ));
132 		
133 		return UISupport.wrapInEmptyPanel( scrollPane, BorderFactory.createEmptyBorder( 10, 10, 10, 10 ) );
134 	}
135 
136 	public void setProgress( String string )
137    {
138       progressBar.setString( string );
139    }
140 	
141 	public void run( ToolRunner toolRunner )
142 	{
143 		if( !SoapUI.getLogMonitor().hasLogArea( "toolLogger"))
144 			SoapUI.getLogMonitor().addLogArea( "tools", "toolLogger", false );
145 		
146 		this.runner = toolRunner;
147 		runner.setContext( this );
148 		Thread thread = new Thread( runner );
149 		thread.start();
150 		
151 		UISupport.centerDialog( this );
152 		setVisible( true );
153 	}
154    
155    private class CancelAction extends AbstractAction
156    {
157    	public CancelAction()
158    	{
159    		super( "Cancel" );
160    	}
161    	
162 		public void actionPerformed(ActionEvent e)
163 		{
164 			if( runner.isRunning() )
165 				runner.cancel();
166 		}
167    }
168    
169    private final class CloseAction extends AbstractAction
170    {
171    	public CloseAction()
172    	{
173    		super( "Close" );
174    		setEnabled( false );
175    	}
176    	
177 		public void actionPerformed(ActionEvent e)
178 		{
179 			setVisible( false );
180 		}
181    }
182 
183 	public void setCancelLabel(String label)
184 	{
185 		if( cancelButton != null )
186 			cancelButton.setText( label );
187 	}
188 	
189 	public void setStatus(RunnerStatus status)
190 	{
191 		this.status = status;
192 
193 		if( status == RunnerStatus.RUNNING )
194 		{ 
195 			progressBar.setIndeterminate( true );
196 			if( cancelButton != null )
197 				cancelButton.setEnabled( true );
198 			
199 			if( closeButton != null )
200 				closeButton.setEnabled( false );
201 		}
202 		else if( status == RunnerStatus.ERROR )
203 		{ 
204 			if( logArea == null )
205 			{
206 				setVisible( false );
207 				return;
208 			}
209 			
210 			progressBar.setIndeterminate( false );
211 			progressBar.setValue( 0 );
212 			if( cancelButton != null )
213 				cancelButton.setEnabled( false );
214 
215 			if( closeButton != null )
216 				closeButton.setEnabled( true );
217 		}
218 		else if( status == RunnerStatus.FINISHED )
219 		{ 
220 			if( logArea == null )
221 			{
222 				setVisible( false );
223 				return;
224 			}
225 			
226 			progressBar.setIndeterminate( false );
227 			progressBar.setValue( 1 );
228 			if( cancelButton != null )
229 				cancelButton.setEnabled( false );
230 
231 			if( closeButton != null )
232 				closeButton.setEnabled( true );
233 		}
234 	}
235 
236    public void disposeContext()
237    {
238    }
239    
240 	public void log(String msg )
241 	{
242 		if( logArea == null )
243 			return;
244 		
245 		logArea.insert( msg, logArea.getText().length() );
246 		log.info( msg );
247 		try
248 		{
249 			logArea.setCaretPosition( logArea.getLineStartOffset( logArea.getLineCount()-1 ));
250 		}
251 		catch (BadLocationException e)
252 		{
253 			e.printStackTrace();
254 			log.error( e.toString() );
255 		}
256 	}
257 
258    public void logError( String msg )
259    {
260       log(msg);
261    }
262 
263 	public RunnerStatus getStatus()
264 	{
265 		return status;
266 	}
267 }