/*
* Copyright (c) 2013-2014. Confluenity
* This content is released under the Apache 2 license:
* http://www.apache.org/licenses/LICENSE-2.0
*/
package com.confluenity.jaylen.util;
import com.confluenity.jaylen.context.CustomMessageSource;
import com.confluenity.jaylen.io.BaseFile;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.prefs.Preferences;
/**
* This class provides methods for accessing files on file system
* and generating file names for saving files. It also includes functionality
* to ease manipulation of file extensions and types.
*/
public class FileAssistant extends CustomMessageSource implements ApplicationContextAware {
private ApplicationContext springContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.springContext = applicationContext;
}
public enum DataKind {
IMAGE,
SOURCE,
SPREAD_SHEET;
public String getDefaultExtension() {
switch (this) {
case IMAGE: return ".png";
case SOURCE: return ".jsrc";
case SPREAD_SHEET: return ".xlsx";
default: return "";
}
}
}
public enum FileType {
JSRC(".jsrc"),
DRG(".drg"),
JXF(".jxf"),
PNG(".png"),
JPG(".jpg"),
TIFF(".tiff"),
EPS(".eps"),
SVG(".svg"),
XLSX(".xlsx"),
ODS(".ods");
private FileType(String ext) {
this.ext = ext;
}
private String ext;
public String getExt() {
return ext;
}
public static FileType fromValue(String ext) {
return FileType.valueOf(ext.substring(1).toUpperCase());
}
}
private Shell shell;
private Preferences applicationPreferences;
public static class FileDescriptor {
private String filePath;
private String fileExtension;
private FileType fileType;
private DataKind dataKind;
public FileDescriptor(String filePath, FileType fileType, DataKind dataKind) {
this.fileType = fileType;
this.dataKind = dataKind;
BaseFile file = new BaseFile(filePath);
this.filePath = file.getAbsolutePath();
this.fileExtension = file.getExtension();
if(this.fileExtension.isEmpty()) {
this.fileExtension = fileType.getExt();
if(this.filePath.endsWith(".")) {
this.filePath = this.filePath.substring(0, this.filePath.length() - 1);
}
this.filePath += fileType.getExt();
}
}
public String getFilePath() {
return filePath;
}
public String getFileExtension() {
return fileExtension;
}
public FileType getFileType() {
return fileType;
}
public DataKind getDataKind() {
return dataKind;
}
}
private FileDialog getFileDialog(String [] filterExtensions, String dialogText, DataKind dataKind, int type) {
List<String> filterNames = new ArrayList<>();
List<String> filters = new ArrayList<>();
for (String ext : filterExtensions) {
filterNames.add(getMessage("io.file.ext" + ext));
filters.add("*" + ext);
}
FileDialog fileDialog = new FileDialog(shell, type);
fileDialog.setText(dialogText);
String defaultExtension = dataKind.getDefaultExtension();
String ext = applicationPreferences.get("io.filetype.last." + dataKind.name().toLowerCase(), defaultExtension);
int index = 0;
for (String filterExtension : filterExtensions) {
if (ext.equals(filterExtension)) {
break;
}
index++;
}
fileDialog.setFilterExtensions(filters.toArray(new String[filters.size()]));
fileDialog.setFilterNames(filterNames.toArray(new String[filterNames.size()]));
fileDialog.setFilterIndex(index);
fileDialog.setFilterPath(applicationPreferences.get("io.directory.last" + ext, System.getProperty("user.home")));
return fileDialog;
}
private void setPreferences(FileDescriptor fileDescriptor) {
applicationPreferences.put("io.directory.last" + fileDescriptor.getFileExtension(), new File(fileDescriptor.getFilePath()).getParentFile().getAbsolutePath());
applicationPreferences.put("io.filetype.last." + fileDescriptor.getDataKind().name().toLowerCase(), fileDescriptor.getFileExtension());
}
public FileDescriptor getOpenFile(String [] filterExtensions, String dialogText, DataKind dataKind) {
FileDialog fileDialog = getFileDialog(filterExtensions, dialogText, dataKind, SWT.OPEN);
String selected = fileDialog.open();
if (selected == null) {
return null;
}
FileDescriptor fileDescriptor = new FileDescriptor(selected, FileType.fromValue(filterExtensions[fileDialog.getFilterIndex()]), dataKind);
setPreferences(fileDescriptor);
return fileDescriptor;
}
public FileDescriptor getSaveFile(String [] filterExtensions, String dialogText, DataKind dataKind) {
FileDialog fileDialog = getFileDialog(filterExtensions, dialogText, dataKind, SWT.SAVE);
fileDialog.setOverwrite(true);
String selected = fileDialog.open();
if (selected == null) {
return null;
}
FileDescriptor fileDescriptor = new FileDescriptor(selected, FileType.fromValue(filterExtensions[fileDialog.getFilterIndex()]), dataKind);
setPreferences(fileDescriptor);
return fileDescriptor;
}
public void setShell(Shell shell) {
this.shell = shell;
}
public void setApplicationPreferences(Preferences applicationPreferences) {
this.applicationPreferences = applicationPreferences;
}
}