diff --git a/gui/griffon-app/conf/Config.groovy b/gui/griffon-app/conf/Config.groovy index f019ca33..b99a2191 100644 --- a/gui/griffon-app/conf/Config.groovy +++ b/gui/griffon-app/conf/Config.groovy @@ -106,4 +106,9 @@ mvcGroups { view = 'com.muwire.gui.SharedFileView' controller = 'com.muwire.gui.SharedFileController' } + 'download-preview' { + model = "com.muwire.gui.DownloadPreviewModel" + view = "com.muwire.gui.DownloadPreviewView" + controller = "com.muwire.gui.DownloadPreviewController" + } } diff --git a/gui/griffon-app/controllers/com/muwire/gui/DownloadPreviewController.groovy b/gui/griffon-app/controllers/com/muwire/gui/DownloadPreviewController.groovy new file mode 100644 index 00000000..43671fde --- /dev/null +++ b/gui/griffon-app/controllers/com/muwire/gui/DownloadPreviewController.groovy @@ -0,0 +1,13 @@ +package com.muwire.gui + +import griffon.core.artifact.GriffonController +import griffon.core.controller.ControllerAction +import griffon.inject.MVCMember +import griffon.metadata.ArtifactProviderFor +import javax.annotation.Nonnull + +@ArtifactProviderFor(GriffonController) +class DownloadPreviewController { + @MVCMember @Nonnull + DownloadPreviewModel model +} \ No newline at end of file diff --git a/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy b/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy index 53ab0f1a..ec049d5e 100644 --- a/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy +++ b/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy @@ -208,11 +208,9 @@ class MainFrameController { @ControllerAction void preview() { def downloader = model.downloads[selectedDownload()].downloader - File previewFile = downloader.generatePreview() - if (previewFile != null) - Desktop.getDesktop().open(previewFile) - else - JOptionPane.showMessageDialog(null, "Failed to generate preview", "Failed to generate preveiw", JOptionPane.ERROR_MESSAGE) + def params = [:] + params['downloader'] = downloader + mvcGroup.createMVCGroup("download-preview", params) } @ControllerAction diff --git a/gui/griffon-app/models/com/muwire/gui/DownloadPreviewModel.groovy b/gui/griffon-app/models/com/muwire/gui/DownloadPreviewModel.groovy new file mode 100644 index 00000000..97db81a5 --- /dev/null +++ b/gui/griffon-app/models/com/muwire/gui/DownloadPreviewModel.groovy @@ -0,0 +1,12 @@ +package com.muwire.gui + +import com.muwire.core.download.Downloader + +import griffon.core.artifact.GriffonModel +import griffon.transform.Observable +import griffon.metadata.ArtifactProviderFor + +@ArtifactProviderFor(GriffonModel) +class DownloadPreviewModel { + Downloader downloader +} \ No newline at end of file diff --git a/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy b/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy index 03deac98..258e432b 100644 --- a/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy @@ -100,6 +100,7 @@ class MainFrameModel { @Observable boolean retryButtonEnabled @Observable boolean pauseButtonEnabled @Observable boolean clearButtonEnabled + @Observable boolean previewButtonEnabled @Observable String resumeButtonText @Observable boolean addCommentButtonEnabled @Observable boolean subscribeButtonEnabled diff --git a/gui/griffon-app/views/com/muwire/gui/DownloadPreviewView.groovy b/gui/griffon-app/views/com/muwire/gui/DownloadPreviewView.groovy new file mode 100644 index 00000000..81caf38d --- /dev/null +++ b/gui/griffon-app/views/com/muwire/gui/DownloadPreviewView.groovy @@ -0,0 +1,61 @@ +package com.muwire.gui + +import griffon.core.artifact.GriffonView +import griffon.inject.MVCMember +import griffon.metadata.ArtifactProviderFor + +import javax.swing.Box +import javax.swing.JDialog +import javax.swing.JOptionPane +import javax.swing.SwingConstants + +import java.awt.event.WindowAdapter +import java.awt.event.WindowEvent + +import javax.annotation.Nonnull + +@ArtifactProviderFor(GriffonView) +class DownloadPreviewView { + @MVCMember @Nonnull + FactoryBuilderSupport builder + @MVCMember @Nonnull + DownloadPreviewModel model + + def mainFrame + def dialog + def panel + + void initUI() { + mainFrame = application.windowManager.findWindow("main-frame") + + dialog = new JDialog(mainFrame, "Generating Preview", true) + + panel = builder.panel { + vbox { + label(text : "Generating preview for "+model.downloader.file.getName()) + Box.createVerticalGlue() + progressBar(indeterminate : true) + } + } + + dialog.getContentPane().add(panel) + dialog.pack() + dialog.setResizable(false) + dialog.setLocationRelativeTo(mainFrame) + dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE) + dialog.addWindowListener(new WindowAdapter() { + public void windowClosed(WindowEvent e) { + mainFrame.setVisible(false) + mvcGroup.destroy() + } + }) + } + + void mvcGroupInit(Map args) { + if (!model.downloader.isSequential()) + JOptionPane.showMessageDialog(mainFrame, "This download is not sequential, there may not be much to preview") + DownloadPreviewer previewer = new DownloadPreviewer(model.downloader, this) + previewer.execute() + dialog.show() + } +} \ No newline at end of file diff --git a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy index 74fb4bb4..0c6966f3 100644 --- a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy @@ -216,7 +216,7 @@ class MainFrameView { button(text: "Pause", enabled : bind {model.pauseButtonEnabled}, pauseAction) button(text: bind { model.resumeButtonText }, enabled : bind {model.retryButtonEnabled}, resumeAction) button(text: "Cancel", enabled : bind {model.cancelButtonEnabled }, cancelAction) - button(text: "Preview", previewAction) + button(text: "Preview", enabled : bind {model.previewButtonEnabled}, previewAction) button(text: "Clear Done", enabled : bind {model.clearButtonEnabled}, clearAction) } } @@ -537,6 +537,7 @@ class MainFrameView { model.cancelButtonEnabled = false model.retryButtonEnabled = false model.pauseButtonEnabled = false + model.previewButtonEnabled = false model.downloader = null downloadDetailsPanel.getLayout().show(downloadDetailsPanel,"select-download") return @@ -545,6 +546,7 @@ class MainFrameView { if (downloader == null) return model.downloader = downloader + model.previewButtonEnabled = true downloadDetailsPanel.getLayout().show(downloadDetailsPanel,"download-selected") switch(downloader.getCurrentState()) { case Downloader.DownloadState.CONNECTING : diff --git a/gui/src/main/groovy/com/muwire/gui/DownloadPreviewer.groovy b/gui/src/main/groovy/com/muwire/gui/DownloadPreviewer.groovy new file mode 100644 index 00000000..73d87420 --- /dev/null +++ b/gui/src/main/groovy/com/muwire/gui/DownloadPreviewer.groovy @@ -0,0 +1,36 @@ +package com.muwire.gui + +import java.awt.Desktop + +import javax.swing.JDialog +import javax.swing.JOptionPane +import javax.swing.SwingWorker + +import com.muwire.core.download.Downloader + +class DownloadPreviewer extends SwingWorker { + + private final Downloader downloader + private final DownloadPreviewView view + + DownloadPreviewer(Downloader downloader, DownloadPreviewView view) { + this.downloader = downloader + this.view = view + } + + @Override + protected Object doInBackground() throws Exception { + downloader.generatePreview() + } + + @Override + public void done() { + File previewFile = get() + view.dialog.setVisible(false) + view.mvcGroup.destroy() + if (previewFile == null) + JOptionPane.showMessageDialog(null, "Generating preview file failed", "Preview Failed", JOptionPane.ERROR_MESSAGE) + else + Desktop.getDesktop().open(previewFile) + } +}