/******************************************************************************* * Copyright (c) 2007, 2010 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 *******************************************************************************/ package org.eclipse.draw2d; import org.eclipse.rap.rwt.SingletonUtil; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontMetrics; import org.eclipse.draw2d.geometry.Dimension; /** * Provides miscellaneous text operations. Clients may subclass this class if * necessary. * * @author crevells * @since 3.4 */ public class TextUtilities { /** * a singleton default instance */ public static TextUtilities INSTANCE(){ return SingletonUtil.getSessionInstance(TextUtilities.class); } /** * Returns the Dimensions of <i>s</i> in Font <i>f</i>. * * @param s * the string * @param f * the font * @return the dimensions of the given string */ public Dimension getStringExtents(String s, Font f) { return FigureUtilities.getStringExtents(s, f); } /** * Returns the Dimensions of the given text, converting newlines and tabs * appropriately. * * @param s * the text * @param f * the font * @return the dimensions of the given text */ public Dimension getTextExtents(String s, Font f) { return FigureUtilities.getTextExtents(s, f); } /** * Gets the font's ascent. * * @param font * @return the font's ascent */ public int getAscent(Font font) { FontMetrics fm = FigureUtilities.getFontMetrics(font); // UNSUPPORTED - getDescent() not implemented in RAP // return fm.getHeight() - fm.getDescent(); return fm.getHeight(); } /** * Gets the font's descent. * * @param font * @return the font's descent */ public int getDescent(Font font) { // UNSUPPORTED - getDescent() not implemented in RAP // return FigureUtilities.getFontMetrics(font).getDescent(); return 0; } /** * Returns the largest substring of <i>s</i> in Font <i>f</i> that can be * confined to the number of pixels in <i>availableWidth<i>. * * @param s * the original string * @param f * the font * @param availableWidth * the available width * @return the largest substring that fits in the given width */ public int getLargestSubstringConfinedTo(String s, Font f, int availableWidth) { FontMetrics metrics = FigureUtilities.getFontMetrics(f); int min, max; float avg = metrics.getAverageCharWidth(); min = 0; max = s.length() + 1; // The size of the current guess int guess = 0, guessSize = 0; while ((max - min) > 1) { // Pick a new guess size // New guess is the last guess plus the missing width in pixels // divided by the average character size in pixels guess = guess + (int) ((availableWidth - guessSize) / avg); if (guess >= max) guess = max - 1; if (guess <= min) guess = min + 1; // Measure the current guess guessSize = getTextExtents(s.substring(0, guess), f).width; if (guessSize < availableWidth) // We did not use the available width min = guess; else // We exceeded the available width max = guess; } return min; } }