2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.taxeditor
.editor
;
12 import org
.eclipse
.jface
.text
.source
.Annotation
;
13 import org
.eclipse
.jface
.text
.source
.AnnotationPainter
.SquigglesStrategy
;
14 import org
.eclipse
.swt
.SWT
;
15 import org
.eclipse
.swt
.custom
.StyledText
;
16 import org
.eclipse
.swt
.graphics
.Color
;
17 import org
.eclipse
.swt
.graphics
.GC
;
18 import org
.eclipse
.swt
.graphics
.Point
;
21 * Adds ability to draw multiline squiggles when a <code>StyledText</code>
22 * contains line-wrapping.
28 public class LineWrapSquigglesStrategy
extends SquigglesStrategy
{
30 public static final String ID
= "linewrap_squigglesstrategy";
36 private int lineHeight
;
40 private StyledText textWidget
;
45 * @see org.eclipse.jface.text.source.AnnotationPainter$SquigglesStrategy#draw(org.eclipse.jface.text.source.Annotation, org.eclipse.swt.graphics.GC, org.eclipse.swt.custom.StyledText, int, int, org.eclipse.swt.graphics.Color)
47 public void draw(Annotation annotation
, GC gc
, StyledText textWidget
, int offset
, int length
, Color color
) {
51 this.textWidget
= textWidget
;
59 baseline
= textWidget
.getBaseline(offset
);
60 lineHeight
= textWidget
.getLineHeight(offset
);
63 int offsetNewline
= offset
;
64 int end
= offset
+ length
;
66 // Go through the length one character at a time
67 for (int i
= offset
; i
<= end
; i
++) {
69 // If the y of the current offset is different from that of the last offset,
70 // we are on a new line
71 if (right
!= null && textWidget
.getLocationAtOffset(i
).y
> right
.y
) {
73 // Draw a line of squigglies
74 drawPolyline(offsetNewline
, right
);
76 // Save offset of line break
80 // Get x,y position in case the next char is on a new line
81 right
= textWidget
.getLocationAtOffset(i
);
85 // Draw the last line of squigglies
86 drawPolyline(offsetNewline
, right
);
89 textWidget
.redrawRange(offset
, length
, true);
94 * Draws a squiggly line from the offset <code>offsetNewline</code> to
95 * the x,y coordinates at <code>right</code>.
97 * @param offsetNewline
100 private void drawPolyline(int offsetNewline
, Point right
) {
102 // Get offset at last line break
103 Point left
= textWidget
.getLocationAtOffset(offsetNewline
);
105 // Prevent solitary red dot from appearing at EOL
106 if (left
.equals(right
)) {
110 // Only start drawing from 0 if not on the first line
111 if (offsetNewline
!= offset
) {
113 // Offset.x is at the end of the first letter of the new line, not at 0
117 int[] polyline
= computePolyline(left
, right
, baseline
, lineHeight
);
119 gc
.setLineWidth(0); // NOTE: 0 means width is 1 but with optimized performance
120 gc
.setLineStyle(SWT
.LINE_SOLID
);
121 gc
.setForeground(color
);
122 gc
.drawPolyline(polyline
);
126 * Copied verbatim from {@link org.eclipse.jface.text.source.AnnotationPainter$SquigglesStrategy}
128 * @see org.eclipse.jface.text.source.AnnotationPainter$SquigglesStrategy
136 private int[] computePolyline(Point left
, Point right
, int baseline
, int lineHeight
) {
138 final int WIDTH
= 4; // must be even
139 final int HEIGHT
= 2; // can be any number
141 int peaks
= (right
.x
- left
.x
) / WIDTH
;
142 if (peaks
== 0 && right
.x
- left
.x
> 2)
147 // compute (number of point) * 2
148 int length
= ((2 * peaks
) + 1) * 2;
152 int[] coordinates
= new int[length
];
154 // cache peeks' y-coordinates
155 int top
= left
.y
+ Math
.min(baseline
+ 1, lineHeight
- HEIGHT
- 1);
156 int bottom
= top
+ HEIGHT
;
158 // populate array with peek coordinates
159 for (int i
= 0; i
< peaks
; i
++) {
161 coordinates
[index
]= leftX
+ (WIDTH
* i
);
162 coordinates
[index
+1]= bottom
;
163 coordinates
[index
+2]= coordinates
[index
] + WIDTH
/2;
164 coordinates
[index
+3]= top
;
167 // the last down flank is missing
168 coordinates
[length
-2]= Math
.min(Math
.max(0, right
.x
- 1), left
.x
+ (WIDTH
* peaks
));
169 coordinates
[length
-1]= bottom
;