Package com.confluenity.jaylen.util

Source Code of com.confluenity.jaylen.util.FileAssistant$FileDescriptor

/*
* 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;
  }

}
TOP

Related Classes of com.confluenity.jaylen.util.FileAssistant$FileDescriptor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.