/******************************************************************************* * Copyright (c) MOBAC developers * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package mobac.gui.dialogs; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import mobac.program.tilestore.berkeleydb.DelayedInterruptThread; import mobac.utilities.I18nUtils; import mobac.utilities.Utilities; import org.apache.log4j.Logger; public class WorkinprogressDialog extends JDialog implements WindowListener { private static final Logger log = Logger.getLogger(WorkinprogressDialog.class); private final ThreadFactory threadFactory; private Thread workerThread; public WorkinprogressDialog(Frame owner, String title) { this(owner, title, Executors.defaultThreadFactory()); } public WorkinprogressDialog(Frame owner, String title, ThreadFactory threadFactory) { super(owner, title, true); this.threadFactory = threadFactory; setLayout(new FlowLayout()); add(new JLabel(new ImageIcon(Utilities.getResourceImageUrl("ajax-loader.gif")))); setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); setLocationRelativeTo(owner); addWindowListener(this); JButton abort = new JButton(I18nUtils.localizedStringForKey("dlg_progress_about_btn")); abort.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { log.debug("User interrupted process"); WorkinprogressDialog.this.close(); } }); add(abort); pack(); } public void startWork(final Runnable r) { workerThread = threadFactory.newThread(new Runnable() { public void run() { try { r.run(); } catch (Exception e) { log.error(e.getMessage(), e); } finally { WorkinprogressDialog.this.close(); log.debug("Worker thread finished"); } } }); Thread t1 = new Thread() { @Override public void run() { setVisible(true); } }; t1.start(); } protected synchronized void abortWorking() { try { if (workerThread != null && !workerThread.isInterrupted()) { log.debug("User aborted process - interrupting worker thread"); workerThread.interrupt(); workerThread = null; } } catch (Exception e) { log.error(e.getMessage()); } } public void close() { abortWorking(); setVisible(false); } public void windowActivated(WindowEvent event) { } public void windowOpened(WindowEvent event) { workerThread.start(); } public void windowClosed(WindowEvent event) { abortWorking(); } public void windowClosing(WindowEvent event) { } public void windowDeactivated(WindowEvent event) { } public void windowDeiconified(WindowEvent event) { } public void windowIconified(WindowEvent event) { } public static void main(String[] args) { JFrame parentFrame = new JFrame(); parentFrame.setSize(500, 150); final JLabel jl = new JLabel(); jl.setText(I18nUtils.localizedStringForKey("dlg_progress_count")); parentFrame.add(BorderLayout.CENTER, jl); parentFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); parentFrame.setVisible(true); final WorkinprogressDialog dlg = new WorkinprogressDialog(parentFrame, I18nUtils.localizedStringForKey("dlg_progress_title"), DelayedInterruptThread.createThreadFactory()); final Thread t = new Thread() { @Override public void run() { try { for (int i = 0; i <= 500; i++) { jl.setText(String.format(I18nUtils.localizedStringForKey("dlg_progress_count_i"),i)); if (Thread.currentThread().isInterrupted()) { System.out.println("Aborted"); return; } Thread.sleep(25); } } catch (InterruptedException e) { System.out.println("Aborted"); return; } finally { dlg.setVisible(false); } } }; dlg.startWork(t); } }