diff options
author | Roman Kennke <roman@kennke.org> | 2006-11-22 14:39:36 +0000 |
---|---|---|
committer | Roman Kennke <roman@kennke.org> | 2006-11-22 14:39:36 +0000 |
commit | 123c625c113b1e725d76b013cc6d233b340ee467 (patch) | |
tree | 946d3a7d9229637b98663eff5e48a85f4fc005f6 /java/awt | |
parent | 982dfafea39aaf22ac63d73a80c15d6feb4109b9 (diff) | |
download | classpath-123c625c113b1e725d76b013cc6d233b340ee467.tar.gz |
2006-11-22 Roman Kennke <kennke@aicas.com>
* java/awt/text/TextLayout.java
(getLogicalRangesForVisualSelection): Implemented.
Diffstat (limited to 'java/awt')
-rw-r--r-- | java/awt/font/TextLayout.java | 55 |
1 files changed, 53 insertions, 2 deletions
diff --git a/java/awt/font/TextLayout.java b/java/awt/font/TextLayout.java index e526e4f68..0362c2687 100644 --- a/java/awt/font/TextLayout.java +++ b/java/awt/font/TextLayout.java @@ -654,9 +654,60 @@ public final class TextLayout implements Cloneable public int[] getLogicalRangesForVisualSelection (TextHitInfo firstEndpoint, TextHitInfo secondEndpoint) - throws NotImplementedException { - throw new Error ("not implemented"); + // Check parameters. + checkHitInfo(firstEndpoint); + checkHitInfo(secondEndpoint); + + // Convert to visual and order correctly. + int start = hitToCaret(firstEndpoint); + int end = hitToCaret(secondEndpoint); + if (start > end) + { + // Swap start and end so that end >= start. + int temp = start; + start = end; + end = temp; + } + + // Now walk through the visual indices and mark the included pieces. + boolean[] include = new boolean[length]; + for (int i = start; i < end; i++) + { + include[visualToLogical[i]] = true; + } + + // Count included runs. + int numRuns = 0; + boolean in = false; + for (int i = 0; i < length; i++) + { + if (include[i] != in) // At each run in/out point we toggle the in var. + { + in = ! in; + if (in) // At each run start we count up. + numRuns++; + } + } + + // Put together the ranges array. + int[] ranges = new int[numRuns * 2]; + int index = 0; + in = false; + for (int i = 0; i < length; i++) + { + if (include[i] != in) + { + ranges[index] = i; + index++; + in = ! in; + } + } + // If the last run ends at the very end, include that last bit too. + if (in) + ranges[index] = length; + + return ranges; } public TextHitInfo getNextLeftHit(int offset) |