]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.g2d/src/org/simantics/g2d/participant/RulerPainter.java
Combination of Simantics-platform related changes and fixes for district
[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", getNodeClass());
106         node.setZIndex(PAINT_PRIORITY);
107         updateNode();
108     }
109
110     protected Class<? extends RulerNode> getNodeClass() {
111         return RulerNode.class;
112     }
113
114     @SGCleanup
115     public void cleanupSG() {
116         node.remove();
117     }
118
119     protected void updateNode() {
120         node.setEnabled(isPaintingEnabled());
121         node.setGridSize(getGridSize());
122     }
123
124     private double getGridSize() {
125         Double d = getHint(GridPainter.KEY_GRID_SIZE);
126         return d != null ? d : 1.0;
127     }
128
129     boolean isPaintingEnabled()
130     {
131         boolean enabled = isEnabled();
132         Boolean globalDisable = getHint(Hints.KEY_DISABLE_PAINTING);
133         return enabled && !Boolean.TRUE.equals(globalDisable);
134     }
135
136     public boolean isEnabled()
137     {
138         Boolean b = getHint(KEY_RULER_ENABLED);
139         return !Boolean.FALSE.equals(b);
140     }
141
142     public Color getRulerTextColor()
143     {
144         Color c = getHint(KEY_RULER_TEXT_COLOR);
145         if (c!=null) return c;
146         return DEFAULT_RULER_TEXT_COLOR;
147     }
148
149     public Color getRulerBackgroundColor()
150     {
151         Color c = getHint(KEY_RULER_BACKGROUND_COLOR);
152         if (c!=null) return c;
153         return DEFAULT_RULER_BACKGROUND_COLOR;
154     }
155
156     public void setEnabled(boolean enabled)
157     {
158         node.setEnabled(enabled);
159         setHint(KEY_RULER_ENABLED, enabled);
160     }
161
162     public void setRulerTextColor(Color c)
163     {
164         setHint(KEY_RULER_TEXT_COLOR, c);
165     }
166
167     public void setRulerBackgroundColor(Color c)
168     {
169         setHint(KEY_RULER_BACKGROUND_COLOR, c);
170     }
171
172     @EventHandler(priority = 0)
173     public boolean handleKeyEvent(CommandEvent e) {
174         if (e.command.equals( Commands.RULER_ENABLE)) {
175             setEnabled(true);
176             return true;
177         } else if (e.command.equals( Commands.RULER_DISABLE)) {
178             setEnabled(false);
179             return true;
180         } else if (e.command.equals( Commands.RULER_TOGGLE)) {
181             setEnabled(!isEnabled());
182             return true;
183         }
184         return false;
185     }
186
187 }