Mercurial > hg > ccmieditor
view java/src/uk/ac/qmul/eecs/ccmi/gui/FileService.java @ 1:71ff0735df5a
Fixed bug: open dialog window not opening.
Removed useless FileSystemTreeCellRenderer class.
author | Fiore Martin <fiore@eecs.qmul.ac.uk> |
---|---|
date | Tue, 10 Jan 2012 11:39:43 +0000 |
parents | 9418ab7b7f3f |
children | 9e67171477bc |
line wrap: on
line source
package uk.ac.qmul.eecs.ccmi.gui; import java.awt.Frame; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ResourceBundle; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import uk.ac.qmul.eecs.ccmi.gui.filechooser.FileChooser; import uk.ac.qmul.eecs.ccmi.gui.filechooser.FileChooserFactory; import uk.ac.qmul.eecs.ccmi.sound.SoundEvent; import uk.ac.qmul.eecs.ccmi.sound.SoundFactory; import uk.ac.qmul.eecs.ccmi.utils.PreferencesService; public abstract class FileService { /** * An Open object encapsulates the stream, name and path of the file that the user selected for opening. */ public interface Open { /** * Gets the input stream corresponding to the user selection. * @return the input stream, or null if the user cancels the file selection task */ InputStream getInputStream() throws IOException ; /** * Gets the name of the file that the user selected. * @return the file name, or null if the user cancels the file selection task */ String getName() throws IOException ; /** * Gets the path of the file that the user selected. * @return the file path , or null if the user cancels the file selection task */ String getPath() throws IOException; } /** * A Save object encapsulates the stream and name of the file that the user selected for saving. */ public interface Save { /** * Gets the output stream corresponding to the user selection. * @return the output stream, or null if the user cancels the file selection task */ OutputStream getOutputStream(); /** * Gets the name of the file that the user selected. * @return the file name, or null if the user cancels the file selection task */ String getName(); /** * Gets the path of the file that the user selected. * @return the file path, or null if the user cancels the file selection task */ String getPath(); } /** * This class implements a FileService with a JFileChooser */ public static class ChooserService { public ChooserService(File initialDirectory){ useAccessible = Boolean.parseBoolean(PreferencesService.getInstance().get("use_accessible_filechooser", "true")); fileChooser = FileChooserFactory.getFileChooser(useAccessible); fileChooser.setCurrentDirectory(initialDirectory); } /* If the user cancels the task (presses cancel button or the X at the top left) * * the CANCEl sound is played (together with the registered playerListeenr if any) */ public FileService.Open open(String defaultDirectory, String defaultFile, ExtensionFilter filter, Frame frame) throws FileNotFoundException { fileChooser.resetChoosableFileFilters(); fileChooser.setFileFilter(filter); if (defaultDirectory != null) fileChooser.setCurrentDirectory(new File(defaultDirectory)); if (defaultFile == null) fileChooser.setSelectedFile(null); else fileChooser.setSelectedFile(new File(defaultFile)); int response = fileChooser.showOpenDialog(frame); if (response == JFileChooser.APPROVE_OPTION) return new OpenImpl(fileChooser.getSelectedFile()); else{ if(useAccessible) SoundFactory.getInstance().play(SoundEvent.CANCEL); return new OpenImpl(null); } } /* If the user cancels the task (presses cancel button or the X at the top left) * * the CANCEl sound is played (together with the registered playerListeenr if any) */ public FileService.Save save(String defaultDirectory, String defaultFile, ExtensionFilter filter, String removeExtension, String addExtension) throws FileNotFoundException { fileChooser.resetChoosableFileFilters(); fileChooser.setFileFilter(filter); if (defaultDirectory == null) fileChooser.setCurrentDirectory(new File(".")); else fileChooser.setCurrentDirectory(new File(defaultDirectory)); if (defaultFile != null){ File f = new File(editExtension(defaultFile, removeExtension, addExtension)); if(f.exists()) fileChooser.setSelectedFile(f); else fileChooser.setSelectedFile(null); }else fileChooser.setSelectedFile(null); int response = fileChooser.showSaveDialog(null); if (response == JFileChooser.APPROVE_OPTION){ File f = fileChooser.getSelectedFile(); if (addExtension != null && f.getName().indexOf(".") < 0) // no extension supplied f = new File(f.getPath() + addExtension); if (!f.exists()) return new SaveImpl(f); /* file with this name already exists, we must ask the user to confirm */ ResourceBundle resources = ResourceBundle.getBundle(EditorFrame.class.getName()); if(useAccessible){ int result = SpeechOptionPane.showConfirmDialog( null, resources.getString("dialog.overwrite"), SpeechOptionPane.YES_NO_OPTION); if (result == SpeechOptionPane.YES_OPTION) return new SaveImpl(f); }else{ int result = JOptionPane.showConfirmDialog( null, resources.getString("dialog.overwrite"), null, JOptionPane.YES_NO_OPTION); if (result == JOptionPane.YES_OPTION) return new SaveImpl(f); } } if(useAccessible) SoundFactory.getInstance().play(SoundEvent.CANCEL); return new SaveImpl(null); } private FileChooser fileChooser; private boolean useAccessible; } public static class DirectService { public Open open(File file) throws IOException{ return new OpenImpl(file); } public Save save(File file) throws IOException{ return new SaveImpl(file); } } private static class SaveImpl implements FileService.Save{ public SaveImpl(File f) throws FileNotFoundException{ if (f != null){ path = f.getPath(); name = getFileNameFromPath(path,false); out = new BufferedOutputStream(new FileOutputStream(f)); } } @Override public String getName() { return name; } @Override public String getPath() {return path; } @Override public OutputStream getOutputStream() { return out; } private String name; private String path; private OutputStream out; } private static class OpenImpl implements FileService.Open { public OpenImpl(File f) throws FileNotFoundException{ if (f != null){ path = f.getPath(); name = getFileNameFromPath(path,false); in = new BufferedInputStream(new FileInputStream(f)); } } @Override public String getName() { return name; } @Override public String getPath() { return path; } @Override public InputStream getInputStream() { return in; } private String path; private String name; private InputStream in; } /** Edits the file path so that it ends in the desired extension. @param original the file to use as a starting point @param toBeRemoved the extension that is to be removed before adding the desired extension. Use null if nothing needs to be removed. @param desired the desired extension (e.g. ".png"), or a | separated list of extensions @return original if it already has the desired extension, or a new file with the edited file path */ public static String editExtension(String original, String toBeRemoved, String desired){ if (original == null) return null; int n = desired.indexOf('|'); if (n >= 0) desired = desired.substring(0, n); String path = original; if (!path.toLowerCase().endsWith(desired.toLowerCase())){ if (toBeRemoved != null && path.toLowerCase().endsWith( toBeRemoved.toLowerCase())) path = path.substring(0, path.length() - toBeRemoved.length()); path = path + desired; } return path; } public static String getFileNameFromPath(String path,boolean keepExtension){ int index = path.lastIndexOf(System.getProperty("file.separator")); String name; if(index == -1) name = path; else name = path.substring(index+1); if(!keepExtension){ index = name.lastIndexOf('.'); if(index != -1) name = name.substring(0, index); } return name; } }