package org.goko.gcode.rs274ngcv3.ui.workspace.handler.open;
import java.io.File;
import java.io.IOException;
import javax.inject.Inject;
import org.apache.commons.io.FilenameUtils;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.e4.core.di.annotations.Execute;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;
import org.goko.core.common.exception.GkException;
import org.goko.core.config.GokoPreference;
import org.goko.core.gcode.element.IGCodeProvider;
import org.goko.core.gcode.rs274ngcv3.IRS274NGCService;
import org.goko.core.gcode.rs274ngcv3.element.source.ResourceLocationGCodeSource;
import org.goko.core.log.GkLog;
import org.goko.core.workspace.io.IResourceLocation;
import org.goko.core.workspace.service.IWorkspaceService;
public class OpenGCodeFileHandler {
/** Log */
private static final GkLog LOG = GkLog.getLogger(OpenGCodeFileHandler.class);
private static final String LAST_GCODE_PATH = "org.goko.open.gcode.lastfolder";
@Inject
private IRS274NGCService gCodeService;
@Inject
private IWorkspaceService workspaceService;
@Execute
public void executeOpenFile(Shell shell) {
FileDialog dialog = new FileDialog(shell, SWT.OPEN | SWT.MULTI);
dialog.setText("Open GCode file...");
dialog.setFilterPath(getPersistedGCodeFolder());
String filePath = dialog.open();
String[] fileNames = dialog.getFileNames();
if(fileNames != null && fileNames.length > 0){
persistGCodeFolder(filePath);
final File parentFolder = new File(filePath).getParentFile();
for (final String fileName : fileNames) {
// Start a job for each file
Job gcodeJob = new Job("Opening "+fileName) {
@Override
protected IStatus run(IProgressMonitor monitor) {
IGCodeProvider gcodeFile = null;
File sourceFile = null;
try {
sourceFile = new File(parentFolder, fileName);
IResourceLocation resource = workspaceService.addResource(sourceFile.toURI());
ResourceLocationGCodeSource gcodeSource = new ResourceLocationGCodeSource(resource);
gcodeFile = gCodeService.parse(gcodeSource, monitor);
gcodeFile.setCode(fileName);
gCodeService.addGCodeProvider(gcodeFile);
} catch (GkException e) {
LOG.error(e);
return new Status(IStatus.ERROR, "org.goko.gcode.rs274ngcv3.ui", e.getMessage());
}
return Status.OK_STATUS;
};
};
gcodeJob.setUser(true);
gcodeJob.schedule(100);
}
}
}
private void persistGCodeFolder(String filePath) {
GokoPreference.getInstance().setValue(LAST_GCODE_PATH, FilenameUtils.getFullPath(filePath));
try {
GokoPreference.getInstance().save();
} catch (IOException e) {
LOG.error(e);
}
}
private String getPersistedGCodeFolder() {
return GokoPreference.getInstance().getString(LAST_GCODE_PATH);
}
}