source: josm/trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/placement/PositionForAreaStrategy.java

Last change on this file was 12476, checked in by michael2402, 17 months ago

Fix #15006: Separate offset handling for ways, areas and node. Handle offset for all three of them.

File size: 3.2 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.mappaint.styleelement.placement;
3
4import java.awt.font.GlyphVector;
5import java.awt.geom.Point2D;
6import java.awt.geom.Rectangle2D;
7import java.util.List;
8
9import org.openstreetmap.josm.gui.draw.MapViewPath;
10import org.openstreetmap.josm.gui.draw.MapViewPositionAndRotation;
11import org.openstreetmap.josm.gui.mappaint.Keyword;
12
13/**
14 * This strategy defines how to place a label or icon inside the area.
15 *
16 * @author Michael Zangl
17 * @since 11722
18 * @since 11748 moved to own file
19 */
20public interface PositionForAreaStrategy {
21    /**
22     * Finds the correct position of a label / icon inside the area.
23     * @param path The area to search in
24     * @param nb The bounding box of the thing we are searching a place for.
25     * @return The position as rectangle with the same dimension as nb. <code>null</code> if none was found.
26     */
27    MapViewPositionAndRotation findLabelPlacement(MapViewPath path, Rectangle2D nb);
28
29    /**
30     * Checks whether this placement strategy supports more detailed (rotation / ...) placement using a glyph vector.
31     * @return <code>true</code> if it is supported.
32     */
33    boolean supportsGlyphVector();
34
35    /**
36     * Generates the transformed glyph vectors for the given text.
37     * @param path The path to place the text along
38     * @param nb The bounds of the text
39     * @param gvs The glyph vectors for the text. May be modified
40     * @param isDoubleTranslationBug <code>true</code> to fix a glyph placement bug.
41     *
42     * @return The glyph vectors.
43     * @throws UnsupportedOperationException if {@link #supportsGlyphVector()} returns false
44     */
45    default List<GlyphVector> generateGlyphVectors(
46            MapViewPath path, Rectangle2D nb, List<GlyphVector> gvs, boolean isDoubleTranslationBug) {
47        throw new UnsupportedOperationException("Single glyph transformation is not supported by this implementation");
48    }
49
50    /**
51     * Gets a strategy for the given keyword.
52     * @param keyword The text position keyword.
53     * @return The strategy or line if none was specified.
54     * @since 11722
55     */
56    static PositionForAreaStrategy forKeyword(Keyword keyword) {
57        return forKeyword(keyword, OnLineStrategy.INSTANCE);
58    }
59
60    /**
61     * Gets a strategy for the given keyword.
62     * @param keyword The text position keyword.
63     * @param defaultStrategy The default if no strategy was recognized.
64     * @return The strategy or line if none was specified.
65     * @since 11722
66     */
67    static PositionForAreaStrategy forKeyword(Keyword keyword, PositionForAreaStrategy defaultStrategy) {
68        if (keyword == null) {
69            return defaultStrategy;
70        }
71        switch (keyword.val) {
72        case "center":
73            return PartiallyInsideAreaStrategy.INSTANCE;
74        case "inside":
75            return CompletelyInsideAreaStrategy.INSTANCE;
76        case "line":
77            return OnLineStrategy.INSTANCE;
78        default:
79            return defaultStrategy;
80        }
81    }
82
83    /**
84     * Create a new instance of the same strategy adding a offset
85     * @param addToOffset The offset to add
86     * @return The new strategy
87     * @since 12476
88     */
89    PositionForAreaStrategy withAddedOffset(Point2D addToOffset);
90}
Note: See TracBrowser for help on using the repository browser.