/*
* Copyright (c) 2012, grossmann, waheckma
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the jo-widgets.org nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL jo-widgets.org BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*/
package org.jowidgets.addons.widgets.ole.document.impl;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import org.jowidgets.addons.widgets.ole.api.IOleControl;
import org.jowidgets.addons.widgets.ole.document.api.IOleDocument;
import org.jowidgets.addons.widgets.ole.document.api.IOleDocumentSetupBuilder;
import org.jowidgets.tools.widgets.wrapper.ControlWrapper;
import org.jowidgets.util.Assert;
import org.jowidgets.util.event.ChangeObservable;
import org.jowidgets.util.event.IChangeListener;
import org.jowidgets.util.io.FileUtils;
import org.jowidgets.util.io.ITempFileFactory;
class OleDocumentImpl extends ControlWrapper implements IOleDocument {
private final String progId;
private final ChangeObservable documentChangeObservable;
private final ITempFileFactory tempFileFactory;
OleDocumentImpl(final IOleControl oleControl, final IOleDocumentSetupBuilder<?> setup) {
super(oleControl);
Assert.paramNotNull(setup.getTempFileFactory(), "setup.getTempFileFactory()");
Assert.paramNotNull(setup.getProgId(), "setup.getProgId()");
this.progId = setup.getProgId();
this.tempFileFactory = setup.getTempFileFactory();
this.documentChangeObservable = new ChangeObservable();
if (progId != null) {
oleControl.setDocument(progId);
}
}
@Override
protected IOleControl getWidget() {
return (IOleControl) super.getWidget();
}
@Override
public boolean saveDocument(final File file, final boolean includeOleInfo) {
Assert.paramNotNull(file, "file");
return getWidget().saveCurrentDocument(file, includeOleInfo);
}
@Override
public boolean saveDocument(final OutputStream outputStream) {
Assert.paramNotNull(outputStream, "outputStream");
File tempFile = null;
try {
tempFile = createTempFile();
final boolean saved = getWidget().saveCurrentDocument(tempFile, true);
if (saved) {
FileUtils.fileToOutputStream(tempFile, outputStream);
return true;
}
else {
return false;
}
}
finally {
deleteFile(tempFile);
}
}
@Override
public void openNewDocument() {
if (progId != null) {
getWidget().setDocument(progId);
}
else {
getWidget().clearDocument();
}
documentChangeObservable.fireChangedEvent();
}
@Override
public void openDocument(final File file) {
Assert.paramNotNull(file, "file");
if (progId != null) {
getWidget().setDocument(progId, file);
}
else {
getWidget().setDocument(file);
}
documentChangeObservable.fireChangedEvent();
}
@Override
public void openDocument(final InputStream inputStream) {
Assert.paramNotNull(inputStream, "inputStream");
File tempFile = null;
try {
tempFile = createTempFile();
FileUtils.inputStreamToFile(inputStream, tempFile);
openDocument(tempFile);
}
finally {
deleteFile(tempFile);
}
}
@Override
public boolean isDirty() {
return getWidget().isDirty();
}
@Override
public IOleControl getOleControl() {
return getWidget();
}
@Override
public void addDocumentChangeListener(final IChangeListener changeListener) {
documentChangeObservable.addChangeListener(changeListener);
}
@Override
public void removeDocumentChangeListener(final IChangeListener changeListener) {
documentChangeObservable.removeChangeListener(changeListener);
}
private File createTempFile() {
return tempFileFactory.create("OleDocumentTemp", "");
}
private static void deleteFile(final File file) {
if (file != null && file.exists()) {
if (!file.delete()) {
throw new RuntimeException("Tempfile could not be deleted");
}
}
}
}