/* * AppletContentManager.java 13 Oct. 2008 * * Sweet Home 3D, Copyright (c) 2008 Emmanuel PUYBARET / eTeks <info@eteks.com> * * This program 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. * * This program 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, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package com.eteks.sweethome3d.applet; import java.awt.BorderLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import com.eteks.sweethome3d.model.HomeRecorder; import com.eteks.sweethome3d.model.RecorderException; import com.eteks.sweethome3d.model.UserPreferences; import com.eteks.sweethome3d.swing.FileContentManager; import com.eteks.sweethome3d.viewcontroller.View; /** * Content manager for Sweet Home 3D files stored on server. * @author Emmanuel Puybaret */ public class AppletContentManager extends FileContentManager { private final HomeRecorder recorder; private final UserPreferences preferences; public AppletContentManager(HomeRecorder recorder, UserPreferences preferences) { super(preferences); this.recorder = recorder; this.preferences = preferences; } /** * Returns the name of the content in parameter. */ @Override public String getPresentationName(String contentName, ContentType contentType) { if (contentType == ContentType.SWEET_HOME_3D) { return contentName; } else { return super.getPresentationName(contentName, contentType); } } /** * Returns <code>true</code> if the content name in parameter is accepted * for <code>contentType</code>. */ @Override public boolean isAcceptable(String contentName, ContentType contentType) { if (contentType == ContentType.SWEET_HOME_3D) { return true; } else { return contentType != ContentType.PLUGIN && super.isAcceptable(contentName, contentType); } } /** * Returns the name chosen by user with an open dialog. * @return the name or <code>null</code> if user canceled its choice. */ @Override public String showOpenDialog(View parentView, String dialogTitle, ContentType contentType) { if (contentType == ContentType.SWEET_HOME_3D) { String [] availableHomes = null; if (this.recorder instanceof HomeAppletRecorder) { try { availableHomes = ((HomeAppletRecorder)this.recorder).getAvailableHomes(); } catch (RecorderException ex) { String errorMessage = this.preferences.getLocalizedString( AppletContentManager.class, "showOpenDialog.availableHomesError"); showError(parentView, errorMessage); return null; } } if (availableHomes != null && availableHomes.length == 0) { String message = this.preferences.getLocalizedString( AppletContentManager.class, "showOpenDialog.noAvailableHomes"); JOptionPane.showMessageDialog(SwingUtilities.getRootPane((JComponent)parentView), message, getFileDialogTitle(false), JOptionPane.INFORMATION_MESSAGE); return null; } else { String message = this.preferences.getLocalizedString( AppletContentManager.class, "showOpenDialog.message"); final JList availableHomesList = new JList(availableHomes); availableHomesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); availableHomesList.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent ev) { // Close the option pane when the user double clicks in the list if (ev.getClickCount() == 2 && availableHomesList.getSelectedValue() != null) { ((JOptionPane)SwingUtilities.getAncestorOfClass(JOptionPane.class, availableHomesList)). setValue(JOptionPane.OK_OPTION); } } }); JPanel panel = new JPanel(new BorderLayout()); panel.add(new JLabel(message), BorderLayout.NORTH); panel.add(new JScrollPane(availableHomesList), BorderLayout.CENTER); if (JOptionPane.showConfirmDialog(SwingUtilities.getRootPane((JComponent)parentView), panel, getFileDialogTitle(false), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.OK_OPTION) { Object selectedValue = availableHomesList.getSelectedValue(); if (selectedValue != null) { return (String)selectedValue; } } return null; } } else { return super.showOpenDialog(parentView, dialogTitle, contentType); } } /** * Returns the name chosen by user with a save dialog. * If this name already exists, the user will be prompted whether * he wants to overwrite this existing name. * @return the chosen name or <code>null</code> if user canceled its choice. */ @Override public String showSaveDialog(View parentView, String dialogTitle, ContentType contentType, String name) { if (contentType == ContentType.SWEET_HOME_3D) { String message = this.preferences.getLocalizedString( AppletContentManager.class, "showSaveDialog.message"); String savedName = (String)JOptionPane.showInputDialog(SwingUtilities.getRootPane((JComponent)parentView), message, getFileDialogTitle(true), JOptionPane.QUESTION_MESSAGE, null, null, name); if (savedName == null) { return null; } savedName = savedName.trim(); try { // If the name exists, prompt user if he wants to overwrite it if (this.recorder.exists(savedName) && !confirmOverwrite(parentView, savedName)) { return showSaveDialog(parentView, dialogTitle, contentType, savedName); // If name is empty, prompt user again } else if (savedName.length() == 0) { return showSaveDialog(parentView, dialogTitle, contentType, savedName); } return savedName; } catch (RecorderException ex) { String errorMessage = this.preferences.getLocalizedString( AppletContentManager.class, "showSaveDialog.checkHomeError"); showError(parentView, errorMessage); return null; } } else { return super.showSaveDialog(parentView, dialogTitle, contentType, name); } } /** * Shows the given <code>message</code> in an error message dialog. */ private void showError(View parentView, String message) { String title = this.preferences.getLocalizedString( AppletContentManager.class, "showError.title"); JOptionPane.showMessageDialog(SwingUtilities.getRootPane((JComponent)parentView), message, title, JOptionPane.ERROR_MESSAGE); } }