blob: f12da56fa1ddef167c517b0e15b4016bc6b449cf [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.bpel.common.ui.editmodel;
import java.io.IOException;
import java.util.Map;
import org.eclipse.bpel.common.ui.CommonUIPlugin;
import org.eclipse.bpel.model.resource.BPELResourceSetImpl;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.ui.IEditorPart;
public class EditModelClient {
/** */
private ResourceInfo primaryResourceInfo;
/** */
private EditModel editModel;
/** */
private IEditModelListener modelListener;
/** */
private SynchronizationManager manager;
/** */
private IEditorPart editor;
/**
* Creates a new EditModelClient
*
* @param editor the editor that is using this model manager
* @param file the editor's input
* @param modelListener the listener which is used to communicate back to the editor.
* @param loadOptions a Map of EMF load/save options. May be empty.
*/
public EditModelClient(IEditorPart editor,IEditModelListener modelListener) {
this.editor = editor;
this.modelListener = modelListener;
}
// Bugzilla 330513
// separated this from constructor
public void loadPrimaryResource(IFile file, Map loadOptions) throws RuntimeException {
editModel = getSharedResourceSet(file);
((BPELResourceSetImpl)editModel.getResourceSet()).setLoadOptions(loadOptions);
try {
SynchronizationHandler handler = new Synchronizer();
if(getCommandStack() == null) {
EditModelCommandStack commandStack = createCommandStack();
editModel.setCommandStack(commandStack);
}
primaryResourceInfo = editModel.getResourceInfo(file);
if(loadOptions != null)
primaryResourceInfo.setLoadOptions(loadOptions);
getEditModel().addListener(modelListener);
manager = new SynchronizationManager(editor,editModel,handler);
} catch (RuntimeException ex) {
if(editModel != null)
editModel.release();
throw ex;
}
}
protected EditModel getSharedResourceSet(IFile file) {
return EditModel.getEditModel(file);
}
/**
* Creates and returns a command stack to be used by this
* model manager and the editor.
*/
protected EditModelCommandStack createCommandStack() {
return new EditModelCommandStack();
}
/**
* Returns the command stack to be used by this
* model manager and the editor.
*/
public EditModelCommandStack getCommandStack() {
return editModel.getCommandStack();
}
/**
* Returns the EMFModel editModel used by this model manager.
* The EditModel is a model reference count cache.
*/
public EditModel getEditModel() {
return editModel;
}
/**
* Returns the ResourceInfo which is used by the EditModel
* and counts the reference for each model cached in the model
* editModel.
*/
public ResourceInfo getPrimaryResourceInfo() {
return primaryResourceInfo;
}
/**
* Disposes this model manager, its command stack, and
* its model editModel.
*/
public void dispose() {
getEditModel().removeListener(modelListener);
editModel.releaseReference(primaryResourceInfo);
editModel.release();
}
/**
* Saves the model
*/
public boolean saveAll(IProgressMonitor progressMonitor) {
return editModel.saveAll(progressMonitor);
}
/**
* Saves the model with a new name
*/
public boolean savePrimaryResourceAs(IFile savedFile, IProgressMonitor progressMonitor) {
return editModel.savePrimaryResourceAs(primaryResourceInfo,savedFile,progressMonitor);
}
void close() {
editor.getSite().getPage().closeEditor(editor, false);
}
private class Synchronizer implements SynchronizationHandler {
public void closeEditor() {
EditModelClient.this.close();
}
public boolean saveFileAs(ResourceInfo resourceInfo,IFile file) throws CoreException, IOException {
if (resourceInfo.equals(primaryResourceInfo))
return savePrimaryResourceAs(file, null);
else {
resourceInfo.saveAs(file);
return true;
}
}
public void refresh(ResourceInfo resourceInfo) {
try {
resourceInfo.refresh();
}
catch (Exception e) {
CommonUIPlugin.log(e);
}
getCommandStack().flush();
}
}
}