1
2
3
4
5
6
7
8
9
10
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 }