diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/DIYLCStarter.launch b/ diy-layout-creator --username bancika@gmail.com/DIYLC/DIYLCStarter.launch index 80c950cb..e6e7b0f9 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/DIYLCStarter.launch +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/DIYLCStarter.launch @@ -11,5 +11,5 @@ - + diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/ITask.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/ITask.java new file mode 100644 index 00000000..eb7ad07a --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/ITask.java @@ -0,0 +1,34 @@ +package org.diylc.common; + +/** + * Abstract layer between the app and platform worker thread implementation. + * + * @author Branislav Stojkovic + * + * @param + */ +public interface ITask { + + /** + * Runs in background thread. + * + * @return + * @throws Exception + */ + T doInBackground() throws Exception; + + /** + * Called if background thread fails. + * + * @param e + */ + void failed(Exception e); + + /** + * Called if background thread is executed correctly, the result is passed + * as a parameter. + * + * @param result + */ + void complete(T result); +} diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/ISwingUI.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/ISwingUI.java index 0fa341a2..b316113f 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/ISwingUI.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/ISwingUI.java @@ -7,13 +7,15 @@ import javax.swing.SwingConstants; import javax.swing.JPopupMenu.Separator; import org.diylc.common.BadPositionException; +import org.diylc.common.ITask; +import org.diylc.core.IView; /** * Interface for plugin access to the swing front end. * * @author Branislav Stojkovic */ -public interface ISwingUI { +public interface ISwingUI extends IView { /** * Injects a custom GUI panels provided by the plug-in and desired position @@ -57,4 +59,6 @@ public interface ISwingUI { * @param parentMenuName */ void injectSubmenu(String name, Icon icon, String parentMenuName); + + void executeBackgroundTask(ITask task); } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/MainFrame.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/MainFrame.java index c3ab7a4f..ffccb0b2 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/MainFrame.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/MainFrame.java @@ -2,6 +2,7 @@ package org.diylc.swing.gui; import java.awt.BorderLayout; import java.awt.Container; +import java.awt.Cursor; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -11,6 +12,7 @@ import java.util.Arrays; import java.util.EnumSet; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ExecutionException; import javax.swing.Action; import javax.swing.BoxLayout; @@ -23,6 +25,7 @@ import javax.swing.JMenuBar; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.SwingConstants; +import javax.swing.SwingWorker; import javax.swing.Timer; import org.apache.log4j.Logger; @@ -30,6 +33,7 @@ import org.diylc.common.BadPositionException; import org.diylc.common.EventType; import org.diylc.common.IPlugIn; import org.diylc.common.IPlugInPort; +import org.diylc.common.ITask; import org.diylc.core.IView; import org.diylc.images.IconLoader; import org.diylc.presenter.Presenter; @@ -42,8 +46,8 @@ import org.diylc.swing.plugins.layers.LayersMenuPlugin; import org.diylc.swing.plugins.statusbar.StatusBar; import org.diylc.swing.plugins.toolbox.ToolBox; -public class MainFrame extends JFrame implements IView, ISwingUI { - +public class MainFrame extends JFrame implements ISwingUI { + private static final Logger LOG = Logger.getLogger(MainFrame.class); private static final long serialVersionUID = 1L; @@ -248,6 +252,31 @@ public class MainFrame extends JFrame implements IView, ISwingUI { menuMap.put(name, submenu); } + @Override + public void executeBackgroundTask(final ITask task) { + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + SwingWorker worker = new SwingWorker() { + + @Override + protected T doInBackground() throws Exception { + return task.doInBackground(); + } + + @Override + protected void done() { + try { + T result = get(); + task.complete(result); + } catch (Exception e) { + LOG.error("Task failed", e); + task.failed(e); + } + setCursor(Cursor.getDefaultCursor()); + } + }; + worker.execute(); + } + class FramePlugin implements IPlugIn { private IPlugInPort plugInPort; diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/plugins/file/FileMenuPlugin.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/plugins/file/FileMenuPlugin.java index 4f7354f2..1e690e59 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/plugins/file/FileMenuPlugin.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/plugins/file/FileMenuPlugin.java @@ -3,7 +3,6 @@ package org.diylc.swing.plugins.file; import java.awt.event.ActionEvent; import java.awt.print.PrinterException; import java.io.File; -import java.io.FileNotFoundException; import java.util.EnumSet; import java.util.List; @@ -13,9 +12,9 @@ import org.apache.log4j.Logger; import org.diylc.common.EventType; import org.diylc.common.IPlugIn; import org.diylc.common.IPlugInPort; +import org.diylc.common.ITask; import org.diylc.common.PropertyWrapper; import org.diylc.images.IconLoader; -import org.diylc.presenter.Presenter; import org.diylc.swing.ISwingUI; import org.diylc.swing.gui.DialogFactory; import org.diylc.swing.gui.editor.PropertyEditorDialog; @@ -23,7 +22,6 @@ import org.diylc.swing.gui.editor.PropertyEditorDialog; import com.diyfever.gui.ButtonDialog; import com.diyfever.gui.IDrawingProvider; import com.diyfever.gui.export.DrawingExporter; -import com.lowagie.text.DocumentException; /** * Entry point class for File management utilities. @@ -31,7 +29,7 @@ import com.lowagie.text.DocumentException; * @author Branislav Stojkovic */ public class FileMenuPlugin implements IPlugIn { - + private static final Logger LOG = Logger.getLogger(FileMenuPlugin.class); private static final String FILE_TITLE = "File"; @@ -40,7 +38,7 @@ public class FileMenuPlugin implements IPlugIn { private IPlugInPort plugInPort; private ProjectDrawingProvider drawingProvider; private TraceMaskDrawingProvider traceMaskDrawingProvider; - + private ISwingUI swingUI; public FileMenuPlugin(ISwingUI swingUI) { @@ -53,7 +51,7 @@ public class FileMenuPlugin implements IPlugIn { this.plugInPort = plugInPort; this.drawingProvider = new ProjectDrawingProvider(plugInPort, false); this.traceMaskDrawingProvider = new TraceMaskDrawingProvider(plugInPort); - + swingUI.injectMenuAction(new NewAction(), FILE_TITLE); swingUI.injectMenuAction(new OpenAction(), FILE_TITLE); swingUI.injectMenuAction(new SaveAction(), FILE_TITLE); @@ -87,7 +85,7 @@ public class FileMenuPlugin implements IPlugIn { if (!plugInPort.allowFileAction()) { return; } - plugInPort.createNewProject(); + plugInPort.createNewProject(); List properties = plugInPort.getProjectProperties(); PropertyEditorDialog editor = DialogFactory.getInstance().createPropertyEditorDialog( properties, "Edit Project"); @@ -121,11 +119,29 @@ public class FileMenuPlugin implements IPlugIn { if (!plugInPort.allowFileAction()) { return; } - File file = DialogFactory.getInstance().showOpenDialog(FileFilterEnum.DIY.getFilter(), - null, FileFilterEnum.DIY.getExtensions()[0], null); + final File file = DialogFactory.getInstance().showOpenDialog( + FileFilterEnum.DIY.getFilter(), null, FileFilterEnum.DIY.getExtensions()[0], + null); if (file != null) { - LOG.debug("Opening from " + file.getAbsolutePath()); - plugInPort.loadProjectFromFile(file.getAbsolutePath()); + swingUI.executeBackgroundTask(new ITask() { + + @Override + public Void doInBackground() throws Exception { + LOG.debug("Opening from " + file.getAbsolutePath()); + plugInPort.loadProjectFromFile(file.getAbsolutePath()); + return null; + } + + @Override + public void complete(Void result) { + } + + @Override + public void failed(Exception e) { + swingUI.showMessage("Could not open file. " + e.getMessage(), "Error", + ISwingUI.ERROR_MESSAGE); + } + }); } } } @@ -144,16 +160,50 @@ public class FileMenuPlugin implements IPlugIn { public void actionPerformed(ActionEvent e) { LOG.info("SaveAction triggered"); if (plugInPort.getCurrentFileName() == null) { - File file = DialogFactory.getInstance().showSaveDialog( + final File file = DialogFactory.getInstance().showSaveDialog( FileFilterEnum.DIY.getFilter(), null, FileFilterEnum.DIY.getExtensions()[0], null); if (file != null) { - LOG.debug("Saving to " + file.getAbsolutePath()); - plugInPort.saveProjectToFile(file.getAbsolutePath()); + swingUI.executeBackgroundTask(new ITask() { + + @Override + public Void doInBackground() throws Exception { + LOG.debug("Saving to " + file.getAbsolutePath()); + plugInPort.saveProjectToFile(file.getAbsolutePath()); + return null; + } + + @Override + public void complete(Void result) { + } + + @Override + public void failed(Exception e) { + swingUI.showMessage("Could not save to file. " + e.getMessage(), + "Error", ISwingUI.ERROR_MESSAGE); + } + }); } } else { - LOG.debug("Exporting to " + plugInPort.getCurrentFileName()); - plugInPort.saveProjectToFile(plugInPort.getCurrentFileName()); + swingUI.executeBackgroundTask(new ITask() { + + @Override + public Void doInBackground() throws Exception { + LOG.debug("Saving to " + plugInPort.getCurrentFileName()); + plugInPort.saveProjectToFile(plugInPort.getCurrentFileName()); + return null; + } + + @Override + public void complete(Void result) { + } + + @Override + public void failed(Exception e) { + swingUI.showMessage("Could not save to file. " + e.getMessage(), "Error", + ISwingUI.ERROR_MESSAGE); + } + }); } } } @@ -171,11 +221,29 @@ public class FileMenuPlugin implements IPlugIn { @Override public void actionPerformed(ActionEvent e) { LOG.info("SaveAsAction triggered"); - File file = DialogFactory.getInstance().showSaveDialog(FileFilterEnum.DIY.getFilter(), - null, FileFilterEnum.DIY.getExtensions()[0], null); + final File file = DialogFactory.getInstance().showSaveDialog( + FileFilterEnum.DIY.getFilter(), null, FileFilterEnum.DIY.getExtensions()[0], + null); if (file != null) { - LOG.debug("Save to " + file.getAbsolutePath()); - plugInPort.saveProjectToFile(file.getAbsolutePath()); + swingUI.executeBackgroundTask(new ITask() { + + @Override + public Void doInBackground() throws Exception { + LOG.debug("Saving to " + file.getAbsolutePath()); + plugInPort.saveProjectToFile(file.getAbsolutePath()); + return null; + } + + @Override + public void complete(Void result) { + } + + @Override + public void failed(Exception e) { + swingUI.showMessage("Could not save to file. " + e.getMessage(), "Error", + ISwingUI.ERROR_MESSAGE); + } + }); } } } @@ -216,19 +284,30 @@ public class FileMenuPlugin implements IPlugIn { @Override public void actionPerformed(ActionEvent e) { LOG.info("ExportPDFAction triggered"); - File file = DialogFactory.getInstance().showSaveDialog(FileFilterEnum.PDF.getFilter(), - null, FileFilterEnum.PDF.getExtensions()[0], null); + final File file = DialogFactory.getInstance().showSaveDialog( + FileFilterEnum.PDF.getFilter(), null, FileFilterEnum.PDF.getExtensions()[0], + null); if (file != null) { - try { - LOG.debug("Exporting to " + file.getAbsolutePath()); - DrawingExporter.getInstance().exportPDF(this.drawingProvider, file); - } catch (FileNotFoundException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } catch (DocumentException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } + swingUI.executeBackgroundTask(new ITask() { + + @Override + public Void doInBackground() throws Exception { + LOG.debug("Exporting to " + file.getAbsolutePath()); + DrawingExporter.getInstance().exportPDF( + ExportPDFAction.this.drawingProvider, file); + return null; + } + + @Override + public void complete(Void result) { + } + + @Override + public void failed(Exception e) { + swingUI.showMessage("Could not export to PDF. " + e.getMessage(), "Error", + ISwingUI.ERROR_MESSAGE); + } + }); } } } @@ -249,11 +328,30 @@ public class FileMenuPlugin implements IPlugIn { @Override public void actionPerformed(ActionEvent e) { LOG.info("ExportPNGAction triggered"); - File file = DialogFactory.getInstance().showSaveDialog(FileFilterEnum.PNG.getFilter(), - null, FileFilterEnum.PNG.getExtensions()[0], null); + final File file = DialogFactory.getInstance().showSaveDialog( + FileFilterEnum.PNG.getFilter(), null, FileFilterEnum.PNG.getExtensions()[0], + null); if (file != null) { - LOG.debug("Exporting to " + file.getAbsolutePath()); - DrawingExporter.getInstance().exportPNG(this.drawingProvider, file); + swingUI.executeBackgroundTask(new ITask() { + + @Override + public Void doInBackground() throws Exception { + LOG.debug("Exporting to " + file.getAbsolutePath()); + DrawingExporter.getInstance().exportPNG( + ExportPNGAction.this.drawingProvider, file); + return null; + } + + @Override + public void complete(Void result) { + } + + @Override + public void failed(Exception e) { + swingUI.showMessage("Could not export to PNG. " + e.getMessage(), "Error", + ISwingUI.ERROR_MESSAGE); + } + }); } } }