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 ) 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 }