*******************************************************************************/\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
\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