]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.document.ui/src/org/simantics/document/ui/actions/ImportDocument.java
Sync git svn branch with SVN repository r33345.
[simantics/platform.git] / bundles / org.simantics.document.ui / src / org / simantics / document / ui / actions / ImportDocument.java
index ca50c8bb333f35b2c44a9017682334710a766868..7a9595263494f2cc192fbc7f293b2dea8f962fbc 100644 (file)
  *******************************************************************************/\r
 package org.simantics.document.ui.actions;\r
 \r
+import java.io.File;\r
+\r
+import org.eclipse.core.runtime.IProgressMonitor;\r
+import org.eclipse.core.runtime.IStatus;\r
+import org.eclipse.core.runtime.Status;\r
 import org.eclipse.swt.SWT;\r
 import org.eclipse.swt.widgets.Display;\r
 import org.eclipse.swt.widgets.FileDialog;\r
+import org.simantics.DatabaseJob;\r
 import org.simantics.Simantics;\r
 import org.simantics.db.ReadGraph;\r
 import org.simantics.db.Resource;\r
 import org.simantics.db.WriteGraph;\r
 import org.simantics.db.common.request.WriteRequest;\r
 import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.document.ui.Activator;\r
 import org.simantics.document.ui.graphfile.FileDocumentUtil;\r
-import org.simantics.utils.datastructures.Callback;\r
-import org.simantics.utils.ui.ExceptionUtils;\r
 \r
 /**\r
  * Action for importing files as documents.\r
@@ -46,34 +51,64 @@ public class ImportDocument extends AddDocumentAction {
                        \r
                        @Override\r
                        public void run() {\r
-                               FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell(),SWT.OPEN);\r
+                               FileDialog dialog = new FileDialog(Display.getCurrent().getActiveShell(),SWT.OPEN | SWT.MULTI);\r
                                // TODO : is there any way to read file/executable bindings from OS?\r
                                //        if is, use those extensions to filter this list.\r
                                //        note: in windows using "reg query ..." to read bindings form registry would work.\r
+                               // Note : If the above mentioned filtering is implemented it should be made optional / configurable.\r
                                dialog.setFilterExtensions(new String[]{"*.*"});\r
-                               final String filename = dialog.open();\r
-                               if (filename == null) {\r
-                                       return;\r
-                               }\r
-                               Simantics.getSession().asyncRequest(new WriteRequest() {\r
+                               if (dialog.open() == null) return;\r
+\r
+                               String filterPath = dialog.getFilterPath();\r
+                               String[] filenames = dialog.getFileNames();\r
+                               \r
+                               ImportJob job = new ImportJob(filenames.length > 1 ? "Import files" : "Import file", resource, filterPath, filenames);\r
+                               job.setUser(true);\r
+                               job.schedule();\r
+                       }\r
+               };\r
+       }\r
+       \r
+       private class ImportJob extends DatabaseJob {\r
+\r
+               public ImportJob(String name, Resource resource, String path, String[] filenames) {\r
+                       super(name);\r
+                       this.resource = resource;\r
+                       this.path = path;\r
+                       this.filenames = filenames;\r
+               }\r
+\r
+               Resource resource;\r
+               String path;\r
+               String[] filenames;\r
+\r
+               @Override\r
+               protected IStatus run(final IProgressMonitor monitor) {\r
+                       monitor.beginTask("Importing...", filenames.length);\r
+                       try {\r
+                               Simantics.getSession().syncRequest(new WriteRequest() {\r
                                        @Override\r
                                        public void perform(WriteGraph graph) throws DatabaseException {\r
-                                           graph.markUndoPoint();\r
-                                           \r
-                                               Resource newDoc = FileDocumentUtil.importFileWithName(graph,filename);\r
-                                               linkDocument(graph, resource, newDoc);\r
-                                       }\r
-                               },new Callback<DatabaseException>() {                           \r
-                                       @Override\r
-                                       public void run(DatabaseException parameter) {\r
-                                               if (parameter != null) {\r
-                                                       ExceptionUtils.logAndShowError("Cannot import document.", parameter);\r
+                                               try {\r
+                                                       graph.markUndoPoint();\r
+                                                   for (String filename : filenames) {\r
+                                                       File f = new File(path, filename);\r
+                                                       Resource newDoc = FileDocumentUtil.importFileWithName(graph, f.getAbsolutePath());\r
+                                                       linkDocument(graph, resource, newDoc);\r
+                                                           monitor.worked(1);\r
+                                                   }\r
+                                               } catch (Exception e) {\r
+                                                       throw new DatabaseException(e);\r
                                                }\r
-                                               \r
                                        }\r
                                });\r
+                               return new Status(IStatus.OK, Activator.PLUGIN_ID, "Import succesful.");\r
+                       } catch (DatabaseException e) {\r
+                               return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Import failed.", e);\r
+                       } finally {\r
+                               monitor.done();\r
                        }\r
-               };\r
+               }\r
        }\r
        \r
 }\r