package framework; import java.awt.event.ActionEvent; import javax.swing.*; import java.io.*; /** * Called when items from the file menu are selected * * @author pearce * */ public class FileController extends Controller { /** * memory for the last directory opened */ private File durrentDir; public FileController(View v) { super(v); File f = getTheModel().getFile(); if (f != null) { durrentDir = f.getParentFile(); } } /** * Asks user if model should be saved * @return true if yes */ private boolean saveChanges() { if (!getTheModel().isChanged()) return false; int choice = JOptionPane.showConfirmDialog(theView, "save changes?"); return choice == 0; } /** * Prompts user for file to be saved or open * @return the selected file */ private File getFile() { JFileChooser chooser = new JFileChooser(); if (durrentDir != null) { chooser.setCurrentDirectory(durrentDir); } chooser.showOpenDialog(theView); File result = chooser.getSelectedFile(); durrentDir = result.getParentFile(); return result; } /** * Replaces existing model with model read from selected file. */ private void open() { File f = getFile(); try { ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f)); Model savedModel = (Model)ois.readObject(); theView.setTheModel(savedModel); } catch(Exception e) { GUIUtils.error(e.getMessage()); } } /** * Saves model to selected file. * @param saveAs prompt user for new file if true */ private void save(boolean saveAs) { Model theModel = getTheModel(); if (!saveAs && !theModel.isChanged()) return; // nothing to do File f = theModel.getFile(); if (f == null || saveAs) { f = getFile(); theModel.setFile(f); } try { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f)); oos.writeObject(theModel); theModel.setChanged(false); } catch(Exception e) { GUIUtils.error(e.getMessage()); } } public void actionPerformed(ActionEvent e) { String cmmd = e.getActionCommand(); if (cmmd.equals("Exit")) { if (saveChanges()) save(false); System.exit(0); } else if (cmmd.equals("Save")) { save(false); } else if (cmmd.equals("SaveAs")) { save(true); } else if (cmmd.equals("Open")) { if (saveChanges()) save(false); open(); } else { GUIUtils.error("unrecognized command: " + cmmd); } } }