blob: dbf4116c21ef8aa8f55c4f9b19ad3bcd84cee0e5 [file] [log] [blame]
package org.eclipse.gendoc.bundle.acceleo.gmf.service;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
import org.eclipse.gef.EditPart;
import org.eclipse.gendoc.bundle.acceleo.gmf.impl.GMFEditPartUtils;
import org.eclipse.gendoc.services.GendocServices;
import org.eclipse.gendoc.services.ILogger;
import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
import org.eclipse.gmf.runtime.diagram.ui.image.ImageFileFormat;
import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditor;
import org.eclipse.gmf.runtime.diagram.ui.render.clipboard.DiagramGenerator;
import org.eclipse.gmf.runtime.diagram.ui.render.util.CopyToImageUtil;
import org.eclipse.gmf.runtime.diagram.ui.util.DiagramEditorUtil;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.swt.widgets.Shell;
public class GMFDiagramRenderer extends CopyToImageUtil implements IDiagramRenderer {
@Override
public void clear() {
}
@Override
public String getServiceId() {
return id;
}
@Override
public void setServiceId(String serviceId) {
this.id = serviceId;
}
@Override
public List<EditPart> renderDiagram(Diagram diagram, List<EObject> visibleElements, IPath path, FileFormat extension, NullProgressMonitor monitor) throws CoreException {
if (visibleElements == null || visibleElements.isEmpty()) {
return copyToImage(diagram, path, getImageFileFormat(extension),
new NullProgressMonitor(),
PreferencesHint.USE_DEFAULTS);
} else {
return copyToImage(diagram, path, visibleElements,
getImageFileFormat(extension),
new NullProgressMonitor(),
PreferencesHint.USE_DEFAULTS);
}
}
public List<EditPart> copyToImage(Diagram diagram, IPath destination,
ImageFileFormat format, NullProgressMonitor monitor,
PreferencesHint preferencesHint)
throws CoreException {
List<?> partInfo = Collections.EMPTY_LIST;
DiagramEditor openedDiagramEditor = findOpenedDiagramEditor(diagram);
if (openedDiagramEditor != null) {
DiagramGenerator generator = copyToImage(openedDiagramEditor.getDiagramEditPart(),
destination, format, monitor);
partInfo = generator.getDiagramPartInfo(openedDiagramEditor.getDiagramEditPart());
} else {
Shell shell = new Shell();
try {
DiagramEditPart diagramEditPart = createDiagramEditPart(diagram,
shell, preferencesHint);
Assert.isNotNull(diagramEditPart);
DiagramGenerator generator = super.copyToImage(diagramEditPart,
destination, format, monitor);
partInfo = generator.getDiagramPartInfo(diagramEditPart);
} finally {
shell.dispose();
}
}
return (List)partInfo;
}
private DiagramEditor findOpenedDiagramEditor(Diagram diagram) {
DiagramEditor result = DiagramEditorUtil.findOpenedDiagramEditorForID(ViewUtil.getIdStr(diagram));
if (result != null){
IPath iPathDiagEditor =getIPath(result.getDiagram());
IPath iPathDiag = getIPath(diagram) ;
if (iPathDiagEditor == null || iPathDiag == null || !iPathDiag.equals(iPathDiagEditor)){
((ILogger) GendocServices.getDefault().getService(ILogger.class)).log("Two diagrams in separate files " + iPathDiagEditor + " and " + iPathDiag + " have the same identifier", Status.WARNING);
return null ;
}
}
return result ;
}
private IPath getIPath(Diagram diagram) {
if (diagram != null){
Resource resource = diagram.eResource();
if (resource != null){
IFile file = WorkspaceSynchronizer.getUnderlyingFile(resource);
if (file != null){
return file.getFullPath();
}
}
}
return null;
}
public List<EditPart> copyToImage(Diagram diagram, IPath destination,
List<EObject> visibleElements, ImageFileFormat format,
NullProgressMonitor monitor, PreferencesHint preferencesHint)
throws CoreException {
Shell shell = null ;
try {
List partInfo = Collections.EMPTY_LIST;
DiagramEditor openedDiagramEditor = findOpenedDiagramEditor(diagram);
DiagramEditPart diagramEditPart = null ;
if (openedDiagramEditor != null) {
diagramEditPart = openedDiagramEditor.getDiagramEditPart();
} else {
shell = new Shell();
diagramEditPart = createDiagramEditPart(
diagram, shell, preferencesHint);
}
Assert.isNotNull(diagramEditPart);
copyToImage(diagramEditPart,
GMFEditPartUtils.getEditParts(visibleElements, diagramEditPart),
destination, format, monitor);
return partInfo;
} finally {
if (shell != null && !shell.isDisposed())
{
shell.dispose();
}
}
}
private ImageFileFormat getImageFileFormat(FileFormat format) {
return ImageFileFormat.resolveImageFormat(format.name());
}
private String id;
}