Mega Code Archive

 
Categories / Java Tutorial / Internationalization
 

Wrap multi-line strings (and get the individual lines)

/*  * $Id: Utilities.java,v 1.11 2008/10/14 22:31:46 rah003 Exp $  *  * Copyright 2006 Sun Microsystems, Inc., 4150 Network Circle,  * Santa Clara, California 95054, U.S.A. All rights reserved.  *  * This library is free software; you can redistribute it and/or  * modify it under the terms of the GNU Lesser General Public  * License as published by the Free Software Foundation; either  * version 2.1 of the License, or (at your option) any later version.  *  * This library is distributed in the hope that it will be useful,  * but WITHOUT ANY WARRANTY; without even the implied warranty of  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  * Lesser General Public License for more details.  *  * You should have received a copy of the GNU Lesser General Public  * License along with this library; if not, write to the Free Software  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA  */ import java.text.BreakIterator; import java.util.StringTokenizer; /**  * Contribution from NetBeans: Issue #319-swingx.  *   * PENDING: need to reconcile with OS, JVM... added as-is because needed the  * shortcut handling to fix #  *   * @author apple  */ public class Utils {   /**    * Wrap multi-line strings (and get the individual lines).    *     * @param original    *          the original string to wrap    * @param width    *          the maximum width of lines    * @param breakIterator    *          breaks original to chars, words, sentences, depending on what    *          instance you provide.    * @param removeNewLines    *          if <code>true</code>, any newlines in the original string are    *          ignored    * @return the lines after wrapping    */   public static String[] wrapStringToArray(String original, int width, BreakIterator breakIterator,       boolean removeNewLines) {     if (original.length() == 0) {       return new String[] { original };     }     String[] workingSet;     // substitute original newlines with spaces,     // remove newlines from head and tail     if (removeNewLines) {       original = trimString(original);       original = original.replace('\n', ' ');       workingSet = new String[] { original };     } else {       StringTokenizer tokens = new StringTokenizer(original, "\n"); // NOI18N       int len = tokens.countTokens();       workingSet = new String[len];       for (int i = 0; i < len; i++) {         workingSet[i] = tokens.nextToken();       }     }     if (width < 1) {       width = 1;     }     if (original.length() <= width) {       return workingSet;     }     widthcheck: {       boolean ok = true;       for (int i = 0; i < workingSet.length; i++) {         ok = ok && (workingSet[i].length() < width);         if (!ok) {           break widthcheck;         }       }       return workingSet;     }     java.util.ArrayList<String> lines = new java.util.ArrayList<String>();     int lineStart = 0; // the position of start of currently processed line in                         // the original string     for (int i = 0; i < workingSet.length; i++) {       if (workingSet[i].length() < width) {         lines.add(workingSet[i]);       } else {         breakIterator.setText(workingSet[i]);         int nextStart = breakIterator.next();         int prevStart = 0;         do {           while (((nextStart - lineStart) < width) && (nextStart != BreakIterator.DONE)) {             prevStart = nextStart;             nextStart = breakIterator.next();           }           if (nextStart == BreakIterator.DONE) {             nextStart = prevStart = workingSet[i].length();           }           if (prevStart == 0) {             prevStart = nextStart;           }           lines.add(workingSet[i].substring(lineStart, prevStart));           lineStart = prevStart;           prevStart = 0;         } while (lineStart < workingSet[i].length());         lineStart = 0;       }     }     String[] s = new String[lines.size()];     return (String[]) lines.toArray(s);   }   private static String trimString(String s) {     int idx = 0;     char c;     final int slen = s.length();     if (slen == 0) {       return s;     }     do {       c = s.charAt(idx++);     } while (((c == '\n') || (c == '\r')) && (idx < slen));     s = s.substring(--idx);     idx = s.length() - 1;     if (idx < 0) {       return s;     }     do {       c = s.charAt(idx--);     } while (((c == '\n') || (c == '\r')) && (idx >= 0));     return s.substring(0, idx + 2);   } }