package jp.ac.aiit.jointry.services.file; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javafx.stage.FileChooser; import javafx.stage.FileChooser.ExtensionFilter; import jp.ac.aiit.jointry.controllers.MainController; import jp.ac.aiit.jointry.models.Jty; import jp.ac.aiit.jointry.models.Sprite; import jp.ac.aiit.jointry.util.JsonUtil; public class FileManager { private static final String JOINTRY_EXTENSION = ".jty"; private static final String DEFAULT_TARGET_DIRECTORY = System.getProperty("user.home"); private String targetDirectory = DEFAULT_TARGET_DIRECTORY; private final String[] matches = { ".+\\.jty", "sprite\\d+_script", "sprite\\d+_costume\\d+\\.png"}; public void save(List<Sprite> sprites) throws IOException { FileChooser fc = createFileChooser("save"); fc.getExtensionFilters().add(new ExtensionFilter("jointry設定ファイル", "*" + JOINTRY_EXTENSION)); File chooser = fc.showSaveDialog(null); if (chooser == null) { return; //保存先が指定されなかった } int extensionPoint = chooser.toString().lastIndexOf("."); if (extensionPoint != -1 && chooser.exists()) { //ダブルクリック等による上書き保存 targetDirectory = chooser.getParent(); saveAsOverWrite(sprites); } else { targetDirectory = chooser.getPath(); if (!chooser.exists()) { chooser.mkdir(); //create project folder } File file = new File(chooser.getPath(), chooser.getName() + JOINTRY_EXTENSION); try (PrintWriter script = new PrintWriter(file)) { for (Sprite sprite : sprites) { script.print(convertSpriteToJson(sprite, file.getParent())); script.print("\n"); } script.flush(); } } } public void saveAsOverWrite(List<Sprite> sprites) throws IOException { if (targetDirectory.equals(DEFAULT_TARGET_DIRECTORY)) { this.save(sprites); return; } File target = new File(targetDirectory); deleteDirectory(target); File file = new File(target.getPath(), target.getName() + JOINTRY_EXTENSION); try (PrintWriter script = new PrintWriter(file)) { for (Sprite sprite : sprites) { script.print(convertSpriteToJson(sprite, file.getParent())); script.print("\n"); } script.flush(); } } public static String convertSpriteToJson(Sprite sprite, String save_dir) { Jty wrap = new Jty(); wrap.setSprite(JsonUtil.processSprite(sprite)); wrap.setCostume(JsonUtil.processCostumes(sprite, save_dir)); wrap.setScript(JsonUtil.processScript(sprite, save_dir)); return JsonUtil.convertObjectToJsonString(wrap); } public void load(MainController mainController) throws IOException { FileChooser fc = createFileChooser("open"); fc.getExtensionFilters().add(new ExtensionFilter("jointry設定ファイル", "*" + JOINTRY_EXTENSION)); File file = fc.showOpenDialog(null); if (file == null) { return; //読込先が指定されなかった } targetDirectory = file.getParent(); //指定されれば次回以降のパスに書き換え mainController.initWindow("load"); //読み込む前に画面を一旦クリア try (BufferedReader br = new BufferedReader(new FileReader(file))) { String line; while ((line = br.readLine()) != null) { Sprite sprite = JsonUtil.parseJSONStringToSprite(line, file); sprite.setMainController(mainController); mainController.getFrontStageController().addSprite(sprite, true); if (mainController.getFrontStageController().getCurrentSprite() == null) { mainController.getFrontStageController().setCurrentSprite(sprite); } } } } private void deleteDirectory(File file) { if (!file.exists()) { return; } if (file.isFile()) { for (String match : matches) { if (file.getName().matches(match)) { file.delete(); } } } if (file.isDirectory()) { for (File localFile : file.listFiles()) { deleteDirectory(localFile); } if (file.getName().equals("img")) { file.delete(); } } } private FileChooser createFileChooser(String title) { FileChooser fc = new FileChooser(); fc.setTitle(title); //title fc.setInitialDirectory(new File(targetDirectory)); return fc; } }