/* * This file is part of muCommander, http://www.mucommander.com * Copyright (C) 2002-2016 Maxence Bernard * * muCommander 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 3 of the License, or * (at your option) any later version. * * muCommander 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 this program. If not, see <http://www.gnu.org/licenses/>. */ package com.mucommander.ui.viewer; import java.awt.Frame; import java.awt.Image; import java.util.Vector; import com.mucommander.commons.file.AbstractFile; import com.mucommander.commons.file.protocol.FileProtocols; import com.mucommander.commons.runtime.OsFamily; import com.mucommander.commons.runtime.OsVersion; import com.mucommander.text.Translator; import com.mucommander.ui.dialog.QuestionDialog; import com.mucommander.ui.main.MainFrame; import com.mucommander.ui.main.WindowManager; /** * ViewerRegistrar maintains a list of registered file viewers and provides methods to dynamically register file viewers * and create appropriate FileViewer (Panel) and ViewerFrame (Window) instances for a given AbstractFile. * * @author Maxence Bernard, Arik Hadas */ public class ViewerRegistrar { /** List of registered file viewers */ private final static java.util.List<ViewerFactory> viewerFactories = new Vector<ViewerFactory>(); static { registerFileViewer(new com.mucommander.ui.viewer.image.ImageFactory()); // The TextFactory must be the last FileViewer to be registered (otherwise it would open other factories file types) registerFileViewer(new com.mucommander.ui.viewer.text.TextFactory()); } /** * Registers a FileViewer. * @param factory file viewer factory to register. */ public static void registerFileViewer(ViewerFactory factory) { viewerFactories.add(factory); } /** * Creates and returns a ViewerFrame to start viewing the given file. The ViewerFrame will be monitored * so that if it is the last window on screen when it is closed by the user, it will trigger the shutdown sequence. * * @param mainFrame the parent MainFrame instance * @param file the file that will be displayed by the returned ViewerFrame * @param icon window's icon. * @return the created ViewerFrame */ public static FileFrame createViewerFrame(MainFrame mainFrame, AbstractFile file, Image icon) { ViewerFrame frame = new ViewerFrame(mainFrame, file, icon); // Use new Window decorations introduced in Mac OS X 10.5 (Leopard) if(OsFamily.MAC_OS_X.isCurrent() && OsVersion.MAC_OS_X_10_5.isCurrentOrHigher()) { // Displays the document icon in the window title bar, works only for local files if(file.getURL().getScheme().equals(FileProtocols.FILE)) frame.getRootPane().putClientProperty("Window.documentFile", file.getUnderlyingFileObject()); } // WindowManager will listen to window closed events to trigger shutdown sequence // if it is the last window visible frame.addWindowListener(WindowManager.getInstance()); return frame; } /** * Creates and returns an appropriate FileViewer for the given file type. * * @param file the file that will be displayed by the returned FileViewer * @param frame the frame in which the FileViewer is shown * @return the created FileViewer, or null if no suitable viewer was found * @throws UserCancelledException if the user has been asked to confirm the operation and canceled */ public static FileViewer createFileViewer(AbstractFile file, ViewerFrame frame) throws UserCancelledException { FileViewer viewer = null; for(ViewerFactory factory : viewerFactories) { try { if(factory.canViewFile(file)) { viewer = factory.createFileViewer(); break; } } catch(WarnUserException e) { // TODO: question the user how does he want to open the file (as image, text..) // Todo: display a proper warning dialog with the appropriate icon QuestionDialog dialog = new QuestionDialog((Frame)null, Translator.get("warning"), Translator.get(e.getMessage()), frame, new String[] {Translator.get("file_editor.open_anyway"), Translator.get("cancel")}, new int[] {0, 1}, 0); int ret = dialog.getActionValue(); if(ret==1 || ret==-1) // User canceled the operation throw new UserCancelledException(); // User confirmed the operation viewer = factory.createFileViewer(); } } if (viewer != null) viewer.setFrame(frame); return viewer; } }