package com.xenoage.zong.commands.desktop.dialog;
import static com.xenoage.utils.collections.CollectionUtils.map;
import static com.xenoage.utils.jse.javafx.FileChooserUtils.addFilter;
import static com.xenoage.utils.log.Log.log;
import static com.xenoage.utils.log.Report.remark;
import static com.xenoage.zong.desktop.App.app;
import java.io.File;
import java.util.HashMap;
import javafx.stage.FileChooser;
import javafx.stage.FileChooser.ExtensionFilter;
import javafx.stage.Window;
import lombok.AllArgsConstructor;
import com.xenoage.utils.document.command.TransparentCommand;
import com.xenoage.utils.document.io.FileFormat;
import com.xenoage.utils.document.io.SupportedFormats;
import com.xenoage.utils.jse.settings.FileSettings;
/**
* This command shows a dialog that allows to save
* the current document.
*
* The possible file formats are the
* {@link SupportedFormats} of the app.
*
* @author Andreas Wenger
* @author Uli Teschemacher
*/
@AllArgsConstructor public class SaveDocumentDialog
extends TransparentCommand {
private Window ownerWindow;
/**
* Shows the dialog.
*/
@Override public void execute() {
FileChooser fileChooser = new FileChooser();
//use last document directory, when running as a desktop application
File initDir = FileSettings.getLastDir();
if (initDir != null)
fileChooser.setInitialDirectory(initDir);
//add formats
HashMap<ExtensionFilter, FileFormat<?>> formats = map();
SupportedFormats<?> supportedFormats = app().getSupportedFormats();
for (FileFormat<?> fileFormat : supportedFormats.getWriteFormats()) {
ExtensionFilter filter = addFilter(fileChooser, fileFormat);
formats.put(filter, fileFormat);
if (supportedFormats.getWriteDefaultFormat() == fileFormat) {
//set default
fileChooser.setSelectedExtensionFilter(filter);
}
}
//show the dialog
File file = fileChooser.showSaveDialog(ownerWindow);
if (file != null) {
log(remark("Dialog closed (OK), saving file \"" + file.getName() + "\""));
FileFormat<?> format = formats.get(fileChooser.getSelectedExtensionFilter());
String defaultExt = format.getDefaultExtension();
if (!file.getName().endsWith(defaultExt)) {
file = new File(file.getAbsolutePath() + defaultExt);
}
app().saveDocument(file, format);
//save document directory
FileSettings.rememberDir(file);
}
else {
log(remark("Dialog closed (Cancel)"));
}
}
}