|
@@ -0,0 +1,163 @@
|
|
|
+/**
|
|
|
+ * Copyright (c) 2012 committers of YAKINDU 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:
|
|
|
+ * committers of YAKINDU - initial API and implementation
|
|
|
+ *
|
|
|
+ */
|
|
|
+package org.yakindu.sct.simulation.ui.view.decorator;
|
|
|
+
|
|
|
+import java.io.IOException;
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+import org.eclipse.core.commands.ExecutionException;
|
|
|
+import org.eclipse.core.resources.IFile;
|
|
|
+import org.eclipse.core.runtime.Assert;
|
|
|
+import org.eclipse.core.runtime.IAdaptable;
|
|
|
+import org.eclipse.core.runtime.IProgressMonitor;
|
|
|
+import org.eclipse.core.runtime.NullProgressMonitor;
|
|
|
+import org.eclipse.emf.common.util.EList;
|
|
|
+import org.eclipse.emf.common.util.TreeIterator;
|
|
|
+import org.eclipse.emf.common.util.URI;
|
|
|
+import org.eclipse.emf.ecore.EObject;
|
|
|
+import org.eclipse.emf.ecore.resource.Resource;
|
|
|
+import org.eclipse.emf.ecore.resource.Resource.Factory;
|
|
|
+import org.eclipse.emf.ecore.resource.ResourceSet;
|
|
|
+import org.eclipse.emf.ecore.resource.impl.ResourceFactoryRegistryImpl;
|
|
|
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
|
|
|
+import org.eclipse.emf.ecore.util.EcoreUtil;
|
|
|
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
|
|
|
+import org.eclipse.emf.transaction.util.TransactionUtil;
|
|
|
+import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
|
|
|
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
|
|
|
+import org.eclipse.gmf.runtime.diagram.ui.render.util.DiagramRenderUtil;
|
|
|
+import org.eclipse.gmf.runtime.draw2d.ui.figures.FigureUtilities;
|
|
|
+import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
|
|
|
+import org.eclipse.gmf.runtime.notation.Diagram;
|
|
|
+import org.eclipse.gmf.runtime.notation.Node;
|
|
|
+import org.eclipse.gmf.runtime.notation.NotationPackage;
|
|
|
+import org.eclipse.gmf.runtime.notation.ShapeStyle;
|
|
|
+import org.eclipse.jface.preference.PreferenceConverter;
|
|
|
+import org.eclipse.swt.graphics.Color;
|
|
|
+import org.eclipse.swt.graphics.Image;
|
|
|
+import org.eclipse.swt.graphics.RGB;
|
|
|
+import org.eclipse.swt.widgets.Display;
|
|
|
+import org.yakindu.sct.model.sgraph.RegularState;
|
|
|
+import org.yakindu.sct.simulation.core.sruntime.ExecutionContext;
|
|
|
+import org.yakindu.sct.simulation.ui.SimulationActivator;
|
|
|
+import org.yakindu.sct.simulation.ui.preferences.SimulationPreferenceConstants;
|
|
|
+
|
|
|
+/**
|
|
|
+ *
|
|
|
+ * @author andreas muelder - Initial contribution and API
|
|
|
+ *
|
|
|
+ */
|
|
|
+public class SimulationImageRenderer {
|
|
|
+ /**
|
|
|
+ * Renderes an image with highlighted states
|
|
|
+ *
|
|
|
+ * @param statechart
|
|
|
+ * @param context
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+
|
|
|
+ public Image renderImage(IFile file, ExecutionContext context) {
|
|
|
+ Diagram diagram = getDiagramCopy(file);
|
|
|
+ return renderImage(diagram);
|
|
|
+ }
|
|
|
+
|
|
|
+ public Image renderImage(Diagram diagram, ExecutionContext context) {
|
|
|
+ highlightActiveStates(context, diagram);
|
|
|
+ return renderImage(diagram);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ protected Image renderImage(Diagram diagram) {
|
|
|
+ Assert.isNotNull(diagram);
|
|
|
+ return DiagramRenderUtil.renderToSWTImage(diagram);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void highlightActiveStates(final ExecutionContext context, final Diagram diagram) {
|
|
|
+ AbstractTransactionalCommand cmd = new AbstractTransactionalCommand(TransactionUtil.getEditingDomain(diagram),
|
|
|
+ "", null) {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info)
|
|
|
+ throws ExecutionException {
|
|
|
+ // Init colors from preferences
|
|
|
+ RGB rgbforeGround = PreferenceConverter.getColor(SimulationActivator.getDefault().getPreferenceStore(),
|
|
|
+ SimulationPreferenceConstants.STATE_FOREGROUND_HIGHLIGHTING_COLOR);
|
|
|
+ RGB rgbBackGround = PreferenceConverter.getColor(SimulationActivator.getDefault().getPreferenceStore(),
|
|
|
+ SimulationPreferenceConstants.STATE_BACKGROUND_HIGHLIGHTING_COLOR);
|
|
|
+ Color color = new Color(Display.getDefault(), rgbforeGround);
|
|
|
+ Integer foreGround = FigureUtilities.colorToInteger(color);
|
|
|
+ color.dispose();
|
|
|
+ color = new Color(Display.getDefault(), rgbBackGround);
|
|
|
+ Integer background = FigureUtilities.colorToInteger(color);
|
|
|
+ color.dispose();
|
|
|
+
|
|
|
+ // Set styling
|
|
|
+ TreeIterator<EObject> eAllContents = diagram.eAllContents();
|
|
|
+ while (eAllContents.hasNext()) {
|
|
|
+ EObject next = eAllContents.next();
|
|
|
+ if (next instanceof Node) {
|
|
|
+ List<RegularState> activeStates = context.getActiveStates();
|
|
|
+ for (RegularState regularState : activeStates) {
|
|
|
+ EObject element = ((Node) next).getElement();
|
|
|
+ if (EcoreUtil.getURI(regularState).equals(EcoreUtil.getURI(element))) {
|
|
|
+ ShapeStyle style = (ShapeStyle) ((Node) next)
|
|
|
+ .getStyle(NotationPackage.Literals.SHAPE_STYLE);
|
|
|
+ if (style != null) {
|
|
|
+ style.setFillColor(background);
|
|
|
+ style.setLineColor(foreGround);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return CommandResult.newOKCommandResult();
|
|
|
+ }
|
|
|
+ };
|
|
|
+ try {
|
|
|
+ cmd.execute(new NullProgressMonitor(), null);
|
|
|
+ } catch (ExecutionException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public Diagram getDiagramCopy(IFile file) {
|
|
|
+ Resource resource = reload(file);
|
|
|
+ Diagram diagram = (Diagram) resource.getContents().get(1);
|
|
|
+ return diagram;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Resource reload(IFile file) {
|
|
|
+ final URI uri = URI.createPlatformResourceURI(file.getFullPath().toString(), true);
|
|
|
+ Factory factory = ResourceFactoryRegistryImpl.INSTANCE.getFactory(uri);
|
|
|
+ Resource resource = factory.createResource(uri);
|
|
|
+ ResourceSet resourceSet = new ResourceSetImpl();
|
|
|
+ TransactionalEditingDomain.Factory.INSTANCE.createEditingDomain(resourceSet);
|
|
|
+ resourceSet.getResources().add(resource);
|
|
|
+ try {
|
|
|
+ resource.load(Collections.EMPTY_MAP);
|
|
|
+ } catch (IOException e) {
|
|
|
+ throw new IllegalStateException("Error loading resource", e);
|
|
|
+ }
|
|
|
+ return resource;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Diagram getDiagramCopy(Diagram diagram) {
|
|
|
+ Resource resource = reload(WorkspaceSynchronizer.getFile(diagram.eResource()));
|
|
|
+ EList<EObject> contents = resource.getContents();
|
|
|
+ for (EObject eObject : contents) {
|
|
|
+ if (EcoreUtil.getURI(diagram).equals(EcoreUtil.getURI(eObject)))
|
|
|
+ return (Diagram) eObject;
|
|
|
+ }
|
|
|
+ // Fall back return the first diagram
|
|
|
+ return (Diagram) resource.getContents().get(1);
|
|
|
+ }
|
|
|
+}
|