1 /*******************************************************************************
2 * Copyright (c) 2007, 2017 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.elements;
14 import java.awt.Graphics2D;
15 import java.util.List;
18 import org.simantics.g2d.canvas.ICanvasContext;
19 import org.simantics.g2d.diagram.participant.Selection;
20 import org.simantics.g2d.element.IElement;
21 import org.simantics.scenegraph.ExportableWidget.RasterOutputWidget;
22 import org.simantics.scenegraph.INode;
23 import org.simantics.scenegraph.g2d.IG2DNode;
24 import org.simantics.scenegraph.g2d.events.EventTypes;
25 import org.simantics.scenegraph.g2d.events.KeyEvent.KeyPressedEvent;
26 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseClickEvent;
27 import org.simantics.scenegraph.g2d.events.command.CommandEvent;
28 import org.simantics.scenegraph.g2d.nodes.SVGNodeAssignment;
29 import org.simantics.scenegraph.g2d.nodes.SingleElementNode;
30 import org.simantics.scenegraph.utils.NodeUtil;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
34 import com.kitfox.svg.SVGDiagram;
35 import com.kitfox.svg.SVGException;
36 import com.kitfox.svg.Text;
37 import com.kitfox.svg.Tspan;
40 public class SVGNode extends org.simantics.scenegraph.g2d.nodes.SVGNode {
42 private static final Logger LOGGER = LoggerFactory.getLogger(SVGNode.class);
44 private static final long serialVersionUID = 4735066193941274186L;
46 transient EditorStateManager esm = null;
47 transient boolean parametersProcessed = false;
50 public void cleanup() {
52 removeEventHandler(this);
57 public void render(Graphics2D g2d) {
58 if (!parametersProcessed) {
59 SingleElementNode sne = getSingleElementNode();
61 Boolean enableEditing = sne.getParameter("enableEditing");
62 if (enableEditing != null && enableEditing) {
63 esm = new EditorStateManager(this);
64 addEventHandler(this);
66 parametersProcessed = true;
74 protected int dynamicHash() {
75 return esm != null ? esm.currentHash() : 0;
79 protected boolean applyAssignments(SVGDiagram diagram, List<SVGNodeAssignment> assignments) throws SVGException {
80 boolean changed = super.applyAssignments(diagram, assignments);
81 if (esm != null && !esm.applyEditMode(diagram))
82 diagram.updateTime(0);
86 private boolean isSelected(IG2DNode node) {
87 ICanvasContext ctx = DiagramNodeUtil.getPossibleCanvasContext(this);
90 IElement ie = DiagramNodeUtil.getElement(ctx, node);
93 Selection sel = ctx.getAtMostOneItemOfClass(Selection.class);
95 Set<IElement> elems = sel.getSelection(0);
96 if (elems.size() == 1 && elems.contains(ie))
102 private boolean isSelected() {
103 SingleElementNode sne = getSingleElementNode();
106 INode n = sne.getParent();
108 if (isSelected((IG2DNode)n))
116 protected boolean mouseClicked(MouseClickEvent e) {
118 if(esm.isEditMode()) {
120 esm.deactivateEdit();
124 if(esm.tryToStartEditMode(diagramCache, e))
128 return super.mouseClicked(e);
131 SingleElementNode getSingleElementNode() {
132 return (SingleElementNode)NodeUtil.getNearestParentOfType(this, SingleElementNode.class);
136 protected boolean keyPressed(KeyPressedEvent e) {
137 if (esm != null && esm.keyPressed(e))
139 return super.keyPressed(e);
143 protected boolean handleCommand(CommandEvent e) {
146 && "org.eclipse.ui.edit.rename".equals(e.command.id)
148 && esm.tryToStartEditMode(diagramCache)) {
151 return super.handleCommand(e);
155 public int getEventMask() {
156 return EventTypes.KeyPressedMask | EventTypes.MouseClickMask | EventTypes.CommandMask;
159 public void modifyTextElement(String id, String newText) {
160 Text text = (Text) diagramCache.getElement(id);
162 EditorState es = new EditorState();
163 es.base = new EditorStateStatic();
164 es.base.textElementId = text.getId();
166 Tspan span = (Tspan)text.getContent().get(0);
169 span.setText(newText);
171 diagramCache.updateTime(0);
172 } catch (SVGException e) {
173 LOGGER.error("Failed to update text span element " + id + " with text " + newText, e);