| ErdNameLabelPainter.java |
1 /****************************************************************************
2 * This demo file is part of yFiles for Java 2.14.
3 * Copyright (c) 2000-2017 by yWorks GmbH, Vor dem Kreuzberg 28,
4 * 72070 Tuebingen, Germany. All rights reserved.
5 *
6 * yFiles demo files exhibit yFiles for Java functionalities. Any redistribution
7 * of demo files in source code or binary form, with or without
8 * modification, is not permitted.
9 *
10 * Owners of a valid software license for a yFiles for Java version that this
11 * demo is shipped with are allowed to use the demo source code as basis
12 * for their own yFiles for Java powered applications. Use of such programs is
13 * governed by the rights and conditions as set out in the yFiles for Java
14 * license agreement.
15 *
16 * THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
19 * NO EVENT SHALL yWorks BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
21 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 *
27 ***************************************************************************/
28 package demo.view.entityrelationship.painters;
29
30 import y.geom.OrientedRectangle;
31 import y.view.AbstractCustomLabelPainter;
32 import y.view.NodeLabel;
33 import y.view.YLabel;
34
35 import java.awt.Color;
36 import java.awt.Graphics2D;
37 import java.awt.Paint;
38 import java.awt.Stroke;
39 import java.util.Map;
40
41 /**
42 * This painter draws the name label of a detailed entity of an entity relationship diagram (ERD).
43 *
44 * The painter does not draw an opaque background as the <code>ErdNodePainter</code> already paints all
45 * background colors.
46 *
47 * @see ErdNodePainter
48 */
49 public class ErdNameLabelPainter implements YLabel.Painter {
50 private final YLabel.Painter painter;
51 private final YLabel.Painter boxPainter;
52
53 /** Creates a new <code>ErdNameLabelPainter</code> */
54 public ErdNameLabelPainter() {
55 this(defaultPainter());
56 }
57
58 /**
59 * Creates a new <code>ErdNameLabelPainter</code> that uses the given label painter.
60 * @param painter the label painter
61 */
62 public ErdNameLabelPainter( final YLabel.Painter painter ) {
63 this.painter = painter;
64 this.boxPainter = new BoxPainter();
65 }
66
67 /**
68 * Paints the label.
69 * @param label the label context
70 * @param gfx the grapics object
71 */
72 public void paint( final YLabel label, final Graphics2D gfx ) {
73 if (painter != null) {
74 painter.paint(label, gfx);
75 }
76 }
77
78 /**
79 * Paints the label content to the specified location. In this case it is a string with contains the name of the entity.
80 * @param label the label context
81 * @param gfx the graphics object
82 * @param x the x-coordinate of the label
83 * @param y the y-coordinate of the label
84 * @param width the width of the label
85 * @param height the height of the label
86 */
87 public void paintContent(
88 final YLabel label,
89 final Graphics2D gfx,
90 final double x,
91 final double y,
92 final double width,
93 final double height
94 ) {
95 if (painter != null) {
96 painter.paintContent(label, gfx, x, y, width, height);
97 }
98 }
99
100 /**
101 * Paints the background of the label.
102 * @param label the label context
103 * @param gfx the graphics object
104 * @param x the x-coordinate of the label
105 * @param y the y-coordinate of the label
106 * @param width the width of the label
107 * @param height the height of the label
108 */
109 public void paintBox(
110 final YLabel label,
111 final Graphics2D gfx,
112 final double x,
113 final double y,
114 final double width,
115 final double height
116 ) {
117 // paint the box only if the *main* painter is not null
118 if (painter != null) {
119 // the <code>BoxPainter</code> will only draw a label background if
120 // the label is selected
121 boxPainter.paintBox(label, gfx, x, y, width, height);
122 }
123 }
124
125 /**
126 * Returns the text box of a given label
127 * @param label the label context
128 * @return a rectangle with the size and position of the text box
129 */
130 public OrientedRectangle getTextBox( final YLabel label ) {
131 if (painter != null) {
132 return painter.getTextBox(label);
133 } else {
134 return null;
135 }
136 }
137
138 /**
139 * Returns the icon box of a given label
140 * @param label the label context
141 * @return a rectangle with the size and position of the icon box
142 */
143 public OrientedRectangle getIconBox( final YLabel label ) {
144 if (painter != null) {
145 return painter.getIconBox(label);
146 } else {
147 return null;
148 }
149 }
150
151
152 /**
153 * Returns the default painter if it exists.
154 * @return the default painter or null if it does not exist
155 */
156 static YLabel.Painter defaultPainter() {
157 final YLabel.Factory factory = NodeLabel.getFactory();
158 final Map c = factory.createDefaultConfigurationMap();
159 final Object painter = c.get(YLabel.Painter.class);
160 if (painter instanceof YLabel.Painter) {
161 return (YLabel.Painter) painter;
162 } else {
163 return null;
164 }
165 }
166
167
168 /**
169 * This painter draws the label box only if the label is selected. No background color is drawn
170 * because the <code>ErdNodePainter</code> already draws all background colors.
171 * @see ErdNodePainter
172 */
173 private static final class BoxPainter extends AbstractCustomLabelPainter {
174
175 /**
176 * Paints a selection box, if the label is selected by the user.
177 * @param label the label to paint.
178 * @param graphics the graphics context to paint upon.
179 * @param x the x-coordinate of the upper left corner of the label's
180 * background rectangle.
181 * @param y the y-coordinate of the upper left corner of the label's
182 * background rectangle.
183 * @param width the width of the label's background rectangle.
184 * @param height the height of the label's background rectangle.
185 */
186 public void paintBox(
187 final YLabel label,
188 final Graphics2D graphics,
189 final double x,
190 final double y,
191 final double width,
192 final double height
193 ) {
194 final Color oldColor = graphics.getColor();
195 final Paint oldPaint = graphics.getPaint();
196 final Stroke oldStroke = graphics.getStroke();
197
198 paintSelectionBox(label, graphics, x, y, width, height);
199
200 graphics.setStroke(oldStroke);
201 graphics.setPaint(oldPaint);
202 graphics.setColor(oldColor);
203 }
204
205 /** Does nothing */
206 public void paintContent(
207 final YLabel label,
208 final Graphics2D gfx,
209 final double x,
210 final double y,
211 final double width,
212 final double height
213 ) {
214 }
215
216 /** Does nothing */
217 public OrientedRectangle getTextBox( final YLabel label ) {
218 return null;
219 }
220
221 /** Does nothing */
222 public OrientedRectangle getIconBox( final YLabel label ) {
223 return null;
224 }
225 }
226
227 }
228