]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/adapter/TextElementClassFactory.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / adapter / TextElementClassFactory.java
1 /*******************************************************************************
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management
3  * in Industry THTH ry.
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
8  *
9  * Contributors:
10  *     VTT Technical Research Centre of Finland - initial API and implementation
11  *******************************************************************************/
12 package org.simantics.diagram.adapter;
13
14 import java.awt.geom.AffineTransform;
15 import java.awt.geom.Rectangle2D;
16
17 import org.simantics.db.ReadGraph;
18 import org.simantics.db.Resource;
19 import org.simantics.db.common.utils.NameUtils;
20 import org.simantics.db.exception.DatabaseException;
21 import org.simantics.diagram.G2DUtils;
22 import org.simantics.diagram.elements.ElementPropertySetter;
23 import org.simantics.diagram.elements.MonitorClass;
24 import org.simantics.diagram.elements.ResizeRectangularSceneGraph;
25 import org.simantics.diagram.elements.TextElementHandler;
26 import org.simantics.diagram.stubs.DiagramResource;
27 import org.simantics.diagram.stubs.G2DResource;
28 import org.simantics.diagram.synchronization.CompositeHintSynchronizer;
29 import org.simantics.diagram.synchronization.IHintSynchronizer;
30 import org.simantics.diagram.synchronization.SynchronizationHints;
31 import org.simantics.diagram.synchronization.graph.DiagramGraphUtil;
32 import org.simantics.diagram.synchronization.graph.TextSynchronizer;
33 import org.simantics.diagram.synchronization.graph.TransformSynchronizer;
34 import org.simantics.g2d.canvas.ICanvasContext;
35 import org.simantics.g2d.diagram.IDiagram;
36 import org.simantics.g2d.element.ElementClass;
37 import org.simantics.g2d.element.ElementHints;
38 import org.simantics.g2d.element.ElementUtils;
39 import org.simantics.g2d.element.IElement;
40 import org.simantics.g2d.element.handler.Text;
41 import org.simantics.g2d.element.handler.impl.DefaultTransform;
42 import org.simantics.g2d.element.handler.impl.SimpleElementLayers;
43 import org.simantics.g2d.element.handler.impl.StaticObjectAdapter;
44 import org.simantics.g2d.element.handler.impl.StaticSymbolImpl;
45 import org.simantics.g2d.element.handler.impl.TextColorImpl;
46 import org.simantics.g2d.element.handler.impl.TextFontImpl;
47 import org.simantics.g2d.image.DefaultImages;
48 import org.simantics.g2d.image.Image;
49 import org.simantics.g2d.svg.SVGImage;
50 import org.simantics.g2d.utils.Alignment;
51
52
53 /**
54  * Element(Class)Factory for TextElements
55  * 
56  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
57  *
58  */
59 public class TextElementClassFactory extends SyncElementFactory {
60
61     public static final ElementFactory INSTANCE = new TextElementClassFactory();
62
63     public static final IHintSynchronizer TEXT_SYNCHRONIZER = new CompositeHintSynchronizer(TextSynchronizer.INSTANCE, TransformSynchronizer.INSTANCE);
64
65     public static final ElementPropertySetter RESIZE_PROPERTY_SETTER =
66             new ElementPropertySetter(ResizeRectangularSceneGraph.KEY_SG_NODE);
67     
68     @Override
69     public ElementClass create(ReadGraph graph, ICanvasContext canvas, IDiagram diagram, Resource elementType) throws DatabaseException {
70         String id = "TextElement: " + NameUtils.getSafeName(graph, elementType);
71         G2DResource g2d = G2DResource.getInstance(graph);
72         String svgDoc = graph.getPossibleRelatedValue(elementType, g2d.HasSVGDocument);
73         Image image = null;
74         if (svgDoc != null)
75             image = new SVGImage(id+".svg", svgDoc);
76         else
77             image = DefaultImages.ERROR_DECORATOR.get();
78         return ElementClass.compile(
79                 Text.INSTANCE,
80                 TextColorImpl.BLACK,
81                 TextFontImpl.DEFAULT,
82                 new StaticObjectAdapter(elementType),
83                 DefaultTransform.INSTANCE,
84                 SimpleElementLayers.INSTANCE,
85                 TextElementHandler.INSTANCE,
86                 ResizeRectangularSceneGraph.INSTANCE,
87                 RESIZE_PROPERTY_SETTER,                
88                 new StaticSymbolImpl(image)
89         )
90         .setId(id)
91         ;
92     }
93
94     @Override
95     public void load(ReadGraph graph, ICanvasContext canvas, IDiagram diagram, Resource element, IElement e) throws DatabaseException {
96         G2DResource G2D = G2DResource.getInstance(graph);
97         DiagramResource DIA = DiagramResource.getInstance(graph);
98
99         String text = (String) graph.getPossibleRelatedValue(element, DIA.HasText);
100         if (text == null)
101                 text = ElementUtils.getText(e);
102         if (text == null)
103             text = "[empty]";
104         ElementUtils.setText(e, text);
105
106         if (graph.isInstanceOf(element, DIA.FontProvider)) {
107             Resource fontResource = graph.getPossibleObject(element, G2D.HasFont);
108             if (fontResource != null)
109                 ElementUtils.setTextFont(e, G2DUtils.getFont(graph, fontResource));
110         }
111         if (graph.isInstanceOf(element, DIA.ColorProvider)) {
112             Resource colorResource = graph.getPossibleObject(element, G2D.HasColor);
113             if (colorResource != null)
114                 ElementUtils.setTextColor(e, G2DUtils.getColor(graph, colorResource));
115         }
116
117         // Load alignments
118         Resource hAlign = graph.getPossibleObject(element, G2D.HasHorizontalAlignment);
119         Resource vAlign = graph.getPossibleObject(element, G2D.HasVerticalAlignment);
120         if (hAlign != null)
121             e.setHint(ElementHints.KEY_HORIZONTAL_ALIGN, DiagramGraphUtil.toAlignment(hAlign, G2D, Alignment.LEADING));
122         if (vAlign != null)
123             e.setHint(ElementHints.KEY_VERTICAL_ALIGN, DiagramGraphUtil.toVerticalAlignment(vAlign, G2D, Alignment.BASELINE));
124
125         // Load border
126         final Float borderWidth = graph.getPossibleRelatedValue(element, G2D.HasStrokeWidth);
127         if (borderWidth != null)
128             e.setHint(MonitorClass.KEY_BORDER_WIDTH, borderWidth.doubleValue());
129
130         // Load transform
131         AffineTransform at = DiagramGraphUtil.getAffineTransform(graph, element);
132         ElementUtils.setTransform(e, at);
133
134         // This synchronizes only text and transformation (not font and color)
135         e.setHint(SynchronizationHints.HINT_SYNCHRONIZER, TEXT_SYNCHRONIZER);
136         
137         double bounds[] = DiagramGraphUtil.getPossibleRelatedDoubleArray(graph, element, G2D.HasBounds);
138         if (bounds != null) {
139             e.setHint(ElementHints.KEY_BOUNDS, new Rectangle2D.Double(bounds[0], bounds[1], bounds[2], bounds[3]));
140         }
141     }
142
143 }