Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 157620 Details for
Bug 301249
[TextSizeDetermination] holds on session-scoped fonts
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
[patch]
Fix: store FontData instaed of Font
clipboard.txt (text/plain), 46.34 KB, created by
RĂ¼diger Herrmann
on 2010-01-29 09:15:30 EST
(
hide
)
Description:
Fix: store FontData instaed of Font
Filename:
MIME Type:
Creator:
RĂ¼diger Herrmann
Created:
2010-01-29 09:15:30 EST
Size:
46.34 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.rap.rwt.q07 >Index: src/org/eclipse/swt/internal/graphics/TextSizeDeterminationFacadeImpl.java >=================================================================== >RCS file: /cvsroot/rt/org.eclipse.rap/runtime.rwt/org.eclipse.rap.rwt.q07/src/org/eclipse/swt/internal/graphics/TextSizeDeterminationFacadeImpl.java,v >retrieving revision 1.4 >diff -u -r1.4 TextSizeDeterminationFacadeImpl.java >--- src/org/eclipse/swt/internal/graphics/TextSizeDeterminationFacadeImpl.java 4 Jun 2009 11:48:55 -0000 1.4 >+++ src/org/eclipse/swt/internal/graphics/TextSizeDeterminationFacadeImpl.java 29 Jan 2010 14:14:27 -0000 >@@ -16,7 +16,6 @@ > import org.eclipse.rwt.internal.lifecycle.CommonPatterns; > import org.eclipse.rwt.lifecycle.*; > import org.eclipse.swt.SWT; >-import org.eclipse.swt.graphics.Font; > import org.eclipse.swt.graphics.FontData; > import org.eclipse.swt.internal.graphics.TextSizeDetermination.ICalculationItem; > import org.eclipse.swt.internal.graphics.TextSizeProbeStore.IProbe; >@@ -76,7 +75,7 @@ > itemString = CommonPatterns.escapeLeadingTrailingSpaces( itemString ); > param.append( itemString ); > param.append( "\", " ); >- param.append( createFontParam( item.getFont() ) ); >+ param.append( createFontParam( item.getFontData() ) ); > param.append( ", " ); > param.append( item.getWrapWidth() ); > param.append( " ]" ); >@@ -113,9 +112,8 @@ > return requests; > } > >- public String createFontParamInternal( final Font font ) { >+ public String createFontParamInternal( final FontData fontData ) { > StringBuffer result = new StringBuffer(); >- FontData fontData = font.getFontData()[ 0 ]; > String[] names = WidgetLCAUtil.parseFontName( fontData.getName() ); > result.append( "[ " ); > for( int i = 0; i < names.length; i++ ) { >#P org.eclipse.rap.rwt >Index: src/org/eclipse/swt/graphics/Font.java >=================================================================== >RCS file: /cvsroot/rt/org.eclipse.rap/runtime.rwt/org.eclipse.rap.rwt/src/org/eclipse/swt/graphics/Font.java,v >retrieving revision 1.17 >diff -u -r1.17 Font.java >--- src/org/eclipse/swt/graphics/Font.java 30 Oct 2009 16:44:16 -0000 1.17 >+++ src/org/eclipse/swt/graphics/Font.java 29 Jan 2010 14:14:29 -0000 >@@ -1,5 +1,5 @@ > /******************************************************************************* >- * Copyright (c) 2002, 2009 Innoopract Informationssysteme GmbH. >+ * Copyright (c) 2002, 2010 Innoopract Informationssysteme GmbH. > * 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 >@@ -157,11 +157,9 @@ > * > * @return an array of font data objects describing the receiver > * >- * <!-- > * @exception SWTException <ul> > * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> > * </ul> >- * --> > */ > public FontData[] getFontData() { > if( isDisposed() ) { >Index: src/org/eclipse/swt/internal/graphics/TextSizeDataBase.java >=================================================================== >RCS file: /cvsroot/rt/org.eclipse.rap/runtime.rwt/org.eclipse.rap.rwt/src/org/eclipse/swt/internal/graphics/TextSizeDataBase.java,v >retrieving revision 1.5 >diff -u -r1.5 TextSizeDataBase.java >--- src/org/eclipse/swt/internal/graphics/TextSizeDataBase.java 12 Jun 2008 13:56:32 -0000 1.5 >+++ src/org/eclipse/swt/internal/graphics/TextSizeDataBase.java 29 Jan 2010 14:14:29 -0000 >@@ -1,5 +1,5 @@ > /******************************************************************************* >- * Copyright (c) 2007, 2008 Innoopract Informationssysteme GmbH. >+ * Copyright (c) 2007, 2010 Innoopract Informationssysteme GmbH. > * 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 >@@ -7,6 +7,7 @@ > * > * Contributors: > * Innoopract Informationssysteme GmbH - initial API and implementation >+ * EclipseSource - ongoing development > ******************************************************************************/ > package org.eclipse.swt.internal.graphics; > >@@ -18,7 +19,7 @@ > > final class TextSizeDataBase { > >- public static Point lookup( final Font font, >+ public static Point lookup( final FontData font, > final String string, > final int wrapWidth ) > { >@@ -32,19 +33,19 @@ > return result; > } > >- public static void store( final Font font, >+ public static void store( final FontData fontData, > final String string, > final int wrapWidth, > final Point calculatedTextSize ) > { >- if( !TextSizeProbeStore.getInstance().containsProbeResult( font ) ) { >+ if( !TextSizeProbeStore.getInstance().containsProbeResult( fontData ) ) { > String txt = "Font ''{0}'' not probed yet."; >- Object[] args = new Object[] { font.toString() }; >+ Object[] args = new Object[] { fontData.toString() }; > String msg = MessageFormat.format( txt, args ); > throw new IllegalStateException( msg ); > } > ITextSizeStorage registry = TextSizeStorageRegistry.obtain(); >- Integer key = getKey( font, string, wrapWidth ); >+ Integer key = getKey( fontData, string, wrapWidth ); > registry.storeTextSize( key, calculatedTextSize ); > } > >@@ -58,19 +59,18 @@ > > > // for test purposes only >- static Integer getKey( final Font font, >+ static Integer getKey( final FontData fontData, > final String string, > final int wrapWidth ) > { > TextSizeProbeStore instance = TextSizeProbeStore.getInstance(); >- IProbeResult probeResult = instance.getProbeResult( font ); >+ IProbeResult probeResult = instance.getProbeResult( fontData ); > String probeText = probeResult.getProbe().getString(); > Point probeSize = probeResult.getSize(); >- FontData probeFontData = font.getFontData()[ 0 ]; > int hashCode = 1; > hashCode = 31 * hashCode + probeText.hashCode(); > hashCode = 31 * hashCode + probeSize.hashCode(); >- hashCode = 31 * hashCode + probeFontData.hashCode(); >+ hashCode = 31 * hashCode + fontData.hashCode(); > hashCode = 31 * hashCode + string.hashCode(); > hashCode = 31 * hashCode + wrapWidth; > return new Integer( hashCode ); >Index: src/org/eclipse/swt/internal/graphics/TextSizeProbeStore.java >=================================================================== >RCS file: /cvsroot/rt/org.eclipse.rap/runtime.rwt/org.eclipse.rap.rwt/src/org/eclipse/swt/internal/graphics/TextSizeProbeStore.java,v >retrieving revision 1.6 >diff -u -r1.6 TextSizeProbeStore.java >--- src/org/eclipse/swt/internal/graphics/TextSizeProbeStore.java 4 Jun 2009 11:48:51 -0000 1.6 >+++ src/org/eclipse/swt/internal/graphics/TextSizeProbeStore.java 29 Jan 2010 14:14:29 -0000 >@@ -1,5 +1,5 @@ > /******************************************************************************* >- * Copyright (c) 2007, 2009 Innoopract Informationssysteme GmbH. >+ * Copyright (c) 2007, 2010 Innoopract Informationssysteme GmbH. > * 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 >@@ -44,7 +44,7 @@ > > > public interface IProbe { >- Font getFont(); >+ FontData getFontData(); > String getString(); > String getJSProbeParam(); > } >@@ -58,17 +58,17 @@ > private static final class ProbeImpl implements IProbe { > > private final String probeText; >- private final Font font; >+ private final FontData fontData; > private String jsProbeParam; > >- private ProbeImpl( final String probeText, final Font font ) { >+ private ProbeImpl( final String probeText, final FontData fontData ) { > this.probeText = probeText; >- this.font = font; >+ this.fontData = fontData; > this.jsProbeParam = createProbeParam( this ); > } > >- public Font getFont() { >- return font; >+ public FontData getFontData() { >+ return fontData; > } > > public String getString() { >@@ -91,17 +91,16 @@ > return ( TextSizeProbeStore )getInstance( TextSizeProbeStore.class ); > } > >- IProbeResult getProbeResult( final Font font ) { >- FontData fontData = font.getFontData()[ 0 ]; >+ IProbeResult getProbeResult( final FontData fontData ) { > return ( IProbeResult )probeResults.get( fontData ); > } > >- boolean containsProbeResult( final Font font ) { >- return getProbeResult( font ) != null; >+ boolean containsProbeResult( final FontData fontData ) { >+ return getProbeResult( fontData ) != null; > } > > IProbeResult createProbeResult( final IProbe probe, final Point size ) { >- FontData fontData = probe.getFont().getFontData()[ 0 ]; >+ FontData fontData = probe.getFontData(); > IProbeResult result = new IProbeResult() { > private float avgCharWidth; > public IProbe getProbe() { >@@ -134,7 +133,7 @@ > IProbe[] result; > synchronized( probes ) { > if( probes.isEmpty() ) { >- Font[] fontList = TextSizeStorageRegistry.obtain().getFontList(); >+ FontData[] fontList = TextSizeStorageRegistry.obtain().getFontList(); > for( int i = 0; i < fontList.length; i++ ) { > createProbe( fontList[ i ], getProbeString( fontList[ i ] ) ); > } >@@ -145,31 +144,29 @@ > return result; > } > >- private static String getProbeString( final Font font ) { >+ private static String getProbeString( final FontData fontData ) { > // TODO [fappel]: probe string determination different from default > return DEFAULT_PROBE; > } > >- static IProbe getProbe( final Font font ) { >- FontData fontData = font.getFontData()[ 0 ]; >+ static IProbe getProbe( final FontData font ) { > IProbe result; > synchronized( probes ) { >- result = ( IProbe )probes.get( fontData ); >+ result = ( IProbe )probes.get( font ); > } > return result; > } > >- static boolean containsProbe( final Font font ) { >- return getProbe( font ) != null; >+ static boolean containsProbe( final FontData fontData ) { >+ return getProbe( fontData ) != null; > } > >- static IProbe createProbe( final Font font, final String probeText ) { >- IProbe result = new ProbeImpl( probeText, font ); >- FontData fontData = font.getFontData()[ 0 ]; >+ static IProbe createProbe( final FontData fontData, final String probeText ) { >+ IProbe result = new ProbeImpl( probeText, fontData ); > synchronized( probes ) { > probes.put( fontData, result ); > } >- TextSizeStorageRegistry.obtain().storeFont( font ); >+ TextSizeStorageRegistry.obtain().storeFont( fontData ); > return result; > } > >@@ -183,10 +180,11 @@ > } > } > >- static void addProbeRequest( final Font font ) { >+ static void addProbeRequest( final FontData font ) { > IProbe probe = getProbe( font ); > if( probe == null ) { >- probe = createProbe( font, getProbeString( font ) ); >+ FontData fontData = font; >+ probe = createProbe( fontData, getProbeString( fontData ) ); > } > getProbeRequestsInternal().add( probe ); > } >@@ -207,13 +205,13 @@ > final Display display = Display.getCurrent(); > if( display != null ) { > result.append( "[ " ); >- result.append( probe.getFont().hashCode() ); >+ result.append( probe.getFontData().hashCode() ); > result.append( ", " ); > result.append( "\"" ); > result.append( probe.getString() ); > result.append( "\", " ); > result.append( >- TextSizeDeterminationFacade.createFontParam( probe.getFont() ) ); >+ TextSizeDeterminationFacade.createFontParam( probe.getFontData() ) ); > result.append( " ]" ); > } > return result.toString(); >Index: src/org/eclipse/swt/internal/graphics/TextSizeEstimation.java >=================================================================== >RCS file: /cvsroot/rt/org.eclipse.rap/runtime.rwt/org.eclipse.rap.rwt/src/org/eclipse/swt/internal/graphics/TextSizeEstimation.java,v >retrieving revision 1.6 >diff -u -r1.6 TextSizeEstimation.java >--- src/org/eclipse/swt/internal/graphics/TextSizeEstimation.java 26 Sep 2009 16:20:07 -0000 1.6 >+++ src/org/eclipse/swt/internal/graphics/TextSizeEstimation.java 29 Jan 2010 14:14:29 -0000 >@@ -1,5 +1,5 @@ > /******************************************************************************* >- * Copyright (c) 2006, 2008 Innoopract Informationssysteme GmbH. >+ * Copyright (c) 2006, 2010 Innoopract Informationssysteme GmbH. > * 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 >@@ -7,15 +7,15 @@ > * > * Contributors: > * Innoopract Informationssysteme GmbH - initial API and implementation >+ * EclipseSource - ongoing development > ******************************************************************************/ > package org.eclipse.swt.internal.graphics; > > import org.eclipse.rwt.internal.lifecycle.CommonPatterns; > import org.eclipse.swt.SWT; >-import org.eclipse.swt.graphics.Font; >-import org.eclipse.swt.graphics.Point; >+import org.eclipse.swt.graphics.*; > >-class TextSizeEstimation { >+final class TextSizeEstimation { > > /** > * Estimates the size of a given text. Line breaks are not respected. >@@ -99,14 +99,15 @@ > */ > static float getAvgCharWidth( final Font font ) { > float result; >+ FontData fontData = font.getFontData()[ 0 ]; > TextSizeProbeStore probeStore = TextSizeProbeStore.getInstance(); >- if( probeStore.containsProbeResult( font ) ) { >+ if( probeStore.containsProbeResult( fontData ) ) { > // we can improve char width estimations in case that we already have the > // specified font probed. >- result = probeStore.getProbeResult( font ).getAvgCharWidth(); >+ result = probeStore.getProbeResult( fontData ).getAvgCharWidth(); > } else { >- result = font.getFontData()[ 0 ].getHeight() * 0.48f; >- if( ( font.getFontData()[ 0 ].getStyle() & SWT.BOLD ) != 0 ) { >+ result = fontData.getHeight() * 0.48f; >+ if( ( fontData.getStyle() & SWT.BOLD ) != 0 ) { > result *= 1.45; > } > } >Index: src/org/eclipse/swt/internal/graphics/TextSizeDeterminationHandler.java >=================================================================== >RCS file: /cvsroot/rt/org.eclipse.rap/runtime.rwt/org.eclipse.rap.rwt/src/org/eclipse/swt/internal/graphics/TextSizeDeterminationHandler.java,v >retrieving revision 1.13 >diff -u -r1.13 TextSizeDeterminationHandler.java >--- src/org/eclipse/swt/internal/graphics/TextSizeDeterminationHandler.java 7 Oct 2009 13:29:34 -0000 1.13 >+++ src/org/eclipse/swt/internal/graphics/TextSizeDeterminationHandler.java 29 Jan 2010 14:14:29 -0000 >@@ -1,5 +1,5 @@ > /******************************************************************************* >- * Copyright (c) 2007, 2009 Innoopract Informationssysteme GmbH. >+ * Copyright (c) 2007, 2010 Innoopract Informationssysteme GmbH. > * 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 >@@ -170,7 +170,7 @@ > HttpServletRequest request = ContextProvider.getRequest(); > for( int i = 0; hasProbes && i < probes.length; i++ ) { > IProbe probe = probes[ i ]; >- String name = String.valueOf( probe.getFont().hashCode() ); >+ String name = String.valueOf( probe.getFontData().hashCode() ); > String value = request.getParameter( name ); > if( value != null ) { > Point size = getSize( value ); >@@ -207,7 +207,7 @@ > // TODO [fappel]: Workaround for background process problem > if( value != null ) { > Point size = getSize( value ); >- TextSizeDataBase.store( item.getFont(), >+ TextSizeDataBase.store( item.getFontData(), > item.getString(), > item.getWrapWidth(), > size ); >Index: src/org/eclipse/swt/internal/graphics/TextSizeDeterminationFacade.java >=================================================================== >RCS file: /cvsroot/rt/org.eclipse.rap/runtime.rwt/org.eclipse.rap.rwt/src/org/eclipse/swt/internal/graphics/TextSizeDeterminationFacade.java,v >retrieving revision 1.1 >diff -u -r1.1 TextSizeDeterminationFacade.java >--- src/org/eclipse/swt/internal/graphics/TextSizeDeterminationFacade.java 5 Dec 2008 10:57:28 -0000 1.1 >+++ src/org/eclipse/swt/internal/graphics/TextSizeDeterminationFacade.java 29 Jan 2010 14:14:29 -0000 >@@ -1,5 +1,5 @@ > /******************************************************************************* >- * Copyright (c) 2008 Innoopract Informationssysteme GmbH. >+ * Copyright (c) 2008, 2010 Innoopract Informationssysteme GmbH. > * 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 >@@ -7,13 +7,14 @@ > * > * Contributors: > * Innoopract Informationssysteme GmbH - initial API and implementation >+ * EclipseSource - ongoing development > ******************************************************************************/ > package org.eclipse.swt.internal.graphics; > > import java.io.IOException; > > import org.eclipse.rwt.internal.FacadesInitializer; >-import org.eclipse.swt.graphics.Font; >+import org.eclipse.swt.graphics.FontData; > import org.eclipse.swt.internal.graphics.TextSizeDetermination.ICalculationItem; > import org.eclipse.swt.internal.graphics.TextSizeProbeStore.IProbe; > >@@ -38,8 +39,8 @@ > return FACADE_IMPL.writeFontProbingInternal(); > } > >- static String createFontParam( final Font font ) { >- return FACADE_IMPL.createFontParamInternal( font ); >+ static String createFontParam( final FontData fontData ) { >+ return FACADE_IMPL.createFontParamInternal( fontData ); > } > > public abstract String createMeasureStringInternal( String string, >@@ -50,5 +51,5 @@ > > public abstract IProbe[] writeFontProbingInternal() throws IOException; > >- public abstract String createFontParamInternal( Font font ); >+ public abstract String createFontParamInternal( FontData fontData ); > } >Index: src/org/eclipse/swt/internal/graphics/TextSizeDetermination.java >=================================================================== >RCS file: /cvsroot/rt/org.eclipse.rap/runtime.rwt/org.eclipse.rap.rwt/src/org/eclipse/swt/internal/graphics/TextSizeDetermination.java,v >retrieving revision 1.11 >diff -u -r1.11 TextSizeDetermination.java >--- src/org/eclipse/swt/internal/graphics/TextSizeDetermination.java 5 Dec 2008 10:57:28 -0000 1.11 >+++ src/org/eclipse/swt/internal/graphics/TextSizeDetermination.java 29 Jan 2010 14:14:29 -0000 >@@ -1,5 +1,5 @@ > /******************************************************************************* >- * Copyright (c) 2007, 2008 Innoopract Informationssysteme GmbH. >+ * Copyright (c) 2007, 2010 Innoopract Informationssysteme GmbH. > * 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 >@@ -7,6 +7,7 @@ > * > * Contributors: > * Innoopract Informationssysteme GmbH - initial API and implementation >+ * EclipseSource - ongoing development > ******************************************************************************/ > package org.eclipse.swt.internal.graphics; > >@@ -35,7 +36,7 @@ > > > public interface ICalculationItem { >- Font getFont(); >+ FontData getFontData(); > String getString(); > int getWrapWidth(); > } >@@ -109,7 +110,8 @@ > = TextSizeDeterminationFacade.createMeasureString( string, > expandNewLines ); > } >- Point result = TextSizeDataBase.lookup( font, toMeasure, wrapWidth ); >+ FontData fontData = font.getFontData()[ 0 ]; >+ Point result = TextSizeDataBase.lookup( fontData, toMeasure, wrapWidth ); > if( result == null ) { > switch( estimationMode ) { > case MARKUP_EXTENT: { >@@ -128,7 +130,7 @@ > throw new IllegalStateException( "Unknown estimation mode." ); > } > } >- addCalculationItem( font, toMeasure, wrapWidth ); >+ addCalculationItem( fontData, toMeasure, wrapWidth ); > } > // TODO [rst] Still returns wrong result for texts that contain only > // whitespace ( and possibly more that one line ) >@@ -140,12 +142,13 @@ > > public static int getCharHeight( final Font font ) { > int result; >+ FontData fontData = font.getFontData()[ 0 ]; > TextSizeProbeStore probeStore = TextSizeProbeStore.getInstance(); >- if( probeStore.containsProbeResult( font ) ) { >- IProbeResult probeResult = probeStore.getProbeResult( font ); >+ if( probeStore.containsProbeResult( fontData ) ) { >+ IProbeResult probeResult = probeStore.getProbeResult( fontData ); > result = probeResult.getSize().y; > } else { >- TextSizeProbeStore.addProbeRequest( font ); >+ TextSizeProbeStore.addProbeRequest( fontData ); > result = TextSizeEstimation.getCharHeight( font ); > } > return result; >@@ -154,11 +157,12 @@ > public static float getAvgCharWidth( final Font font ) { > float result; > TextSizeProbeStore probeStore = TextSizeProbeStore.getInstance(); >- if( probeStore.containsProbeResult( font ) ) { >- IProbeResult probeResult = probeStore.getProbeResult( font ); >+ FontData fontData = font.getFontData()[ 0 ]; >+ if( probeStore.containsProbeResult( fontData ) ) { >+ IProbeResult probeResult = probeStore.getProbeResult( fontData ); > result = probeResult.getAvgCharWidth(); > } else { >- TextSizeProbeStore.addProbeRequest( font ); >+ TextSizeProbeStore.addProbeRequest( fontData ); > result = TextSizeEstimation.getAvgCharWidth( font ); > } > return result; >@@ -183,24 +187,24 @@ > return result; > } > >- private static void addCalculationItem( final Font font, >+ private static void addCalculationItem( final FontData fontData, > final String string, > final int wrapWidth ) > { > ICalculationItem[] oldItems = getCalculationItems(); > boolean mustAdd = true; > for( int i = 0; mustAdd && i < oldItems.length; i++ ) { >- FontData oldFontData = oldItems[ i ].getFont().getFontData()[ 0 ]; >+ FontData oldFontData = oldItems[ i ].getFontData(); > mustAdd = !( oldItems[ i ].getString().equals( string ) >- && oldFontData.equals( font.getFontData()[ 0 ] ) >+ && oldFontData.equals( fontData ) > && oldItems[ i ].getWrapWidth() == wrapWidth ); > } > if( mustAdd ) { > ICalculationItem[] newItems = new ICalculationItem[ oldItems.length + 1 ]; > System.arraycopy( oldItems, 0, newItems, 0, oldItems.length ); > newItems[ oldItems.length ] = new ICalculationItem() { >- public Font getFont() { >- return font; >+ public FontData getFontData() { >+ return fontData; > } > public String getString() { > return string; >Index: src/org/eclipse/swt/internal/graphics/TextSizeStorageRegistry.java >=================================================================== >RCS file: /cvsroot/rt/org.eclipse.rap/runtime.rwt/org.eclipse.rap.rwt/src/org/eclipse/swt/internal/graphics/TextSizeStorageRegistry.java,v >retrieving revision 1.3 >diff -u -r1.3 TextSizeStorageRegistry.java >--- src/org/eclipse/swt/internal/graphics/TextSizeStorageRegistry.java 12 Jun 2008 13:56:32 -0000 1.3 >+++ src/org/eclipse/swt/internal/graphics/TextSizeStorageRegistry.java 29 Jan 2010 14:14:29 -0000 >@@ -1,5 +1,5 @@ > /******************************************************************************* >- * Copyright (c) 2007 Innoopract Informationssysteme GmbH. >+ * Copyright (c) 2007, 2010 Innoopract Informationssysteme GmbH. > * 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 >@@ -7,6 +7,7 @@ > * > * Contributors: > * Innoopract Informationssysteme GmbH - initial API and implementation >+ * EclipseSource - ongoing development > ******************************************************************************/ > package org.eclipse.swt.internal.graphics; > >@@ -19,13 +20,13 @@ > > private static ITextSizeStorage storage; > >- public static void register( final ITextSizeStorage fontSizeStorage ) { >+ public static void register( final ITextSizeStorage textSizeStorage ) { > if( storage != null ) { > String msg >- = "A fontsize storage implementation has already been registered."; >+ = "A textsize storage implementation has already been registered."; > throw new IllegalStateException( msg ); > } >- storage = fontSizeStorage; >+ storage = textSizeStorage; > } > > public static ITextSizeStorage obtain() { >Index: src/org/eclipse/swt/internal/graphics/ITextSizeStorage.java >=================================================================== >RCS file: /cvsroot/rt/org.eclipse.rap/runtime.rwt/org.eclipse.rap.rwt/src/org/eclipse/swt/internal/graphics/ITextSizeStorage.java,v >retrieving revision 1.3 >diff -u -r1.3 ITextSizeStorage.java >--- src/org/eclipse/swt/internal/graphics/ITextSizeStorage.java 12 Jun 2008 13:56:32 -0000 1.3 >+++ src/org/eclipse/swt/internal/graphics/ITextSizeStorage.java 29 Jan 2010 14:14:29 -0000 >@@ -1,5 +1,5 @@ > /******************************************************************************* >- * Copyright (c) 2007 Innoopract Informationssysteme GmbH. >+ * Copyright (c) 2007, 2010 Innoopract Informationssysteme GmbH. > * 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 >@@ -7,11 +7,11 @@ > * > * Contributors: > * Innoopract Informationssysteme GmbH - initial API and implementation >+ * EclipseSource - ongoing development > ******************************************************************************/ > package org.eclipse.swt.internal.graphics; > >-import org.eclipse.swt.graphics.Font; >-import org.eclipse.swt.graphics.Point; >+import org.eclipse.swt.graphics.*; > > > /** >@@ -22,12 +22,12 @@ > /** > * TODO [fappel]: Documentation > */ >- Font[] getFontList(); >+ FontData[] getFontList(); > > /** > * TODO [fappel]: Documentation > */ >- void storeFont( Font font ); >+ void storeFont( FontData fontData ); > > /** > * TODO [fappel]: Documentation >Index: src/org/eclipse/swt/internal/graphics/DefaultTextSizeStorage.java >=================================================================== >RCS file: /cvsroot/rt/org.eclipse.rap/runtime.rwt/org.eclipse.rap.rwt/src/org/eclipse/swt/internal/graphics/DefaultTextSizeStorage.java,v >retrieving revision 1.5 >diff -u -r1.5 DefaultTextSizeStorage.java >--- src/org/eclipse/swt/internal/graphics/DefaultTextSizeStorage.java 12 Jun 2008 13:56:32 -0000 1.5 >+++ src/org/eclipse/swt/internal/graphics/DefaultTextSizeStorage.java 29 Jan 2010 14:14:29 -0000 >@@ -1,5 +1,5 @@ > /******************************************************************************* >- * Copyright (c) 2007, 2008 Innoopract Informationssysteme GmbH. >+ * Copyright (c) 2007, 2010 Innoopract Informationssysteme GmbH. > * 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 >@@ -7,6 +7,7 @@ > * > * Contributors: > * Innoopract Informationssysteme GmbH - initial API and implementation >+ * EclipseSource - ongoing development > ******************************************************************************/ > package org.eclipse.swt.internal.graphics; > >@@ -15,48 +16,54 @@ > import java.text.MessageFormat; > import java.util.*; > >-import org.eclipse.rwt.graphics.Graphics; >-import org.eclipse.swt.graphics.*; >+import org.eclipse.swt.graphics.FontData; >+import org.eclipse.swt.graphics.Point; > > >-public class DefaultTextSizeStorage implements ITextSizeStorage { >+public final class DefaultTextSizeStorage implements ITextSizeStorage { > > public static final int MIN_STORE_SIZE = 1000; > public static final int DEFAULT_STORE_SIZE = 10000; > > static final String COMMENT = "RAP DefaultFontSizeStorage"; > static final String PREFIX_FONT_KEY = "FONT_"; >- private static Set fonts = new HashSet(); >- private static Map data = new HashMap(); >- private static Object lock = new Object(); >- private static int storeSize ; >- private static int clearRange; >- private static int clock; >- static { >- setStoreSize( DEFAULT_STORE_SIZE ); >- } >- >+ > private static class Entry { > private Point point; > private long timeStamp; > } >- >+ >+ private final Object lock; >+ // access is guarded by 'lock' >+ private final Set fontDatas; >+ // access is guarded by 'lock' >+ private final Map data; >+ private int storeSize; >+ private int clearRange; >+ private int clock; >+ >+ public DefaultTextSizeStorage() { >+ lock = new Object(); >+ data = new HashMap(); >+ fontDatas = new HashSet(); >+ setStoreSize( DEFAULT_STORE_SIZE ); >+ } > > ///////////////////////////// > // interface IFontSizeStorage > >- public Font[] getFontList() { >- Font[] result; >+ public FontData[] getFontList() { >+ FontData[] result; > synchronized( lock ) { >- result = new Font[ fonts.size() ]; >- fonts.toArray( result ); >+ result = new FontData[ fontDatas.size() ]; >+ fontDatas.toArray( result ); > } > return result; > } > >- public void storeFont( final Font font ) { >+ public void storeFont( final FontData fontData ) { > synchronized( lock ) { >- fonts.add( font ); >+ fontDatas.add( fontData ); > } > } > >@@ -73,9 +80,7 @@ > return result; > } > >- public void storeTextSize( final Integer key, >- final Point size ) >- { >+ public void storeTextSize( final Integer key, final Point size ) { > Point clone = defensiveCopy( size ); > Entry entry = new Entry(); > entry.point = clone; >@@ -89,11 +94,11 @@ > ////////////// > // persistance > >- public void save( final OutputStream out ) throws IOException { >+ public void save( final OutputStream stream ) throws IOException { > Properties properties = new Properties(); >- Font[] fontList; >+ FontData[] fontDataList; > synchronized( lock ) { >- fontList = getFontList(); >+ fontDataList = getFontList(); > Iterator iterator = data.keySet().iterator(); > while( iterator.hasNext() ) { > Integer key = ( Integer )iterator.next(); >@@ -105,19 +110,19 @@ > properties.setProperty( key.toString(), value.toString() ); > } > } >- for( int i = 0; i < fontList.length; i++ ) { >+ for( int i = 0; i < fontDataList.length; i++ ) { > StringBuffer key = new StringBuffer(); > key.append( PREFIX_FONT_KEY ); > key.append( i ); >- String value = fontList[ i ].getFontData()[ 0 ].toString(); >+ String value = fontDataList[ i ].toString(); > properties.setProperty( key.toString(), value ); > } >- properties.store( out, COMMENT ); >+ properties.store( stream, COMMENT ); > } > >- public void read( final InputStream in ) throws IOException { >+ public void read( final InputStream stream ) throws IOException { > Properties properties = new Properties(); >- properties.load( in ); >+ properties.load( stream ); > synchronized( lock ) { > Enumeration keys = properties.keys(); > while( keys.hasMoreElements() ) { >@@ -125,7 +130,7 @@ > String value = properties.getProperty( key ); > if( key.startsWith( PREFIX_FONT_KEY ) ) { > FontData fontData = new FontData( value ); >- storeFont( Graphics.getFont( fontData ) ); >+ storeFont( fontData ); > } else { > storeTextSize( new Integer( key ), parsePoint( value ) ); > } >@@ -137,7 +142,7 @@ > //////////////////// > // overflow handling > >- public static void setStoreSize( final int storeSize ) { >+ public void setStoreSize( final int storeSize ) { > if( storeSize < MIN_STORE_SIZE ) { > String txt = "Store size must be >= {0}."; > Object[] param = new Object[] { new Integer( MIN_STORE_SIZE ) }; >@@ -148,15 +153,15 @@ > BigDecimal bdStoreSize = new BigDecimal( storeSize ); > int rounding = BigDecimal.ROUND_HALF_UP; > clearRange = bdStoreSize.divide( ten, 0, rounding ).intValue(); >- DefaultTextSizeStorage.storeSize = storeSize; >+ this.storeSize = storeSize; > } > >- public static int getStoreSize() { >+ public int getStoreSize() { > return storeSize; > } > > private void handleOverFlow() { >- if( data.size() >= DefaultTextSizeStorage.storeSize ) { >+ if( data.size() >= storeSize ) { > Entry[] entries = new Entry[ data.size() ]; > data.values().toArray( entries ); > Arrays.sort( entries, new Comparator() { >@@ -182,32 +187,33 @@ > ////////////////// > // helping methods > >- private Point parsePoint( final String value ) { >+ private static Point parsePoint( final String value ) { > String[] values = value.split( "," ); > int x = Integer.valueOf( values[ 0 ] ).intValue(); > int y = Integer.valueOf( values[ 1 ] ).intValue(); > return new Point( x, y ); > } > >+ private static Point defensiveCopy( final Point point ) { >+ Point result = null; >+ if( point != null ) { >+ result = new Point( point.x, point.y ); >+ } >+ return result; >+ } >+ > // for test purposes only > void resetFontList() { >- synchronized( fonts ) { >- fonts.clear(); >+ synchronized( fontDatas ) { >+ fontDatas.clear(); > } > } >- >+ > // for test purposes only > void resetStringSizes() { > synchronized( data ) { > data.clear(); > } > } >- >- private static Point defensiveCopy( final Point point ) { >- Point result = null; >- if( point != null ) { >- result = new Point( point.x, point.y ); >- } >- return result; >- } >+ > } >#P org.eclipse.rap.rwt.test >Index: src/org/eclipse/swt/internal/graphics/TextSizeDetermination_Test.java >=================================================================== >RCS file: /cvsroot/rt/org.eclipse.rap/runtime.rwt.test/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/graphics/TextSizeDetermination_Test.java,v >retrieving revision 1.13 >diff -u -r1.13 TextSizeDetermination_Test.java >--- src/org/eclipse/swt/internal/graphics/TextSizeDetermination_Test.java 11 Dec 2009 15:19:56 -0000 1.13 >+++ src/org/eclipse/swt/internal/graphics/TextSizeDetermination_Test.java 29 Jan 2010 14:14:32 -0000 >@@ -20,8 +20,7 @@ > import org.eclipse.rwt.Fixture; > import org.eclipse.rwt.graphics.Graphics; > import org.eclipse.swt.SWT; >-import org.eclipse.swt.graphics.Font; >-import org.eclipse.swt.graphics.Point; >+import org.eclipse.swt.graphics.*; > import org.eclipse.swt.internal.graphics.TextSizeDetermination.ICalculationItem; > import org.eclipse.swt.internal.graphics.TextSizeProbeStore.IProbe; > import org.eclipse.swt.internal.graphics.TextSizeProbeStore.IProbeResult; >@@ -53,11 +52,14 @@ > Point storedSize = new Point( 100, 10 ); > IProbe[] probeRequests = TextSizeProbeStore.getProbeRequests(); > assertEquals( 1, probeRequests.length ); >- assertSame( font, probeRequests[ 0 ].getFont() ); >+ assertSame( font.getFontData()[ 0 ], probeRequests[ 0 ].getFontData() ); > > TextSizeProbeStore probeStore = TextSizeProbeStore.getInstance(); > probeStore.createProbeResult( probeRequests[ 0 ], new Point( 10, 10 ) ); >- TextSizeDataBase.store( font, TEST_STRING, SWT.DEFAULT, storedSize ); >+ TextSizeDataBase.store( font.getFontData()[ 0 ], >+ TEST_STRING, >+ SWT.DEFAULT, >+ storedSize ); > calculated = TextSizeDetermination.stringExtent( font, TEST_STRING ); > assertEquals( storedSize, calculated ); > >@@ -110,7 +112,7 @@ > > probeRequests = TextSizeProbeStore.getProbeRequests(); > assertEquals( 1, probeRequests.length ); >- assertSame( font0, probeRequests[ 0 ].getFont() ); >+ assertSame( font0.getFontData()[ 0 ], probeRequests[ 0 ].getFontData() ); > > TextSizeProbeStore probeStore = TextSizeProbeStore.getInstance(); > Point probeSize = new Point( 10, 13 ); >@@ -130,7 +132,7 @@ > > probeRequests = TextSizeProbeStore.getProbeRequests(); > assertEquals( 1, probeRequests.length ); >- assertSame( font0, probeRequests[ 0 ].getFont() ); >+ assertSame( font0.getFontData()[ 0 ], probeRequests[ 0 ].getFontData() ); > > TextSizeProbeStore probeStore = TextSizeProbeStore.getInstance(); > Point probeSize = new Point( TextSizeProbeStore.DEFAULT_PROBE.length() * 4, 10 ); >@@ -141,16 +143,19 @@ > > public void testFontSizeDataBase() { > Font font0 = Graphics.getFont( "arial", 10, SWT.NORMAL ); >+ FontData fontData0 = font0.getFontData()[ 0 ]; > Font font1 = Graphics.getFont( "helvetia", 12, SWT.NORMAL ); >+ FontData fontData1 = font1.getFontData()[ 0 ]; > >- Point textSize = TextSizeDataBase.lookup( font0, TEST_STRING, SWT.DEFAULT ); >+ Point textSize; >+ textSize = TextSizeDataBase.lookup( fontData0, TEST_STRING, SWT.DEFAULT ); > assertNull( textSize ); >- textSize = TextSizeDataBase.lookup( font1, TEST_STRING, SWT.DEFAULT ); >+ textSize = TextSizeDataBase.lookup( fontData1, TEST_STRING, SWT.DEFAULT ); > assertNull( textSize ); > > try { > Point point = new Point( 1, 1 ); >- TextSizeDataBase.store( font1, TEST_STRING, SWT.DEFAULT, point ); >+ TextSizeDataBase.store( fontData1, TEST_STRING, SWT.DEFAULT, point ); > fail( "No probe available." ); > } catch( final IllegalStateException ise ) { > } >@@ -163,64 +168,68 @@ > probeStore.createProbeResult( findRequestedProbe( 1 ), probeSize1 ); > > Point calculatedTextSize0 = new Point( 100, 10 ); >- TextSizeDataBase.store( font0, >+ TextSizeDataBase.store( fontData0, > TEST_STRING, > SWT.DEFAULT, > calculatedTextSize0 ); > Point calculatedTextSize1 = new Point( 100, 12 ); >- TextSizeDataBase.store( font1, >+ TextSizeDataBase.store( fontData1, > TEST_STRING, > SWT.DEFAULT, > calculatedTextSize1 ); >- textSize = TextSizeDataBase.lookup( font0, TEST_STRING, SWT.DEFAULT ); >+ textSize = TextSizeDataBase.lookup( fontData0, TEST_STRING, SWT.DEFAULT ); > assertEquals( calculatedTextSize0, textSize ); >- textSize = TextSizeDataBase.lookup( font1, TEST_STRING, SWT.DEFAULT ); >+ textSize = TextSizeDataBase.lookup( fontData1, TEST_STRING, SWT.DEFAULT ); > assertEquals( calculatedTextSize1, textSize ); > } > > private IProbe findRequestedProbe( final int i ) { > IProbe[] probeRequests = TextSizeProbeStore.getProbeRequests(); >- return TextSizeProbeStore.getProbe( probeRequests[ i ].getFont() ); >+ return TextSizeProbeStore.getProbe( probeRequests[ i ].getFontData() ); > } > > public void testProbeStorage() { > Font font0 = Graphics.getFont( "arial", 10, SWT.NORMAL ); >+ FontData fontData0 = font0.getFontData()[ 0 ]; > IProbe[] probeList = TextSizeProbeStore.getProbeList(); > assertEquals( 0, probeList.length ); >- IProbe probe0 = TextSizeProbeStore.getProbe( font0 ); >+ IProbe probe0 = TextSizeProbeStore.getProbe( fontData0 ); > assertNull( probe0 ); > > String probeText0 = "ProbeText0"; >- probe0 = TextSizeProbeStore.createProbe( font0, probeText0 ); >+ probe0 = TextSizeProbeStore.createProbe( fontData0, probeText0 ); > probeList = TextSizeProbeStore.getProbeList(); > assertEquals( 1, probeList.length ); > assertSame( probe0, probeList[ 0 ] ); >- assertSame( probe0, TextSizeProbeStore.getProbe( font0 ) ); >- assertTrue( TextSizeProbeStore.containsProbe( font0 ) ); >- assertSame( probe0.getFont(), font0 ); >+ assertSame( probe0, TextSizeProbeStore.getProbe( fontData0 ) ); >+ assertTrue( TextSizeProbeStore.containsProbe( fontData0 ) ); >+ assertSame( probe0.getFontData(), fontData0 ); > assertSame( probe0.getString(), probeText0 ); > > Font font1 = Graphics.getFont( "arial", 12, SWT.NORMAL ); >- assertFalse( TextSizeProbeStore.containsProbe( font1 ) ); >+ FontData fontData1 = font1.getFontData()[ 0 ]; >+ assertFalse( TextSizeProbeStore.containsProbe( fontData1 ) ); > > TextSizeProbeStore probeStore = TextSizeProbeStore.getInstance(); >- IProbeResult probeResult0 = probeStore.getProbeResult( font0 ); >+ IProbeResult probeResult0 = probeStore.getProbeResult( fontData0 ); > assertNull( probeResult0 ); > > Point probeSize0 = new Point( 10, 10 ); > probeResult0 = probeStore.createProbeResult( probe0, probeSize0 ); > assertSame( probeResult0.getProbe(), probe0 ); > assertSame( probeResult0.getSize(), probeSize0 ); >- assertTrue( probeStore.containsProbeResult( font0 ) ); >- assertFalse( probeStore.containsProbeResult( font1 ) ); >+ assertTrue( probeStore.containsProbeResult( fontData0 ) ); >+ assertFalse( probeStore.containsProbeResult( fontData1 ) ); > } > > public void testDefaultFontSizeStorage() throws IOException { > DefaultTextSizeStorage storage = new DefaultTextSizeStorage(); > Font font0 = Graphics.getFont( "arial", 10, SWT.NORMAL ); >+ FontData fontData0 = font0.getFontData()[ 0 ]; > Font font1 = Graphics.getFont( "helvetia", 12, SWT.NORMAL ); >- storage.storeFont( font0 ); >- storage.storeFont( font1 ); >+ FontData fontData1 = font1.getFontData()[ 0 ]; >+ storage.storeFont( fontData0 ); >+ storage.storeFont( fontData1 ); > > Point point0 = new Point( 9, 10 ); > Integer key0 = new Integer( 0 ); >@@ -252,17 +261,17 @@ > assertEquals( point0, actual ); > actual = storage.lookupTextSize( key1 ); > assertEquals( point1, actual ); >- Font[] fontList = storage.getFontList(); >- List fonts = Arrays.asList( fontList ); >- assertEquals( 2, fonts.size() ); >- assertTrue( fonts.contains( font0 ) ); >- assertTrue( fonts.contains( font1 ) ); >+ FontData[] fontDatas = storage.getFontList(); >+ assertEquals( 2, fontDatas.length ); >+ List fontDataList = Arrays.asList( fontDatas ); >+ assertTrue( fontDataList.contains( fontData0 ) ); >+ assertTrue( fontDataList.contains( fontData1 ) ); > } > > public void testStorageOverflow() { > DefaultTextSizeStorage storage = new DefaultTextSizeStorage(); > int storeSize = DefaultTextSizeStorage.MIN_STORE_SIZE; >- DefaultTextSizeStorage.setStoreSize( storeSize ); >+ storage.setStoreSize( storeSize ); > > for( int i = 0; i < storeSize - 1; i++ ) { > Integer key = new Integer( i ); >@@ -286,15 +295,16 @@ > } > > public void testTextSizeDatabaseKey() { >- final Font font = Graphics.getFont( "name", 10, SWT.NORMAL ); >+ Font font = Graphics.getFont( "name", 10, SWT.NORMAL ); >+ final FontData fontData = font.getFontData()[ 0 ]; > Set takenKeys = new HashSet(); > StringBuffer generatedText = new StringBuffer(); > for( int i = 0; i < 100; i++ ) { > generatedText.append( "a" ); > final String text = generatedText.toString(); > IProbe probe = new IProbe() { >- public Font getFont() { >- return font; >+ public FontData getFontData() { >+ return fontData; > } > public String getString() { > return text; >@@ -305,12 +315,12 @@ > }; > Point size = new Point( 1, 2 ); > TextSizeProbeStore.getInstance().createProbeResult( probe, size ); >- Integer key = TextSizeDataBase.getKey( font, text, -1 ); >+ Integer key = TextSizeDataBase.getKey( fontData, text, -1 ); > assertFalse( takenKeys.contains( key ) ); > takenKeys.add( key ); > } > } >- >+ > protected void setUp() throws Exception { > Fixture.setUp(); > TextSizeDataBase.reset(); >Index: src/org/eclipse/swt/widgets/Widget_Test.java >=================================================================== >RCS file: /cvsroot/rt/org.eclipse.rap/runtime.rwt.test/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/Widget_Test.java,v >retrieving revision 1.22 >diff -u -r1.22 Widget_Test.java >--- src/org/eclipse/swt/widgets/Widget_Test.java 29 Jan 2010 10:19:27 -0000 1.22 >+++ src/org/eclipse/swt/widgets/Widget_Test.java 29 Jan 2010 14:14:32 -0000 >@@ -413,7 +413,7 @@ > > public void testReskin() { > Fixture.fakePhase( PhaseId.PROCESS_ACTION ); >- final ArrayList log = new ArrayList(); >+ final java.util.List log = new ArrayList(); > Display display = new Display(); > Listener listener = new Listener() { > public void handleEvent( final Event event ) { >#P org.eclipse.rap.rwt.test.mockup >Index: src/org/eclipse/swt/internal/graphics/TextSizeDeterminationFacadeImpl.java >=================================================================== >RCS file: /cvsroot/rt/org.eclipse.rap/runtime.rwt.test/org.eclipse.rap.rwt.test.mockup/src/org/eclipse/swt/internal/graphics/TextSizeDeterminationFacadeImpl.java,v >retrieving revision 1.1 >diff -u -r1.1 TextSizeDeterminationFacadeImpl.java >--- src/org/eclipse/swt/internal/graphics/TextSizeDeterminationFacadeImpl.java 5 Dec 2008 10:57:25 -0000 1.1 >+++ src/org/eclipse/swt/internal/graphics/TextSizeDeterminationFacadeImpl.java 29 Jan 2010 14:14:34 -0000 >@@ -13,7 +13,7 @@ > > import java.io.IOException; > >-import org.eclipse.swt.graphics.Font; >+import org.eclipse.swt.graphics.FontData; > import org.eclipse.swt.internal.graphics.TextSizeDetermination.ICalculationItem; > import org.eclipse.swt.internal.graphics.TextSizeProbeStore.IProbe; > >@@ -38,7 +38,7 @@ > return new IProbe[ 0 ]; > } > >- public String createFontParamInternal( final Font font ) { >+ public String createFontParamInternal( final FontData font ) { > return null; > } > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 301249
: 157620