Imported GNU Classpath 0.92
2006-08-14 Mark Wielaard <mark@klomp.org> Imported GNU Classpath 0.92 * HACKING: Add more importing hints. Update automake version requirement. * configure.ac (gconf-peer): New enable AC argument. Add --disable-gconf-peer and --enable-default-preferences-peer to classpath configure when gconf is disabled. * scripts/makemake.tcl: Set gnu/java/util/prefs/gconf and gnu/java/awt/dnd/peer/gtk to bc. Classify gnu/java/security/Configuration.java as generated source file. * gnu/java/lang/management/VMGarbageCollectorMXBeanImpl.java, gnu/java/lang/management/VMMemoryPoolMXBeanImpl.java, gnu/java/lang/management/VMClassLoadingMXBeanImpl.java, gnu/java/lang/management/VMRuntimeMXBeanImpl.java, gnu/java/lang/management/VMMemoryManagerMXBeanImpl.java, gnu/java/lang/management/VMThreadMXBeanImpl.java, gnu/java/lang/management/VMMemoryMXBeanImpl.java, gnu/java/lang/management/VMCompilationMXBeanImpl.java: New VM stub classes. * java/lang/management/VMManagementFactory.java: Likewise. * java/net/VMURLConnection.java: Likewise. * gnu/java/nio/VMChannel.java: Likewise. * java/lang/Thread.java (getState): Add stub implementation. * java/lang/Class.java (isEnum): Likewise. * java/lang/Class.h (isEnum): Likewise. * gnu/awt/xlib/XToolkit.java (getClasspathTextLayoutPeer): Removed. * javax/naming/spi/NamingManager.java: New override for StackWalker functionality. * configure, sources.am, Makefile.in, gcj/Makefile.in, include/Makefile.in, testsuite/Makefile.in: Regenerated. From-SVN: r116139
This commit is contained in:
parent
abab460491
commit
ac1ed908de
1294 changed files with 99479 additions and 35933 deletions
|
@ -1,5 +1,5 @@
|
|||
/* TextMeasurer.java
|
||||
Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
Copyright (C) 2006 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU Classpath.
|
||||
|
||||
|
@ -38,67 +38,154 @@ exception statement from your version. */
|
|||
|
||||
package java.awt.font;
|
||||
|
||||
import gnu.classpath.NotImplementedException;
|
||||
|
||||
import java.text.AttributedCharacterIterator;
|
||||
import java.text.AttributedString;
|
||||
import java.awt.Shape;
|
||||
|
||||
/**
|
||||
* @author Michael Koch
|
||||
* TextMeasurer is a small utility class for measuring the length of laid-out
|
||||
* text objects.
|
||||
*
|
||||
* @author Sven de Marothy
|
||||
* @since 1.3
|
||||
*/
|
||||
public final class TextMeasurer implements Cloneable
|
||||
{
|
||||
private AttributedCharacterIterator ci;
|
||||
private AttributedCharacterIterator text;
|
||||
private FontRenderContext frc;
|
||||
|
||||
private TextLayout totalLayout;
|
||||
private int numChars;
|
||||
|
||||
/**
|
||||
* Creates a TextMeasurer from a given text in the form of an
|
||||
* <code>AttributedCharacterIterator</code> and a
|
||||
* <code>FontRenderContext</code>.
|
||||
*/
|
||||
public TextMeasurer (AttributedCharacterIterator text, FontRenderContext frc)
|
||||
{
|
||||
this.ci = text;
|
||||
this.text = text;
|
||||
this.frc = frc;
|
||||
totalLayout = new TextLayout( text, frc );
|
||||
numChars = totalLayout.getCharacterCount();
|
||||
}
|
||||
|
||||
/**
|
||||
* Clones the TextMeasurer object
|
||||
*/
|
||||
protected Object clone ()
|
||||
{
|
||||
try
|
||||
{
|
||||
return super.clone ();
|
||||
}
|
||||
catch (CloneNotSupportedException e)
|
||||
{
|
||||
// This may never occur
|
||||
throw new InternalError ();
|
||||
}
|
||||
return new TextMeasurer( text, frc );
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the text if a character is deleted at the position deletePos
|
||||
* @param newParagraph - the updated paragraph.
|
||||
* @param deletePos - the deletion position
|
||||
*/
|
||||
public void deleteChar (AttributedCharacterIterator newParagraph,
|
||||
int deletePos)
|
||||
throws NotImplementedException
|
||||
{
|
||||
throw new Error ("not implemented");
|
||||
}
|
||||
|
||||
public float getAdvanceBetween (int start, int limit)
|
||||
throws NotImplementedException
|
||||
{
|
||||
throw new Error ("not implemented");
|
||||
}
|
||||
|
||||
public TextLayout getLayout (int start, int limit)
|
||||
throws NotImplementedException
|
||||
{
|
||||
throw new Error ("not implemented");
|
||||
}
|
||||
|
||||
public int getLineBreakIndex (int start, float maxAdvance)
|
||||
throws NotImplementedException
|
||||
{
|
||||
throw new Error ("not implemented");
|
||||
totalLayout = new TextLayout(newParagraph, frc);
|
||||
if( deletePos < 0 || deletePos > totalLayout.getCharacterCount() )
|
||||
throw new NullPointerException("Invalid deletePos:"+deletePos);
|
||||
numChars = totalLayout.getCharacterCount();
|
||||
text = newParagraph;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the text if a character is inserted at the position insertPos
|
||||
* @param newParagraph - the updated paragraph.
|
||||
* @param insertPos - the insertion position
|
||||
*/
|
||||
public void insertChar (AttributedCharacterIterator newParagraph,
|
||||
int insertPos)
|
||||
throws NotImplementedException
|
||||
{
|
||||
throw new Error ("not implemented");
|
||||
totalLayout = new TextLayout(newParagraph, frc);
|
||||
if( insertPos < 0 || insertPos > totalLayout.getCharacterCount() )
|
||||
throw new NullPointerException("Invalid insertPos:"+insertPos);
|
||||
numChars = totalLayout.getCharacterCount();
|
||||
text = newParagraph;
|
||||
}
|
||||
|
||||
/***
|
||||
* Returns the total advance between two positions in the paragraph.
|
||||
* Characters from start to limit-1 (inclusive) are included in this count.
|
||||
*
|
||||
* @param start - the starting character index.
|
||||
* @param limit - the limiting index.
|
||||
*/
|
||||
public float getAdvanceBetween (int start, int limit)
|
||||
{
|
||||
Shape s = totalLayout.getLogicalHighlightShape( start, limit );
|
||||
return (float)s.getBounds2D().getWidth();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a <code>TextLayout</code> object corresponding to the characters
|
||||
* from text to limit.
|
||||
* @param start - the starting character index.
|
||||
* @param limit - the limiting index.
|
||||
*/
|
||||
public TextLayout getLayout (int start, int limit)
|
||||
{
|
||||
if( start >= limit )
|
||||
throw new IllegalArgumentException("Start position must be < limit.");
|
||||
return new TextLayout( totalLayout, start, limit );
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the line-break index from a given starting index and a maximum
|
||||
* advance. The index returned is the first character outside the given
|
||||
* advance (or the limit of the string, if all remaining characters fit.)
|
||||
*
|
||||
* @param start - the starting index.
|
||||
* @param maxAdvance - the maximum advance allowed.
|
||||
* @return the index of the first character beyond maxAdvance, or the
|
||||
* index of the last character + 1.
|
||||
*/
|
||||
public int getLineBreakIndex (int start, float maxAdvance)
|
||||
{
|
||||
if( start < 0 )
|
||||
throw new IllegalArgumentException("Start parameter must be > 0.");
|
||||
|
||||
double remainingLength = getAdvanceBetween( start, numChars );
|
||||
|
||||
int guessOffset = (int)( ( (double)maxAdvance / (double)remainingLength)
|
||||
* ( (double)numChars - (double)start ) );
|
||||
guessOffset += start;
|
||||
if( guessOffset > numChars )
|
||||
guessOffset = numChars;
|
||||
|
||||
double guessLength = getAdvanceBetween( start, guessOffset );
|
||||
boolean makeSmaller = ( guessLength > maxAdvance );
|
||||
int inc = makeSmaller ? -1 : 1;
|
||||
boolean keepGoing = true;
|
||||
|
||||
do
|
||||
{
|
||||
guessOffset = guessOffset + inc;
|
||||
if( guessOffset <= start || guessOffset > numChars )
|
||||
{
|
||||
keepGoing = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
guessLength = getAdvanceBetween( start, guessOffset );
|
||||
if( makeSmaller && ( guessLength <= maxAdvance) )
|
||||
keepGoing = false;
|
||||
if( !makeSmaller && ( guessLength >= maxAdvance) )
|
||||
keepGoing = false;
|
||||
}
|
||||
}
|
||||
while( keepGoing );
|
||||
|
||||
// Return first index that doesn't fit.
|
||||
if( !makeSmaller )
|
||||
guessOffset--;
|
||||
|
||||
if( guessOffset > numChars )
|
||||
return numChars;
|
||||
|
||||
return guessOffset;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue