1) Moved net.sourceforge.phpeclipse.ui\src\net\sourceforge\phpdt back to net.sourcefo...
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / ui / text / LineBreakingReader.java
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/LineBreakingReader.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/LineBreakingReader.java
new file mode 100644 (file)
index 0000000..c69c0c8
--- /dev/null
@@ -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;
+       }
+}