package org.teiid.designer.runtime.ui.vdb;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.core.designer.util.FileUtils;
import org.teiid.designer.runtime.ui.DqpUiConstants;
import org.teiid.designer.ui.UiPlugin;
import org.teiid.designer.vdb.ui.VdbUiConstants;
import org.teiid.designer.vdb.ui.editor.VdbEditor;
/**
* @since 8.0
*/
public class VdbRequiresSaveChecker {
public static boolean insureOpenVdbSaved(IFile vdbFile) {
CoreArgCheck.isNotNull(vdbFile, "vdbFile"); //$NON-NLS-1$
String vdbName = FileUtils.getNameWithoutExtension(vdbFile);
final IWorkbenchWindow window = UiPlugin.getDefault().getCurrentWorkbenchWindow();
VdbEditor vdbEditor = null;
if (window != null) {
final IWorkbenchPage page = window.getActivePage();
if (page != null) {
// look through the open editors and see if there is one available for this model file.
IEditorReference[] editors = page.getEditorReferences();
for (int i = 0; i < editors.length; ++i) {
IEditorPart editor = editors[i].getEditor(false);
if (editor != null) {
IEditorInput input = editor.getEditorInput();
if (input instanceof IFileEditorInput) {
if (vdbFile.equals(((IFileEditorInput)input).getFile())) {
// found it;
if (editor instanceof VdbEditor) {
vdbEditor = (VdbEditor)editor;
}
break;
}
}
}
}
}
}
if( vdbEditor != null ) {
if( vdbEditor.isDirty() ) {
// Query the user
final VdbEditor tmpVdbEditor = vdbEditor;
boolean doSave = MessageDialog.openConfirm(window.getShell(),
DqpUiConstants.UTIL.getString("VdbRequiresSaveChecker.unsavedVdb.title"), //$NON-NLS-1$
DqpUiConstants.UTIL.getString("VdbRequiresSaveChecker.unsavedVdb.message", vdbName)); //$NON-NLS-1$
if( doSave ) {
// create VDB resource
final IRunnableWithProgress op = new IRunnableWithProgress() {
@Override
@SuppressWarnings("unchecked")
public void run( final IProgressMonitor monitor ) throws InvocationTargetException {
try {
tmpVdbEditor.doSave(new NullProgressMonitor());
} catch (final Exception err) {
throw new InvocationTargetException(err);
} finally {
monitor.done();
}
}
};
try {
new ProgressMonitorDialog(window.getShell()).run(false, true, op);
return true;
} catch (Throwable err) {
if (err instanceof InvocationTargetException) {
err = ((InvocationTargetException)err).getTargetException();
}
VdbUiConstants.Util.log(err);
return false;
}
} else {
return false;
}
}
}
return true;
}
}