/* GanttProject is an opensource project management tool. License: GPL3 Copyright (C) 2011 GanttProject Team 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 3 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package net.sourceforge.ganttproject.export; import java.awt.Component; import java.io.File; import java.net.URL; import java.text.MessageFormat; import java.util.List; import javax.swing.filechooser.FileFilter; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.osgi.service.prefs.Preferences; import biz.ganttproject.core.option.GPOption; import biz.ganttproject.core.option.GPOptionGroup; import net.sourceforge.ganttproject.IGanttProject; import net.sourceforge.ganttproject.document.Document; import net.sourceforge.ganttproject.export.ExportFileWizardImpl.State; import net.sourceforge.ganttproject.filter.ExtensionBasedFileFilter; import net.sourceforge.ganttproject.gui.FileChooserPageBase; import net.sourceforge.ganttproject.gui.UIUtil; import net.sourceforge.ganttproject.gui.projectwizard.WizardImpl; import net.sourceforge.ganttproject.language.GanttLanguage; class FileChooserPage extends FileChooserPageBase { private final State myState; private final IGanttProject myProject; private final GPOptionGroup myWebPublishingGroup; FileChooserPage(State state, IGanttProject project, WizardImpl wizardImpl, Preferences prefs) { super(wizardImpl, prefs, false); myState = state; myProject = project; myWebPublishingGroup = new GPOptionGroup("exporter.webPublishing", new GPOption[] { state.getPublishInWebOption() }); myWebPublishingGroup.setTitled(false); } @Override protected String getFileChooserTitle() { return GanttLanguage.getInstance().getText("selectFileToExport"); } @Override public String getTitle() { return GanttLanguage.getInstance().getText("selectFileToExport"); } @Override protected void loadPreferences() { super.loadPreferences(); if (getPreferences().get(PREF_SELECTED_FILE, null) == null) { getChooser().setFile(proposeOutputFile(myProject, myState.getExporter())); } else { String proposedExtension = myState.getExporter().proposeFileExtension(); if (proposedExtension != null) { File selectedFile = getChooser().getFile(); String fileName = selectedFile.getName(); int lastDot = fileName.lastIndexOf('.'); if (lastDot < 0) { // No extension available, add one fileName += "."; lastDot = selectedFile.getName().length(); } String extension = fileName.substring(lastDot + 1); if (!extension.equals(proposedExtension)) { getChooser().setFile( new File(selectedFile.getParent(), fileName.substring(0, lastDot + 1) + proposedExtension)); } } } } @Override protected void onSelectedUrlChange(URL selectedUrl) { myState.setUrl(selectedUrl); super.onSelectedUrlChange(selectedUrl); } @Override protected IStatus onSelectedFileChange(File file) { if (!file.exists()) { File parent = file.getParentFile(); if (!parent.exists()) { return new Status(IStatus.ERROR, "foo", IStatus.ERROR, GanttLanguage.getInstance().formatText("fileChooser.error.directoryDoesNotExists", UIUtil.formatPathForLabel(parent)), null); } if (!parent.canWrite()) { return new Status(IStatus.ERROR, "foo", IStatus.ERROR, GanttLanguage.getInstance().formatText("fileChooser.error.directoryIsReadOnly", UIUtil.formatPathForLabel(parent)), null); } } else if (!file.canWrite()) { if (file.isDirectory()) { return new Status(IStatus.ERROR, "foo", IStatus.ERROR, GanttLanguage.getInstance().formatText("fileChooser.error.directoryIsReadOnly", UIUtil.formatPathForLabel(file)), null); } else { return new Status(IStatus.ERROR, "foo", IStatus.ERROR, GanttLanguage.getInstance().formatText("fileChooser.error.fileIsReadOnly", UIUtil.formatPathForLabel(file)), null); } } IStatus result = new Status(IStatus.OK, "foo", IStatus.OK, "", null); String proposedExtension = myState.getExporter().proposeFileExtension(); if (proposedExtension != null) { if (false == file.getName().toLowerCase().endsWith(proposedExtension)) { result = new Status(IStatus.OK, "foo", IStatus.OK, MessageFormat.format("Note that the extension is not {0}", new Object[] { proposedExtension }), null); } } IStatus setStatus = setSelectedFile(file); return setStatus.isOK() ? result : setStatus; } @Override protected Component createSecondaryOptionsPanel() { Component customUI = myState.getExporter().getCustomOptionsUI(); return customUI == null ? super.createSecondaryOptionsPanel() : customUI; } static File proposeOutputFile(IGanttProject project, Exporter exporter) { String proposedExtension = exporter.proposeFileExtension(); if (proposedExtension == null) { return null; } File result = null; Document projectDocument = project.getDocument(); if (projectDocument != null) { File localFile = new File(projectDocument.getFilePath()); if (localFile.exists()) { String name = localFile.getAbsolutePath(); int lastDot = name.lastIndexOf('.'); name = name.substring(0, lastDot) + "." + proposedExtension; result = new File(name); } else { File directory = localFile.getParentFile(); if (directory.exists()) { result = new File(directory, project.getProjectName() + "." + proposedExtension); } } } if (result == null) { File userHome = new File(System.getProperty("user.home")); result = new File(userHome, project.getProjectName() + "." + proposedExtension); } return result; } @Override protected FileFilter createFileFilter() { return new ExtensionBasedFileFilter(myState.getExporter().getFileNamePattern(), myState.getExporter().getFileTypeDescription()); } @Override protected GPOptionGroup[] getOptionGroups() { GPOptionGroup[] exporterOptions = null; if (myState.getExporter() != null) { List<GPOptionGroup> options = myState.getExporter().getSecondaryOptions(); exporterOptions = options == null ? null : options.toArray(new GPOptionGroup[0]); } if (exporterOptions == null) { return new GPOptionGroup[] { myWebPublishingGroup }; } GPOptionGroup[] result = new GPOptionGroup[exporterOptions.length + 1]; result[0] = myWebPublishingGroup; System.arraycopy(exporterOptions, 0, result, 1, exporterOptions.length); return result; } }