]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/elements/Line.java
Sync git svn branch with SVN repository r33269.
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / elements / Line.java
1 /*******************************************************************************\r
2  * Copyright (c) 2012 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     Semantum Oy - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.diagram.elements;\r
13 \r
14 import java.awt.Graphics2D;\r
15 import java.awt.Shape;\r
16 import java.awt.font.TextLayout;\r
17 import java.awt.geom.Rectangle2D;\r
18 \r
19 /**\r
20  * Auxiliary class for drawing positioned and single lines of laid out text.\r
21  * \r
22  * @author Tuukka Lehtonen\r
23  * \r
24  * @see TextNode\r
25  * @see TextLayout\r
26  */\r
27 class Line {\r
28 \r
29     public interface BoundsProcedure {\r
30         Rectangle2D getBounds(Line line);\r
31     }\r
32 \r
33     public static BoundsProcedure BBOX = new BoundsProcedure() {\r
34         @Override\r
35         public Rectangle2D getBounds(Line line) {\r
36             return line.bbox;\r
37         }\r
38     };\r
39 \r
40     public static BoundsProcedure ABBOX = new BoundsProcedure() {\r
41         @Override\r
42         public Rectangle2D getBounds(Line line) {\r
43             return line.abbox;\r
44         }\r
45     };\r
46 \r
47     public final String document;\r
48     public final int startOffset;\r
49     public final int endOffset;\r
50 \r
51     float drawPosX;\r
52     float drawPosY;\r
53     float alignedPosX;\r
54     float alignedPosY;\r
55     TextLayout layout;\r
56     Rectangle2D bbox;\r
57     Rectangle2D abbox;\r
58 \r
59     public Line(String document, int startOffset, int endOffset) {\r
60         int len = document.length();\r
61         if (endOffset < startOffset)\r
62             throw new IllegalArgumentException("endOffset (" + endOffset + ") < startOffset (" + startOffset + ")");\r
63         if (startOffset < 0 || startOffset > len)\r
64             throw new IllegalArgumentException("startOffset " + startOffset + " out of bounds [0," + len + "]");\r
65         if (endOffset < 0 || endOffset > len)\r
66             throw new IllegalArgumentException("endOffset " + endOffset + " out of bounds [0," + len + "]");\r
67         this.document = document;\r
68         this.startOffset = startOffset;\r
69         this.endOffset = endOffset;\r
70     }\r
71 \r
72     public void render(Graphics2D g) {\r
73         if (layout != null)\r
74             layout.draw(g, alignedPosX, alignedPosY);\r
75     }\r
76 \r
77     public String getText() {\r
78         return document.substring(startOffset, endOffset);\r
79     }\r
80 \r
81     public boolean intersectsRange(int start, int end) {\r
82         return start < endOffset && end > startOffset;\r
83     }\r
84 \r
85     public boolean containsRange(int start, int end) {\r
86         return start >= startOffset && start <= endOffset\r
87                 && end > startOffset && end <= endOffset;\r
88     }\r
89 \r
90     public boolean containsOffset(int caret) {\r
91         return startOffset <= caret && caret <= endOffset;\r
92     }\r
93 \r
94     public Shape getLogicalHighlightShape(int start, int end) {\r
95         return layout.getLogicalHighlightShape(\r
96                 Math.max(0, start - startOffset),\r
97                 Math.min(endOffset - startOffset, end - startOffset));\r
98     }\r
99 \r
100     public Shape[] getCaretShapes(int caret) {\r
101         return layout.getCaretShapes(caret - startOffset);\r
102     }\r
103 \r
104     public void translate(Graphics2D g, float xOffset, float yOffset) {\r
105         g.translate(alignedPosX + xOffset, alignedPosY + yOffset);\r
106     }\r
107 \r
108     public void translateInv(Graphics2D g, float xOffset, float yOffset) {\r
109         g.translate(-alignedPosX - xOffset, - alignedPosY - yOffset);\r
110     }\r
111 \r
112     public void alignOffset(double x, double y) {\r
113         alignedPosX = drawPosX + (float) x;\r
114         alignedPosY = drawPosY + (float) y;\r
115         if (abbox == null)\r
116             abbox = new Rectangle2D.Float();\r
117         abbox.setFrame(bbox.getX() + x, bbox.getY() + y, bbox.getWidth(), bbox.getHeight());\r
118         //System.out.println("offset(" + x + ", " + y + "): " + this);\r
119     }\r
120 \r
121     @Override\r
122     public String toString() {\r
123         return getClass().getSimpleName() + "[startOffset="\r
124                 + startOffset + ", endOffset=" + endOffset\r
125                 + ", x=" + drawPosX + ", y=" + drawPosY\r
126                 + ", ax='" + alignedPosX + ", ay=" + alignedPosY\r
127                 + ", text='" + getText()\r
128                 + ", bbox='" + bbox + ", abbox=" + abbox\r
129                 + "']";\r
130     }\r
131 \r
132 }