X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.g2d%2Fsrc%2Forg%2Fsimantics%2Fg2d%2Fdiagram%2Fparticipant%2FElementPainter.java;h=d4d0609b2766a3c9b616bba03b8a9f050d06a56b;hb=4d3f88eb0edb95b8bc7dedb136f0048ff3918506;hp=6e9ff85b1f62c9fb75f4552e346c956cad80113a;hpb=1a88878256eeb41efd2c0e3f82b69b4ef2565d61;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/ElementPainter.java b/bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/ElementPainter.java index 6e9ff85b1..d4d0609b2 100644 --- a/bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/ElementPainter.java +++ b/bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/ElementPainter.java @@ -61,6 +61,7 @@ import org.simantics.g2d.element.handler.BendsHandler; import org.simantics.g2d.element.handler.Children; import org.simantics.g2d.element.handler.Children.ChildEvent; import org.simantics.g2d.element.handler.Children.ChildListener; +import org.simantics.g2d.element.handler.ElementLayers; import org.simantics.g2d.element.handler.FillColor; import org.simantics.g2d.element.handler.Outline; import org.simantics.g2d.element.handler.OutlineColorSpec; @@ -71,9 +72,9 @@ import org.simantics.g2d.element.handler.SelectionSpecification; import org.simantics.g2d.element.handler.StrokeSpec; import org.simantics.g2d.element.handler.TerminalTopology; import org.simantics.g2d.element.handler.Transform; -import org.simantics.g2d.layers.ILayer; +import org.simantics.g2d.layers.ILayers; +import org.simantics.g2d.layers.ILayers.ILayersListener; import org.simantics.g2d.layers.ILayersEditor; -import org.simantics.g2d.layers.ILayersEditor.ILayersEditorListener; import org.simantics.g2d.participant.TransformUtil; import org.simantics.g2d.scenegraph.SceneGraphConstants; import org.simantics.g2d.utils.ElementNodeBridge; @@ -83,6 +84,7 @@ import org.simantics.scenegraph.Node; import org.simantics.scenegraph.g2d.G2DParentNode; import org.simantics.scenegraph.g2d.G2DSceneGraph; import org.simantics.scenegraph.g2d.IG2DNode; +import org.simantics.scenegraph.g2d.color.ColorFilter; import org.simantics.scenegraph.g2d.nodes.ConnectionNode; import org.simantics.scenegraph.g2d.nodes.DataNode; import org.simantics.scenegraph.g2d.nodes.LinkNode; @@ -137,7 +139,7 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos * ElementPainter. */ public static interface ISelectionProvider { - public void init(final IElement e, final G2DParentNode parentNode, final String nodeId, + public void init(int selectionId, final IElement e, final G2DParentNode parentNode, final String nodeId, final AffineTransform transform, final Rectangle2D bounds, final Color color); } @@ -158,7 +160,7 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos SingleElementNode diagramParent; RTreeNode elementParent; - boolean paintSelectionFrames; + ElementPainterConfiguration cfg; /** * Internally reused to avert constant reallocation. @@ -174,7 +176,11 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos } public ElementPainter(boolean paintSelectionFrames) { - this.paintSelectionFrames = paintSelectionFrames; + this(new ElementPainterConfiguration().paintSelectionFrames(paintSelectionFrames)); + } + + public ElementPainter(ElementPainterConfiguration cfg) { + this.cfg = cfg; } @Override @@ -209,9 +215,9 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos oldValue.removeKeyHintListener(Hints.KEY_DIRTY, diagramHintListener); oldValue.removeKeyHintListener(Hints.KEY_DISABLE_PAINTING, diagramHintListener); - ILayersEditor layers = oldValue.getHint(DiagramHints.KEY_LAYERS_EDITOR); + ILayers layers = oldValue.getHint(DiagramHints.KEY_LAYERS); if (layers != null) { - layers.removeListener(layersListener); + layers.removeLayersListener(layersListener); } for (TransactionContext tc : oldValue.getDiagramClass().getItemsByClass(TransactionContext.class)) { @@ -233,9 +239,9 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos newValue.addKeyHintListener(Hints.KEY_DISABLE_PAINTING, diagramHintListener); newValue.addKeyHintListener(Hints.KEY_DIRTY, diagramHintListener); - ILayersEditor layers = newValue.getHint(DiagramHints.KEY_LAYERS_EDITOR); + ILayers layers = newValue.getHint(DiagramHints.KEY_LAYERS); if (layers != null) { - layers.addListener(layersListener); + layers.addLayersListener(layersListener); } for (TransactionContext tc : newValue.getDiagramClass().getItemsByClass(TransactionContext.class)) { @@ -298,41 +304,21 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos // Layer configuration change listening and reaction logic // ------------------------------------------------------------------------ - ILayersEditorListener layersListener = new ILayersEditorListener() { - private void layersChanged() { + ILayersListener layersListener = new ILayersListener() { + @Override + public void changed() { Object task = BEGIN("EP.layersChanged"); - // Update visibility/focusability for each node only, do not reinitialize the graphics. + ICanvasContext ctx = getContext(); + if(ctx != null) { + G2DSceneGraph sg = ctx.getSceneGraph(); + if(sg != null) { + ILayersEditor layers = diagram.getHint(DiagramHints.KEY_LAYERS); + sg.setGlobalProperty(G2DSceneGraph.IGNORE_FOCUS, layers.getIgnoreFocusSettings()); + } + } updateAllVisibility(); END(task); } - @Override - public void layerRemoved(ILayer layer) { - layersChanged(); - } - @Override - public void layerDeactivated(ILayer layer) { - layersChanged(); - } - @Override - public void layerAdded(ILayer layer) { - layersChanged(); - } - @Override - public void layerActivated(ILayer layer) { - layersChanged(); - } - @Override - public void ignoreFocusChanged(boolean value) { - ICanvasContext ctx = getContext(); - if(ctx == null) return; - G2DSceneGraph sg = ctx.getSceneGraph(); - if(sg == null) return; - sg.setGlobalProperty(G2DSceneGraph.IGNORE_FOCUS, value); - } - @Override - public void ignoreVisibilityChanged(boolean value) { - layersChanged(); - } }; protected void updateAllVisibility() { @@ -401,11 +387,17 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos } } else if (key == ElementHints.KEY_FOCUS_LAYERS || key == ElementHints.KEY_VISIBLE_LAYERS) { if (sender instanceof IElement) { - assert getContext().getThreadAccess().currentThreadAccess(); - IElement e = (IElement) sender; - Object task = BEGIN("layers changed: " + e); - update(e); - END(task); + getContext().getThreadAccess().asyncExec(new Runnable() { + + @Override + public void run() { + assert getContext().getThreadAccess().currentThreadAccess(); + IElement e = (IElement) sender; + Object task = BEGIN("layers changed: " + e); + update(e); + END(task); + } + }); } } } @@ -771,14 +763,6 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos if (ElementUtils.isHidden(e)) return null; -// ElementClass ec = e.getElementClass(); -// ILayers layers = diagram.getHint(DiagramHints.KEY_LAYERS); -// if (layers != null && !layers.getIgnoreVisibilitySettings()) { -// ElementLayers el = ec.getAtMostOneItemOfClass(ElementLayers.class); -// if (el != null && !el.isVisible(e, layers)) { -// return null; -// } -// } // Update the node scene graph through SceneGraph handlers. List nodeHandlers = e.getElementClass().getItemsByClass(SceneGraph.class); @@ -793,7 +777,19 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos e.setHint(elementSgNodeKey, holder); } holder.setComposite(composite); - holder.setVisible(true); + boolean visible = true; + ElementClass ec = e.getElementClass(); + ILayers layers = diagram.getHint(DiagramHints.KEY_LAYERS); + if (layers != null && !layers.getIgnoreVisibilitySettings()) { + ElementLayers el = ec.getAtMostOneItemOfClass(ElementLayers.class); + if (el != null && !el.isVisible(e, layers)) { + visible = false; + } + } + holder.setVisible(visible); + + ColorFilter colorFilter = e.getHint(ElementHints.KEY_COLOR_FILTER); + holder.setColorFilter(colorFilter); for (SceneGraph n : nodeHandlers) { n.init(e, holder); @@ -828,7 +824,7 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos Object task = BEGIN("EP.updateSelections"); try { - if (!paintSelectionFrames) + if (!cfg.paintSelectionFrames) return; if (selection == null) return; @@ -934,7 +930,7 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos Object task = BEGIN("EP.updateSelection"); try { - if (!paintSelectionFrames) + if (!cfg.paintSelectionFrames) return; G2DParentNode elementNode = (G2DParentNode) el.getHint(ElementHints.KEY_SG_NODE); @@ -953,7 +949,7 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos continue; if (NodeUtil.needSelectionPaint(elementNode)) - paintSelectionFrame(elementNode, selectionNode, el, color); + paintSelectionFrame(selectionId, elementNode, selectionNode, el, color); nodesUpdated = true; } @@ -980,12 +976,14 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos Color color = getSelectionColor(selectionId); G2DParentNode selectionsNode = getSelectionsNode(selectionId); + Class selectionNodeClass = cfg.selectionNodeClass != null ? cfg.selectionNodeClass : G2DParentNode.class; + for (IElement e : selection) { Node elementNode = e.getHint(ElementHints.KEY_SG_NODE); // System.out.println("selectionNode: " + elementNode + " " + e); if (elementNode instanceof G2DParentNode) { G2DParentNode en = (G2DParentNode) elementNode; - G2DParentNode selectionNode = en.getOrCreateNode(NodeUtil.SELECTION_NODE_NAME, G2DParentNode.class); + G2DParentNode selectionNode = en.getOrCreateNode(NodeUtil.SELECTION_NODE_NAME, selectionNodeClass); selectionNode.setZIndex(SELECTION_PAINT_PRIORITY); if (selectionNodes != null) selectionNodes.add(selectionNode); @@ -999,7 +997,7 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos createSelectionReference(selectionsNode, elementNode); if (NodeUtil.needSelectionPaint(elementNode)) - paintSelectionFrame(en, selectionNode, e, color); + paintSelectionFrame(selectionId, en, selectionNode, e, color); } else { if (elementNode != null) { @@ -1027,7 +1025,18 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos return result; } - public void paintSelectionFrame(G2DParentNode elementNode, G2DParentNode selectionNode, final IElement e, Color color) { + + /** + * We need to have separate class for SelectionNode, so that SCLSceneGraph can handle this properly. + * + */ + public static class SelectionShapeNode extends ShapeNode { + + private static final long serialVersionUID = -5393630944240940166L; + + } + + public void paintSelectionFrame(int selectionId, G2DParentNode elementNode, G2DParentNode selectionNode, final IElement e, Color color) { // The element node already has the correct transform. AffineTransform selectionTransform = ElementUtils.getTransform(e);// no it doesnt ... new AffineTransform(); Shape shape = ElementUtils.getElementShapeOrBounds(e); @@ -1048,7 +1057,7 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos Outline outline = (Outline) es.getAdapter(Outline.class); if (outline == null || outline.getElementShape(e) == null) continue; - ShapeNode shapenode = shapeholder.getOrCreateNode(getNodeId("outline", e, es), ShapeNode.class); + ShapeNode shapenode = shapeholder.getOrCreateNode(getNodeId("outline", e, es), SelectionShapeNode.class); // shapenode.setShape(es.getSelectionShape(e)); // shapenode.setStroke(SELECTION_STROKE); // shapenode.setScaleStroke(true); @@ -1084,7 +1093,7 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos G2DParentNode shapeholder = selectionNode.getOrCreateNode(getNodeId("outlines", e), G2DParentNode.class); for (SelectionOutline es : shapeHandlers) { - ShapeNode shapenode = shapeholder.getOrCreateNode(getNodeId("outline", e, es), ShapeNode.class); + ShapeNode shapenode = shapeholder.getOrCreateNode(getNodeId("outline", e, es), SelectionShapeNode.class); // shapenode.setShape(es.getSelectionShape(e)); // shapenode.setStroke(SELECTION_STROKE); // shapenode.setScaleStroke(true); @@ -1104,10 +1113,10 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos ISelectionProvider provider = this.getContext().getDefaultHintContext().getHint(KEY_SELECTION_PROVIDER); if (provider != null) { - provider.init(e, selectionNode, getNodeId("shape", e), selectionTransform, bounds, color); + provider.init(selectionId, e, selectionNode, getNodeId("shape", e), selectionTransform, bounds, color); } else { SelectionNode s = selectionNode.getOrCreateNode(getNodeId("shape", e), SelectionNode.class); - s.init(selectionTransform, bounds, color); + s.init(selectionId, selectionTransform, bounds, color); Double paddingFactor = diagram.getHint(DiagramHints.SELECTION_PADDING_SCALE_FACTOR); if (paddingFactor != null) s.setPaddingFactor(paddingFactor);