/******************************************************************************* * Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com) * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v3 * which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt ******************************************************************************/ package com.opendoorlogistics.studio.dialogs; import java.awt.Dimension; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.concurrent.Callable; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.SwingWorker; import com.opendoorlogistics.studio.panels.ProgressPanel; import com.opendoorlogistics.studio.panels.ProgressPanel.ProgressReporter; final public class ProgressDialog<TResult> extends JDialog implements PropertyChangeListener, ProgressReporter { public static final String USER_MESSAGE_PROP = "UserMessage"; private final ProgressPanel panel; private boolean isDisposed = false; // private JProgressBar progressBar; // private JTextArea taskOutput; // private JButton finishNowButton; // private JButton cancelButton; // private volatile boolean cancelled; // private volatile boolean finishNow; public interface OnFinishedSwingThreadCB<TResult> { void onFinished(TResult result, boolean userCancelled, boolean userFinishedNow); } private class MyTask extends SwingWorker<TResult, Void> { private Callable<TResult> runnable; private OnFinishedSwingThreadCB<TResult> cb; private TResult result; public MyTask(Callable<TResult> runnable, OnFinishedSwingThreadCB<TResult> cb) { super(); this.runnable = runnable; this.cb = cb; } /* * Main task. Executed in background thread. */ @Override public TResult doInBackground() { try { result = runnable.call(); return result; } catch (Throwable e) { throw new RuntimeException(e); } } /* * Executed in event dispatch thread */ @Override public void done() { runnable = null; dispose(); cb.onFinished(result, panel.isCancelled(), panel.isFinishedNow()); } } public void setText(String text) { panel.setText(text); } public ProgressDialog(JFrame frame, String title, boolean showFinishNow, boolean showCancel) { super(frame, true); setTitle(title); // JPanel mainPanel = new JPanel(); // mainPanel.setLayout(new BorderLayout()); panel = new ProgressPanel(showFinishNow,showCancel); setContentPane(panel); setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); addWindowListener(new WindowListener() { @Override public void windowOpened(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowIconified(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowDeiconified(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowDeactivated(WindowEvent e) { // TODO Auto-generated method stub } @Override public void windowClosing(WindowEvent e) { panel.cancel(); } @Override public void windowClosed(WindowEvent e) { // set cancel button disabled } @Override public void windowActivated(WindowEvent e) { // TODO Auto-generated method stub } }); setMinimumSize(new Dimension(ProgressPanel.STANDARD_DIALOG_WIDTH, ProgressPanel.STANDARD_DIALOG_HEIGHT)); pack(); } public void start(Callable<TResult> runnable, OnFinishedSwingThreadCB<TResult> onFinished) { MyTask task = new MyTask(runnable, onFinished); start(task); } public void start(SwingWorker<?, ?> task) { task.addPropertyChangeListener(this); // the task itself will shutdown the progress bar afterwards... task.execute(); start(); } public void start() { panel.start(); setVisible(true); } // public DependencyInjector getGuiFascade(){ // return guiFascade; // } // /** * Invoked when task's progress property changes. */ @Override public void propertyChange(PropertyChangeEvent evt) { if (evt.getPropertyName().equals(USER_MESSAGE_PROP)) { panel.setText((String) evt.getNewValue()); // taskOutput.setText((String)evt.getNewValue()); } } public boolean isFinishedNow() { return panel.isFinishedNow(); } public boolean isCancelled() { return panel.isCancelled(); } @Override public ProgressPanel getProgressPanel() { return panel; } @Override public void dispose() { if (!isDisposed) { isDisposed = true; super.dispose(); } } @Override public boolean isDisposed() { return isDisposed; } }