| /******************************************************************************* |
| * Copyright (c) 2001, 2004 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| * Jens Lukowski/Innoopract - initial renaming/restructuring |
| * |
| *******************************************************************************/ |
| package org.eclipse.wst.sse.ui.internal; |
| |
| |
| |
| import java.io.BufferedReader; |
| import java.io.IOException; |
| import java.io.Reader; |
| |
| import org.eclipse.swt.graphics.GC; |
| |
| /* |
| * Not a real reader. Could change if requested |
| */ |
| public class StructuredTextLineBreakingReader { |
| private GC fGC; |
| private int fIndex; |
| private String fLine; |
| private int fMaxWidth; |
| |
| private BufferedReader fReader; |
| |
| /** |
| * 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 StructuredTextLineBreakingReader(Reader reader, GC gc, int maxLineWidth) { |
| fReader = new BufferedReader(reader); |
| fGC = gc; |
| fMaxWidth = maxLineWidth; |
| fLine = null; |
| fIndex = 0; |
| } |
| |
| private int findNextBreakIndex(int currIndex) { |
| int currWidth = 0; |
| int lineLength = fLine.length(); |
| |
| while (currIndex < lineLength) { |
| char ch = fLine.charAt(currIndex); |
| int nextIndex = currIndex + 1; |
| // leading whitespaces are counted to the following word |
| if (Character.isWhitespace(ch)) { |
| while (nextIndex < lineLength && Character.isWhitespace(fLine.charAt(nextIndex))) { |
| nextIndex++; |
| } |
| } |
| while (nextIndex < lineLength && !Character.isWhitespace(fLine.charAt(nextIndex))) { |
| nextIndex++; |
| } |
| String word = fLine.substring(currIndex, nextIndex); |
| int wordWidth = fGC.textExtent(word).x; |
| int nextWidth = wordWidth + currWidth; |
| if (nextWidth > fMaxWidth && wordWidth < fMaxWidth) { |
| return currIndex; |
| } |
| currWidth = nextWidth; |
| currIndex = nextIndex; |
| } |
| return currIndex; |
| } |
| |
| private int findWordBegin(int idx) { |
| while (idx < fLine.length() && Character.isWhitespace(fLine.charAt(idx))) { |
| idx++; |
| } |
| return idx; |
| } |
| |
| /** |
| * 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; |
| fIndex = 0; |
| } |
| int breakIdx = findNextBreakIndex(fIndex); |
| String res = fLine.substring(fIndex, breakIdx); |
| if (breakIdx < fLine.length()) { |
| fIndex = findWordBegin(breakIdx); |
| } else { |
| fLine = null; |
| } |
| return res; |
| } |
| } |