/*
GanttProject is an opensource project management tool.
Copyright (C) 2005-2012 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.io.File;
import java.net.URL;
import java.net.URLDecoder;
import java.util.List;
import javax.swing.SwingUtilities;
import org.osgi.service.prefs.Preferences;
import biz.ganttproject.core.option.BooleanOption;
import biz.ganttproject.core.option.ChangeValueEvent;
import biz.ganttproject.core.option.ChangeValueListener;
import biz.ganttproject.core.option.DefaultBooleanOption;
import net.sourceforge.ganttproject.GPLogger;
import net.sourceforge.ganttproject.IGanttProject;
import net.sourceforge.ganttproject.gui.UIFacade;
import net.sourceforge.ganttproject.gui.projectwizard.WizardImpl;
import net.sourceforge.ganttproject.plugins.PluginManager;
/**
* @author bard
*/
public class ExportFileWizardImpl extends WizardImpl {
private final IGanttProject myProject;
private final State myState;
private static Exporter ourLastSelectedExporter;
private static List<Exporter> ourExporters;
public ExportFileWizardImpl(UIFacade uiFacade, IGanttProject project, Preferences pluginPreferences) {
super(uiFacade, language.getText("exportWizard.dialog.title"));
final Preferences exportNode = pluginPreferences.node("/instance/net.sourceforge.ganttproject/export");
myProject = project;
myState = new State();
myState.myPublishInWebOption.setValue(exportNode.getBoolean("publishInWeb", false));
myState.myPublishInWebOption.addChangeValueListener(new ChangeValueListener() {
@Override
public void changeValue(ChangeValueEvent event) {
exportNode.putBoolean("publishInWeb", myState.myPublishInWebOption.getValue());
}
});
if (ourExporters == null) {
ourExporters = PluginManager.getExporters();
}
myState.setExporter(ourLastSelectedExporter == null ? ourExporters.get(0) : ourLastSelectedExporter);
for (Exporter e : ourExporters) {
e.setContext(project, uiFacade, pluginPreferences);
}
addPage(new ExporterChooserPage(ourExporters, myState));
addPage(new FileChooserPage(myState, myProject, this, exportNode));
}
@Override
protected boolean canFinish() {
return myState.getExporter() != null && myState.myUrl != null && "file".equals(myState.getUrl().getProtocol());
}
@Override
protected void onOkPressed() {
super.onOkPressed();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
ExportFinalizationJob finalizationJob = new ExportFinalizationJobImpl();
if ("file".equals(myState.getUrl().getProtocol())) {
myState.getExporter().run(new File(myState.getUrl().toURI()), finalizationJob);
}
} catch (Exception e) {
GPLogger.log(e);
}
}
});
}
private class ExportFinalizationJobImpl implements ExportFinalizationJob {
@Override
public void run(File[] exportedFiles) {
if (myState.getPublishInWebOption().isChecked() && exportedFiles.length > 0) {
WebPublisher publisher = new WebPublisher();
publisher.run(exportedFiles, myProject.getDocumentManager().getFTPOptions());
}
}
}
static class State {
private Exporter myExporter;
private final BooleanOption myPublishInWebOption = new DefaultBooleanOption("exporter.publishInWeb");
private URL myUrl;
void setExporter(Exporter exporter) {
myExporter = exporter;
ExportFileWizardImpl.ourLastSelectedExporter = exporter;
}
Exporter getExporter() {
return myExporter;
}
BooleanOption getPublishInWebOption() {
return myPublishInWebOption;
}
void setUrl(URL url) {
myUrl = url;
}
public URL getUrl() {
return myUrl;
}
}
}