001: /*
002: * soapUI, copyright (C) 2004-2007 eviware.com
003: *
004: * soapUI is free software; you can redistribute it and/or modify it under the
005: * terms of version 2.1 of the GNU Lesser General Public License as published by
006: * the Free Software Foundation.
007: *
008: * soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
009: * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
010: * See the GNU Lesser General Public License for more details at gnu.org.
011: */
012:
013: package com.eviware.soapui.impl.wsdl.actions.iface.tools.support;
014:
015: import java.awt.BorderLayout;
016: import java.awt.Color;
017: import java.awt.Component;
018: import java.awt.Dimension;
019: import java.awt.HeadlessException;
020: import java.awt.event.ActionEvent;
021: import java.awt.event.WindowAdapter;
022: import java.awt.event.WindowEvent;
023:
024: import javax.swing.AbstractAction;
025: import javax.swing.BorderFactory;
026: import javax.swing.JButton;
027: import javax.swing.JDialog;
028: import javax.swing.JLabel;
029: import javax.swing.JPanel;
030: import javax.swing.JProgressBar;
031: import javax.swing.JScrollPane;
032: import javax.swing.JTextArea;
033: import javax.swing.text.BadLocationException;
034:
035: import org.apache.log4j.Logger;
036:
037: import com.eviware.soapui.SoapUI;
038: import com.eviware.soapui.support.UISupport;
039: import com.jgoodies.forms.builder.ButtonBarBuilder;
040:
041: /**
042: * Dialog for creating progress-dialogs
043: *
044: * @author Ole.Matzura
045: */
046:
047: public class ProcessDialog extends JDialog implements RunnerContext {
048: private JProgressBar progressBar;
049: private JLabel progressLabel;
050: private JButton cancelButton;
051: private JTextArea logArea;
052: private JButton closeButton;
053: private ToolRunner runner;
054: private RunnerStatus status;
055: private final static Logger log = Logger.getLogger("toolLogger");
056:
057: public ProcessDialog(String title, String description,
058: boolean showLog, boolean allowCancel)
059: throws HeadlessException {
060: super (UISupport.getMainFrame());
061: setTitle(title);
062: setModal(true);
063:
064: setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
065: addWindowListener(new WindowAdapter() {
066:
067: public void windowClosing(WindowEvent e) {
068: if (runner != null && !runner.isRunning())
069: dispose();
070: else
071: UISupport
072: .showErrorMessage("Cannot close while task is running..");
073: }
074: });
075:
076: progressBar = new JProgressBar(0, 1);
077: progressBar.setValue(0);
078: progressBar.setIndeterminate(false);
079:
080: getContentPane().setLayout(new BorderLayout());
081:
082: if (description != null) {
083: progressBar.setBorder(BorderFactory.createEmptyBorder(10,
084: 0, 0, 0));
085:
086: JPanel p = new JPanel(new BorderLayout());
087: p.add(new JLabel(description), BorderLayout.NORTH);
088: p.add(progressBar, BorderLayout.CENTER);
089: p
090: .setBorder(BorderFactory.createEmptyBorder(10, 10,
091: 10, 10));
092:
093: getContentPane().add(p, BorderLayout.NORTH);
094: } else {
095: progressBar.setBorder(BorderFactory.createEmptyBorder(10,
096: 10, 10, 10));
097:
098: getContentPane().add(progressBar, BorderLayout.NORTH);
099: }
100:
101: if (showLog)
102: getContentPane().add(buildLog(), BorderLayout.CENTER);
103:
104: if (allowCancel) {
105: ButtonBarBuilder builder = ButtonBarBuilder
106: .createLeftToRightBuilder();
107: builder.addGlue();
108: cancelButton = new JButton(new CancelAction());
109: builder.addFixed(cancelButton);
110: builder.addUnrelatedGap();
111:
112: if (showLog) {
113: closeButton = new JButton(new CloseAction());
114: builder.addFixed(closeButton);
115: }
116:
117: builder.addGlue();
118:
119: builder.setBorder(BorderFactory.createEmptyBorder(0, 10,
120: 10, 10));
121: getContentPane()
122: .add(builder.getPanel(), BorderLayout.SOUTH);
123: } else if (showLog) {
124: ButtonBarBuilder builder = ButtonBarBuilder
125: .createLeftToRightBuilder();
126: builder.addGlue();
127:
128: closeButton = new JButton(new CloseAction());
129: builder.addFixed(closeButton);
130: builder.addGlue();
131:
132: builder.setBorder(BorderFactory.createEmptyBorder(0, 10,
133: 10, 10));
134: getContentPane()
135: .add(builder.getPanel(), BorderLayout.SOUTH);
136: }
137:
138: pack();
139: }
140:
141: private Component buildLog() {
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
149: .createEmptyBorder(10, 10, 10, 10));
150: }
151:
152: public void setProgress(String string) {
153: progressBar.setString(string);
154: }
155:
156: public void run(ToolRunner toolRunner) {
157: if (!SoapUI.getLogMonitor().hasLogArea("toolLogger"))
158: SoapUI.getLogMonitor().addLogArea("tools", "toolLogger",
159: 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: public CancelAction() {
172: super ("Cancel");
173: }
174:
175: public void actionPerformed(ActionEvent e) {
176: if (runner.isRunning())
177: runner.cancel();
178: }
179: }
180:
181: private final class CloseAction extends AbstractAction {
182: public CloseAction() {
183: super ("Close");
184: setEnabled(false);
185: }
186:
187: public void actionPerformed(ActionEvent e) {
188: setVisible(false);
189: }
190: }
191:
192: public void setCancelLabel(String label) {
193: if (cancelButton != null)
194: cancelButton.setText(label);
195: }
196:
197: public void setStatus(RunnerStatus status) {
198: this .status = status;
199:
200: if (status == RunnerStatus.RUNNING) {
201: progressBar.setIndeterminate(true);
202: if (cancelButton != null)
203: cancelButton.setEnabled(true);
204:
205: if (closeButton != null)
206: closeButton.setEnabled(false);
207: } else if (status == RunnerStatus.ERROR) {
208: if (logArea == null) {
209: setVisible(false);
210: return;
211: }
212:
213: progressBar.setIndeterminate(false);
214: progressBar.setValue(0);
215: if (cancelButton != null)
216: cancelButton.setEnabled(false);
217:
218: if (closeButton != null)
219: closeButton.setEnabled(true);
220: } else if (status == RunnerStatus.FINISHED) {
221: if (logArea == null) {
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: public void log(String msg) {
240: if (logArea == null)
241: return;
242:
243: logArea.insert(msg, logArea.getText().length());
244: log.info(msg);
245: try {
246: logArea.setCaretPosition(logArea.getLineStartOffset(logArea
247: .getLineCount() - 1));
248: } catch (BadLocationException e) {
249: SoapUI.logError(e);
250: log.error(e.toString());
251: }
252: }
253:
254: public void logError(String msg) {
255: log(msg);
256: }
257:
258: public RunnerStatus getStatus() {
259: return status;
260: }
261: }
|