/******************************************************************************* * Copyright (c) 2014 Jeff Martin. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser General Public * License v3.0 which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl.html * * Contributors: * Jeff Martin - initial API and implementation ******************************************************************************/ package cuchaz.enigma.gui; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.WindowConstants; import cuchaz.enigma.Constants; import cuchaz.enigma.Deobfuscator.ProgressListener; public class ProgressDialog implements ProgressListener, AutoCloseable { private JFrame m_frame; private JLabel m_title; private JLabel m_text; private JProgressBar m_progress; public ProgressDialog( JFrame parent ) { // init frame m_frame = new JFrame( Constants.Name + " - Operation in progress" ); final Container pane = m_frame.getContentPane(); FlowLayout layout = new FlowLayout(); layout.setAlignment( FlowLayout.LEFT ); pane.setLayout( layout ); m_title = new JLabel(); pane.add( m_title ); // set up the progress bar JPanel panel = new JPanel(); pane.add( panel ); panel.setLayout( new BorderLayout() ); m_text = GuiTricks.unboldLabel( new JLabel() ); m_progress = new JProgressBar(); m_text.setBorder( BorderFactory.createEmptyBorder( 0, 0, 10, 0 ) ); panel.add( m_text, BorderLayout.NORTH ); panel.add( m_progress, BorderLayout.CENTER ); panel.setPreferredSize( new Dimension( 360, 50 ) ); // show the frame pane.doLayout(); m_frame.setSize( 400, 120 ); m_frame.setResizable( false ); m_frame.setLocationRelativeTo( parent ); m_frame.setVisible( true ); m_frame.setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE ); } public void close( ) { m_frame.dispose(); } @Override public void init( int totalWork, String title ) { m_title.setText( title ); m_progress.setMinimum( 0 ); m_progress.setMaximum( totalWork ); m_progress.setValue( 0 ); } @Override public void onProgress( int numDone, String message ) { m_text.setText( message ); m_progress.setValue( numDone ); // update the frame m_frame.validate(); m_frame.repaint(); } public static interface ProgressRunnable { void run( ProgressListener listener ) throws Exception; } public static void runInThread( final JFrame parent, final ProgressRunnable runnable ) { new Thread( ) { @Override public void run( ) { try( ProgressDialog progress = new ProgressDialog( parent ) ) { runnable.run( progress ); } catch( Exception ex ) { throw new Error( ex ); } } }.start(); } }