/* Copyright (C) 2006 Christian Schneider * * This file is part of Nomad. * * Nomad is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Nomad is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Nomad; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package net.sf.nmedit.nordmodular; import java.io.File; import javax.swing.Icon; import javax.swing.JOptionPane; import net.sf.nmedit.jpatch.clavia.nordmodular.NMData; import net.sf.nmedit.jpatch.clavia.nordmodular.NMPatch; import net.sf.nmedit.jsynth.clavia.nordmodular.utils.NmUtils; import net.sf.nmedit.jtheme.clavia.nordmodular.JTNMPatch; import net.sf.nmedit.nomad.core.Nomad; import net.sf.nmedit.nomad.core.forms.ExceptionDialog; import net.sf.nmedit.nomad.core.service.Service; import net.sf.nmedit.nomad.core.service.fileService.FSFileFilter; import net.sf.nmedit.nomad.core.service.fileService.FileService; import net.sf.nmedit.nomad.core.swing.document.DefaultDocumentManager; import net.sf.nmedit.nomad.core.swing.document.Document; import net.sf.nmedit.nomad.core.swing.document.DocumentManager; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class NmFileService implements FileService { private static final String PATCH_DESCRIPTION ="Nord Modular patch 3.0 (*.pch)"; public FSFileFilter getFileFilter() { return new FSFileFilter(this, "pch"); } public String getDescription() { return PATCH_DESCRIPTION; } public static NMPatch openPatch(File file, File sourceFile, final String title, boolean showExceptionDialog) { NMContextData data = NMContextData.sharedInstance(); try { boolean setFilePointerToNull = false; if (isFileAlreadyOpen(file)) { if (JOptionPane.showConfirmDialog( Nomad.sharedInstance().getWindow().getRootPane(), "File \""+file+"\" is already open.\nDo you want to open a copy of the file?", "Open...", JOptionPane.YES_NO_OPTION) == JOptionPane.NO_OPTION) { Nomad.sharedInstance().setSelectedDocumentByFile(file); return null; } setFilePointerToNull = true; } NMPatch patch = NMPatch.createPatchFromFile(file); patch.setEditSupportEnabled(false); if (title != null) patch.setName(title); final PatchDocument pd = createPatchDoc(patch); if (setFilePointerToNull) { if (sourceFile != null) { String name = sourceFile.getName(); if (name.toLowerCase().endsWith(".pch")) name = name.substring(0, name.length()-4); patch.setName(name); } } else { if (sourceFile!=null) { patch.setProperty("file", sourceFile); pd.setURI(sourceFile); } } patch.setEditSupportEnabled(true); patch.setModified(false); DocumentManager dm = Nomad.sharedInstance() .getDocumentManager(); dm.add(pd); dm.setSelection(pd); return patch; } catch (Exception e) { Log log = LogFactory.getLog(NmFileService.class); if (log.isWarnEnabled()) { log.warn("open failed: "+file, e); } if (showExceptionDialog) { ExceptionDialog.showErrorDialog(Nomad.sharedInstance().getWindow().getRootPane(), "Could not open file '"+file+"' ("+e.getMessage()+")", "Could not open file", e); } } return null; } public void open(File file) { openPatch(file, file, null, true); } public static PatchDocument createPatchDoc(NMPatch patch) throws Exception { JTNMPatch jtp = JTNMPatch.createPatchUI(patch); jtp.setHelpHandler(NMContextData.sharedInstance().getHelpHandler()); PatchDocument pd = new PatchDocument(jtp); return pd; } public Class<? extends Service> getServiceClass() { return FileService.class; } public boolean isNewFileOperationSupported() { return true; } public void newFile() { try { NMPatch patch = new NMPatch(NMData.sharedInstance().getModuleDescriptions()); PatchDocument pd = createPatchDoc(patch); Nomad.sharedInstance() .getDocumentManager() .add(pd); patch.setEditSupportEnabled(true); // enable history } catch (Exception e) { Log log = LogFactory.getLog(getClass()); if (log.isWarnEnabled()) { log.warn(e); } return; } } public String getName() { return "Nord Modular patch 3.0"; } public boolean isOpenFileOperationSupported() { return true; } public Icon getIcon() { return PatchDocument.pchIcon; } private NMPatch getPatch(Object source) { if (source instanceof NMPatch) return (NMPatch) source; if (source instanceof JTNMPatch) return ((JTNMPatch) source).getPatch(); if (source instanceof PatchDocument) return ((PatchDocument)source).getComponent().getPatch(); return null; } public File getAssociatedFile(Object source) { NMPatch patch = getPatch(source); if (patch == null) return null; return patch.getFile(); } public static boolean isFileAlreadyOpen(File file) { final DefaultDocumentManager dm = Nomad.sharedInstance().getDocumentManager(); for (Document d: dm.getDocuments()) { if (d instanceof PatchDocument) { if (file.equals(d.getFile())) return true; } } return false; } public static void selectOrOpen(NMPatch patch) { final DefaultDocumentManager dm = Nomad.sharedInstance().getDocumentManager(); for (Document d: dm.getDocuments()) { if (d instanceof PatchDocument) { PatchDocument pd = (PatchDocument) d; if (pd.getPatch() == patch) { dm.setSelection(pd); return; } } } // document does not exist try { final Document d = NmFileService.createPatchDoc(patch); dm.add(d); dm.setSelection(d); // TODO selection does not work } catch (Exception e) { e.printStackTrace(); return; } } public boolean isDirectSaveOperationSupported(Object source) { NMPatch patch = getPatch(source); return patch != null && (patch.getFile()!=null); } public boolean isSaveOperationSupported(Object source) { return getPatch(source) != null; } private File getFileWithCorrectExtension(File file) { String name = file.getName(); if (name.toLowerCase().endsWith(".pch")) return file; return new File(file.getParentFile(), name+".pch"); } public void save(Object source, File as) { NMPatch patch = getPatch(source); if (patch == null) throw new IllegalArgumentException("save operation not supported for source: "+source); File file = as != null ? as : patch.getFile(); if (file == null) throw new RuntimeException("not file specified"); file = getFileWithCorrectExtension(file); if (NmUtils.writePatchSavely(patch, file)) { patch.setProperty("file", file); patch.setModified(false); } } public void editProperties(Object source) { NMPatch patch = getPatch(source); if (patch == null) throw new IllegalArgumentException("properties not supported for source: "+source); PatchSettingsDialog.invoke(this, patch); } public boolean isEditPropertiesSupported(Object source) { return getPatch(source) != null; } }