/* D-Bus Java Viewer Copyright (c) 2006 Peter Cox This program is free software; you can redistribute it and/or modify it under the terms of either the GNU Lesser General Public License Version 2 or the Academic Free Licence Version 2.1. Full licence texts are included in the COPYING file with this program. */ package org.freedesktop.dbus.viewer; import static org.freedesktop.dbus.Gettext._; import java.awt.event.ActionEvent; import java.io.File; import javax.swing.AbstractAction; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.text.JTextComponent; abstract class TabbedSaveAction extends AbstractAction implements Iterable<TextFile> { /** File chooser component. * Make static so that previous save location is stored */ private static JFileChooser chooser; protected final JTabbedPane tabbedPane; protected TabbedSaveAction(JTabbedPane tabbedPane) { super(); this.tabbedPane = tabbedPane; } protected TabbedSaveAction(JTabbedPane tabbedPane, String name) { super(name); this.tabbedPane = tabbedPane; } /** Get the text file object associated with the supplied index * @param index The tabbed pane index * @return The text file object for the referenced tab */ protected TextFile getTextFile(int index) { JScrollPane scrollPane = (JScrollPane) tabbedPane.getComponentAt(index); JTextComponent textComponent = (JTextComponent) scrollPane.getViewport().getView(); final String sourceCode = textComponent.getText(); final String fileName = getFileName(index); TextFile textFile = new TextFile(fileName, sourceCode); return textFile; } /** Get the file name for the supplied index * @param index The tabbed pane index * @return The file name for the referenced tab */ protected String getFileName(int index) { return (index > -1) ? tabbedPane.getTitleAt(index) : ""; } /** {@inheritDoc} */ public final void actionPerformed(ActionEvent e) { if (chooser == null) { /** Occurs on event dispatch thread, so no problems with lazy static init here */ chooser = new JFileChooser(); } chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); chooser.setDialogTitle(_("Select parent directory for saving")); int result = chooser.showDialog(tabbedPane, "Select"); if (result == JFileChooser.APPROVE_OPTION) { File parentDirectory = chooser.getSelectedFile(); if (parentDirectory.exists() || parentDirectory.mkdirs()) { if (parentDirectory.canWrite()) { Runnable runnable = new FileSaver(tabbedPane, parentDirectory, this); new Thread(runnable).start(); } else { JOptionPane.showMessageDialog(tabbedPane, _("Could not write to parent directory"), _("Invalid Parent Directory"), JOptionPane.ERROR_MESSAGE); } } else { JOptionPane.showMessageDialog(tabbedPane, _("Could not access parent directory"), _("Invalid Parent Directory"), JOptionPane.ERROR_MESSAGE); } } } }