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
10 * Semantum Oy - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.diagram.elements;
\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
20 * Auxiliary class for drawing positioned and single lines of laid out text.
\r
22 * @author Tuukka Lehtonen
\r
29 public interface BoundsProcedure {
\r
30 Rectangle2D getBounds(Line line);
\r
33 public static BoundsProcedure BBOX = new BoundsProcedure() {
\r
35 public Rectangle2D getBounds(Line line) {
\r
40 public static BoundsProcedure ABBOX = new BoundsProcedure() {
\r
42 public Rectangle2D getBounds(Line line) {
\r
47 public final String document;
\r
48 public final int startOffset;
\r
49 public final int endOffset;
\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
72 public void render(Graphics2D g) {
\r
74 layout.draw(g, alignedPosX, alignedPosY);
\r
77 public String getText() {
\r
78 return document.substring(startOffset, endOffset);
\r
81 public boolean intersectsRange(int start, int end) {
\r
82 return start < endOffset && end > startOffset;
\r
85 public boolean containsRange(int start, int end) {
\r
86 return start >= startOffset && start <= endOffset
\r
87 && end > startOffset && end <= endOffset;
\r
90 public boolean containsOffset(int caret) {
\r
91 return startOffset <= caret && caret <= endOffset;
\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
100 public Shape[] getCaretShapes(int caret) {
\r
101 return layout.getCaretShapes(caret - startOffset);
\r
104 public void translate(Graphics2D g, float xOffset, float yOffset) {
\r
105 g.translate(alignedPosX + xOffset, alignedPosY + yOffset);
\r
108 public void translateInv(Graphics2D g, float xOffset, float yOffset) {
\r
109 g.translate(-alignedPosX - xOffset, - alignedPosY - yOffset);
\r
112 public void alignOffset(double x, double y) {
\r
113 alignedPosX = drawPosX + (float) x;
\r
114 alignedPosY = drawPosY + (float) y;
\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
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