package gsingh.learnkirtan.ui.action;
import gsingh.learnkirtan.FileManager;
import gsingh.learnkirtan.FileManager.SaveResult;
import gsingh.learnkirtan.shabad.Shabad;
import gsingh.learnkirtan.shabad.ShabadMetaData;
import gsingh.learnkirtan.ui.shabadeditor.ShabadEditor;
import gsingh.learnkirtan.ui.shabadeditor.SwingShabadEditor;
import gsingh.learnkirtan.utility.DialogUtility;
import java.awt.event.ActionEvent;
import java.io.IOException;
import javax.swing.AbstractAction;
import javax.swing.Action;
public class ActionFactory {
private ShabadEditor shabadEditor;
private FileManager fileManager;
public ActionFactory(ShabadEditor e, FileManager f) {
shabadEditor = e;
fileManager = f;
}
public Action newSaveAction() {
return new SaveAction();
}
public Action newOpenAction() {
return new OpenAction();
}
public Action newCreateAction() {
return new CreateAction();
}
public Action newPropertiesAction() {
return new PropertiesAction();
}
@SuppressWarnings("serial")
private class SaveAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent event) {
if (shabadEditor.isValidShabad()) {
try {
if (shabadEditor.isModified()) {
SaveResult result = fileManager.saveShabad(shabadEditor
.getShabad());
if (result != SaveResult.NOT_SAVED_CANCELLED) {
if (shabadEditor instanceof SwingShabadEditor) {
SwingShabadEditor editor = (SwingShabadEditor) shabadEditor;
editor.reset();
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
} else {
DialogUtility.showInvalidShabadDialog();
}
}
}
/**
* Prompts the user if they would like to save and saves if accepted
*
* @return a {@code SaveResult} describing the action taken
* @throws IOException
*/
private SaveResult safeSave(Shabad shabad) throws IOException {
int result = DialogUtility.showSaveDialog();
if (DialogUtility.isCancelledOrClosed(result))
return SaveResult.NOT_SAVED_CANCELLED;
if (DialogUtility.isYes(result)) {
if (shabadEditor.isValidShabad()) {
return fileManager.saveShabad(shabad);
} else {
return SaveResult.NOT_SAVED_INVALID_SHABAD;
}
}
return SaveResult.NOT_SAVED;
}
@SuppressWarnings("serial")
private class OpenAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent event) {
try {
// Save file if modified
SaveResult result = null;
if (shabadEditor.isModified()) {
result = safeSave(shabadEditor.getShabad());
}
if (result != SaveResult.NOT_SAVED_INVALID_SHABAD) {
// Open file if not cancelled
if (result != SaveResult.NOT_SAVED_CANCELLED) {
if (fileManager.openFile(shabadEditor)) {
if (shabadEditor instanceof SwingShabadEditor) {
SwingShabadEditor editor = (SwingShabadEditor) shabadEditor;
editor.reset();
}
}
}
} else {
DialogUtility.showInvalidShabadDialog();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
@SuppressWarnings("serial")
private class CreateAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent event) {
try {
// Save file if modified
SaveResult result = null;
if (shabadEditor.isModified()) {
result = safeSave(shabadEditor.getShabad());
}
if (result != SaveResult.NOT_SAVED_INVALID_SHABAD) {
// Create new file if not cancelled
if (result != SaveResult.NOT_SAVED_CANCELLED) {
shabadEditor.setShabad(new Shabad(""));
fileManager.newFile();
if (shabadEditor instanceof SwingShabadEditor) {
SwingShabadEditor editor = (SwingShabadEditor) shabadEditor;
editor.reset();
}
}
} else {
DialogUtility.showInvalidShabadDialog();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
@SuppressWarnings("serial")
public class PropertiesAction extends AbstractAction {
@Override
public void actionPerformed(ActionEvent event) {
DialogUtility.showMetaDataDialog(shabadEditor.getMetaData(),
new MetaDataDialogCallback());
}
public class MetaDataDialogCallback {
public void completed(ShabadMetaData data) {
shabadEditor.setMetaData(data);
}
}
}
}