]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/elements/SVGNode.java
Merge "Editing of texts inside SVG elements"
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / elements / SVGNode.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.elements;
13
14 import java.awt.Graphics2D;
15 import java.util.List;
16 import java.util.Set;
17
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
32 import com.kitfox.svg.SVGDiagram;
33 import com.kitfox.svg.SVGException;
34
35 @RasterOutputWidget
36 public class SVGNode extends org.simantics.scenegraph.g2d.nodes.SVGNode {
37
38     private static final long serialVersionUID = 4735066193941274186L;
39
40     transient EditorStateManager esm  = null;
41     transient boolean parametersProcessed = false;
42
43     @Override
44     public void cleanup() {
45         if (esm != null)
46             removeEventHandler(this);
47         super.cleanup();
48     }
49
50     @Override
51     public void render(Graphics2D g2d) {
52         if (!parametersProcessed) {
53             SingleElementNode sne = getSingleElementNode();
54             Boolean enableEditing = sne.getParameter("enableEditing");
55             if (enableEditing != null && enableEditing) {
56                 esm = new EditorStateManager(this);
57                 addEventHandler(this);
58             }
59             parametersProcessed = true;
60         }
61
62         super.render(g2d);
63     }
64
65     @Override
66     protected int dynamicHash() {
67         return esm != null ? esm.currentHash() : 0;
68     }
69
70     @Override
71     protected boolean applyAssignments(SVGDiagram diagram, List<SVGNodeAssignment> assignments) throws SVGException {
72         boolean changed = super.applyAssignments(diagram, assignments);
73         if (esm != null && !esm.applyEditMode(diagram))
74             diagram.updateTime(0);
75         return changed;
76     }
77
78     private boolean isSelected(IG2DNode node) {
79         ICanvasContext ctx = DiagramNodeUtil.getCanvasContext(this);
80         IElement ie = DiagramNodeUtil.getElement(ctx, node);
81         if (ie == null)
82             return false;
83         Selection sel = ctx.getAtMostOneItemOfClass(Selection.class);
84         if (sel != null) {
85             Set<IElement> elems = sel.getSelection(0);
86             if (elems.size() == 1 && elems.contains(ie))
87                 return true;
88         }
89         return false;
90     }
91
92     private boolean isSelected() {
93         SingleElementNode sne = getSingleElementNode();
94         if (isSelected(sne))
95             return true;
96         INode n = sne.getParent();
97         while (n != null) {
98             if (isSelected((IG2DNode)n))
99                 return true;
100             n = n.getParent();
101         }
102         return false;
103     }
104
105     @Override
106     protected boolean mouseClicked(MouseClickEvent e) {
107         if(esm != null) {
108             if(esm.isEditMode()) {
109                 esm.applyEdit();
110                 esm.deactivateEdit();
111                 return true;
112             }
113             if(isSelected()) {
114                 if(esm.tryToStartEditMode(diagramCache, e))
115                     return true;
116             }
117         }
118         return super.mouseClicked(e);
119     }
120
121     SingleElementNode getSingleElementNode() {
122         ICanvasContext ctx = DiagramNodeUtil.getCanvasContext(this);
123         // FIXME: needed only because eventdelegator registrations are done before adding node to scene graph.
124         if (ctx == null)
125             return null;
126         return (SingleElementNode)NodeUtil.getNearestParentOfType(this, SingleElementNode.class);
127     }
128
129     @Override
130     protected boolean keyPressed(KeyPressedEvent e) {
131         if (esm != null && esm.keyPressed(e))
132             return true;
133         return super.keyPressed(e);
134     }
135
136     @Override
137     protected boolean handleCommand(CommandEvent e) {
138         if (esm != null
139                 && !esm.isEditMode()
140                 && "org.eclipse.ui.edit.rename".equals(e.command.id)
141                 && isSelected()
142                 && esm.tryToStartEditMode(diagramCache)) {
143             return true;
144         }
145         return super.handleCommand(e);
146     }
147
148     @Override
149     public int getEventMask() {
150         return EventTypes.KeyPressedMask | EventTypes.MouseClickMask | EventTypes.CommandMask;
151     }
152
153 }