/*******************************************************************************
* Copyright (c) 2016 Weasis Team and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Nicolas Roduit - initial API and implementation
*******************************************************************************/
package org.weasis.core.api.gui.util;
import java.awt.Component;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.weasis.core.api.Messages;
/**
* The Class AbstractBufferHandler.
*
*/
public abstract class AbstractBufferHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(AbstractBufferHandler.class);
private String path;
private boolean isDirty;
private final Component parent;
private String addOpenMessage = ""; //$NON-NLS-1$
private FileFilter fileFilter;
public AbstractBufferHandler(Component component) {
parent = component;
}
public void setDirty(boolean flag) {
isDirty = flag;
}
public boolean isDirty() {
return isDirty;
}
protected void setPath(String s) {
path = s;
}
public String getPath() {
return path;
}
public boolean newDocument() {
if (isDirty() && !canCloseDocument()) {
return false;
} else {
setDirty(false);
setPath(null);
handleNewDocument();
return true;
}
}
public boolean openDocument() {
if (isDirty() && !canCloseDocument()) {
return false;
}
JFileChooser jfilechooser = getOpenFileChooser();
File file;
if (jfilechooser.showOpenDialog(getParentComponent()) != JFileChooser.APPROVE_OPTION
|| (file = jfilechooser.getSelectedFile()) == null) {
return false;
} else {
return openDocument(file.getPath(), false);
}
}
protected boolean openDocument(String s) {
return openDocument(s, true);
}
protected boolean openDocument(String s, boolean flag) {
if (flag && isDirty() && !canCloseDocument()) {
return false;
}
setPath(s);
if (!handleOpenDocument(s)) {
File f = new File(s);
JOptionPane.showMessageDialog(getParentComponent(),
String.format(Messages.getString("AbstractBufferHandler.unable_open"), f.getName()) + "\n" //$NON-NLS-1$ //$NON-NLS-2$
+ addOpenMessage,
Messages.getString("AbstractBufferHandler.open"), 0); //$NON-NLS-1$
setPath(null);
addOpenMessage = ""; //$NON-NLS-1$
return false;
} else {
isDirty = false;
return true;
}
}
public boolean saveDocument() {
if (path == null) {
return saveAsDocument();
} else {
if (!handleSaveDocument(getPath())) {
JOptionPane.showMessageDialog(getParentComponent(),
Messages.getString("AbstractBufferHandler.unable_save"), //$NON-NLS-1$
Messages.getString("AbstractBufferHandler.save"), 0); //$NON-NLS-1$
File file = new File(getPath());
file.delete();
return false;
} else {
isDirty = false;
return true;
}
}
}
public boolean saveAsDocument() {
JFileChooser jfilechooser = getSaveFileChooser();
if (jfilechooser.showSaveDialog(getParentComponent()) != 0) {
return false;
}
File file = jfilechooser.getSelectedFile();
String filename;
String extension = ""; //$NON-NLS-1$
FileFilter filter = jfilechooser.getFileFilter();
if (filter instanceof FileFormatFilter) {
extension = "." + ((FileFormatFilter) filter).getDefaultExtension(); //$NON-NLS-1$
}
if ((file.getPath()).endsWith(extension)) {
filename = file.getPath();
} else {
filename = file.getPath() + extension;
}
file = new File(filename);
if (file.exists()) {
int i = JOptionPane.showConfirmDialog(getParentComponent(),
String.format(Messages.getString("AbstractBufferHandler.exist"), file.getName()), //$NON-NLS-1$
Messages.getString("AbstractBufferHandler.save_as"), //$NON-NLS-1$
0);
if (i != 0) {
return false;
}
}
setPath(file.getPath());
fileFilter = jfilechooser.getFileFilter();
if (!handleSaveDocument(getPath())) {
JOptionPane.showMessageDialog(getParentComponent(), Messages.getString("AbstractBufferHandler.unable_save"), //$NON-NLS-1$
Messages.getString("AbstractBufferHandler.save"), 0); //$NON-NLS-1$
file.delete();
return false;
} else {
isDirty = false;
return true;
}
}
protected boolean canCloseDocument() {
if (isDirty) {
int i = JOptionPane.showConfirmDialog(getParentComponent(),
Messages.getString("AbstractBufferHandler.unsave_msg"), //$NON-NLS-1$
Messages.getString("AbstractBufferHandler.unsave_t"), 1); //$NON-NLS-1$
if (i == 0) {
return saveDocument();
}
if (i == 2) {
return false;
}
}
return true;
}
protected JFileChooser getOpenFileChooser() {
JFileChooser fileChooser = new JFileChooser(getLastFolder());
fileChooser.setDialogType(JFileChooser.OPEN_DIALOG);
return fileChooser;
}
protected JFileChooser getSaveFileChooser() {
JFileChooser fileChooser = new JFileChooser(getLastFolder());
fileChooser.setDialogType(JFileChooser.SAVE_DIALOG);
fileChooser.setAcceptAllFileFilterUsed(false);
return fileChooser;
}
protected Component getParentComponent() {
return parent;
}
protected abstract void handleNewDocument();
protected boolean handleOpenDocument(String s) {
boolean flag = true;
try (FileInputStream fileInputstream = new FileInputStream(s)) {
flag = handleOpenDocument(fileInputstream);
} catch (IOException e) {
flag = false;
LOGGER.error("Cannot open {}", s, e); //$NON-NLS-1$
}
return flag;
}
protected boolean handleSaveDocument(String s) {
boolean flag = true;
try (FileOutputStream fileoutputstream = new FileOutputStream(s)) {
flag = handleSaveDocument(fileoutputstream);
} catch (IOException e) {
flag = false;
LOGGER.error("Cannot save {}", s, e); //$NON-NLS-1$
}
return flag;
}
protected abstract boolean handleOpenDocument(InputStream inputstream);
protected abstract boolean handleSaveDocument(OutputStream outputstream);
protected String getLastFolder() {
return null;
}
public void setAddOpenMessage(String addOpenMessage) {
this.addOpenMessage = addOpenMessage;
}
public String getAddOpenMessage() {
return addOpenMessage;
}
public FileFilter getFileFilter() {
return fileFilter;
}
}