View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2009 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 )
59  			throws HeadlessException
60  	{
61  		super( UISupport.getMainFrame() );
62  		setTitle( title );
63  		setModal( true );
64  
65  		setDefaultCloseOperation( JDialog.DO_NOTHING_ON_CLOSE );
66  		addWindowListener( new WindowAdapter()
67  		{
68  
69  			public void windowClosing( WindowEvent e )
70  			{
71  				if( runner != null && !runner.isRunning() )
72  					dispose();
73  				else
74  					UISupport.showErrorMessage( "Cannot close while task is running.." );
75  			}
76  		} );
77  
78  		progressBar = new JProgressBar( 0, 1 );
79  		progressBar.setValue( 0 );
80  		progressBar.setIndeterminate( false );
81  
82  		getContentPane().setLayout( new BorderLayout() );
83  
84  		if( description != null )
85  		{
86  			progressBar.setBorder( BorderFactory.createEmptyBorder( 10, 0, 0, 0 ) );
87  
88  			JPanel p = new JPanel( new BorderLayout() );
89  			p.add( new JLabel( description ), BorderLayout.NORTH );
90  			p.add( progressBar, BorderLayout.CENTER );
91  			p.setBorder( BorderFactory.createEmptyBorder( 10, 10, 10, 10 ) );
92  
93  			getContentPane().add( p, BorderLayout.NORTH );
94  		}
95  		else
96  		{
97  			progressBar.setBorder( BorderFactory.createEmptyBorder( 10, 10, 10, 10 ) );
98  
99  			getContentPane().add( progressBar, BorderLayout.NORTH );
100 		}
101 
102 		if( showLog )
103 			getContentPane().add( buildLog(), BorderLayout.CENTER );
104 
105 		if( allowCancel )
106 		{
107 			ButtonBarBuilder builder = ButtonBarBuilder.createLeftToRightBuilder();
108 			builder.addGlue();
109 			cancelButton = new JButton( new CancelAction() );
110 			builder.addFixed( cancelButton );
111 			builder.addUnrelatedGap();
112 
113 			if( showLog )
114 			{
115 				closeButton = new JButton( new CloseAction() );
116 				builder.addFixed( closeButton );
117 			}
118 
119 			builder.addGlue();
120 
121 			builder.setBorder( BorderFactory.createEmptyBorder( 0, 10, 10, 10 ) );
122 			getContentPane().add( builder.getPanel(), BorderLayout.SOUTH );
123 		}
124 		else if( showLog )
125 		{
126 			ButtonBarBuilder builder = ButtonBarBuilder.createLeftToRightBuilder();
127 			builder.addGlue();
128 
129 			closeButton = new JButton( new CloseAction() );
130 			builder.addFixed( closeButton );
131 			builder.addGlue();
132 
133 			builder.setBorder( BorderFactory.createEmptyBorder( 0, 10, 10, 10 ) );
134 			getContentPane().add( builder.getPanel(), BorderLayout.SOUTH );
135 		}
136 
137 		pack();
138 	}
139 
140 	private Component buildLog()
141 	{
142 		logArea = new JTextArea();
143 		logArea.setEditable( false );
144 		logArea.setBackground( Color.WHITE );
145 		JScrollPane scrollPane = new JScrollPane( logArea );
146 		scrollPane.setPreferredSize( new Dimension( 500, 300 ) );
147 
148 		return UISupport.wrapInEmptyPanel( scrollPane, BorderFactory.createEmptyBorder( 10, 10, 10, 10 ) );
149 	}
150 
151 	public void setProgress( String string )
152 	{
153 		progressBar.setString( string );
154 	}
155 
156 	public void run( ToolRunner toolRunner )
157 	{
158 		if( !SoapUI.getLogMonitor().hasLogArea( "toolLogger" ) )
159 			SoapUI.getLogMonitor().addLogArea( "tools", "toolLogger", false );
160 
161 		this.runner = toolRunner;
162 		runner.setContext( this );
163 		Thread thread = new Thread( runner, toolRunner.getName() );
164 		thread.start();
165 
166 		UISupport.centerDialog( this );
167 		setVisible( true );
168 	}
169 
170 	private class CancelAction extends AbstractAction
171 	{
172 		public CancelAction()
173 		{
174 			super( "Cancel" );
175 		}
176 
177 		public void actionPerformed( ActionEvent e )
178 		{
179 			if( runner.isRunning() )
180 				runner.cancel();
181 		}
182 	}
183 
184 	private final class CloseAction extends AbstractAction
185 	{
186 		public CloseAction()
187 		{
188 			super( "Close" );
189 			setEnabled( false );
190 		}
191 
192 		public void actionPerformed( ActionEvent e )
193 		{
194 			setVisible( false );
195 		}
196 	}
197 
198 	public void setCancelLabel( String label )
199 	{
200 		if( cancelButton != null )
201 			cancelButton.setText( label );
202 	}
203 
204 	public void setStatus( RunnerStatus status )
205 	{
206 		this.status = status;
207 
208 		if( status == RunnerStatus.RUNNING )
209 		{
210 			progressBar.setIndeterminate( true );
211 			if( cancelButton != null )
212 				cancelButton.setEnabled( true );
213 
214 			if( closeButton != null )
215 				closeButton.setEnabled( false );
216 		}
217 		else if( status == RunnerStatus.ERROR )
218 		{
219 			if( logArea == null )
220 			{
221 				setVisible( false );
222 				return;
223 			}
224 
225 			progressBar.setIndeterminate( false );
226 			progressBar.setValue( 0 );
227 			if( cancelButton != null )
228 				cancelButton.setEnabled( false );
229 
230 			if( closeButton != null )
231 				closeButton.setEnabled( true );
232 		}
233 		else if( status == RunnerStatus.FINISHED )
234 		{
235 			if( logArea == null )
236 			{
237 				setVisible( false );
238 				return;
239 			}
240 
241 			progressBar.setIndeterminate( false );
242 			progressBar.setValue( 1 );
243 			if( cancelButton != null )
244 				cancelButton.setEnabled( false );
245 
246 			if( closeButton != null )
247 				closeButton.setEnabled( true );
248 		}
249 	}
250 
251 	public void disposeContext()
252 	{
253 	}
254 
255 	public void log( String msg )
256 	{
257 		if( logArea == null )
258 			return;
259 
260 		logArea.insert( msg, logArea.getText().length() );
261 		log.info( msg );
262 		try
263 		{
264 			logArea.setCaretPosition( logArea.getLineStartOffset( logArea.getLineCount() - 1 ) );
265 		}
266 		catch( BadLocationException e )
267 		{
268 			SoapUI.logError( e );
269 			log.error( e.toString() );
270 		}
271 	}
272 
273 	public void logError( String msg )
274 	{
275 		log( msg );
276 	}
277 
278 	public RunnerStatus getStatus()
279 	{
280 		return status;
281 	}
282 }