package org.korsakow.ide.ui.controller.action; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import javax.swing.JDialog; import javax.swing.JProgressBar; import org.dsrg.soenea.domain.MapperException; import org.dsrg.soenea.domain.command.CommandException; import org.korsakow.domain.CommandExecutor; import org.korsakow.domain.Settings; import org.korsakow.domain.command.ExportDraftFlashProjectCommand; import org.korsakow.domain.command.Helper; import org.korsakow.domain.command.Request; import org.korsakow.domain.command.Response; import org.korsakow.domain.interf.IProject; import org.korsakow.domain.mapper.input.ProjectInputMapper; import org.korsakow.domain.mapper.input.SettingsInputMapper; import org.korsakow.domain.task.IWorker; import org.korsakow.ide.Application; import org.korsakow.ide.lang.LanguageBundle; import org.korsakow.ide.ui.controller.action.ExportWebAction.ExportDoneWorkerListener; import org.korsakow.ide.ui.controller.action.helper.CancelProgressDialogWindowAdapter; import org.korsakow.ide.ui.controller.action.helper.ProgressDialogWorkerListener; import org.korsakow.ide.ui.dialogs.ProgressDialog; import org.korsakow.ide.util.ShellExec; import org.korsakow.ide.util.UIUtil; import org.korsakow.ide.util.ShellExec.ShellException; import org.korsakow.services.export.Exporter; public class ExportDraftWebAction implements ActionListener { public void actionPerformed(ActionEvent event) { try { boolean isAltDown = (event.getModifiers()&KeyEvent.SHIFT_MASK)==KeyEvent.SHIFT_MASK; export(isAltDown, SettingsInputMapper.find().getBoolean(Settings.EncodeVideoOnExport)); } catch (IOException e) { Application.getInstance().showUnhandledErrorDialog(LanguageBundle.getString("general.errors.cantexport.title"), e); } catch (Exception e) { Application.getInstance().showUnhandledErrorDialog(LanguageBundle.getString("general.errors.cantexport.title"), e); } } public static void export(boolean forceSkipOverwrite, boolean encodeVideo) throws IOException, CommandException, MapperException { final Application app = Application.getInstance(); final JDialog progressDialog = new JDialog(app.getProjectExplorer()); final JProgressBar taskProgressBar = new JProgressBar(0, 100); taskProgressBar.setIndeterminate(true); final ProgressDialog dialogMain = new ProgressDialog(); progressDialog.add(dialogMain); progressDialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); progressDialog.setTitle(LanguageBundle.getString("export.progress.window.title")); progressDialog.pack(); progressDialog.setSize(640, progressDialog.getSize().height); UIUtil.centerOnFrame(progressDialog, app.getProjectExplorer()); progressDialog.setModal(true); IProject project = ProjectInputMapper.find(); Helper request = new Request(); Helper response = new Response(); request.set(ExportDraftFlashProjectCommand.PROJECT_ID, project.getId()); CommandExecutor.executeCommand(ExportDraftFlashProjectCommand.class, request, response); final IWorker exportWorker = (IWorker)response.get(ExportDraftFlashProjectCommand.WORKER); Exporter exporter = (Exporter)response.get(ExportDraftFlashProjectCommand.EXPORTER); if (forceSkipOverwrite) exporter.getExportOptions().overwriteExisting = false; exporter.getExportOptions().encodeVideo = encodeVideo; File exportFile = (File)response.get(ExportDraftFlashProjectCommand.EXPORT_FILE); ProgressDialogWorkerListener progressListener = new ProgressDialogWorkerListener(dialogMain); exportWorker.addPropertyChangeListener(IWorker.PROPERTY_STATE, new DraftExportDoneWorkerListener(progressDialog, exportFile)); exportWorker.addPropertyChangeListener(IWorker.PROPERTY_PROGRESS, progressListener); exportWorker.addPropertyChangeListener(IWorker.PROPERTY_DISPLAY_STRING, progressListener); exportWorker.addPropertyChangeListener(IWorker.PROPERTY_SUB_PROGRESS, progressListener); exportWorker.addPropertyChangeListener(IWorker.PROPERTY_SUB_DISPLAY_STRING, progressListener); exportWorker.execute(); progressDialog.addWindowListener(new CancelProgressDialogWindowAdapter(progressDialog, exportWorker)); progressDialog.setVisible(true); System.gc(); // purely speculative } public static class DraftExportDoneWorkerListener extends ExportDoneWorkerListener { public DraftExportDoneWorkerListener(JDialog progressDialog, File exportFile) { super(progressDialog, exportFile); } @Override protected void onDone() { try { ShellExec.openUrl(exportFile.toURL()); } catch (ShellException e) { Application.getInstance().showUnhandledErrorDialog(LanguageBundle.getString("general.errors.uncaughtexception.title"), e); } catch (MalformedURLException e) { Application.getInstance().showUnhandledErrorDialog(LanguageBundle.getString("general.errors.uncaughtexception.title"), e); } } } private static String urlEncode(String path) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < path.length(); ++i) { char c = path.charAt(i); if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')) sb.append(c); else sb.append('%').append(Integer.toHexString(c)); } return sb.toString(); } private static String formatExportUrl(String path) { String[] bits = path.split(File.separator); StringBuilder sb = new StringBuilder(); for (int i = 0; i < bits.length; ++i) { sb.append(urlEncode(bits[i])); if (i != bits.length -1) sb.append(File.separator); } return sb.toString(); } }