package de.onyxbits.raccoon.gui;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.HashMap;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import com.akdeniz.googleplaycrawler.GooglePlay.DocV2;
import de.onyxbits.raccoon.BrowseUtil;
import de.onyxbits.raccoon.Messages;
import de.onyxbits.raccoon.io.Archive;
import de.onyxbits.raccoon.io.DownloadLogger;
import de.onyxbits.raccoon.io.FetchListener;
import de.onyxbits.raccoon.io.FetchService;
import de.onyxbits.raccoon.io.FileNode;
/**
* Display download progress and give the user a chance to cancel.
*
* @author patrick
*
*/
public class DownloadView extends JPanel implements ActionListener, FetchListener {
/**
*
*/
private static final long serialVersionUID = 1L;
private DownloadWorker worker;
private JProgressBar progress;
private JButton cancel;
private DocV2 doc;
private Archive archive;
private HashMap<String, Object> model;
private Vector<FileNode> files;
private JEditorPane info;
private DownloadView(Archive archive, DocV2 doc) {
this.doc = doc;
this.archive = archive;
this.cancel = new JButton(Messages.getString("DownloadView.0")); //$NON-NLS-1$
this.progress = new JProgressBar(0, 100);
this.progress.setString(Messages.getString("DownloadView.1")); //$NON-NLS-1$
this.progress.setStringPainted(true);
String pn = doc.getBackendDocid();
int vc = doc.getDetails().getAppDetails().getVersionCode();
File dest = archive.fileUnder(pn, vc);
model = new HashMap<String, Object>();
model.put("title", doc.getTitle());
model.put("path", dest.getParent());
model.put("pathuri", dest.getParentFile().toURI());
model.put("package", doc.getBackendDocid()); //$NON-NLS-1$
model.put("author", doc.getCreator()); //$NON-NLS-1$
model.put("size", Archive.humanReadableByteCount(doc.getDetails().getAppDetails() //$NON-NLS-1$
.getInstallationSize(), true));
File icon = SearchWorker.getImageCacheFile(doc.getBackendDocid(), 4);
if (icon.exists()) {
model.put("icon", icon.toURI()); //$NON-NLS-1$
}
else {
model.put("icon", getClass().getResource("/rsrc/icons/icon_missing.png").toString());
}
files = new Vector<FileNode>();
worker = new DownloadWorker(doc, archive, null);
JPanel container = new JPanel();
container.setOpaque(false);
container.add(progress);
container.add(cancel);
info = new HypertextPane(TmplTool.transform("download.html", model)); //$NON-NLS-1$
info.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
info.addHyperlinkListener(new BrowseUtil());
add(info);
add(container);
}
public static DownloadView create(Archive archive, DocV2 doc) {
DownloadView ret = new DownloadView(archive, doc);
ret.cancel.addActionListener(ret);
ret.setLayout(new BoxLayout(ret, BoxLayout.Y_AXIS));
ret.worker.addFetchListener(ret);
return ret;
}
public boolean isDownloaded() {
String pn = doc.getBackendDocid();
int vc = doc.getDetails().getAppDetails().getVersionCode();
return archive.fileUnder(pn, vc).exists();
}
public void addFetchListener(FetchListener listener) {
worker.addFetchListener(listener);
}
public void startWorker() {
worker.execute();
}
public void stopWorker() {
worker.cancel(true);
}
public boolean isDownloading() {
return !worker.isDone();
}
public void actionPerformed(ActionEvent event) {
if (event.getSource() == cancel) {
worker.cancel(true);
}
}
public boolean onChunk(FetchService src, long numBytes) {
float percent = (float) numBytes / (float) worker.totalBytes;
int tmp = (int) (100f * percent);
progress.setValue(tmp);
progress.setString(tmp + "%"); //$NON-NLS-1$
return false;
}
public void onComplete(FetchService src) {
progress.setString(Messages.getString("DownloadView.7")); //$NON-NLS-1$
progress.setValue(100);
cancel.setEnabled(false);
try {
DownloadLogger dl = new DownloadLogger(archive);
for (FileNode fn : files) {
dl.addEntry(fn.file);
}
}
catch (Exception e) {
e.printStackTrace();
}
}
public void onFailure(FetchService src, Exception e) {
if (e instanceof IndexOutOfBoundsException) {
progress.setString(Messages.getString("DownloadView.8")); //$NON-NLS-1$
}
else {
progress.setString(Messages.getString("DownloadView.9")); //$NON-NLS-1$
}
cancel.setEnabled(false);
}
public void onAborted(FetchService src) {
model.remove("files");
model.put("deleted_files", files);
info.setText(TmplTool.transform("download.html", model)); //$NON-NLS-1$
progress.setString(Messages.getString("DownloadView.10")); //$NON-NLS-1$
cancel.setEnabled(false);
}
@Override
public void onBeginFile(FetchService src, File file) {
files.add(new FileNode(file));
model.put("files", files);
info.setText(TmplTool.transform("download.html", model)); //$NON-NLS-1$
}
@Override
public void onFinishFile(FetchService src, File file) {
}
}