/* 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 */ /* * Created on Nov 23, 2006 */ package net.sf.nmedit.nomad.core; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; import java.awt.Image; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.dnd.DropTarget; import java.awt.event.ActionEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.RenderedImage; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.Reader; import java.net.URI; import java.util.Iterator; import java.util.Properties; import java.util.ResourceBundle; import javax.imageio.ImageIO; import javax.swing.AbstractAction; import javax.swing.DefaultListCellRenderer; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JMenuBar; import javax.swing.JOptionPane; import javax.swing.JPopupMenu; import javax.swing.JRadioButtonMenuItem; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JToolBar; import javax.swing.SwingUtilities; import net.sf.nmedit.nmutils.Platform; import net.sf.nmedit.nmutils.Platform.OS; import net.sf.nmedit.nmutils.properties.SystemProperties; import net.sf.nmedit.nmutils.properties.SystemPropertyFactory; import net.sf.nmedit.nmutils.swing.ApplicationClipboard; import net.sf.nmedit.nmutils.swing.CopyCutPasteTarget; import net.sf.nmedit.nmutils.swing.WorkIndicator; import net.sf.nmedit.nomad.core.NomadLoader.LocaleHandler; import net.sf.nmedit.nomad.core.helpers.DocumentActionActivator; import net.sf.nmedit.nomad.core.helpers.RuntimeMenuBuilder; import net.sf.nmedit.nomad.core.i18n.LocaleConfiguration; import net.sf.nmedit.nomad.core.jpf.PluginView; import net.sf.nmedit.nomad.core.jpf.TempDir; import net.sf.nmedit.nomad.core.menulayout.ActionHandler; import net.sf.nmedit.nomad.core.menulayout.MenuBuilder; import net.sf.nmedit.nomad.core.menulayout.MenuLayout; import net.sf.nmedit.nomad.core.misc.NMUtilities; import net.sf.nmedit.nomad.core.service.ServiceRegistry; import net.sf.nmedit.nomad.core.service.fileService.FileService; import net.sf.nmedit.nomad.core.service.fileService.FileServiceTool; import net.sf.nmedit.nomad.core.service.initService.InitService; import net.sf.nmedit.nomad.core.swing.Factory; import net.sf.nmedit.nomad.core.swing.JDropDownButtonControl; import net.sf.nmedit.nomad.core.swing.SelectedAction; import net.sf.nmedit.nomad.core.swing.URIListDropHandler; 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.DocumentEvent; import net.sf.nmedit.nomad.core.swing.document.DocumentListener; import net.sf.nmedit.nomad.core.swing.explorer.ExplorerTree; import net.sf.nmedit.nomad.core.swing.explorer.FileExplorerTree; import net.sf.nmedit.nomad.core.swing.tabs.JTabbedPane2; import net.sf.nmedit.nomad.core.utils.NomadPropertyFactory; import net.sf.nmedit.nomad.core.utils.OSXAdapter; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.java.plugin.PluginManager; import org.java.plugin.boot.Boot; public class Nomad { private static final String PROPERY_WINDOW_BOUNDS = "window.bounds"; private static final String MENU_FILE_OPEN = "nomad.menu.file.open"; private static final String MENU_FILE_SAVE = "nomad.menu.file.save.save"; private static final String MENU_FILE_SAVEAS = "nomad.menu.file.save.saveas"; private static final String MENU_FILE_PROPERTIES = "nomad.menu.file.properties"; private static final String MENU_FILE_EXPORT = "nomad.menu.file.ie.export"; private static final String MENU_EDIT_COPY = "nomad.menu.edit.edit.copy"; private static final String MENU_EDIT_PASTE = "nomad.menu.edit.edit.paste"; private static final String MENU_EDIT_CUT = "nomad.menu.edit.edit.cut"; private static final String MENU_DEBUG_GC = "nomad.menu.help.debug.gc"; private static Nomad instance; private JFrame mainWindow = null; private NomadPlugin pluginInstance; private Clipboard clipBoard; private boolean stopped = false; private DefaultDocumentManager pageContainer ; private MenuLayout menuLayout; private MenuBuilder menuBuilder; private FileExplorerTree explorerTree; private JTabbedPane2 toolPane; private JTabbedPane2 synthPane; public static final String NOMAD_PROPERTIES="nomad.properties"; protected void storeProperties() { // store properties SystemPropertyFactory factory = SystemPropertyFactory.sharedInstance().getFactory(); if (factory instanceof NomadPropertyFactory) { Properties p = ((NomadPropertyFactory)factory).getProperties(); try { OutputStream out = new BufferedOutputStream(new FileOutputStream(getCorePropertiesFile())); p.store(out, "do not edit"); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } } } public static File getCorePropertiesFile() { return new File(TempDir.getBaseDir(), NOMAD_PROPERTIES); } public DefaultDocumentManager getDocumentManager() { return pageContainer; } public Nomad(NomadPlugin plugin, MenuLayout menuLayout) { mainWindow = new JFrame("Nomad"); menuBuilder = new MenuBuilder(menuLayout); this.pluginInstance = plugin; Nomad.instance = this; this.menuLayout = menuLayout; SystemProperties properties = SystemPropertyFactory.getProperties(Nomad.class); properties.defineRectangleProperty(PROPERY_WINDOW_BOUNDS, null); Rectangle bounds = properties.rectangleValue(PROPERY_WINDOW_BOUNDS); Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); if (bounds == null) { bounds = new Rectangle(0, 0, 640, 480); NMUtilities.fitRectangle(bounds, screen); NMUtilities.centerRectangle(bounds, screen); } if (bounds.x<0) bounds.x = 0; if (bounds.y<0) bounds.y = 0; if (bounds.width<=100) bounds.width = 100; if (bounds.height<=100) bounds.height = 100; mainWindow.setBounds(bounds); } public void pluginsHelp() { Document d = new PluginView(); getDocumentManager().add(d); getDocumentManager().setSelection(d); } private class DocumentSelectionHandler implements DocumentListener { public void documentAdded(DocumentEvent e) { // no op } public void documentRemoved(DocumentEvent e) { // no op } public void documentSelected(DocumentEvent e) { setMenuForDocument(e.getDocument()); } public void setMenuForDocument(Document d) { boolean saveEnabled = false; boolean saveAsEnabled = false; boolean propertiesEnabled = false; if (d != null) { Iterator<FileService> iter = ServiceRegistry.getServices(FileService.class); while (iter.hasNext() && (!saveEnabled) && (!saveAsEnabled) && (!propertiesEnabled)) { FileService fs = iter.next(); if (!saveEnabled) saveEnabled = fs.isDirectSaveOperationSupported(d); if (!saveAsEnabled) saveAsEnabled = fs.isSaveOperationSupported(d); if (!propertiesEnabled) propertiesEnabled = fs.isEditPropertiesSupported(d); } } menuLayout.getEntry(MENU_FILE_SAVE).setEnabled(saveEnabled); menuLayout.getEntry(MENU_FILE_SAVEAS).setEnabled(saveAsEnabled); menuLayout.getEntry(MENU_FILE_PROPERTIES).setEnabled(propertiesEnabled); menuLayout.getEntry(MENU_FILE_EXPORT).setEnabled(d instanceof Transferable); } } protected CopyCutPasteTarget getActiveCopyCutPasteTarget() { Document doc = Nomad.sharedInstance().getDocumentManager().getSelection(); if (doc == null) return null; JComponent c = doc.getComponent(); if (c instanceof CopyCutPasteTarget) return (CopyCutPasteTarget)c; else return null; } public void editCopy() { CopyCutPasteTarget target = getActiveCopyCutPasteTarget(); if (target == null) return; if (target.canCopy()) target.performCopy(clipBoard); } public void editCut() { CopyCutPasteTarget target = getActiveCopyCutPasteTarget(); if (target == null) return; if (target.canCut()) target.performCut(clipBoard); } public void editPaste() { CopyCutPasteTarget target = getActiveCopyCutPasteTarget(); if (target == null) return; if (target.canPaste()) target.performPaste(clipBoard); } public void export() { Document doc = getDocumentManager().getSelection(); if (!(doc instanceof Transferable)) return; Transferable transferable = (Transferable) doc; String title = doc.getTitle(); if (title == null) title = "Export"; else title = "Export '"+title+"'"; JComboBox src = new JComboBox(transferable.getTransferDataFlavors()); src.setRenderer(new DefaultListCellRenderer(){ /** * */ private static final long serialVersionUID = -4553255745845039428L; public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { String text; if (value instanceof DataFlavor) { DataFlavor flavor = (DataFlavor) value; String mimeType = flavor.getMimeType(); String humanRep = flavor.getHumanPresentableName(); String charset = flavor.getParameter("charset"); if (mimeType == null) text = "?"; else { text = mimeType; int ix = text.indexOf(';'); if (ix>=0) text = text.substring(0, ix).trim(); } if (charset != null) text+="; charset="+charset; if (humanRep != null) text+=" ("+humanRep+")"; } else { text = String.valueOf(value); } return super.getListCellRendererComponent(list, text, index, isSelected, cellHasFocus); } }); JComboBox dst = new JComboBox(new Object[]{"File", "Clipboard"}); Object[] msg = {"Source:", doc.getTitle(), "Export as:", src, "Export to:", dst}; Object[] options = {"Ok", "Cancel"}; JOptionPane op = new JOptionPane( msg, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION, null, options); JDialog dialog = op.createDialog(getWindow(), title); dialog.setModal(true); dialog.setVisible(true); boolean ok = "Ok".equals(op.getValue()); DataFlavor flavor = (DataFlavor) src.getSelectedItem(); dialog.dispose(); if(!ok) return; if (flavor == null) return; if ("Clipboard".equals(dst.getSelectedItem())) { Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); cb.setContents(new SelectedTransfer(flavor, transferable), null); } else { export(transferable, flavor); } } private static class SelectedTransfer implements Transferable { private DataFlavor selectedFlavor; private Transferable delegate; public SelectedTransfer(DataFlavor selectedFlavor, Transferable delegate) { this.selectedFlavor = selectedFlavor; this.delegate = delegate; } public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { if (!selectedFlavor.match(flavor)) throw new UnsupportedFlavorException(flavor); return delegate.getTransferData(flavor); } public DataFlavor[] getTransferDataFlavors() { DataFlavor[] flavors = {selectedFlavor}; return flavors; } public boolean isDataFlavorSupported(DataFlavor flavor) { return selectedFlavor.equals(flavor); } } private void export(Transferable transferable, DataFlavor flavor) { File file = getExportFile(); if (file == null) return; Reader reader; try { reader = flavor.getReaderForText(transferable); } catch(Exception e) { reader = null; } if (reader != null) { try { FileOutputStream out = new FileOutputStream(file); try { int data; while ((data=reader.read())!=-1) { out.write(data); } out.flush(); } finally { out.close(); } } catch (Exception e) { throw new RuntimeException(e); } return ; } if (DataFlavor.imageFlavor.match(flavor)) { Image image; try { image = (Image) transferable.getTransferData(flavor); } catch (Exception e) { throw new RuntimeException(e); } try { ImageIO.write((RenderedImage) image, "png", file); } catch (IOException e) { throw new RuntimeException(e); } } // else report unsupported flavor } private File getExportFile() { JFileChooser chooser = new JFileChooser(); if (chooser.showSaveDialog(mainWindow)==JFileChooser.APPROVE_OPTION) { return chooser.getSelectedFile(); } return null; } public void fileSave() { fileSave(false); } public void fileSaveAs() { fileSave(true); } private File lastSaveInFolderLocation = null; public void fileSave(boolean saveAs) { Document d = pageContainer.getSelection(); if (d == null) return; if (!saveAs) { Iterator<FileService> iter = ServiceRegistry.getServices(FileService.class); FileService useService = null; while (iter.hasNext()) { FileService fs = iter.next(); if (fs.isDirectSaveOperationSupported(d)) { useService = fs; break; } } if (useService != null) { useService.save(d, useService.getAssociatedFile(d)); return ; } } JFileChooser chooser = new JFileChooser(); chooser.setSelectedFile(lastSaveInFolderLocation); chooser.setMultiSelectionEnabled(false); Iterator<FileService> iter = ServiceRegistry.getServices(FileService.class); while (iter.hasNext()) { FileService fs = iter.next(); boolean add = (saveAs && fs.isSaveOperationSupported(d)) || ((!saveAs)&&fs.isDirectSaveOperationSupported(d)); if (add) chooser.addChoosableFileFilter(fs.getFileFilter()); } File sfile = d.getFile(); if (sfile == null && d.getTitle()!=null) sfile = new File(d.getTitle()); if (sfile != null) chooser.setSelectedFile(sfile); if (!(chooser.showSaveDialog(mainWindow)==JFileChooser.APPROVE_OPTION)) return; FileService service = FileServiceTool.lookupFileService(chooser); if (service != null) { File newFile = chooser.getSelectedFile(); if (newFile == null) return; if (newFile.exists() && JOptionPane.showConfirmDialog(mainWindow, "Overwrite existing file '"+newFile.getAbsolutePath() +"' ?", "File already exists.", JOptionPane.YES_NO_OPTION)==JOptionPane.NO_OPTION) return; service.save(d, newFile); lastSaveInFolderLocation = newFile.getParentFile(); } else { JOptionPane.showMessageDialog(mainWindow, "Could not find service to save file."); } } public void fileProperties() { Document d = pageContainer.getSelection(); if (d == null) return; FileService service = null; Iterator<FileService> iter = ServiceRegistry.getServices(FileService.class); while (iter.hasNext() && service == null) { FileService fs = iter.next(); if (fs.isEditPropertiesSupported(d)) { service = fs; } } service.editProperties(d); } public void fileOpen() { // todo keep working directory JFileChooser chooser = new JFileChooser(); chooser.setMultiSelectionEnabled(true); FileServiceTool.addChoosableFileFilters(chooser); if (!(chooser.showOpenDialog(mainWindow)==JFileChooser.APPROVE_OPTION)) return; final File[] selected = chooser.getSelectedFiles(); final FileService service = FileServiceTool.lookupFileService(chooser); if (service == null) { JOptionPane.showMessageDialog(mainWindow, "Could not find service to open file."); return; } Runnable run = new Runnable() { public void run() { for (File file: selected) { service.open(file); } } }; SwingUtilities.invokeLater(WorkIndicator.create(getWindow(), run)); } public ExplorerTree getExplorer() { return explorerTree; } public JTabbedPane2 getSynthTabbedPane() { return synthPane; } void setupMenu() { // before menu builder is used RuntimeMenuBuilder.buildNewMenuEntries(menuLayout, "Nord Modular patch 3.0", "Nord Modular"); ResourceBundle localizedMessages = NomadLoader.getResourceBundle(); menuLayout.getEntry(MENU_FILE_OPEN) .addActionListener(new ActionHandler(this, true, "fileOpen")); menuLayout.getEntry(MENU_FILE_SAVE) .addActionListener(new ActionHandler(this, true, "fileSave")); menuLayout.getEntry(MENU_FILE_SAVEAS) .addActionListener(new ActionHandler(this, true, "fileSaveAs")); menuLayout.getEntry(MENU_FILE_PROPERTIES) .addActionListener(new ActionHandler(this, true, "fileProperties")); menuLayout.getEntry(MENU_FILE_EXPORT) .addActionListener(new ActionHandler(this, true, "export")); menuLayout.getEntry(MENU_EDIT_COPY) .addActionListener(new ActionHandler(this, true, "editCopy")); menuLayout.getEntry(MENU_EDIT_CUT) .addActionListener(new ActionHandler(this, true, "editCut")); menuLayout.getEntry(MENU_EDIT_PASTE) .addActionListener(new ActionHandler(this, true, "editPaste")); menuLayout.getEntry("nomad.menu.help.plugins") .addActionListener(new ActionHandler(this, true, "pluginsHelp")); menuLayout.getEntry(MENU_DEBUG_GC) .addActionListener(new ActionHandler(this, true, "debug_gc")); /* MLEntry mnLang = menuLayout.getEntry("nomad.menu.window.language"); for (int i=0;i<mnLang.size();i++) { MLEntry lang = mnLang.getEntryAt(i); lang.addActionListener(new LocaleSwitcher(lang.getLocalEntryPoint())); }*/ menuBuilder.setResourceBundle(localizedMessages); LocaleConfiguration.getLocaleConfiguration().addLocaleChangeListener(new LocaleHandler(menuBuilder)); final JMenuBar mainMenuBar = menuBuilder.createMenuBar("nomad.menu"); mainWindow.setJMenuBar(mainMenuBar); menuBuilder.addActionListener("nomad.menu.file.exit", new ActionHandler(this, true, "handleExit")); MenuLayout.disableGhosts(menuLayout); DocumentSelectionHandler dsh = new DocumentSelectionHandler(); pageContainer.addListener(dsh); dsh.setMenuForDocument(pageContainer.getSelection()); new DocumentActionActivator(pageContainer, menuLayout); } public void debug_gc() { SwingUtilities.invokeLater(new Runnable(){public void run(){ Runtime rt = Runtime.getRuntime(); System.out.println("garbage collect"); System.gc(); System.out.println("gc: free:"+rt.freeMemory()+" byte, max:"+rt.maxMemory()); }}); } void setupUI() { this.clipBoard = new Clipboard("nomad clipboard"); ApplicationClipboard.setApplicationClipboard(clipBoard); mainWindow.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); mainWindow.addWindowListener(new WindowAdapter() { public void windowClosing( WindowEvent e ) { Nomad.sharedInstance().handleExit(); } }); pageContainer = new DefaultDocumentManager(); Container contentPane = mainWindow.getContentPane(); explorerTree = new FileExplorerTree(); explorerTree.setFont(new Font("Arial", Font.PLAIN, 11)); explorerTree.createPopup(menuBuilder); JScrollPane explorerTreeScroller = new JScrollPane(explorerTree); toolPane = new JTabbedPane2(); toolPane.setCloseActionEnabled(false); toolPane.addTab("Explorer", getImage("/icons/eview16/filenav_nav.gif"), explorerTreeScroller); new DropTarget(contentPane, new URIListDropHandler() { public void uriListDropped(URI[] uriList) { for (URI uri: uriList) { try { File f = new File(uri); openOrSelect(f); } catch (IllegalArgumentException e) { // ignore } } } }); synthPane = new JTabbedPane2(); synthPane.setCloseActionEnabled(true); JSplitPane sidebarSplit = new JSplitPane(JSplitPane.VERTICAL_SPLIT, false); sidebarSplit.setTopComponent(toolPane); sidebarSplit.setBottomComponent(synthPane); sidebarSplit.setResizeWeight(0.8); sidebarSplit.setOneTouchExpandable(true); /* JComponent sidebar = new JPanel(new BorderLayout()); sidebar.setBorder(null); sidebar.add(sidebarSplit, BorderLayout.CENTER); */ if (!Platform.isFlavor(OS.MacOSFlavor)) { /* JToolBar tb = createQuickActionToolbar(); sidebar.add(tb, BorderLayout.NORTH);*/ } else { registerForMacOSXEvents(); } JSplitPane splitLR = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); splitLR.setResizeWeight(0); splitLR.setDividerLocation(200); splitLR.setRightComponent(pageContainer); splitLR.setLeftComponent(sidebarSplit); contentPane.setLayout(new BorderLayout()); contentPane.add(splitLR, BorderLayout.CENTER); if (contentPane instanceof JComponent) ((JComponent)contentPane).revalidate(); } private JToolBar createQuickActionToolbar() { JToolBar toolbar = new JToolBar(); toolbar.setBorderPainted(false); toolbar.setFloatable(false); toolbar.add(Factory.createToolBarButton(menuLayout.getEntry(MENU_FILE_OPEN))); toolbar.addSeparator(); toolbar.add(Factory.createToolBarButton(menuLayout.getEntry(MENU_FILE_SAVE))); toolbar.addSeparator(); JPopupMenu pop = new JPopupMenu(); Iterator<FileService> iter = ServiceRegistry.getServices(FileService.class); JRadioButtonMenuItem rfirst = null; SelectedAction sa = new SelectedAction(); sa.putValue(AbstractAction.SMALL_ICON, getImage("/icons/tango/16x16/actions/document-new.png")); while (iter.hasNext()) { FileService fs = iter.next(); if (fs.isNewFileOperationSupported()) { JRadioButtonMenuItem rb = new JRadioButtonMenuItem(new AHAction(fs.getName(), fs.getIcon(), fs, "newFile")); sa.add(rb); pop.add(rb); if (rfirst == null) rfirst = rb; } } JButton btn = Factory.createToolBarButton(sa); toolbar.add(btn); new JDropDownButtonControl(btn, pop); return toolbar; } public void registerForMacOSXEvents() { try { // Generate and register the OSXAdapter, passing it a hash of all the methods we wish to // use as delegates for various com.apple.eawt.ApplicationListener methods OSXAdapter.setQuitHandler(this, getClass().getDeclaredMethod("handleExit", (Class[])null)); OSXAdapter.setFileHandler(this, getClass().getDeclaredMethod("loadOSXFile", new Class[] { String.class })); } catch (Exception e) { System.err.println("Error while loading the OSXAdapter:"); e.printStackTrace(); } } public void loadOSXFile(String path) { File file = new File(path); FileService service = FileServiceTool.lookupFileService(file); if (service != null) { service.open(file); } else { JOptionPane.showMessageDialog(mainWindow, "Could not find service to open file."); } } private static class AHAction extends AbstractAction { /** * */ private static final long serialVersionUID = 3827015254600154428L; private ActionHandler actionHandler; public AHAction(String title, Icon icon, Object imp, String method) { if (title != null) putValue(NAME, title); if (icon != null) putValue(SMALL_ICON, icon); actionHandler = new ActionHandler(imp, method); } public void actionPerformed(ActionEvent e) { actionHandler.actionPerformed(e); } } private ImageIcon getImage(String name) { return new ImageIcon(getClass().getResource(name)); } public JTabbedPane2 getToolPane() { return toolPane; } public NomadPlugin getCorePlugin() { return pluginInstance; } public PluginManager getPluginManager() { return PluginManager.lookup(pluginInstance); } public static synchronized Nomad sharedInstance() { return instance; } public JFrame getWindow() { return mainWindow; } public boolean askStopApplication() { if (!stopped) { for (Document d: getDocumentManager().getDocuments()) { if (d.isModified()) { Nomad n = Nomad.sharedInstance(); int result = JOptionPane.showConfirmDialog(n.getWindow().getRootPane(), "Are you sure you want to quit without saving " + d.getTitle() + " ?\nChanges will not be lost upon quit, as the patch will be saved in the current session.", "", JOptionPane.OK_CANCEL_OPTION); if (result != JOptionPane.OK_OPTION) return false; } } stop(); return stopped; } return false; } private void stop() { stopped = true; getWindow().setVisible(false); SystemProperties properties = SystemPropertyFactory.getProperties(getClass()); properties.setRectangleValue(PROPERY_WINDOW_BOUNDS, mainWindow.getBounds()); for (Iterator<InitService> i=ServiceRegistry.getServices(InitService.class); i.hasNext();) { try { i.next().shutdown(); } catch (Throwable t) { t.printStackTrace(); } } storeProperties(); shutDownPlugin(); getPluginManager().shutdown(); System.exit(0); } private void shutDownPlugin() { Log log = LogFactory.getLog(getClass()); log.info("Shutting down "+pluginInstance); try { Boot.stopApplication(pluginInstance); } catch (Exception e) { // log.warn(e); e.printStackTrace(); } } public boolean handleExit() { return askStopApplication(); } public MenuLayout getMenuLayout() { return menuLayout; } public MenuBuilder getMenuBuilder() { return menuBuilder; } public void openOrSelect(File file) { if (file.isDirectory()) return; // find out if file is already open for (Document d: getDocumentManager().getDocuments()) { if (file.equals(d.getFile())) { getDocumentManager().setSelection(d); return ; } } Iterator<FileService> iter = ServiceRegistry.getServices(FileService.class); while (iter.hasNext()) { FileService fs = iter.next(); if (fs.isOpenFileOperationSupported()) { if (fs.getFileFilter().accept(file)) { int count = pageContainer.getDocumentCount(); fs.open(file); int newCount = pageContainer.getDocumentCount(); if (newCount>count) { // condition may be false if fs.open() creates the document // on the event dispatch thread pageContainer.setSelectedIndex(newCount-1); } return; } } } } public Document setSelectedDocumentByFile(File file) { if (file == null) return null; for (Document d: pageContainer.getDocuments()) { if (file.equals(d.getFile())) { pageContainer.setSelection(d); return d; } } return null; } }