/*-
* Copyright (C) 2006-2008 Erik Larsson
*
* 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 3 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 org.catacombae.hfsexplorer;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.text.DecimalFormat;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import org.catacombae.hfsexplorer.gui.ExtractProgressPanel;
import org.catacombae.hfsexplorer.gui.ExtractSettingsPanel;
public class ExtractProgressDialog extends JDialog implements ExtractProgressMonitor {
private final ExtractProgressPanel progressPanel;
private final ExtractSettingsPanel settingsPanel;
private final ExtractProperties extractProperties;
private final JButton cancelButton;
private volatile boolean cancelSignaled = false;
private long completedSize = 0;
private long totalSize = -1;
private DecimalFormat sizeFormatter = new DecimalFormat("0.00");
public ExtractProgressDialog(Frame owner) {
this(owner, false);
}
private ExtractProgressDialog(Frame owner, boolean modal) {
super(owner, "Extracting...", modal);
final JPanel backgroundPanel = new JPanel();
extractProperties = new ExtractProperties();
progressPanel = new ExtractProgressPanel();
settingsPanel = new ExtractSettingsPanel(extractProperties);
cancelButton = progressPanel.cancelButton;
cancelButton.addActionListener(new ActionListener() {
/* @Override */
public void actionPerformed(ActionEvent ae) {
signalCancel();
}
});
progressPanel.addShowSettingsButtonListener(new ActionListener() {
/* @Override */
public void actionPerformed(ActionEvent e) {
boolean selected = progressPanel.getShowSettingsButtonSelected();
if(selected)
backgroundPanel.add(settingsPanel);
else
backgroundPanel.remove(settingsPanel);
pack();
}
});
backgroundPanel.setLayout(new BoxLayout(backgroundPanel, BoxLayout.PAGE_AXIS));
backgroundPanel.add(progressPanel);
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent we) {
requestCloseWindow();
}
});
add(backgroundPanel);
pack();
setLocationRelativeTo(null);
setResizable(false);
}
/* @Override */
public void updateCalculateDir(String dirname) {
progressPanel.updateCalculateDir(dirname);
}
/* @Override */
public void updateTotalProgress(double fraction, String message) {
progressPanel.updateTotalProgress(fraction, message);
}
/* @Override */
public void updateCurrentDir(String dirname) {
progressPanel.updateCurrentDir(dirname);
}
/* @Override */
public void updateCurrentFile(String filename, long fileSize) {
progressPanel.updateCurrentFile(filename, fileSize);
}
/* @Override */
public synchronized void signalCancel() {
cancelButton.setEnabled(false);
cancelSignaled = true;
}
/* @Override */
public boolean cancelSignaled() {
return cancelSignaled;
}
/* @Override */
public void confirmCancel() {
if(isVisible())
dispose();
}
private synchronized void requestCloseWindow() {
if(!cancelSignaled)
signalCancel();
dispose();
}
/* @Override */
public void setDataSize(long totalSize) {
this.totalSize = totalSize;
addDataProgress(0);
}
/* @Override */
public void addDataProgress(long dataSize) {
completedSize += dataSize;
String message = SpeedUnitUtils.bytesToBinaryUnit(completedSize, sizeFormatter) + "/" +
SpeedUnitUtils.bytesToBinaryUnit(totalSize, sizeFormatter);
updateTotalProgress(((double) completedSize) / totalSize, message);
}
/*
@Override
public boolean confirmOverwriteDirectory(File dir) {
return SimpleGUIProgressMonitor.confirmOverwriteDirectory(this, dir);
}
@Override
public boolean confirmSkipDirectory(String... messageLines) {
return SimpleGUIProgressMonitor.confirmSkipDirectory(this, messageLines);
}
*/
/* @Override */
public CreateDirectoryFailedAction createDirectoryFailed(String dirname, File parentDirectory) {
return SimpleGUIProgressMonitor.createDirectoryFailed(this, dirname, parentDirectory);
}
/* @Override */
public CreateFileFailedAction createFileFailed(String filename, File parentDirectory) {
return SimpleGUIProgressMonitor.createFileFailed(this, filename, parentDirectory);
}
/* @Override */
public DirectoryExistsAction directoryExists(File directory) {
return SimpleGUIProgressMonitor.directoryExists(this, directory);
}
/* @Override */
public FileExistsAction fileExists(File file) {
return SimpleGUIProgressMonitor.fileExists(this, file);
}
/* @Override */
public UnhandledExceptionAction unhandledException(String filename,
Throwable t)
{
return SimpleGUIProgressMonitor.unhandledException(this, filename, t);
}
/* @Override */
public String displayRenamePrompt(String currentName, File outDir) {
return SimpleGUIProgressMonitor.displayRenamePrompt(this, currentName, outDir);
}
/* @Override */
public ExtractProperties getExtractProperties() {
return extractProperties;
}
/*
public static void main(String[] args) {
ExtractProgressDialog d = new ExtractProgressDialog(null);
d.pack();
d.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
d.setLocationRelativeTo(null);
d.setVisible(true);
}
*/
}