]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.g2d/src/org/simantics/g2d/elementclass/operationsymbols/OperationClasses.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / elementclass / operationsymbols / OperationClasses.java
diff --git a/bundles/org.simantics.g2d/src/org/simantics/g2d/elementclass/operationsymbols/OperationClasses.java b/bundles/org.simantics.g2d/src/org/simantics/g2d/elementclass/operationsymbols/OperationClasses.java
new file mode 100644 (file)
index 0000000..baab7cc
--- /dev/null
@@ -0,0 +1,1055 @@
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ *     VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.g2d.elementclass.operationsymbols;\r
+\r
+import java.awt.Color;\r
+import java.awt.geom.AffineTransform;\r
+import java.awt.geom.Rectangle2D;\r
+\r
+import org.simantics.g2d.diagram.handler.Topology.Terminal;\r
+import org.simantics.g2d.element.ElementClass;\r
+import org.simantics.g2d.element.ElementUtils;\r
+import org.simantics.g2d.element.IElement;\r
+import org.simantics.g2d.element.SceneGraphNodeKey;\r
+import org.simantics.g2d.element.handler.AdditionalColor;\r
+import org.simantics.g2d.element.handler.BorderColor;\r
+import org.simantics.g2d.element.handler.Clickable;\r
+import org.simantics.g2d.element.handler.Clickable.PressStatus;\r
+import org.simantics.g2d.element.handler.FillColor;\r
+import org.simantics.g2d.element.handler.SceneGraph;\r
+import org.simantics.g2d.element.handler.impl.AdditionalColorImpl;\r
+import org.simantics.g2d.element.handler.impl.BorderColorImpl;\r
+import org.simantics.g2d.element.handler.impl.DefaultTransform;\r
+import org.simantics.g2d.element.handler.impl.FillColorImpl;\r
+import org.simantics.g2d.element.handler.impl.FixedSize;\r
+import org.simantics.g2d.element.handler.impl.Resizeable;\r
+import org.simantics.g2d.element.handler.impl.StaticTerminals;\r
+import org.simantics.g2d.element.handler.impl.TerminalImpl;\r
+import org.simantics.g2d.elementclass.operationsymbols.OperationSymbols.BoilerSymbol;\r
+import org.simantics.g2d.elementclass.operationsymbols.OperationSymbols.BoilerSymbol2;\r
+import org.simantics.g2d.elementclass.operationsymbols.OperationSymbols.ChimneySymbol;\r
+import org.simantics.g2d.elementclass.operationsymbols.OperationSymbols.CompressorSymbol;\r
+import org.simantics.g2d.elementclass.operationsymbols.OperationSymbols.ControlValveSymbol;\r
+import org.simantics.g2d.elementclass.operationsymbols.OperationSymbols.GeneratorSymbol;\r
+import org.simantics.g2d.elementclass.operationsymbols.OperationSymbols.HeatExchangerSymbol;\r
+import org.simantics.g2d.elementclass.operationsymbols.OperationSymbols.NoSpinSymbol;\r
+import org.simantics.g2d.elementclass.operationsymbols.OperationSymbols.PumpSymbol;\r
+import org.simantics.g2d.elementclass.operationsymbols.OperationSymbols.ShutoffValveSymbol;\r
+import org.simantics.g2d.elementclass.operationsymbols.OperationSymbols.SwitchSymbol;\r
+import org.simantics.g2d.elementclass.operationsymbols.OperationSymbols.Tank2Symbol;\r
+import org.simantics.g2d.elementclass.operationsymbols.OperationSymbols.TankSymbol;\r
+import org.simantics.g2d.elementclass.operationsymbols.OperationSymbols.ThreeWayValveSymbol;\r
+import org.simantics.g2d.elementclass.operationsymbols.OperationSymbols.TurbineSymbol;\r
+import org.simantics.g2d.elementclass.operationsymbols.OperationSymbols.VoltageTransformerSymbol;\r
+import org.simantics.g2d.image.Image;\r
+import org.simantics.g2d.utils.geom.DirectionSet;\r
+import org.simantics.scenegraph.Node;\r
+import org.simantics.scenegraph.g2d.G2DParentNode;\r
+import org.simantics.utils.datastructures.hints.IHintContext.Key;\r
+\r
+/**\r
+ * Operation symbol handlers.\r
+ * \r
+ * @author Toni Kalajainen\r
+ */\r
+public class OperationClasses {\r
+    \r
+       static final FillColor FILL_COLOR_HANDLER = FillColorImpl.handlerOf(Color.WHITE);\r
+       static final BorderColor BORDER_COLOR_HANDLER = BorderColorImpl.handlerOf(Color.BLACK);\r
+       static final AdditionalColor ADDITIONAL_COLOR_HANDLER = AdditionalColorImpl.handlerOf(Color.GREEN);\r
+       \r
+       public static final Terminal TERMINAL_IN = new TerminalImpl(); \r
+       public static final Terminal TERMINAL_OUT = new TerminalImpl(); \r
+       \r
+       public static ElementClass BOILER_CLASS =\r
+               ElementClass.compile(\r
+                               DefaultTransform.INSTANCE,\r
+                               BoilerPaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(-10, 0, 20, 125),\r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    0.0, -BoilerSymbol.DIM*3, DirectionSet.N,\r
+                                               TERMINAL_OUT,   0.0,  BoilerSymbol.DIM*3, DirectionSet.S\r
+                                               )\r
+                               );\r
+       public static ElementClass BOILER_BUTTON_CLASS =\r
+               ElementClass.compile(\r
+                               Clickable.INSTANCE,\r
+                               DefaultTransform.INSTANCE,\r
+                               BoilerPaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(-10, 0, 20, 125),\r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    0.0, -BoilerSymbol.DIM*3, DirectionSet.N,\r
+                                               TERMINAL_OUT,   0.0,  BoilerSymbol.DIM*3, DirectionSet.S\r
+                                               )\r
+                               );\r
+       public static ElementClass NO_SPIN_CLASS =\r
+               ElementClass.compile(\r
+                               DefaultTransform.INSTANCE,\r
+                               NoSpinPaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(NoSpinSymbol.BOUNDS),\r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    0.0, 0.0, DirectionSet.NESW\r
+                                               )                               \r
+                               );\r
+       public static ElementClass NO_SPIN_BUTTON_CLASS =\r
+               ElementClass.compile(\r
+                               Clickable.INSTANCE,\r
+                               DefaultTransform.INSTANCE,\r
+                               NoSpinPaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(NoSpinSymbol.BOUNDS),\r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    0.0, 0.0, DirectionSet.NESW\r
+                                               )                               \r
+                               );                      \r
+       public static ElementClass COMPRESSOR_CLASS =\r
+               ElementClass.compile(\r
+                               DefaultTransform.INSTANCE,\r
+                               CompressorPaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(CompressorSymbol.BOUNDS),\r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    0.0, 0.0, DirectionSet.NESW\r
+                                               )                               \r
+                               );\r
+       public static ElementClass COMPRESSOR_BUTTON_CLASS =\r
+               ElementClass.compile(\r
+                               Clickable.INSTANCE,\r
+                               DefaultTransform.INSTANCE,\r
+                               CompressorPaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(CompressorSymbol.BOUNDS),\r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    0.0, 0.0, DirectionSet.NESW\r
+                                               )                               \r
+                               );              \r
+       public static ElementClass CONTROLVALVE_CLASS =\r
+               ElementClass.compile(\r
+                               DefaultTransform.INSTANCE,\r
+                               ControlValvePaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(ControlValveSymbol.BOUNDS),                                \r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    -ControlValveSymbol.D, 0.0, DirectionSet.N,\r
+                                               TERMINAL_OUT,    ControlValveSymbol.D, 0.0, DirectionSet.S\r
+                                               )                               \r
+                               );      \r
+       public static ElementClass CONTROLVALVE_BUTTON_CLASS =\r
+               ElementClass.compile(\r
+                               Clickable.INSTANCE,\r
+                               DefaultTransform.INSTANCE,\r
+                               ControlValvePaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(ControlValveSymbol.BOUNDS),                                \r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    -ControlValveSymbol.D, 0.0, DirectionSet.N,\r
+                                               TERMINAL_OUT,    ControlValveSymbol.D, 0.0, DirectionSet.S\r
+                                               )                               \r
+                               );              \r
+       public static ElementClass THREEWAYVALVE_CLASS =\r
+               ElementClass.compile(\r
+                               DefaultTransform.INSTANCE,\r
+                               ThreeWayValvePaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(ControlValveSymbol.BOUNDS),                                \r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    -ThreeWayValveSymbol.D, 0.0, DirectionSet.N,\r
+                                               TERMINAL_OUT,    ThreeWayValveSymbol.D, 0.0, DirectionSet.S\r
+                                               )                               \r
+                               );      \r
+       public static ElementClass THREEWAYVALVE_BUTTON_CLASS =\r
+               ElementClass.compile(\r
+                               Clickable.INSTANCE,\r
+                               DefaultTransform.INSTANCE,\r
+                               ThreeWayValvePaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(ControlValveSymbol.BOUNDS),                                \r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    -ThreeWayValveSymbol.D, 0.0, DirectionSet.N,\r
+                                               TERMINAL_OUT,    ThreeWayValveSymbol.D, 0.0, DirectionSet.S\r
+                                               )                               \r
+                               );              \r
+       public static ElementClass HEATEXCHANGER_CLASS =\r
+               ElementClass.compile(\r
+                               DefaultTransform.INSTANCE,\r
+                               HeatExchangerPaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(HeatExchangerSymbol.BOUNDS),\r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    HeatExchangerSymbol.BOUNDS.getMinX(), HeatExchangerSymbol.BOUNDS.getMaxY()*0.5, DirectionSet.SW,\r
+                                               TERMINAL_OUT,   HeatExchangerSymbol.BOUNDS.getMaxX(), HeatExchangerSymbol.BOUNDS.getMinY()*0.5, DirectionSet.NE\r
+                                               )                                                               \r
+                               );      \r
+       public static ElementClass HEATEXCHANGER_BUTTON_CLASS =\r
+               ElementClass.compile(\r
+                               Clickable.INSTANCE,\r
+                               DefaultTransform.INSTANCE,\r
+                               HeatExchangerPaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(HeatExchangerSymbol.BOUNDS),\r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    HeatExchangerSymbol.BOUNDS.getMinX(), HeatExchangerSymbol.BOUNDS.getMaxY(), DirectionSet.SW,\r
+                                               TERMINAL_OUT,   HeatExchangerSymbol.BOUNDS.getMaxX(), HeatExchangerSymbol.BOUNDS.getMinY(), DirectionSet.NE                                             \r
+                                               )                                                               \r
+                               );              \r
+       public static ElementClass PUMP_CLASS =\r
+               ElementClass.compile(\r
+                               DefaultTransform.INSTANCE,\r
+                               PumpPaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(PumpSymbol.BOUNDS),\r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    -PumpSymbol.D2, 0.0, DirectionSet.N,\r
+                                               TERMINAL_OUT,    PumpSymbol.D2, 0.0, DirectionSet.S\r
+                                               )                                       \r
+                               );\r
+       public static ElementClass PUMP_BUTTON_CLASS =\r
+               ElementClass.compile(\r
+                               Clickable.INSTANCE,\r
+                               DefaultTransform.INSTANCE,\r
+                               PumpPaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(PumpSymbol.BOUNDS),\r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    -PumpSymbol.D2, 0.0, DirectionSet.N,\r
+                                               TERMINAL_OUT,    PumpSymbol.D2, 0.0, DirectionSet.S\r
+                                               )                                       \r
+                               );      \r
+       public static ElementClass SHUTOFFVALVE_CLASS =\r
+               ElementClass.compile(\r
+                               DefaultTransform.INSTANCE,\r
+                               ShutoffValvePaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(ShutoffValveSymbol.SHAPE.getBounds()),\r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    -ShutoffValveSymbol.DIM, 0.0, DirectionSet.N,\r
+                                               TERMINAL_OUT,    ShutoffValveSymbol.DIM, 0.0, DirectionSet.S\r
+                                               )                                       \r
+                               );      \r
+       public static ElementClass SHUTOFFVALVE_BUTTON_CLASS =\r
+               ElementClass.compile(\r
+                               Clickable.INSTANCE,\r
+                               DefaultTransform.INSTANCE,\r
+                               ShutoffValvePaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(ShutoffValveSymbol.SHAPE.getBounds()),\r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    -ShutoffValveSymbol.DIM, 0.0, DirectionSet.N,\r
+                                               TERMINAL_OUT,    ShutoffValveSymbol.DIM, 0.0, DirectionSet.S\r
+                                               )                                       \r
+                               );              \r
+       public static ElementClass SWITCH_CLASS =\r
+               ElementClass.compile(\r
+                               DefaultTransform.INSTANCE,\r
+                               SwitchPaint.INSTANCE,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(SwitchSymbol.BOUNDS),\r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    SwitchSymbol.BOUNDS.getCenterX(), SwitchSymbol.BOUNDS.getMinY(), DirectionSet.N,\r
+                                               TERMINAL_OUT,   SwitchSymbol.BOUNDS.getCenterX(), SwitchSymbol.BOUNDS.getMaxY(), DirectionSet.S                                         \r
+                                               )                                       \r
+                               );      \r
+       public static ElementClass SWITCH_BUTTON_CLASS =\r
+               ElementClass.compile(\r
+                               Clickable.INSTANCE,\r
+                               DefaultTransform.INSTANCE,\r
+                               SwitchPaint.INSTANCE,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(SwitchSymbol.BOUNDS),\r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    SwitchSymbol.BOUNDS.getCenterX(), SwitchSymbol.BOUNDS.getMinY(), DirectionSet.N,\r
+                                               TERMINAL_OUT,   SwitchSymbol.BOUNDS.getCenterX(), SwitchSymbol.BOUNDS.getMaxY(), DirectionSet.S                                         \r
+                                               )                                       \r
+                               );              \r
+       public static ElementClass TURBINE_CLASS =\r
+               ElementClass.compile(\r
+                               DefaultTransform.INSTANCE,\r
+                               TurbinePaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(TurbineSymbol.SHAPE.getBounds()),\r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    -TurbineSymbol.DIM, 0.0, DirectionSet.N,\r
+                                               TERMINAL_OUT,    TurbineSymbol.DIM, 0.0, DirectionSet.S\r
+                                               )                                               \r
+                               );              \r
+       public static ElementClass TURBINE_BUTTON_CLASS =\r
+               ElementClass.compile(\r
+                               Clickable.INSTANCE,\r
+                               DefaultTransform.INSTANCE,\r
+                               TurbinePaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(TurbineSymbol.BOUNDS),\r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    -TurbineSymbol.DIM, 0.0, DirectionSet.N,\r
+                                               TERMINAL_OUT,    TurbineSymbol.DIM, 0.0, DirectionSet.S\r
+                                               )                                               \r
+                               );              \r
+       public static ElementClass VOLTAGETRANSFORMER_CLASS =\r
+               ElementClass.compile(\r
+                               DefaultTransform.INSTANCE,\r
+                               VoltageTransformerPaint.INSTANCE,\r
+                               ADDITIONAL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(VoltageTransformerSymbol.BOUNDS),\r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    VoltageTransformerSymbol.BOUNDS.getCenterX(), VoltageTransformerSymbol.BOUNDS.getMinY(), DirectionSet.N,\r
+                                               TERMINAL_OUT,   VoltageTransformerSymbol.BOUNDS.getCenterX(), VoltageTransformerSymbol.BOUNDS.getMaxY(), DirectionSet.S\r
+                                               )                                                       \r
+                               );\r
+       public static ElementClass VOLTAGETRANSFORMER_BUTTON_CLASS =\r
+               ElementClass.compile(\r
+                               Clickable.INSTANCE,\r
+                               DefaultTransform.INSTANCE,\r
+                               VoltageTransformerPaint.INSTANCE,\r
+                               ADDITIONAL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(VoltageTransformerSymbol.BOUNDS),\r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    VoltageTransformerSymbol.BOUNDS.getCenterX(), VoltageTransformerSymbol.BOUNDS.getMinY(), DirectionSet.N,\r
+                                               TERMINAL_OUT,   VoltageTransformerSymbol.BOUNDS.getCenterX(), VoltageTransformerSymbol.BOUNDS.getMaxY(), DirectionSet.S\r
+                                               )                                                       \r
+                               );      \r
+       public static ElementClass CHIMNEY_CLASS =\r
+               ElementClass.compile(\r
+                               DefaultTransform.INSTANCE,\r
+                               ChimneyPaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(ChimneySymbol.BOUNDS)\r
+                               );              \r
+       public static ElementClass CHIMNEY_BUTTON_CLASS =\r
+               ElementClass.compile(\r
+                               Clickable.INSTANCE,\r
+                               DefaultTransform.INSTANCE,\r
+                               ChimneyPaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(ChimneySymbol.BOUNDS)\r
+                               );              \r
+       public static ElementClass GENERATOR_CLASS =\r
+               ElementClass.compile(\r
+                               DefaultTransform.INSTANCE,\r
+                               GeneratorPaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(GeneratorSymbol.BOUNDS),\r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    -GeneratorSymbol.DIM, 0.0, DirectionSet.W,\r
+                                               TERMINAL_OUT,    GeneratorSymbol.DIM, 0.0, DirectionSet.E\r
+                                               )                                                               \r
+                               );              \r
+       public static ElementClass GENERATOR_BUTTON_CLASS =\r
+               ElementClass.compile(\r
+                               Clickable.INSTANCE,\r
+                               DefaultTransform.INSTANCE,\r
+                               GeneratorPaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               FixedSize.of(GeneratorSymbol.BOUNDS),\r
+                               StaticTerminals.compile(\r
+                                               TERMINAL_IN,    -GeneratorSymbol.DIM, 0.0, DirectionSet.W,\r
+                                               TERMINAL_OUT,    GeneratorSymbol.DIM, 0.0, DirectionSet.E\r
+                                               )                                                                                               \r
+                               );\r
+       public static ElementClass TANK_CLASS =\r
+               ElementClass.compile(\r
+                               DefaultTransform.INSTANCE,\r
+                               TankPaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               Resizeable.initialSize(40, 15)\r
+                               );              \r
+       public static ElementClass TANK_BUTTON_CLASS =\r
+               ElementClass.compile(\r
+                               Clickable.INSTANCE,\r
+                               DefaultTransform.INSTANCE,\r
+                               TankPaint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               Resizeable.initialSize(40, 15)\r
+                               );              \r
+       public static ElementClass TANK2_CLASS =\r
+               ElementClass.compile(\r
+                               DefaultTransform.INSTANCE,\r
+                               Tank2Paint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               BORDER_COLOR_HANDLER,\r
+                               ADDITIONAL_COLOR_HANDLER,                               \r
+                               Resizeable.initialSize(40, 15)\r
+                               );              \r
+       public static ElementClass TANK2_BUTTON_CLASS =\r
+               ElementClass.compile(\r
+                               Clickable.INSTANCE,\r
+                               DefaultTransform.INSTANCE,\r
+                               Tank2Paint.INSTANCE,\r
+                               FILL_COLOR_HANDLER,\r
+                               ADDITIONAL_COLOR_HANDLER,                               \r
+                               BORDER_COLOR_HANDLER,\r
+                               Resizeable.initialSize(40, 15)\r
+                               );              \r
+       \r
+       \r
+       \r
+       public static class BoilerPaint implements SceneGraph {         \r
+\r
+               private static final long serialVersionUID = -4545277680608759806L;\r
+               public static final BoilerPaint INSTANCE = new BoilerPaint();\r
+               \r
+           public static final Key SG_NODE = new SceneGraphNodeKey(Node.class, "SUB_SG_NODE");\r
+\r
+               @Override\r
+               public void cleanup(IElement e) {\r
+              Node node = e.removeHint(SG_NODE);\r
+              if (node != null)\r
+                  node.remove();\r
+               }\r
+\r
+               @Override\r
+               public void init(IElement e, G2DParentNode parent) {\r
+              G2DParentNode node = (G2DParentNode) e.getHint(SG_NODE);\r
+              if (node == null) {\r
+                  node = parent.addNode(G2DParentNode.class);\r
+                  e.setHint(SG_NODE, node);\r
+              }\r
+                       AffineTransform at      = ElementUtils.getTransform(e);\r
+                       if(at != null) node.setTransform(at);\r
+\r
+                       Color                   fc              = ElementUtils.getFillColor(e);\r
+                       Color                   bc              = ElementUtils.getBorderColor(e);\r
+                       PressStatus     press   = null;//ElementUtils.getPressStatus(e, ctx); // FIXME: scenegraph does not support context\r
+                       Image ps                = null;\r
+                       \r
+                       if (press==null) {\r
+                               ps = new BoilerSymbol2(fc, bc, OperationSymbols.BOILER_HES);\r
+                       } else {\r
+                               ps = OperationSymbols.BOILER_SHADOW;\r
+// ?????????                           \r
+//                             if (press==PressStatus.NORMAL) \r
+//                                     gc.getGraphics2D().translate(-2, -3);\r
+                       }\r
+                       \r
+                       ps.init(node);\r
+               }\r
+       }\r
+       \r
+       \r
+       public static class NoSpinPaint implements SceneGraph {\r
+\r
+               private static final long serialVersionUID = 801958319361745846L;\r
+               public static final NoSpinPaint INSTANCE = new NoSpinPaint();\r
+               \r
+           public static final Key SG_NODE = new SceneGraphNodeKey(Node.class, "SUB_SG_NODE");\r
+\r
+               @Override\r
+               public void cleanup(IElement e) {\r
+              Node node = e.removeHint(SG_NODE);\r
+              if (node != null)\r
+                  node.remove();\r
+               }\r
+\r
+               @Override\r
+               public void init(IElement e, G2DParentNode parent) {\r
+              G2DParentNode node = (G2DParentNode) e.getHint(SG_NODE);\r
+              if (node == null) {\r
+                  node = parent.addNode(G2DParentNode.class);\r
+                  e.setHint(SG_NODE, node);\r
+              }\r
+                       AffineTransform at      = ElementUtils.getTransform(e);\r
+                       if(at != null) node.setTransform(at);\r
+\r
+                       Color                   fc              = ElementUtils.getFillColor(e);\r
+                       Color                   bc              = ElementUtils.getBorderColor(e);\r
+                       if (bc==null) return;\r
+                       PressStatus     press   = null;//ElementUtils.getPressStatus(e, ctx); // FIXME: scenegraph does not support context\r
+                       Image ps                = null;\r
+                       \r
+                       if (press==null) {\r
+                               ps = new NoSpinSymbol(fc, bc);\r
+                       } else {\r
+                               ps = OperationSymbols.NO_SPIN_SHADOW;\r
+// ?????????                           \r
+//                             if (press==PressStatus.NORMAL)\r
+//                                     gc.getGraphics2D().translate(-2, -3);\r
+                       }\r
+                       \r
+                       ps.init(node);\r
+               }\r
+       }\r
+\r
+       \r
+       public static class ControlValvePaint implements SceneGraph {\r
+\r
+               private static final long serialVersionUID = -8208633777668762027L;\r
+               public static final ControlValvePaint INSTANCE = new ControlValvePaint();\r
+           public static final Key SG_NODE = new SceneGraphNodeKey(Node.class, "SUB_SG_NODE");\r
+\r
+               @Override\r
+               public void cleanup(IElement e) {\r
+              Node node = e.removeHint(SG_NODE);\r
+              if (node != null)\r
+                  node.remove();\r
+               }\r
+\r
+               @Override\r
+               public void init(IElement e, G2DParentNode parent) {\r
+              G2DParentNode node = (G2DParentNode) e.getHint(SG_NODE);\r
+              if (node == null) {\r
+                  node = parent.addNode(G2DParentNode.class);\r
+                  e.setHint(SG_NODE, node);\r
+              }\r
+                       AffineTransform at      = ElementUtils.getTransform(e);\r
+                       if(at != null) node.setTransform(at);\r
+\r
+                       Color                   fc              = ElementUtils.getFillColor(e);\r
+                       Color                   bc              = ElementUtils.getBorderColor(e);\r
+                       if (bc==null) return;\r
+                       PressStatus     press   = null;//ElementUtils.getPressStatus(e, ctx); // FIXME: scenegraph does not support context\r
+                       Image ps                = null;\r
+                       \r
+                       if (press==null) {\r
+                               ps = new ControlValveSymbol(fc, bc);\r
+                       } else {\r
+                               ps = OperationSymbols.CONTROLVALVE_SHADOW;\r
+// ?????????                           \r
+//                             if (press==PressStatus.NORMAL)\r
+//                                     gc.getGraphics2D().translate(-2, -3);\r
+                       }\r
+                       \r
+                       ps.init(node);\r
+               }\r
+       }       \r
+       \r
+       public static class ThreeWayValvePaint implements SceneGraph {\r
+\r
+               private static final long serialVersionUID = -1848763601182093048L;\r
+               public static final ThreeWayValvePaint INSTANCE = new ThreeWayValvePaint();\r
+           public static final Key SG_NODE = new SceneGraphNodeKey(Node.class, "SUB_SG_NODE");\r
+\r
+               @Override\r
+               public void cleanup(IElement e) {\r
+              Node node = e.removeHint(SG_NODE);\r
+              if (node != null)\r
+                  node.remove();\r
+               }\r
+\r
+               @Override\r
+               public void init(IElement e, G2DParentNode parent) {\r
+              G2DParentNode node = (G2DParentNode) e.getHint(SG_NODE);\r
+              if (node == null) {\r
+                  node = parent.addNode(G2DParentNode.class);\r
+                  e.setHint(SG_NODE, node);\r
+              }\r
+                       AffineTransform at      = ElementUtils.getTransform(e);\r
+                       if(at != null) node.setTransform(at);\r
+\r
+                       Color                   fc              = ElementUtils.getFillColor(e);\r
+                       Color                   bc              = ElementUtils.getBorderColor(e);\r
+                       if (bc==null) return;\r
+                       PressStatus     press   = null;//ElementUtils.getPressStatus(e, ctx); // FIXME: scenegraph does not support context\r
+                       Image ps                = null;\r
+                       \r
+                       if (press==null) {\r
+                               ps = new ThreeWayValveSymbol(fc, bc);\r
+                       } else {\r
+                               ps = OperationSymbols.THREEWAYVALVE_SHADOW;\r
+// ?????????                           \r
+//                             if (press==PressStatus.NORMAL)\r
+//                                     gc.getGraphics2D().translate(-2, -3);\r
+                       }\r
+                       \r
+                       ps.init(node);\r
+               }\r
+       }       \r
+       \r
+       public static class HeatExchangerPaint implements SceneGraph {\r
+\r
+               private static final long serialVersionUID = -5482316746105556083L;\r
+               public static final HeatExchangerPaint INSTANCE = new HeatExchangerPaint();             \r
+           public static final Key SG_NODE = new SceneGraphNodeKey(Node.class, "SUB_SG_NODE");\r
+\r
+               @Override\r
+               public void cleanup(IElement e) {\r
+              Node node = e.removeHint(SG_NODE);\r
+              if (node != null)\r
+                  node.remove();\r
+               }\r
+\r
+               @Override\r
+               public void init(IElement e, G2DParentNode parent) {\r
+              G2DParentNode node = (G2DParentNode) e.getHint(SG_NODE);\r
+              if (node == null) {\r
+                  node = parent.addNode(G2DParentNode.class);\r
+                  e.setHint(SG_NODE, node);\r
+              }\r
+                       AffineTransform at      = ElementUtils.getTransform(e);\r
+                       if(at != null) node.setTransform(at);\r
+\r
+                       Color                   fc              = ElementUtils.getFillColor(e);\r
+                       Color                   bc              = ElementUtils.getBorderColor(e);\r
+                       if (bc==null) return;\r
+                       PressStatus     press   = null;//ElementUtils.getPressStatus(e, ctx); // FIXME: scenegraph does not support context\r
+                       Image ps                = null;\r
+                       \r
+                       if (press==null) {\r
+                               ps = new HeatExchangerSymbol(fc, bc);\r
+                       } else {\r
+                               ps = OperationSymbols.HEATEXCHANGER_SHADOW;\r
+// ?????????                           \r
+//                             if (press==PressStatus.NORMAL)\r
+//                                     gc.getGraphics2D().translate(-2, -3);\r
+                       }\r
+                       \r
+                       ps.init(node);\r
+               }\r
+       }       \r
+               \r
+       \r
+       \r
+       public static class PumpPaint implements SceneGraph {\r
+\r
+               private static final long serialVersionUID = 5899800511420262337L;\r
+               public static final PumpPaint INSTANCE = new PumpPaint();               \r
+           public static final Key SG_NODE = new SceneGraphNodeKey(Node.class, "SUB_SG_NODE");\r
+\r
+               @Override\r
+               public void cleanup(IElement e) {\r
+              Node node = e.removeHint(SG_NODE);\r
+              if (node != null)\r
+                  node.remove();\r
+               }\r
+\r
+               @Override\r
+               public void init(IElement e, G2DParentNode parent) {\r
+              G2DParentNode node = (G2DParentNode) e.getHint(SG_NODE);\r
+              if (node == null) {\r
+                  node = parent.addNode(G2DParentNode.class);\r
+                  e.setHint(SG_NODE, node);\r
+              }\r
+                       AffineTransform at      = ElementUtils.getTransform(e);\r
+                       if(at != null) node.setTransform(at);\r
+\r
+                       Color                   fc              = ElementUtils.getFillColor(e);\r
+                       Color                   bc              = ElementUtils.getBorderColor(e);\r
+                       if (bc==null) return;\r
+                       PressStatus     press   = null;//ElementUtils.getPressStatus(e, ctx); // FIXME: scenegraph does not support context\r
+                       Image ps                = null;\r
+                       \r
+                       if (press==null) {\r
+                               ps = new PumpSymbol(fc, bc);\r
+                       } else {\r
+                               ps = OperationSymbols.PUMP_SHADOW;\r
+// ?????????                           \r
+//                             if (press==PressStatus.NORMAL)\r
+//                                     gc.getGraphics2D().translate(-2, -3);\r
+                       }\r
+                       \r
+                       ps.init(node);\r
+               }\r
+       }       \r
+       \r
+       \r
+       public static class ShutoffValvePaint implements SceneGraph {\r
+\r
+               private static final long serialVersionUID = 6258753947743405959L;\r
+               public static final ShutoffValvePaint INSTANCE = new ShutoffValvePaint();               \r
+           public static final Key SG_NODE = new SceneGraphNodeKey(Node.class, "SUB_SG_NODE");\r
+\r
+               @Override\r
+               public void cleanup(IElement e) {\r
+              Node node = e.removeHint(SG_NODE);\r
+              if (node != null)\r
+                  node.remove();\r
+               }\r
+\r
+               @Override\r
+               public void init(IElement e, G2DParentNode parent) {\r
+              G2DParentNode node = (G2DParentNode) e.getHint(SG_NODE);\r
+              if (node == null) {\r
+                  node = parent.addNode(G2DParentNode.class);\r
+                  e.setHint(SG_NODE, node);\r
+              }\r
+                       AffineTransform at      = ElementUtils.getTransform(e);\r
+                       if(at != null) node.setTransform(at);\r
+\r
+                       Color                   fc              = ElementUtils.getFillColor(e);\r
+                       Color                   bc              = ElementUtils.getBorderColor(e);\r
+                       if (bc==null) return;\r
+                       PressStatus     press   = null;//ElementUtils.getPressStatus(e, ctx); // FIXME: scenegraph does not support context\r
+                       Image ps                = null;\r
+                       \r
+                       if (press==null) {\r
+                               ps = new ShutoffValveSymbol(fc, bc);\r
+                       } else {\r
+                               ps = OperationSymbols.SHUTOFFVALVE_SHADOW;\r
+// ?????????                           \r
+//                             if (press==PressStatus.NORMAL)\r
+//                                     gc.getGraphics2D().translate(-2, -3);\r
+                       }\r
+                       \r
+                       ps.init(node);\r
+               }\r
+       }       \r
+       \r
+       \r
+       \r
+       public static class SwitchPaint implements SceneGraph {\r
+\r
+               private static final long serialVersionUID = -171980746141963729L;\r
+               public static final SwitchPaint INSTANCE = new SwitchPaint();\r
+           public static final Key SG_NODE = new SceneGraphNodeKey(Node.class, "SUB_SG_NODE");\r
+\r
+               @Override\r
+               public void cleanup(IElement e) {\r
+              Node node = e.removeHint(SG_NODE);\r
+              if (node != null)\r
+                  node.remove();\r
+               }\r
+\r
+               @Override\r
+               public void init(IElement e, G2DParentNode parent) {\r
+                       G2DParentNode node = (G2DParentNode) e.getHint(SG_NODE);\r
+                       if (node == null) {\r
+                               node = parent.addNode(G2DParentNode.class);\r
+                               e.setHint(SG_NODE, node);\r
+                       }\r
+                       AffineTransform at      = ElementUtils.getTransform(e);\r
+                       if(at != null) node.setTransform(at);\r
+\r
+                       Color                   bc              = ElementUtils.getBorderColor(e);\r
+                       if (bc==null) return;\r
+                       PressStatus     press   = null;//ElementUtils.getPressStatus(e, ctx); // FIXME: scenegraph does not support context\r
+                       Image ps                = null;\r
+                       \r
+                       if (press==null) {\r
+                               ps = new SwitchSymbol(bc);\r
+                       } else {\r
+                               ps = OperationSymbols.SWITCH_SHADOW;\r
+// ?????????                           \r
+//                             if (press==PressStatus.NORMAL)\r
+//                                     gc.getGraphics2D().translate(-2, -3);\r
+                       }\r
+                       ps.init(node);\r
+               }\r
+       }               \r
+\r
+       \r
+       public static class TurbinePaint implements SceneGraph {\r
+\r
+               private static final long serialVersionUID = -920598007509848402L;\r
+               public static final TurbinePaint INSTANCE = new TurbinePaint();         \r
+           public static final Key SG_NODE = new SceneGraphNodeKey(Node.class, "SUB_SG_NODE");\r
+\r
+               @Override\r
+               public void cleanup(IElement e) {\r
+              Node node = e.removeHint(SG_NODE);\r
+              if (node != null)\r
+                  node.remove();\r
+               }\r
+\r
+               @Override\r
+               public void init(IElement e, G2DParentNode parent) {\r
+                       G2DParentNode node = (G2DParentNode) e.getHint(SG_NODE);\r
+                       if (node == null) {\r
+                               node = parent.addNode(G2DParentNode.class);\r
+                               e.setHint(SG_NODE, node);\r
+                       }\r
+                       \r
+                       AffineTransform at      = ElementUtils.getTransform(e);\r
+                       if(at != null) node.setTransform(at);\r
+\r
+                       Color                   fc              = ElementUtils.getFillColor(e);\r
+                       Color                   bc              = ElementUtils.getBorderColor(e);\r
+                       if (bc==null) return;\r
+                       PressStatus     press   = null;//ElementUtils.getPressStatus(e, ctx); // FIXME: scenegraph does not support context\r
+                       Image ps                = null;\r
+                       \r
+                       if (press==null) {\r
+                               ps = new TurbineSymbol(bc, fc);\r
+                       } else {\r
+                               ps = OperationSymbols.TURBINE_SHADOW;\r
+// ?????????                           \r
+//                             if (press==PressStatus.NORMAL)\r
+//                                     gc.getGraphics2D().translate(-2, -3);\r
+                       }\r
+                       ps.init(node);\r
+               }\r
+       }               \r
+\r
+       public static class CompressorPaint implements SceneGraph {\r
+\r
+               private static final long serialVersionUID = 6961201125549409431L;\r
+               public static final CompressorPaint INSTANCE = new CompressorPaint();           \r
+           public static final Key SG_NODE = new SceneGraphNodeKey(Node.class, "SUB_SG_NODE");\r
+\r
+               @Override\r
+               public void cleanup(IElement e) {\r
+              Node node = e.removeHint(SG_NODE);\r
+              if (node != null)\r
+                  node.remove();\r
+               }\r
+\r
+               @Override\r
+               public void init(IElement e, G2DParentNode parent) {\r
+                       G2DParentNode node = (G2DParentNode) e.getHint(SG_NODE);\r
+                       if (node == null) {\r
+                               node = parent.addNode(G2DParentNode.class);\r
+                               e.setHint(SG_NODE, node);\r
+                       }\r
+                       \r
+                       AffineTransform at      = ElementUtils.getTransform(e);\r
+                       if(at != null) node.setTransform(at);\r
+\r
+                       Color                   fc              = ElementUtils.getFillColor(e);\r
+                       Color                   bc              = ElementUtils.getBorderColor(e);\r
+                       if (bc==null) return;\r
+                       PressStatus     press   = null;//ElementUtils.getPressStatus(e, ctx); // FIXME: scenegraph does not support context\r
+                       Image ps                = null;\r
+                       \r
+                       if (press==null) {\r
+                               ps = new CompressorSymbol(bc, fc);\r
+                       } else {\r
+                               ps = OperationSymbols.COMPRESSOR_SHADOW;\r
+// ?????????                           \r
+//                             if (press==PressStatus.NORMAL)\r
+//                                     gc.getGraphics2D().translate(-2, -3);\r
+                       }\r
+                       ps.init(node);\r
+               }\r
+       }       \r
+       \r
+       public static class VoltageTransformerPaint implements SceneGraph {\r
+\r
+               private static final long serialVersionUID = -4935588203299292629L;\r
+               public static final VoltageTransformerPaint INSTANCE = new VoltageTransformerPaint();           \r
+           public static final Key SG_NODE = new SceneGraphNodeKey(Node.class, "SUB_SG_NODE");\r
+\r
+               @Override\r
+               public void cleanup(IElement e) {\r
+              Node node = e.removeHint(SG_NODE);\r
+              if (node != null)\r
+                  node.remove();\r
+               }\r
+\r
+               @Override\r
+               public void init(IElement e, G2DParentNode parent) {\r
+                       G2DParentNode node = (G2DParentNode) e.getHint(SG_NODE);\r
+                       if (node == null) {\r
+                               node = parent.addNode(G2DParentNode.class);\r
+                               e.setHint(SG_NODE, node);\r
+                       }\r
+                       AffineTransform at      = ElementUtils.getTransform(e);\r
+                       if(at != null) node.setTransform(at);\r
+\r
+                       Color           color1          = ElementUtils.getBorderColor(e);\r
+                       Color           color2          = ElementUtils.getAdditionalColor(e);\r
+                       if (color1==null || color2==null) return;\r
+                       PressStatus     press   = null;//ElementUtils.getPressStatus(e, ctx); // FIXME: scenegraph does not support context\r
+                       Image ps                = null;\r
+                       \r
+                       if (press==null) {\r
+                               ps = new VoltageTransformerSymbol(color1, color2);\r
+                       } else {\r
+                               ps = OperationSymbols.VOLTAGETRANSFORMER_SHADOW;\r
+// ?????????                           \r
+//                             if (press==PressStatus.NORMAL)\r
+//                                     gc.getGraphics2D().translate(-2, -3);\r
+                       }\r
+                       ps.init(node);\r
+               }\r
+       }               \r
+       \r
+       public static class ChimneyPaint implements SceneGraph {\r
+\r
+               private static final long serialVersionUID = 1001249555587430505L;\r
+               public static final ChimneyPaint INSTANCE = new ChimneyPaint();         \r
+           public static final Key SG_NODE = new SceneGraphNodeKey(Node.class, "SUB_SG_NODE");\r
+\r
+               @Override\r
+               public void cleanup(IElement e) {\r
+              Node node = e.removeHint(SG_NODE);\r
+              if (node != null)\r
+                  node.remove();\r
+               }\r
+\r
+               @Override\r
+               public void init(IElement e, G2DParentNode parent) {\r
+                       G2DParentNode node = (G2DParentNode) e.getHint(SG_NODE);\r
+                       if (node == null) {\r
+                               node = parent.addNode(G2DParentNode.class);\r
+                               e.setHint(SG_NODE, node);\r
+                       }\r
+                       AffineTransform at      = ElementUtils.getTransform(e);\r
+                       if(at != null) node.setTransform(at);\r
+\r
+                       Color                   fc              = ElementUtils.getFillColor(e);\r
+                       Color                   bc              = ElementUtils.getBorderColor(e);\r
+                       if (bc==null) return;\r
+                       PressStatus     press   = null;//ElementUtils.getPressStatus(e, ctx); // FIXME: scenegraph does not support context\r
+                       Image ps                = null;\r
+                       \r
+                       if (press==null) {\r
+                               ps = new ChimneySymbol(fc, bc);\r
+                       } else {\r
+                               ps = OperationSymbols.CHIMNEY_SHADOW;\r
+// ?????????                           \r
+//                             if (press==PressStatus.NORMAL)\r
+//                                     gc.getGraphics2D().translate(-2, -3);\r
+                       }\r
+                       ps.init(node);\r
+               }\r
+       }               \r
+       \r
+       public static class GeneratorPaint implements SceneGraph {\r
+\r
+               private static final long serialVersionUID = -1080419588160841727L;\r
+               public static final GeneratorPaint INSTANCE = new GeneratorPaint();             \r
+           public static final Key SG_NODE = new SceneGraphNodeKey(Node.class, "SUB_SG_NODE");\r
+\r
+               @Override\r
+               public void cleanup(IElement e) {\r
+              Node node = e.removeHint(SG_NODE);\r
+              if (node != null)\r
+                  node.remove();\r
+               }\r
+\r
+               @Override\r
+               public void init(IElement e, G2DParentNode parent) {\r
+                       G2DParentNode node = (G2DParentNode) e.getHint(SG_NODE);\r
+                       if (node == null) {\r
+                               node = parent.addNode(G2DParentNode.class);\r
+                               e.setHint(SG_NODE, node);\r
+                       }\r
+                       AffineTransform at      = ElementUtils.getTransform(e);\r
+                       if(at != null) node.setTransform(at);\r
+\r
+                       Color                   fc              = ElementUtils.getFillColor(e);\r
+                       Color                   bc              = ElementUtils.getBorderColor(e);\r
+                       PressStatus     press   = null;//ElementUtils.getPressStatus(e, ctx); // FIXME: scenegraph does not support context\r
+                       Image ps                = null;\r
+                       \r
+                       if (press==null) {\r
+                               ps = new GeneratorSymbol(fc, bc);\r
+                       } else {\r
+                               ps = OperationSymbols.GENERATOR_SHADOW;\r
+// ?????????                           \r
+//                             if (press==PressStatus.NORMAL)\r
+//                                     gc.getGraphics2D().translate(-2, -3);\r
+                       }\r
+                       ps.init(node);\r
+               }\r
+       }               \r
+       \r
+       public static class TankPaint implements SceneGraph {\r
+\r
+               private static final long serialVersionUID = -461979630655554477L;\r
+               public static final TankPaint INSTANCE = new TankPaint();               \r
+           public static final Key SG_NODE = new SceneGraphNodeKey(Node.class, "SUB_SG_NODE");\r
+\r
+               @Override\r
+               public void cleanup(IElement e) {\r
+              Node node = e.removeHint(SG_NODE);\r
+              if (node != null)\r
+                  node.remove();\r
+               }\r
+\r
+               @Override\r
+               public void init(IElement e, G2DParentNode parent) {\r
+                       G2DParentNode node = (G2DParentNode) e.getHint(SG_NODE);\r
+                       if (node == null) {\r
+                               node = parent.addNode(G2DParentNode.class);\r
+                               e.setHint(SG_NODE, node);\r
+                       }\r
+                       AffineTransform at      = ElementUtils.getTransform(e);\r
+                       if(at != null) node.setTransform(at);\r
+\r
+                       Color                   fc              = ElementUtils.getFillColor(e);\r
+                       Color                   bc              = ElementUtils.getBorderColor(e);\r
+                       Rectangle2D             bounds  = ElementUtils.getElementBounds(e);\r
+                       PressStatus     press   = null;//ElementUtils.getPressStatus(e, ctx); // FIXME: scenegraph does not support context\r
+                       Image ps                = null;\r
+                       \r
+                       if (press==null) {\r
+                               ps = new TankSymbol(bounds, 5.0, bc, fc);\r
+                       } else {\r
+                               ps = OperationSymbols.TANK_SHADOW;\r
+// ?????????                           \r
+//                             if (press==PressStatus.NORMAL)\r
+//                                     gc.getGraphics2D().translate(-2, -3);\r
+                       }\r
+                       ps.init(node);\r
+               }\r
+       }\r
+       \r
+       public static class Tank2Paint implements SceneGraph {\r
+\r
+               private static final long serialVersionUID = 5232349098800595743L;\r
+               public static final Tank2Paint INSTANCE = new Tank2Paint();\r
+           public static final Key SG_NODE = new SceneGraphNodeKey(Node.class, "SUB_SG_NODE");\r
+\r
+               @Override\r
+               public void cleanup(IElement e) {\r
+              Node node = e.removeHint(SG_NODE);\r
+              if (node != null)\r
+                  node.remove();\r
+               }\r
+\r
+               @Override\r
+               public void init(IElement e, G2DParentNode parent) {\r
+                       G2DParentNode node = (G2DParentNode) e.getHint(SG_NODE);\r
+                       if (node == null) {\r
+                               node = parent.addNode(G2DParentNode.class);\r
+                               e.setHint(SG_NODE, node);\r
+                       }\r
+                       AffineTransform at      = ElementUtils.getTransform(e);\r
+                       if(at != null) node.setTransform(at);\r
+\r
+                       Color                   fc              = ElementUtils.getFillColor(e);\r
+                       Color                   bc              = ElementUtils.getBorderColor(e);\r
+                       Color                   ac              = ElementUtils.getAdditionalColor(e);\r
+                       Rectangle2D             bounds  = ElementUtils.getElementBounds(e);\r
+                       PressStatus     press   = null;//ElementUtils.getPressStatus(e, ctx); // FIXME: scenegraph does not support context\r
+                       Image ps                = null;\r
+                       \r
+                       if (press==null) {\r
+                               ps = new Tank2Symbol(bounds, 5.0, bc, fc, ac);\r
+                       } else {\r
+                               ps = OperationSymbols.TANK2_SHADOW;\r
+// ?????????                           \r
+//                             if (press==PressStatus.NORMAL)\r
+//                                     gc.getGraphics2D().translate(-2, -3);\r
+                       }\r
+                       ps.init(node);\r
+               }\r
+       }       \r
+       \r
+}
\ No newline at end of file