/* =========================================================== * JFreeChart : a free chart library for the Java(tm) platform * =========================================================== * * (C) Copyright 2000-2014, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jfreechart/index.html * * 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 Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Oracle and Java are registered trademarks of Oracle and/or its affiliates. * Other names may be trademarks of their respective owners.] * * ------------------------------ * AttributedStringUtilities.java * ------------------------------ * (C)opyright 2005-2014, by Object Refinery Limited and Contributors. * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): -; * * Changes * ------- * 29-Jul-2005 : Version 1 (DG); * 16-Jun-2012 : Moved from JCommon to JFreeChart (DG); * 01-Aug-2013 : Added toString() method (DG); * */ package org.jfree.chart.util; import java.text.AttributedCharacterIterator; import java.text.AttributedString; import java.text.CharacterIterator; import java.util.Map; /** * Some utility methods for working with <code>AttributedString</code> objects. */ public class AttributedStringUtils { /** * Private constructor prevents object creation. */ private AttributedStringUtils() { } /** * Returns a string containing the underlying character data for the * supplied iterator. * * @param aci the iterator (<code>null</code> not permitted). * * @return A string. */ public static String toString(AttributedCharacterIterator aci) { StringBuilder builder = new StringBuilder(); int count = aci.getEndIndex() - aci.getBeginIndex(); char c = aci.first(); for (int i = 0; i < count; i++) { builder.append(c); c = aci.next(); } return builder.toString(); } /** * Tests two attributed strings for equality. * * @param s1 string 1 (<code>null</code> permitted). * @param s2 string 2 (<code>null</code> permitted). * * @return <code>true</code> if <code>s1</code> and <code>s2</code> are * equal or both <code>null</code>, and <code>false</code> * otherwise. */ public static boolean equal(AttributedString s1, AttributedString s2) { if (s1 == null) { return (s2 == null); } if (s2 == null) { return false; } AttributedCharacterIterator it1 = s1.getIterator(); AttributedCharacterIterator it2 = s2.getIterator(); char c1 = it1.first(); char c2 = it2.first(); int start = 0; while (c1 != CharacterIterator.DONE) { int limit1 = it1.getRunLimit(); int limit2 = it2.getRunLimit(); if (limit1 != limit2) { return false; } // if maps aren't equivalent, return false Map<AttributedCharacterIterator.Attribute, Object> m1 = it1.getAttributes(); Map<AttributedCharacterIterator.Attribute, Object> m2 = it2.getAttributes(); if (!m1.equals(m2)) { return false; } // now check characters in the run are the same for (int i = start; i < limit1; i++) { if (c1 != c2) { return false; } c1 = it1.next(); c2 = it2.next(); } start = limit1; } return c2 == CharacterIterator.DONE; } }