/* * Copyright (C) 2007-2011 IsmAvatar <IsmAvatar@gmail.com> * * This file is part of LateralGM. * LateralGM is free software and comes with ABSOLUTELY NO WARRANTY. * See LICENSE for details. */ package com.pixelmatrixstudios.ghpc; import java.io.File; import java.util.ArrayList; import java.util.List; import javax.swing.Icon; import javax.swing.filechooser.FileFilter; import javax.swing.filechooser.FileView; import org.lateralgm.components.CustomFileChooser; import org.lateralgm.components.CustomFileChooser.FilterSet; import org.lateralgm.components.impl.CustomFileFilter; import org.lateralgm.components.impl.ResNode; import org.lateralgm.file.GmFile; import org.lateralgm.file.GmFileReader; import org.lateralgm.file.GmFormatException; import org.lateralgm.messages.Messages; import org.lateralgm.resources.Resource.Kind; public class FileChooser { List<FileReader> readers = new ArrayList<FileReader>(); CustomFileChooser fc = new CustomFileChooser("/org/lateralgm","LAST_FILE_DIR"); //$NON-NLS-1$ //$NON-NLS-2$ FilterSet openFs = new FilterSet(); FilterUnion openAllFilter = new FilterUnion(); FilterSet saveFs = new FilterSet(); public static List<FileView> fileViews = new ArrayList<FileView>(); public static interface FileReader { public FileFilter getGroupFilter(); public FileFilter[] getFilters(); public boolean canRead(File f); public GmFile readFile(File f, ResNode root) throws GmFormatException; } public static interface FileWriter { } public void addReader(FileReader fr) { readers.add(fr); openFs.add(fr.getGroupFilter()); for (FileFilter ff : fr.getFilters()) openFs.add(ff); openAllFilter.add(fr.getGroupFilter()); if (readers.size() == 2) openFs.add(0,openAllFilter); } public FileChooser() { fc.setFileView(new FileViewUnion()); addReader(new GmReader()); String exts[] = { ".gm81",".gmk",".gm6" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ saveFs.addFilter("FileChooser.FORMAT_WRITERS_GM",exts); //$NON-NLS-1$ saveFs.addFilter("FileChooser.FORMAT_GM81",exts[0]); //$NON-NLS-1$ saveFs.addFilter("FileChooser.FORMAT_GMK",exts[1]); //$NON-NLS-1$ saveFs.addFilter("FileChooser.FORMAT_GM6",exts[2]); //$NON-NLS-1$ } private class FileViewUnion extends FileView { public String getName(File f) { for (FileView fv : fileViews) { String val = fv.getName(f); if (val != null) return val; } return super.getName(f); } public String getDescription(File f) { for (FileView fv : fileViews) { String val = fv.getDescription(f); if (val != null) return val; } return super.getDescription(f); } public String getTypeDescription(File f) { for (FileView fv : fileViews) { String val = fv.getTypeDescription(f); if (val != null) return val; } return super.getTypeDescription(f); } public Icon getIcon(File f) { for (FileView fv : fileViews) { Icon val = fv.getIcon(f); if (val != null) return val; } return super.getIcon(f); } public Boolean isTraversable(File f) { for (FileView fv : fileViews) { Boolean val = fv.isTraversable(f); if (val != null) return val; } return super.isTraversable(f); } } private class FilterUnion extends FileFilter { List<FileFilter> filters = new ArrayList<FileFilter>(); public FilterUnion(FileFilter...filters) { add(filters); } public void add(FileFilter...filters) { for (FileFilter ff : filters) this.filters.add(ff); } @Override public boolean accept(File f) { for (FileFilter ff : filters) if (ff.accept(f)) return true; return false; } @Override public String getDescription() { return Messages.getString("FileChooser.ALL_SUPPORTED"); //$NON-NLS-1$ } } protected class GmReader implements FileReader { CustomFileFilter[] filters; CustomFileFilter groupFilter; GmReader() { String[] exts = { ".gm81",".gmk",".gm6",".gmd" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ String[] descs = { "GM81","GMK","GM6","GMD" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ groupFilter = new CustomFileFilter(Messages.getString("FileChooser.FORMAT_READERS_GM"),exts); //$NON-NLS-1$ filters = new CustomFileFilter[exts.length]; for (int i = 0; i < exts.length; i++) filters[i] = new CustomFileFilter( Messages.getString("FileChooser.FORMAT_" + descs[i]),exts[i]); //$NON-NLS-1$ } public FileFilter getGroupFilter() { return groupFilter; } public FileFilter[] getFilters() { return filters; } public boolean canRead(File f) { return groupFilter.accept(f); } public GmFile readFile(File f, ResNode root) throws GmFormatException { return GmFileReader.readGmFile(f,root); } } /** Note that passing in null will cause an open dialog to display */ public GmFile openFile(File file) { GmFile gmfile = new GmFile(); if (file == null) { return gmfile; } if (!file.exists()) return gmfile; FileReader reader = findReader(file); if (reader == null) { return gmfile; } ResNode rn = new ResNode("rn1", (byte)0, Kind.SPRITE); try { gmfile = reader.readFile(file, rn); } catch (GmFormatException e) { return gmfile; } return gmfile; } private FileReader findReader(File file) { for (FileReader fr : readers) if (fr.canRead(file)) return fr; return null; } /*public boolean saveFile() { try { writeFile(currentFile,root); return true; } catch (IOException e) { return false; } } //TODO: Remove void writeFile(GmFile f, ResNode root) throws IOException { GmFileWriter.writeGmFile(f,root); }*/ }