1 /*******************************************************************************
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.diagram.adapter;
14 import java.awt.geom.AffineTransform;
17 import org.simantics.db.AsyncReadGraph;
18 import org.simantics.db.ReadGraph;
19 import org.simantics.db.Resource;
20 import org.simantics.db.common.procedure.adapter.AsyncProcedureAdapter;
21 import org.simantics.db.common.procedure.adapter.ProcedureAdapter;
22 import org.simantics.db.exception.DatabaseException;
23 import org.simantics.db.procedure.AsyncProcedure;
24 import org.simantics.diagram.stubs.DiagramResource;
25 import org.simantics.diagram.synchronization.ErrorHandler;
26 import org.simantics.diagram.synchronization.ISynchronizationContext;
27 import org.simantics.diagram.synchronization.SynchronizationHints;
28 import org.simantics.diagram.synchronization.graph.DiagramGraphUtil;
29 import org.simantics.diagram.synchronization.graph.GraphSynchronizationHints;
30 import org.simantics.diagram.synchronization.graph.layer.GraphLayerManager;
31 import org.simantics.g2d.diagram.DiagramHints;
32 import org.simantics.g2d.diagram.IDiagram;
33 import org.simantics.g2d.element.ElementUtils;
34 import org.simantics.g2d.element.IElement;
35 import org.simantics.g2d.layers.ILayersEditor;
36 import org.simantics.utils.datastructures.hints.IHintContext.Key;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
40 public class ElementFactoryUtil {
42 private static final Logger LOGGER = LoggerFactory.getLogger(ElementFactoryUtil.class);
44 public static void readTransform(AsyncReadGraph graph, final Resource resource, final IElement e) {
45 readTransform(graph, resource, e, new AsyncProcedureAdapter<IElement>() {
47 public void exception(AsyncReadGraph graph, Throwable t) {
48 LOGGER.error("Error reading transform from " + resource + " into element " + e, t);
53 public static void readTransform(AsyncReadGraph graph, final Resource resource, final IElement e, final AsyncProcedure<IElement> procedure) {
54 DiagramResource DIA = graph.getService(DiagramResource.class);
56 AffineTransform tr = DiagramGraphUtil.getDynamicAffineTransform((ReadGraph)graph, null, resource, DIA.HasDynamicTransform, true);
57 ElementUtils.setTransform(e, tr);
58 } catch (DatabaseException e1) {
59 ElementUtils.setTransform(e, new AffineTransform());
61 procedure.execute(graph, e);
64 public static void readParameters(AsyncReadGraph graph, final Resource resource, final IElement e) {
65 graph.asyncRequest(new ElementParameterRequest(resource), new ProcedureAdapter<Map<String,Object>>() {
67 public void execute(Map<String, Object> result) {
68 ElementUtils.setParameters(e, result);
73 public static ISynchronizationContext getContext(IDiagram diagram) {
74 return diagram.getHint(SynchronizationHints.CONTEXT);
77 public static ISynchronizationContext getContextChecked(IDiagram diagram) {
78 ISynchronizationContext context = getContext(diagram);
80 throw new IllegalStateException("diagram does not contain " + SynchronizationHints.CONTEXT + " hint");
84 public static ErrorHandler getErrorHandler(IDiagram diagram) {
85 ISynchronizationContext context = getContext(diagram);
88 return context.get(SynchronizationHints.ERROR_HANDLER);
91 public static ErrorHandler getErrorHandlerChecked(IDiagram diagram) {
92 ISynchronizationContext context = getContextChecked(diagram);
93 ErrorHandler errorHandler = context.get(SynchronizationHints.ERROR_HANDLER);
94 if (errorHandler == null)
95 throw new IllegalStateException("synchronization context " + context + " does not contain " + SynchronizationHints.ERROR_HANDLER + " hint");
99 public static <T> T getContextHint(IDiagram diagram, Key key) {
100 ISynchronizationContext context = getContext(diagram);
103 return context.get(key);
106 public static <T> T getContextHintChecked(IDiagram diagram, Key key) {
107 return getContextChecked(diagram).get(key);
110 public static void loadLayersForElement(AsyncReadGraph graph, IDiagram diagram, IElement e, Resource element,
111 AsyncProcedure<IElement> callback) {
112 final GraphLayerManager layerManager = getContextHint(diagram, GraphSynchronizationHints.GRAPH_LAYER_MANAGER);
113 if (layerManager != null)
114 loadLayersForElement(graph, layerManager, diagram, e, element, callback);
116 callback.execute(graph, e);
119 public static void loadLayersForElement(AsyncReadGraph graph, GraphLayerManager layerManager, IDiagram diagram, IElement e, Resource element,
120 AsyncProcedure<IElement> callback) {
121 final ILayersEditor layers = diagram.getHint(DiagramHints.KEY_LAYERS_EDITOR);
123 layerManager.loadLayersForElement(graph, layers, e, element, callback);
125 callback.execute(graph, e);