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.NodeLabel;
32  import y.view.YLabel;
33  
34  import java.awt.Graphics2D;
35  import java.awt.font.FontRenderContext;
36  import java.util.Map;
37  
38  /**
39   * This configuration paints ERD attribute labels for detailed entities.
40   *
41   * The label uses the whole space of the lower compartment. So the size is retrieved from
42   * the oriented box instead of the content box. Also the the contains test is using this size.
43   */
44  public class ErdAttributesLabelConfiguration implements YLabel.Layout, YLabel.Painter {
45    private final YLabel.Layout layout;
46    private final YLabel.Painter painter;
47  
48    public ErdAttributesLabelConfiguration() {
49      this(defaultLayout(), ErdNameLabelPainter.defaultPainter());
50    }
51  
52    /**
53     * Creates a new <code>ErdAttributesLabelConfiguration</code>.
54     * @param layout the layout of the label
55     * @param painter the painter of the label
56     */
57    public ErdAttributesLabelConfiguration(
58            final YLabel.Layout layout,
59            final YLabel.Painter painter
60    ) {
61      this.layout = layout;
62      this.painter = painter;
63    }
64  
65    /**
66     * Paints the ERD attributes label.
67     * @param label the label context
68     * @param gfx the graphics object
69     */
70    public void paint( final YLabel label, final Graphics2D gfx ) {
71      if (painter != null) {
72        final OrientedRectangle cb = label.getContentBox();
73        if (cb.getUpY() == -1) {
74          // Use the oriented box size to paint the box,
75          // so the label is as wide as the node
76          final OrientedRectangle ob = label.getOrientedBox();
77          final double h = ob.getHeight();
78          final double x = ob.getAnchorX();
79          final double y = ob.getAnchorY() - h;
80          paintBox(label, gfx, x, y, ob.getWidth(), h);
81          paintContent(label, gfx, x, y, cb.getWidth(), cb.getHeight());
82        } else {
83          painter.paint(label, gfx);
84        }
85      }
86    }
87  
88    /**
89     * Draws the content of the attributes label. In this case it is a string containing the attributes.
90     * @param label the label context
91     * @param gfx the graphics object
92     * @param x the x-coordinate of the label
93     * @param y the y-coordinate of the label
94     * @param width the width of the label
95     * @param height the height of the label
96     */
97    public void paintContent(
98            final YLabel label,
99            final Graphics2D gfx,
100           final double x,
101           final double y,
102           final double width,
103           final double height
104   ) {
105     if (painter != null) {
106       painter.paintContent(label, gfx, x, y, width, height);
107     }
108   }
109 
110   /**
111    * Paints the background of the attributes label.
112    * @param label the label context
113    * @param gfx the graphics object
114    * @param x the x-coordinate of the label
115    * @param y the y-coordinate of the label
116    * @param width the width of the label
117    * @param height the height of the label
118    */
119   public void paintBox(
120           final YLabel label,
121           final Graphics2D gfx,
122           final double x,
123           final double y,
124           final double width,
125           final double height
126   ) {
127     if (painter != null) {
128       painter.paintBox(label, gfx, x, y, width, height);
129     }
130   }
131 
132   /**
133    * Returns the text box of the current painter.
134    * @param label the label context
135    * @return a rectangle with the size and position of the text box
136    */
137   public OrientedRectangle getTextBox( final YLabel label ) {
138     if (painter != null) {
139       return painter.getTextBox(label);
140     } else {
141       return null;
142     }
143   }
144 
145   /**
146    * Returns the icon box of the current painter.
147    * @param label the label context
148    * @return a rectangle with the size and position of the icon box
149    */
150   public OrientedRectangle getIconBox( final YLabel label ) {
151     if (painter != null) {
152       return painter.getIconBox(label);
153     } else {
154       return null;
155     }
156   }
157 
158   /**
159    * Calculates the size of the label content.
160    * @param label the label context
161    * @param frc the font render context.
162    */
163   public void calculateContentSize(
164           final YLabel label,
165           final FontRenderContext frc
166   ) {
167     if (layout != null) {
168       layout.calculateContentSize(label, frc);
169     }
170   }
171 
172   /**
173    * Determines if the coordinates <code>(x,y)</code> lie within the label box.
174    * @param label the label context.
175    * @param x x-coordinate
176    * @param y y-coordinate
177    * @return <code>true</code> if the label box contains the coordinates (x,y), <code>false</code> otherwise
178    */
179   public boolean contains(
180           final YLabel label,
181           final double x,
182           final double y
183   ) {
184     // Use the oriented box instead of the content box, so one can
185     // click on the whole compartment to select the label
186     return label.getOrientedBox().contains(x, y, true);
187   }
188 
189 
190   /**
191    * Retrieves a suitable default layout for this configuration.
192    * @return the default layout or <code>null</code> if no default layout is set
193    */
194   static YLabel.Layout defaultLayout() {
195     final YLabel.Factory factory = NodeLabel.getFactory();
196     final Map c = factory.createDefaultConfigurationMap();
197     final Object layout = c.get(YLabel.Layout.class);
198     if (layout instanceof YLabel.Layout) {
199       return (YLabel.Layout) layout;
200     } else {
201       return null;
202     }
203   }
204 }
205 
206