X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpdt/internal/ui/text/LineBreakingReader.java b/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpdt/internal/ui/text/LineBreakingReader.java new file mode 100644 index 0000000..c69c0c8 --- /dev/null +++ b/net.sourceforge.phpeclipse.ui/src/net/sourceforge/phpdt/internal/ui/text/LineBreakingReader.java @@ -0,0 +1,116 @@ +package net.sourceforge.phpdt.internal.ui.text; + +/* + * (c) Copyright IBM Corp. 2000, 2001. + * All Rights Reserved. + */ + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.Reader; +import java.text.BreakIterator; + +import org.eclipse.swt.graphics.GC; + +/* + * Not a real reader. Could change if requested + */ +public class LineBreakingReader { + + private BufferedReader fReader; + + private GC fGC; + + private int fMaxWidth; + + private String fLine; + + private int fOffset; + + private BreakIterator fLineBreakIterator; + + /** + * Creates a reader that breaks an input text to fit in a given width. + * + * @param reader + * Reader of the input text + * @param gc + * The graphic context that defines the currently used font sizes + * @param maxLineWidth + * The max width (pixes) where the text has to fit in + */ + public LineBreakingReader(Reader reader, GC gc, int maxLineWidth) { + fReader = new BufferedReader(reader); + fGC = gc; + fMaxWidth = maxLineWidth; + fOffset = 0; + fLine = null; + fLineBreakIterator = BreakIterator.getLineInstance(); + } + + public boolean isFormattedLine() { + return fLine != null; + } + + /** + * Reads the next line. The lengths of the line will not exceed the gived + * maximum width. + */ + public String readLine() throws IOException { + if (fLine == null) { + String line = fReader.readLine(); + if (line == null) + return null; + + int lineLen = fGC.textExtent(line).x; + if (lineLen < fMaxWidth) { + return line; + } + fLine = line; + fLineBreakIterator.setText(line); + fOffset = 0; + } + int breakOffset = findNextBreakOffset(fOffset); + String res; + if (breakOffset != BreakIterator.DONE) { + res = fLine.substring(fOffset, breakOffset); + fOffset = findWordBegin(breakOffset); + if (fOffset == fLine.length()) { + fLine = null; + } + } else { + res = fLine.substring(fOffset); + fLine = null; + } + return res; + } + + private int findNextBreakOffset(int currOffset) { + int currWidth = 0; + int nextOffset = fLineBreakIterator.following(currOffset); + while (nextOffset != BreakIterator.DONE) { + String word = fLine.substring(currOffset, nextOffset); + int wordWidth = fGC.textExtent(word).x; + int nextWidth = wordWidth + currWidth; + if (nextWidth > fMaxWidth) { + if (currWidth > 0) { + return currOffset; + } else { + return nextOffset; + } + } + currWidth = nextWidth; + currOffset = nextOffset; + nextOffset = fLineBreakIterator.next(); + } + return nextOffset; + } + + private int findWordBegin(int idx) { + while (idx < fLine.length() + && Character.isWhitespace(fLine.charAt(idx))) { + idx++; + } + return idx; + } +}