]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.g2d/src/org/simantics/g2d/participant/RulerPainter.java
JsonNode support with Data/Json
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / participant / RulerPainter.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 /*
13  *
14  * @author Toni Kalajainen
15  */
16 package org.simantics.g2d.participant;
17
18 import java.awt.AlphaComposite;
19 import java.awt.Color;
20 import java.awt.Composite;
21
22 import org.simantics.g2d.canvas.Hints;
23 import org.simantics.g2d.canvas.ICanvasContext;
24 import org.simantics.g2d.canvas.impl.AbstractCanvasParticipant;
25 import org.simantics.g2d.canvas.impl.SGNodeReflection.SGCleanup;
26 import org.simantics.g2d.canvas.impl.SGNodeReflection.SGInit;
27 import org.simantics.scenegraph.g2d.G2DParentNode;
28 import org.simantics.scenegraph.g2d.events.EventHandlerReflection.EventHandler;
29 import org.simantics.scenegraph.g2d.events.command.CommandEvent;
30 import org.simantics.scenegraph.g2d.events.command.Commands;
31 import org.simantics.scenegraph.g2d.nodes.RulerNode;
32 import org.simantics.utils.datastructures.hints.HintListenerAdapter;
33 import org.simantics.utils.datastructures.hints.IHintListener;
34 import org.simantics.utils.datastructures.hints.IHintObservable;
35 import org.simantics.utils.datastructures.hints.IHintContext.Key;
36 import org.simantics.utils.datastructures.hints.IHintContext.KeyOf;
37 import org.simantics.utils.page.MarginUtils;
38 import org.simantics.utils.page.MarginUtils.Margin;
39 import org.simantics.utils.page.MarginUtils.Margins;
40
41
42 public class RulerPainter extends AbstractCanvasParticipant {
43
44     public static final int PAINT_PRIORITY = Integer.MAX_VALUE - 1000;
45
46     public static final double RULER_WIDTH = 20.0;
47
48     /** Ruler width + 5% */
49     public static final Margin RULER_MARGIN5 = MarginUtils.marginOf(5, RulerPainter.RULER_WIDTH, 0);
50     /** Ruler width + 2% */
51     public static final Margin RULER_MARGIN2 = MarginUtils.marginOf(2, RulerPainter.RULER_WIDTH, 0);
52     /** 5% margin + ruler */
53     public static final Margins RULER_MARINGS5 = new Margins(RULER_MARGIN5, MarginUtils.MARGIN5, RULER_MARGIN5, MarginUtils.MARGIN5);
54     /** 2% margin + ruler */
55     public static final Margins RULER_MARINGS2 = new Margins(RULER_MARGIN2, MarginUtils.MARGIN2, RULER_MARGIN2, MarginUtils.MARGIN2);
56
57     public static final Key KEY_RULER_ENABLED = new KeyOf(Boolean.class, "RULER_ENABLED");
58
59     /** Background color */
60     public static final Key KEY_RULER_BACKGROUND_COLOR = new KeyOf(Color.class, "RULER_BACKGROUND_COLOR");
61
62     public static final Key KEY_RULER_TEXT_COLOR = new KeyOf(Color.class, "RULER_TEXT_COLOR");
63
64     public static Color DEFAULT_RULER_BACKGROUND_COLOR = new Color(192, 192, 192, 192);
65
66     public static Color DEFAULT_RULER_TEXT_COLOR = Color.BLACK;
67
68     IHintListener hintListener = new HintListenerAdapter() {
69         public void hintChanged(IHintObservable sender, Key key, Object oldValue, Object newValue) {
70             ICanvasContext cc = getContext();
71             if (cc != null) {
72                 updateNode();
73                 cc.getContentContext().setDirty();
74             }
75         }
76     };
77
78     @Override
79     public void addedToContext(ICanvasContext ctx) {
80         super.addedToContext(ctx);
81         getHintStack().addKeyHintListener(getThread(), KEY_RULER_ENABLED, hintListener);
82         getHintStack().addKeyHintListener(getThread(), KEY_RULER_BACKGROUND_COLOR, hintListener);
83         getHintStack().addKeyHintListener(getThread(), KEY_RULER_TEXT_COLOR, hintListener);
84         getHintStack().addKeyHintListener(getThread(), GridPainter.KEY_GRID_SIZE, hintListener);
85         getHintStack().addKeyHintListener(getThread(), Hints.KEY_DISABLE_PAINTING, hintListener);
86     }
87
88     @Override
89     public void removedFromContext(ICanvasContext ctx) {
90         getHintStack().removeKeyHintListener(getThread(), KEY_RULER_ENABLED, hintListener);
91         getHintStack().removeKeyHintListener(getThread(), KEY_RULER_BACKGROUND_COLOR, hintListener);
92         getHintStack().removeKeyHintListener(getThread(), KEY_RULER_TEXT_COLOR, hintListener);
93         getHintStack().removeKeyHintListener(getThread(), GridPainter.KEY_GRID_SIZE, hintListener);
94         getHintStack().removeKeyHintListener(getThread(), Hints.KEY_DISABLE_PAINTING, hintListener);
95         super.removedFromContext(ctx);
96     }
97
98     @SuppressWarnings("unused")
99     private final Composite transparency = AlphaComposite.SrcOver.derive(0.75f);
100
101     protected RulerNode node = null;
102
103     @SGInit
104     public void initSG(G2DParentNode parent) {
105         node = parent.addNode("ruler", RulerNode.class);
106         node.setZIndex(PAINT_PRIORITY);
107         updateNode();
108     }
109
110     @SGCleanup
111     public void cleanupSG() {
112         node.remove();
113     }
114
115     void updateNode() {
116         node.setEnabled(isPaintingEnabled());
117         node.setGridSize(getGridSize());
118     }
119
120     private double getGridSize() {
121         Double d = getHint(GridPainter.KEY_GRID_SIZE);
122         return d != null ? d : 1.0;
123     }
124
125     boolean isPaintingEnabled()
126     {
127         boolean enabled = isEnabled();
128         Boolean globalDisable = getHint(Hints.KEY_DISABLE_PAINTING);
129         return enabled && !Boolean.TRUE.equals(globalDisable);
130     }
131
132     public boolean isEnabled()
133     {
134         Boolean b = getHint(KEY_RULER_ENABLED);
135         return !Boolean.FALSE.equals(b);
136     }
137
138     public Color getRulerTextColor()
139     {
140         Color c = getHint(KEY_RULER_TEXT_COLOR);
141         if (c!=null) return c;
142         return DEFAULT_RULER_TEXT_COLOR;
143     }
144
145     public Color getRulerBackgroundColor()
146     {
147         Color c = getHint(KEY_RULER_BACKGROUND_COLOR);
148         if (c!=null) return c;
149         return DEFAULT_RULER_BACKGROUND_COLOR;
150     }
151
152     public void setEnabled(boolean enabled)
153     {
154         node.setEnabled(enabled);
155         setHint(KEY_RULER_ENABLED, enabled);
156     }
157
158     public void setRulerTextColor(Color c)
159     {
160         setHint(KEY_RULER_TEXT_COLOR, c);
161     }
162
163     public void setRulerBackgroundColor(Color c)
164     {
165         setHint(KEY_RULER_BACKGROUND_COLOR, c);
166     }
167
168     @EventHandler(priority = 0)
169     public boolean handleKeyEvent(CommandEvent e) {
170         if (e.command.equals( Commands.RULER_ENABLE)) {
171             setEnabled(true);
172             return true;
173         } else if (e.command.equals( Commands.RULER_DISABLE)) {
174             setEnabled(false);
175             return true;
176         } else if (e.command.equals( Commands.RULER_TOGGLE)) {
177             setEnabled(!isEnabled());
178             return true;
179         }
180         return false;
181     }
182
183 }