// This product is provided under the terms of EPL (Eclipse Public License)
// version 1.0.
//
// The full license text can be read from: http://www.eclipse.org/org/documents/epl-v10.php
package org.dtangler.swingui.mainview.impl;
import java.io.File;
import java.util.Map;
import org.dtangler.core.configuration.Arguments;
import org.dtangler.core.configuration.ParserConstants;
import org.dtangler.core.input.ArgumentParser;
import org.dtangler.core.input.ConfigFileParser;
import org.dtangler.core.input.ConfigFileWriter;
import org.dtangler.swingui.fileselector.FileSelector;
import org.dtangler.swingui.windowmanager.DialogManager;
import org.dtangler.swingui.windowmanager.DialogManager.DialogResult;
public class ConfigurationModel {
private final FileSelector fileSelector;
private final DialogManager dialogManager;
private Arguments currentArguments;
private Arguments lastSavedArguments;
public ConfigurationModel(final FileSelector fileSelector,
final DialogManager dialogManager, Arguments arguments) {
this.fileSelector = fileSelector;
this.dialogManager = dialogManager;
currentArguments = arguments;
lastSavedArguments = currentArguments.createDeepCopy();
}
public boolean openConfiguration() {
if (!canLooseCurrentConfiguration())
return false;
String fileName = selectFile("Open");
if (fileName == null)
return false;
openConfigFile(fileName);
return true;
}
public boolean openConfiguration(String fileName) {
if (!canLooseCurrentConfiguration())
return false;
openConfigFile(fileName);
return true;
}
public void save() {
if (currentArguments.getConfigFileName() == null)
saveAs();
else
saveConfiguration();
}
public void saveAs() {
String fileName = selectFile("Save");
if (fileName == null)
return;
currentArguments.setConfigFileName(fileName);
saveConfiguration();
}
private void saveConfiguration() {
saveConfigFile(currentArguments.getConfigFileName());
lastSavedArguments = currentArguments.createDeepCopy();
}
public String getFileName() {
String configFileName = currentArguments.getConfigFileName();
return configFileName != null ? configFileName : "unsaved settings";
}
public boolean newConfiguration() {
if (!canLooseCurrentConfiguration())
return false;
currentArguments = new Arguments();
lastSavedArguments = currentArguments.createDeepCopy();
return true;
}
public boolean canLooseCurrentConfiguration() {
if (!isDirty())
return true;
DialogResult result = dialogManager.showYesNoCancelDialog(
"dtangler settings have been modified. Save canges?",
"save dtangler settings");
if (result.equals(DialogResult.yes)) {
save();
return !isDirty(); // check wether actually saved
}
return result.equals(DialogResult.no);
}
public boolean isDirty() {
return !currentArguments.equals(lastSavedArguments);
}
public Arguments getArguments() {
return currentArguments;
}
public void setArguments(Arguments newArguments) {
currentArguments = newArguments;
}
private String selectFile(String functionText) {
return fileSelector.selectFile(functionText, ".properties",
"dtangler properties file");
}
protected void openConfigFile(String fileName) {
Map<String, String> configFileValues = new ConfigFileParser(new File(
fileName), ParserConstants.VALID_KEYS).parseValues();
setOpenedArguments(fileName, new ArgumentParser()
.parseArguments(configFileValues));
}
protected void setOpenedArguments(String fileName, Arguments parseArguments) {
currentArguments = parseArguments;
currentArguments.setConfigFileName(fileName);
lastSavedArguments = currentArguments.createDeepCopy();
}
protected void saveConfigFile(String fileName) {
new ConfigFileWriter(new File(fileName)).save(currentArguments);
}
}