package com.mucommander.ui.viewer; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Frame; import java.awt.Image; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.WindowConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.mucommander.commons.file.AbstractFile; import com.mucommander.ui.dialog.DialogToolkit; import com.mucommander.ui.dialog.InformationDialog; import com.mucommander.ui.helper.FocusRequester; import com.mucommander.ui.layout.AsyncPanel; import com.mucommander.ui.main.MainFrame; /** * This class is used as an abstraction for the {@link EditorFrame} and {@link ViewerFrame}. * * @author Arik Hadas */ public abstract class FileFrame extends JFrame { private static final Logger LOGGER = LoggerFactory.getLogger(FileFrame.class); private final static Dimension WAIT_DIALOG_SIZE = new Dimension(400, 350); // The file presenter within this frame private FilePresenter filePresenter; // The main frame from which this frame was initiated private MainFrame mainFrame; FileFrame(MainFrame mainFrame, AbstractFile file, Image icon) { this.mainFrame = mainFrame; setIconImage(icon); // Call #dispose() on close (default is hide) setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); setResizable(true); initContentPane(file); } protected void initContentPane(final AbstractFile file) { try { filePresenter = createFilePresenter(file); } catch (UserCancelledException e) { // May get a UserCancelledException if the user canceled (refused to confirm the operation after a warning) return; } // If not suitable presenter was found for the given file if (filePresenter == null) { showGenericErrorDialog(); return; } AsyncPanel asyncPanel = new AsyncPanel() { @Override public JComponent getTargetComponent() { try { // Ask the presenter to present the file filePresenter.open(file); } catch(Exception e) { LOGGER.debug("Exception caught", e); showGenericErrorDialog(); dispose(); return filePresenter==null?new JPanel():filePresenter; } setJMenuBar(filePresenter.getMenuBar()); return filePresenter; } @Override protected void updateLayout() { super.updateLayout(); // Sets panel to preferred size, without exceeding a maximum size and with a minimum size pack(); // Request focus on the viewer when it is visible FocusRequester.requestFocus(filePresenter); } }; // Add the AsyncPanel to the content pane JPanel contentPane = new JPanel(new BorderLayout()); contentPane.add(asyncPanel, BorderLayout.CENTER); setContentPane(contentPane); setSize(WAIT_DIALOG_SIZE); DialogToolkit.centerOnWindow(this, mainFrame); setVisible(true); } private void showGenericErrorDialog() { InformationDialog.showErrorDialog(mainFrame, getGenericErrorDialogTitle(), getGenericErrorDialogMessage()); } /** * Sets this file presenter to full screen */ public void setFullScreen(boolean on) { int currentExtendedState = getExtendedState(); setExtendedState(on ? currentExtendedState | Frame.MAXIMIZED_BOTH : currentExtendedState & ~Frame.MAXIMIZED_BOTH); } /** * Returns whether this frame is set to be displayed in full screen mode * * @return true if the frame is set to full screen, false otherwise */ public boolean isFullScreen() { return (getExtendedState() & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH; } //////////////////////// // Overridden methods // //////////////////////// @Override public void pack() { if (!isFullScreen()) { super.pack(); DialogToolkit.fitToScreen(this); DialogToolkit.fitToMinDimension(this, getMinimumSize()); DialogToolkit.centerOnWindow(this, mainFrame); } } ////////////////////// // Abstract methods // ////////////////////// protected abstract String getGenericErrorDialogTitle(); protected abstract String getGenericErrorDialogMessage(); protected abstract FilePresenter createFilePresenter(AbstractFile file) throws UserCancelledException; }