/* * SoapUI, Copyright (C) 2004-2016 SmartBear Software * * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent * versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://ec.europa.eu/idabc/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the Licence for the specific language governing permissions and limitations * under the Licence. */ package com.eviware.soapui.impl.wsdl.actions.iface.tools.support; import com.eviware.soapui.SoapUI; import com.eviware.soapui.support.UISupport; import com.jgoodies.forms.builder.ButtonBarBuilder; import org.apache.log4j.Logger; import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.text.BadLocationException; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.HeadlessException; import java.awt.event.ActionEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; /** * Dialog for creating progress-dialogs * * @author Ole.Matzura */ public class ProcessDialog extends JDialog implements RunnerContext { private JProgressBar progressBar; private JLabel progressLabel; private JButton cancelButton; private JTextArea logArea; private JButton closeButton; private ToolRunner runner; private RunnerStatus status; private final static Logger log = Logger.getLogger("toolLogger"); public ProcessDialog(String title, String description, boolean showLog, boolean allowCancel) throws HeadlessException { super(UISupport.getMainFrame()); setTitle(title); setModal(true); setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { if (runner != null && !runner.isRunning()) { dispose(); } else { UISupport.showErrorMessage("Cannot close while task is running.."); } } }); progressBar = new JProgressBar(0, 1); progressBar.setValue(0); progressBar.setIndeterminate(false); getContentPane().setLayout(new BorderLayout()); if (description != null) { progressBar.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); JPanel p = new JPanel(new BorderLayout()); p.add(new JLabel(description), BorderLayout.NORTH); p.add(progressBar, BorderLayout.CENTER); p.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); getContentPane().add(p, BorderLayout.NORTH); } else { progressBar.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); getContentPane().add(progressBar, BorderLayout.NORTH); } if (showLog) { getContentPane().add(buildLog(), BorderLayout.CENTER); } if (allowCancel) { ButtonBarBuilder builder = ButtonBarBuilder.createLeftToRightBuilder(); builder.addGlue(); cancelButton = new JButton(new CancelAction()); builder.addFixed(cancelButton); builder.addUnrelatedGap(); if (showLog) { closeButton = new JButton(new CloseAction()); builder.addFixed(closeButton); } builder.addGlue(); builder.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10)); getContentPane().add(builder.getPanel(), BorderLayout.SOUTH); } else if (showLog) { ButtonBarBuilder builder = ButtonBarBuilder.createLeftToRightBuilder(); builder.addGlue(); closeButton = new JButton(new CloseAction()); builder.addFixed(closeButton); builder.addGlue(); builder.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10)); getContentPane().add(builder.getPanel(), BorderLayout.SOUTH); } pack(); } private Component buildLog() { logArea = new JTextArea(); logArea.setEditable(false); logArea.setBackground(Color.WHITE); JScrollPane scrollPane = new JScrollPane(logArea); scrollPane.setPreferredSize(new Dimension(500, 300)); return UISupport.wrapInEmptyPanel(scrollPane, BorderFactory.createEmptyBorder(10, 10, 10, 10)); } public void setProgress(String string) { progressBar.setString(string); } public void run(ToolRunner toolRunner) { if (!SoapUI.getLogMonitor().hasLogArea("toolLogger")) { SoapUI.getLogMonitor().addLogArea("tools", "toolLogger", false); } this.runner = toolRunner; runner.setContext(this); Thread thread = new Thread(runner, toolRunner.getName()); thread.start(); UISupport.centerDialog(this); setVisible(true); } private class CancelAction extends AbstractAction { public CancelAction() { super("Cancel"); } public void actionPerformed(ActionEvent e) { if (runner.isRunning()) { runner.cancel(); } } } private final class CloseAction extends AbstractAction { public CloseAction() { super("Close"); setEnabled(false); } public void actionPerformed(ActionEvent e) { setVisible(false); } } public void setCancelLabel(String label) { if (cancelButton != null) { cancelButton.setText(label); } } public void setStatus(RunnerStatus status) { this.status = status; if (status == RunnerStatus.RUNNING) { progressBar.setIndeterminate(true); if (cancelButton != null) { cancelButton.setEnabled(true); } if (closeButton != null) { closeButton.setEnabled(false); } } else if (status == RunnerStatus.ERROR) { if (logArea == null) { setVisible(false); return; } progressBar.setIndeterminate(false); progressBar.setValue(0); if (cancelButton != null) { cancelButton.setEnabled(false); } if (closeButton != null) { closeButton.setEnabled(true); } } else if (status == RunnerStatus.FINISHED) { if (logArea == null) { setVisible(false); return; } progressBar.setIndeterminate(false); progressBar.setValue(1); if (cancelButton != null) { cancelButton.setEnabled(false); } if (closeButton != null) { closeButton.setEnabled(true); } } } public void disposeContext() { } public void log(String msg) { if (logArea == null) { return; } logArea.insert(msg, logArea.getText().length()); log.info(msg); try { logArea.setCaretPosition(logArea.getLineStartOffset(logArea.getLineCount() - 1)); } catch (BadLocationException e) { SoapUI.logError(e); log.error(e.toString()); } } public void logError(String msg) { log(msg); } public RunnerStatus getStatus() { return status; } }