/*
GNU GENERAL PUBLIC LICENSE
Copyright (C) 2006 The Lobo Project
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
verion 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 library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Contact info: lobochief@users.sourceforge.net
*/
/*
* Created on Jun 19, 2005
*/
package org.lobobrowser.gui;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.HeadlessException;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import org.lobobrowser.request.ClientletRequestHandler;
import org.lobobrowser.request.UserAgentImpl;
import org.lobobrowser.ua.NavigatorProgressEvent;
import org.lobobrowser.ua.UserAgentContext;
/**
* Progress window shown before a window is opened.
*/
public class ProgressWindow extends JFrame {
private static final long serialVersionUID = 7625806507431580931L;
private final OpenProgressBar statusProgressBar;
private final JLabel statusLabel;
/**
* @throws java.awt.HeadlessException
*/
public ProgressWindow() throws HeadlessException {
super(UserAgentImpl.getInstance().getName());
this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
final UserAgentContext uaContext = null; // TODO
final ImageIcon windowIcon = DefaultWindowFactory.getInstance().getDefaultImageIcon(uaContext);
if (windowIcon != null) {
this.setIconImage(windowIcon.getImage());
}
final Container contentPane = this.getContentPane();
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
final JPanel topPanel = new JPanel();
contentPane.add(topPanel);
contentPane.add(Box.createRigidArea(new Dimension(1, 18)));
final Border bevelBorder = new BevelBorder(BevelBorder.LOWERED);
final Border emptyBorder = new EmptyBorder(10, 10, 10, 10);
final Border border = new CompoundBorder(bevelBorder, emptyBorder);
topPanel.setBorder(border);
topPanel.setLayout(new BorderLayout());
this.statusProgressBar = new OpenProgressBar();
this.statusProgressBar.setStringPainted(true);
this.statusLabel = new JLabel();
topPanel.add(statusLabel, BorderLayout.NORTH);
topPanel.add(statusProgressBar, BorderLayout.CENTER);
}
public void updateProgress(final NavigatorProgressEvent event) {
statusLabel.setText(ClientletRequestHandler.getProgressMessage(event.getProgressType(), event.getUrl()));
final int value = event.getCurrentValue();
final int max = event.getMaxValue();
if (max == -1) {
statusProgressBar.setIndeterminate(true);
statusProgressBar.setValue(value);
statusProgressBar.setString(getSizeText(value));
statusProgressBar.repaint();
} else {
statusProgressBar.setIndeterminate(false);
statusProgressBar.setValue(value);
statusProgressBar.setMaximum(max);
if ((value == 0) || (max == 0)) {
statusProgressBar.setString("");
} else {
final int percent = (value * 100) / max;
statusProgressBar.setString(String.valueOf(percent) + "%");
}
statusProgressBar.repaint();
}
}
private static double round1(final double value) {
return Math.round(value * 10.0) / 10.0;
}
private static String getSizeText(final int numBytes) {
if (numBytes < 1024) {
return "";
} else {
final double numK = numBytes / 1024.0;
if (numK < 1024) {
return round1(numK) + " Kb";
} else {
final double numM = numK / 1024.0;
if (numM < 1024) {
return round1(numM) + " Mb";
} else {
final double numG = numM / 1024.0;
return round1(numG) + " Gb";
}
}
}
}
}