/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_svtools.hxx"

#define CTRLTOOL_CXX

#include <string.h>

#include <tools/debug.hxx>
#include <i18npool/mslangid.hxx>
#include <vcl/window.hxx>
#include <vcl/svapp.hxx>
#include <vcl/wrkwin.hxx>
#include <svtools/svtools.hrc>
#include <svtools/svtdata.hxx>
#include <svtools/ctrltool.hxx>

// =======================================================================

// Standard Fontgroessen fuer scalierbare Fonts
static long aStdSizeAry[] =
{
	 60,
	 70,
	 80,
	 90,
	100,
	105,
	110,
	120,
	130,
	140,
	150,
	160,
	180,
	200,
	220,
	240,
	260,
	280,
	320,
	360,
	400,
	440,
	480,
	540,
	600,
	660,
	720,
	800,
	880,
	960,
	0
};

// =======================================================================

// -----------------------------
// - class ImplFontListFonInfo -
// -----------------------------

class ImplFontListFontInfo : public FontInfo
{
	friend class FontList;

private:
	OutputDevice*			mpDevice;
	ImplFontListFontInfo*	mpNext;

public:
							ImplFontListFontInfo( const FontInfo& rInfo,
												  OutputDevice* pDev ) :
								FontInfo( rInfo )
							{
								mpDevice = pDev;
							}

	OutputDevice*			GetDevice() const { return mpDevice; }
};

// ------------------------------
// - class ImplFontListNameInfo -
// ------------------------------

class ImplFontListNameInfo
{
	friend class FontList;

private:
	XubString				maSearchName;
	ImplFontListFontInfo*	mpFirst;
	sal_uInt16					mnType;

							ImplFontListNameInfo( const XubString& rSearchName ) :
								maSearchName( rSearchName )
							{}

	const XubString&		GetSearchName() const { return maSearchName; }
};

// =======================================================================

static StringCompare ImplCompareFontInfo( ImplFontListFontInfo* pInfo1,
										  ImplFontListFontInfo* pInfo2 )
{
	if ( pInfo1->GetWeight() < pInfo2->GetWeight() )
		return COMPARE_LESS;
	else if ( pInfo1->GetWeight() > pInfo2->GetWeight() )
		return COMPARE_GREATER;

	if ( pInfo1->GetItalic() < pInfo2->GetItalic() )
		return COMPARE_LESS;
	else if ( pInfo1->GetItalic() > pInfo2->GetItalic() )
		return COMPARE_GREATER;

	return pInfo1->GetStyleName().CompareTo( pInfo2->GetStyleName() );
}

// =======================================================================

static void ImplMakeSearchString( XubString& rStr )
{
	rStr.ToLowerAscii();
}

// -----------------------------------------------------------------------

static void ImplMakeSearchStringFromName( XubString& rStr )
{
    // check for features before alternate font separator
    if (rStr.Search(':') < rStr.Search(';'))
        rStr = rStr.GetToken( 0, ':' );
    else
        rStr = rStr.GetToken( 0, ';' );
	ImplMakeSearchString( rStr );
}

// -----------------------------------------------------------------------

ImplFontListNameInfo* FontList::ImplFind( const XubString& rSearchName, sal_uLong* pIndex ) const
{
	// Wenn kein Eintrag in der Liste oder der Eintrag groesser ist als
	// der Letzte, dann hinten dranhaengen. Wir vergleichen erst mit dem
	// letzten Eintrag, da die Liste von VCL auch sortiert zurueckkommt
	// und somit die Wahrscheinlichkeit das hinten angehaengt werden muss
	// sehr gross ist.
	StringCompare eComp;
	sal_uLong nCnt = Count();
	if ( !nCnt )
	{
		if ( pIndex )
			*pIndex = LIST_APPEND;
		return NULL;
	}
	else
	{
		ImplFontListNameInfo* pCmpData = (ImplFontListNameInfo*)List::GetObject( nCnt-1 );
		eComp = rSearchName.CompareTo( pCmpData->maSearchName );
		if ( eComp == COMPARE_GREATER )
		{
			if ( pIndex )
				*pIndex = LIST_APPEND;
			return NULL;
		}
		else if ( eComp == COMPARE_EQUAL )
			return pCmpData;
	}

	// Fonts in der Liste suchen
	ImplFontListNameInfo*	pCompareData;
	ImplFontListNameInfo*	pFoundData = NULL;
	sal_uLong					nLow = 0;
	sal_uLong					nHigh = nCnt-1;
	sal_uLong					nMid;

	do
	{
		nMid = (nLow + nHigh) / 2;
		pCompareData = (ImplFontListNameInfo*)List::GetObject( nMid );
		eComp = rSearchName.CompareTo( pCompareData->maSearchName );
		if ( eComp == COMPARE_LESS )
		{
			if ( !nMid )
				break;
			nHigh = nMid-1;
		}
		else
		{
			if ( eComp == COMPARE_GREATER )
				nLow = nMid + 1;
			else
			{
				pFoundData = pCompareData;
				break;
			}
		}
	}
	while ( nLow <= nHigh );

	if ( pIndex )
	{
		eComp = rSearchName.CompareTo( pCompareData->maSearchName );
		if ( eComp == COMPARE_GREATER )
			*pIndex = (nMid+1);
		else
			*pIndex = nMid;
	}

	return pFoundData;
}

// -----------------------------------------------------------------------

ImplFontListNameInfo* FontList::ImplFindByName( const XubString& rStr ) const
{
	XubString aSearchName = rStr;
	ImplMakeSearchStringFromName( aSearchName );
	return ImplFind( aSearchName, NULL );
}

// -----------------------------------------------------------------------

void FontList::ImplInsertFonts( OutputDevice* pDevice, sal_Bool bAll,
								sal_Bool bInsertData )
{
	rtl_TextEncoding eSystemEncoding = gsl_getSystemTextEncoding();

	sal_uInt16 nType;
	if ( pDevice->GetOutDevType() != OUTDEV_PRINTER )
		nType = FONTLIST_FONTNAMETYPE_SCREEN;
	else
		nType = FONTLIST_FONTNAMETYPE_PRINTER;

	// Alle Fonts vom Device abfragen
	int n = pDevice->GetDevFontCount();
	sal_uInt16	i;
	for( i = 0; i < n; i++ )
	{
		FontInfo aFontInfo = pDevice->GetDevFont( i );

		// Wenn keine Raster-Schriften angezeigt werden sollen,
		// dann diese ignorieren
		if ( !bAll && (aFontInfo.GetType() == TYPE_RASTER) )
			continue;

		XubString				aSearchName = aFontInfo.GetName();
		ImplFontListNameInfo*	pData;
		sal_uLong					nIndex;
		ImplMakeSearchString( aSearchName );
		pData = ImplFind( aSearchName, &nIndex );

		if ( !pData )
		{
			if ( bInsertData )
			{
				ImplFontListFontInfo* pNewInfo = new ImplFontListFontInfo( aFontInfo, pDevice );
				pData = new ImplFontListNameInfo( aSearchName );
				pData->mpFirst		= pNewInfo;
				pNewInfo->mpNext	= NULL;
				pData->mnType		= 0;
				Insert( (void*)pData, nIndex );
			}
		}
		else
		{
			if ( bInsertData )
			{
				sal_Bool					bInsert = sal_True;
				ImplFontListFontInfo*	pPrev = NULL;
				ImplFontListFontInfo*	pTemp = pData->mpFirst;
				ImplFontListFontInfo*	pNewInfo = new ImplFontListFontInfo( aFontInfo, pDevice );
				while ( pTemp )
				{
					StringCompare eComp = ImplCompareFontInfo( pNewInfo, pTemp );
					if ( (eComp == COMPARE_LESS) || (eComp == COMPARE_EQUAL) )
					{
						if ( eComp == COMPARE_EQUAL )
						{
							// Overwrite charset, because charset should match
							// with the system charset
							if ( (pTemp->GetCharSet() != eSystemEncoding) &&
								 (pNewInfo->GetCharSet() == eSystemEncoding) )
							{
								ImplFontListFontInfo* pTemp2 = pTemp->mpNext;
								*((FontInfo*)pTemp) = *((FontInfo*)pNewInfo);
								pTemp->mpNext = pTemp2;
							}
							delete pNewInfo;
							bInsert = sal_False;
						}

						break;
					}

					pPrev = pTemp;
					pTemp = pTemp->mpNext;
				}

				if ( bInsert )
				{
					pNewInfo->mpNext = pTemp;
					if ( pPrev )
						pPrev->mpNext = pNewInfo;
					else
						pData->mpFirst = pNewInfo;
				}
			}
		}

		if ( pData )
		{
			pData->mnType |= nType;
			if ( aFontInfo.GetType() != TYPE_RASTER )
				pData->mnType |= FONTLIST_FONTNAMETYPE_SCALABLE;
		}
	}
}

// =======================================================================

FontList::FontList( OutputDevice* pDevice, OutputDevice* pDevice2, sal_Bool bAll ) :
	List( 4096, sal::static_int_cast< sal_uInt16 >(pDevice->GetDevFontCount()), 32 )
{
	// Variablen initialisieren
	mpDev = pDevice;
	mpDev2 = pDevice2;
	mpSizeAry = NULL;

	// Stylenamen festlegen
	maLight 		= XubString( SvtResId( STR_SVT_STYLE_LIGHT ) );
	maLightItalic	= XubString( SvtResId( STR_SVT_STYLE_LIGHT_ITALIC ) );
	maNormal		= XubString( SvtResId( STR_SVT_STYLE_NORMAL ) );
	maNormalItalic	= XubString( SvtResId( STR_SVT_STYLE_NORMAL_ITALIC ) );
	maBold			= XubString( SvtResId( STR_SVT_STYLE_BOLD ) );
	maBoldItalic	= XubString( SvtResId( STR_SVT_STYLE_BOLD_ITALIC ) );
	maBlack 		= XubString( SvtResId( STR_SVT_STYLE_BLACK ) );
	maBlackItalic	= XubString( SvtResId( STR_SVT_STYLE_BLACK_ITALIC ) );

	ImplInsertFonts( pDevice, bAll, sal_True );

	// Gegebenenfalls muessen wir mit den Bildschirmfonts vergleichen,
	// damit dort die eigentlich doppelten auf Equal mappen koennen
	sal_Bool bCompareWindow = sal_False;
	if ( !pDevice2 && (pDevice->GetOutDevType() == OUTDEV_PRINTER) )
	{
		bCompareWindow = sal_True;
		pDevice2 = Application::GetDefaultDevice();
	}

	if ( pDevice2 &&
		 (pDevice2->GetOutDevType() != pDevice->GetOutDevType()) )
		ImplInsertFonts( pDevice2, bAll, !bCompareWindow );
}

// -----------------------------------------------------------------------

FontList::~FontList()
{
	// Gegebenenfalls SizeArray loeschen
	if ( mpSizeAry )
		delete[] mpSizeAry;

	// FontInfos loeschen
	ImplFontListNameInfo* pData = (ImplFontListNameInfo*)First();
	while ( pData )
	{
		ImplFontListFontInfo* pTemp;
		ImplFontListFontInfo* pInfo = pData->mpFirst;
		while ( pInfo )
		{
			pTemp = pInfo->mpNext;
			delete pInfo;
			pInfo = pTemp;
		}
		ImplFontListNameInfo* pNext = (ImplFontListNameInfo*)Next();
		delete pData;
		pData = pNext;
	}
}
// -----------------------------------------------------------------------
FontList* FontList::Clone() const
{
    FontList* pReturn = new FontList(
            mpDev, mpDev2, GetFontNameCount() == mpDev->GetDevFontCount());
    return pReturn;
}            

// -----------------------------------------------------------------------

const XubString& FontList::GetStyleName( FontWeight eWeight, FontItalic eItalic ) const
{
	if ( eWeight > WEIGHT_BOLD )
	{
		if ( eItalic > ITALIC_NONE )
			return maBlackItalic;
		else
			return maBlack;
	}
	else if ( eWeight > WEIGHT_MEDIUM )
	{
		if ( eItalic > ITALIC_NONE )
			return maBoldItalic;
		else
			return maBold;
	}
	else if ( eWeight > WEIGHT_LIGHT )
	{
		if ( eItalic > ITALIC_NONE )
			return maNormalItalic;
		else
			return maNormal;
	}
	else if ( eWeight != WEIGHT_DONTKNOW )
	{
		if ( eItalic > ITALIC_NONE )
			return maLightItalic;
		else
			return maLight;
	}
	else
	{
		if ( eItalic > ITALIC_NONE )
			return maNormalItalic;
		else
			return maNormal;
	}
}

// -----------------------------------------------------------------------

XubString FontList::GetStyleName( const FontInfo& rInfo ) const
{
	XubString	aStyleName = rInfo.GetStyleName();
	FontWeight	eWeight = rInfo.GetWeight();
	FontItalic	eItalic = rInfo.GetItalic();

	// Nur wenn kein StyleName gesetzt ist, geben wir einen syntetischen
	// Namen zurueck
	if ( !aStyleName.Len() )
		aStyleName = GetStyleName( eWeight, eItalic );
	else
	{
		// Translate StyleName to localized name
		XubString aCompareStyleName = aStyleName;
		aCompareStyleName.ToLowerAscii();
		aCompareStyleName.EraseAllChars( ' ' );
		if ( aCompareStyleName.EqualsAscii( "bold" ) )
			aStyleName = maBold;
		else if ( aCompareStyleName.EqualsAscii( "bolditalic" ) )
			aStyleName = maBoldItalic;
		else if ( aCompareStyleName.EqualsAscii( "italic" ) )
			aStyleName = maNormalItalic;
		else if ( aCompareStyleName.EqualsAscii( "standard" ) )
			aStyleName = maNormal;
		else if ( aCompareStyleName.EqualsAscii( "regular" ) )
			aStyleName = maNormal;
		else if ( aCompareStyleName.EqualsAscii( "medium" ) )
			aStyleName = maNormal;
		else if ( aCompareStyleName.EqualsAscii( "light" ) )
			aStyleName = maLight;
		else if ( aCompareStyleName.EqualsAscii( "lightitalic" ) )
			aStyleName = maLightItalic;
		else if ( aCompareStyleName.EqualsAscii( "black" ) )
			aStyleName = maBlack;
		else if ( aCompareStyleName.EqualsAscii( "blackitalic" ) )
			aStyleName = maBlackItalic;

		// fix up StyleName, because the PS Printer driver from
		// W2000 returns wrong StyleNames (e.g. Bold instead of Bold Italic
		// for Helvetica)
		if ( eItalic > ITALIC_NONE )
		{
			if ( (aStyleName == maNormal) ||
				 (aStyleName == maBold) ||
				 (aStyleName == maLight) ||
				 (aStyleName == maBlack) )
				aStyleName = GetStyleName( eWeight, eItalic );
		}
	}

	return aStyleName;
}

// -----------------------------------------------------------------------

XubString FontList::GetFontMapText( const FontInfo& rInfo ) const
{
	if ( !rInfo.GetName().Len() )
	{
		XubString aEmptryStr;
		return aEmptryStr;
	}

	// Search Fontname
	ImplFontListNameInfo* pData = ImplFindByName( rInfo.GetName() );
	if ( !pData )
	{
		if ( !maMapNotAvailable.Len() )
			((FontList*)this)->maMapNotAvailable = XubString( SvtResId( STR_SVT_FONTMAP_NOTAVAILABLE ) );
		return maMapNotAvailable;
	}

	// search for synthetic style
	sal_uInt16				nType		= pData->mnType;
	const XubString&	rStyleName	= rInfo.GetStyleName();
	if ( rStyleName.Len() )
	{
		sal_Bool					bNotSynthetic = sal_False;
		sal_Bool					bNoneAvailable = sal_False;
		FontWeight				eWeight = rInfo.GetWeight();
		FontItalic				eItalic = rInfo.GetItalic();
		ImplFontListFontInfo*	pFontInfo = pData->mpFirst;
		while ( pFontInfo )
		{
			if ( (eWeight == pFontInfo->GetWeight()) &&
				 (eItalic == pFontInfo->GetItalic()) )
			{
				bNotSynthetic = sal_True;
				break;
			}

			pFontInfo = pFontInfo->mpNext;
		}

		if ( bNoneAvailable )
		{
			XubString aEmptryStr;
			return aEmptryStr;
		}
		else if ( !bNotSynthetic )
		{
			if ( !maMapStyleNotAvailable.Len() )
				((FontList*)this)->maMapStyleNotAvailable = XubString( SvtResId( STR_SVT_FONTMAP_STYLENOTAVAILABLE ) );
			return maMapStyleNotAvailable;
		}
	}

	/* Size not available not implemented yet
	if ( !(nType & FONTLIST_FONTNAMETYPE_SCALABLE) )
	{
		...
		{
			if ( !maMapSizeNotAvailable.Len() )
				 ((FontList*)this)->maMapSizeNotAvailable = XubString( SvtResId( STR_SVT_FONTMAP_SIZENOTAVAILABLE ) );
			return maMapSizeNotAvailable;
		}
	}
	*/

	// Only Printer-Font?
	if ( (nType & (FONTLIST_FONTNAMETYPE_PRINTER | FONTLIST_FONTNAMETYPE_SCREEN)) == FONTLIST_FONTNAMETYPE_PRINTER )
	{
		if ( !maMapPrinterOnly.Len() )
			((FontList*)this)->maMapPrinterOnly = XubString( SvtResId( STR_SVT_FONTMAP_PRINTERONLY ) );
		return maMapPrinterOnly;
	}
	// Only Screen-Font?
    else if ( (nType & (FONTLIST_FONTNAMETYPE_PRINTER | FONTLIST_FONTNAMETYPE_SCREEN)) == FONTLIST_FONTNAMETYPE_SCREEN 
            && rInfo.GetType() == TYPE_RASTER )
	{
		if ( !maMapScreenOnly.Len() )
			((FontList*)this)->maMapScreenOnly = XubString( SvtResId( STR_SVT_FONTMAP_SCREENONLY ) );
		return maMapScreenOnly;
	}
	else
	{
		if ( !maMapBoth.Len() )
			((FontList*)this)->maMapBoth = XubString( SvtResId( STR_SVT_FONTMAP_BOTH ) );
		return maMapBoth;
	}
}

// -----------------------------------------------------------------------

sal_uInt16 FontList::GetFontNameType( const XubString& rFontName ) const
{
	ImplFontListNameInfo* pData = ImplFindByName( rFontName );
	if ( pData )
		return pData->mnType;
	else
		return 0;
}

// -----------------------------------------------------------------------

FontInfo FontList::Get( const XubString& rName, const XubString& rStyleName ) const
{
	ImplFontListNameInfo* pData = ImplFindByName( rName );
	ImplFontListFontInfo* pFontInfo = NULL;
	ImplFontListFontInfo* pFontNameInfo = NULL;
	if ( pData )
	{
		ImplFontListFontInfo* pSearchInfo = pData->mpFirst;
		pFontNameInfo = pSearchInfo;
		pSearchInfo = pData->mpFirst;
		while ( pSearchInfo )
		{
			if ( rStyleName.EqualsIgnoreCaseAscii( GetStyleName( *pSearchInfo ) ) )
			{
				pFontInfo = pSearchInfo;
				break;
			}

			pSearchInfo = pSearchInfo->mpNext;
		}
	}

	// Konnten die Daten nicht gefunden werden, dann muessen bestimmte
	// Attribute nachgebildet werden
	FontInfo aInfo;
	if ( !pFontInfo )
	{
		if ( pFontNameInfo )
			aInfo = *pFontNameInfo;

		if ( rStyleName == maNormal )
		{
			aInfo.SetItalic( ITALIC_NONE );
			aInfo.SetWeight( WEIGHT_NORMAL );
		}
		else if ( rStyleName == maNormalItalic )
		{
			aInfo.SetItalic( ITALIC_NORMAL );
			aInfo.SetWeight( WEIGHT_NORMAL );
		}
		else if ( rStyleName == maBold )
		{
			aInfo.SetItalic( ITALIC_NONE );
			aInfo.SetWeight( WEIGHT_BOLD );
		}
		else if ( rStyleName == maBoldItalic )
		{
			aInfo.SetItalic( ITALIC_NORMAL );
			aInfo.SetWeight( WEIGHT_BOLD );
		}
		else if ( rStyleName == maLight )
		{
			aInfo.SetItalic( ITALIC_NONE );
			aInfo.SetWeight( WEIGHT_LIGHT );
		}
		else if ( rStyleName == maLightItalic )
		{
			aInfo.SetItalic( ITALIC_NORMAL );
			aInfo.SetWeight( WEIGHT_LIGHT );
		}
		else if ( rStyleName == maBlack )
		{
			aInfo.SetItalic( ITALIC_NONE );
			aInfo.SetWeight( WEIGHT_BLACK );
		}
		else if ( rStyleName == maBlackItalic )
		{
			aInfo.SetItalic( ITALIC_NORMAL );
			aInfo.SetWeight( WEIGHT_BLACK );
		}
		else
		{
			aInfo.SetItalic( ITALIC_NONE );
			aInfo.SetWeight( WEIGHT_DONTKNOW );
		}
	}
	else
		aInfo = *pFontInfo;

	// set Fontname to keep FontAlias
	aInfo.SetName( rName );
	aInfo.SetStyleName( rStyleName );

	return aInfo;
}

// -----------------------------------------------------------------------

FontInfo FontList::Get( const XubString& rName,
						FontWeight eWeight, FontItalic eItalic ) const
{
	ImplFontListNameInfo* pData = ImplFindByName( rName );
	ImplFontListFontInfo* pFontInfo = NULL;
	ImplFontListFontInfo* pFontNameInfo = NULL;
	if ( pData )
	{
		ImplFontListFontInfo* pSearchInfo = pData->mpFirst;
		pFontNameInfo = pSearchInfo;
		while ( pSearchInfo )
		{
			if ( (eWeight == pSearchInfo->GetWeight()) &&
				 (eItalic == pSearchInfo->GetItalic()) )
			{
				pFontInfo = pSearchInfo;
				break;
			}

			pSearchInfo = pSearchInfo->mpNext;
		}
	}

	// Konnten die Daten nicht gefunden werden, dann muessen bestimmte
	// Attribute nachgebildet werden
	FontInfo aInfo;
	if ( !pFontInfo )
	{
		// Falls der Fontname stimmt, uebernehmen wir soviel wie moeglich
		if ( pFontNameInfo )
		{
			aInfo = *pFontNameInfo;
			aInfo.SetStyleName( XubString() );
		}

		aInfo.SetWeight( eWeight );
		aInfo.SetItalic( eItalic );
	}
	else
		aInfo = *pFontInfo;

	// set Fontname to keep FontAlias
	aInfo.SetName( rName );

	return aInfo;
}

// -----------------------------------------------------------------------

sal_Bool FontList::IsAvailable( const XubString& rName ) const
{
	return (ImplFindByName( rName ) != 0);
}

// -----------------------------------------------------------------------

const FontInfo& FontList::GetFontName( sal_uInt16 nFont ) const
{
	DBG_ASSERT( nFont < GetFontNameCount(), "FontList::GetFontName(): nFont >= Count" );

	ImplFontListNameInfo* pData = (ImplFontListNameInfo*)List::GetObject( nFont );
	return *(pData->mpFirst);
}

// -----------------------------------------------------------------------

sal_uInt16 FontList::GetFontNameType( sal_uInt16 nFont ) const
{
	DBG_ASSERT( nFont < GetFontNameCount(), "FontList::GetFontNameType(): nFont >= Count" );

	ImplFontListNameInfo* pData = (ImplFontListNameInfo*)List::GetObject( nFont );
	return pData->mnType;
}

// -----------------------------------------------------------------------

sal_Handle FontList::GetFirstFontInfo( const XubString& rName ) const
{
	ImplFontListNameInfo* pData = ImplFindByName( rName );
	if ( !pData )
		return (sal_Handle)NULL;
	else
		return (sal_Handle)pData->mpFirst;
}

// -----------------------------------------------------------------------

sal_Handle FontList::GetNextFontInfo( sal_Handle hFontInfo ) const
{
	ImplFontListFontInfo* pInfo = (ImplFontListFontInfo*)(void*)hFontInfo;
	return (sal_Handle)(pInfo->mpNext);
}

// -----------------------------------------------------------------------

const FontInfo& FontList::GetFontInfo( sal_Handle hFontInfo ) const
{
	ImplFontListFontInfo* pInfo = (ImplFontListFontInfo*)(void*)hFontInfo;
	return *pInfo;
}

// -----------------------------------------------------------------------

const long* FontList::GetSizeAry( const FontInfo& rInfo ) const
{
	// Size-Array vorher loeschen
	if ( mpSizeAry )
	{
		delete[] ((FontList*)this)->mpSizeAry;
		((FontList*)this)->mpSizeAry = NULL;
	}

	// Falls kein Name, dann Standardgroessen
	if ( !rInfo.GetName().Len() )
		return aStdSizeAry;

	// Zuerst nach dem Fontnamen suchen um das Device dann von dem
	// entsprechenden Font zu nehmen
	OutputDevice*			pDevice = mpDev;
	ImplFontListNameInfo*	pData = ImplFindByName( rInfo.GetName() );
	if ( pData )
		pDevice = pData->mpFirst->GetDevice();

	int nDevSizeCount = pDevice->GetDevFontSizeCount( rInfo );
	if ( !nDevSizeCount ||
		 (pDevice->GetDevFontSize( rInfo, 0 ).Height() == 0) )
		return aStdSizeAry;

	MapMode aOldMapMode = pDevice->GetMapMode();
	MapMode aMap( MAP_10TH_INCH, Point(), Fraction( 1, 72 ), Fraction( 1, 72 ) );
	pDevice->SetMapMode( aMap );

	sal_uInt16	i;
	sal_uInt16	nRealCount = 0;
	long	nOldHeight = 0;
	((FontList*)this)->mpSizeAry = new long[nDevSizeCount+1];
	for ( i = 0; i < nDevSizeCount; i++ )
	{
		Size aSize = pDevice->GetDevFontSize( rInfo, i );
		if ( aSize.Height() != nOldHeight )
		{
			nOldHeight = aSize.Height();
			((FontList*)this)->mpSizeAry[nRealCount] = nOldHeight;
			nRealCount++;
		}
	}
	((FontList*)this)->mpSizeAry[nRealCount] = 0;

	pDevice->SetMapMode( aOldMapMode );
	return mpSizeAry;
}

// -----------------------------------------------------------------------

const long* FontList::GetStdSizeAry()
{
	return aStdSizeAry;
}

// =======================================================================

// ---------------------------------
// - FontSizeNames & FsizeNameItem -
// ---------------------------------

struct ImplFSNameItem
{
	long		mnSize;
	const char* mszUtf8Name;
};

//------------------------------------------------------------------------

static ImplFSNameItem aImplSimplifiedChinese[] =
{
	{  50, "\xe5\x85\xab\xe5\x8f\xb7" },
	{  55, "\xe4\xb8\x83\xe5\x8f\xb7" },
	{  65, "\xe5\xb0\x8f\xe5\x85\xad" },
	{  75, "\xe5\x85\xad\xe5\x8f\xb7" },
	{  90, "\xe5\xb0\x8f\xe4\xba\x94" },
	{ 105, "\xe4\xba\x94\xe5\x8f\xb7" },
	{ 120, "\xe5\xb0\x8f\xe5\x9b\x9b" },
	{ 140, "\xe5\x9b\x9b\xe5\x8f\xb7" },
	{ 150, "\xe5\xb0\x8f\xe4\xb8\x89" },
	{ 160, "\xe4\xb8\x89\xe5\x8f\xb7" },
	{ 180, "\xe5\xb0\x8f\xe4\xba\x8c" },
	{ 220, "\xe4\xba\x8c\xe5\x8f\xb7" },
	{ 240, "\xe5\xb0\x8f\xe4\xb8\x80" },
	{ 260, "\xe4\xb8\x80\xe5\x8f\xb7" },
	{ 360, "\xe5\xb0\x8f\xe5\x88\x9d" },
	{ 420, "\xe5\x88\x9d\xe5\x8f\xb7" }
};

// -----------------------------------------------------------------------

#if 0 // #i89077# disabled by popular request
static ImplFSNameItem aImplTraditionalChinese[] =
{
	{  50, "\xe5\x85\xab\xe8\x99\x9f" },
	{  55, "\xe4\xb8\x83\xe8\x99\x9f" },
	{  65, "\xe5\xb0\x8f\xe5\x85\xad" },
	{  75, "\xe5\x85\xad\xe8\x99\x9f" },
	{  90, "\xe5\xb0\x8f\xe4\xba\x94" },
	{ 105, "\xe4\xba\x94\xe8\x99\x9f" },
	{ 120, "\xe5\xb0\x8f\xe5\x9b\x9b" },
	{ 140, "\xe5\x9b\x9b\xe8\x99\x9f" },
	{ 150, "\xe5\xb0\x8f\xe4\xb8\x89" },
	{ 160, "\xe4\xb8\x89\xe8\x99\x9f" },
	{ 180, "\xe5\xb0\x8f\xe4\xba\x8c" },
	{ 220, "\xe4\xba\x8c\xe8\x99\x9f" },
	{ 240, "\xe5\xb0\x8f\xe4\xb8\x80" },
	{ 260, "\xe4\xb8\x80\xe8\x99\x9f" },
	{ 360, "\xe5\xb0\x8f\xe5\x88\x9d" },
	{ 420, "\xe5\x88\x9d\xe8\x99\x9f" }
};
#endif

//------------------------------------------------------------------------

FontSizeNames::FontSizeNames( LanguageType eLanguage )
{
	if ( eLanguage == LANGUAGE_DONTKNOW )
		eLanguage = Application::GetSettings().GetUILanguage();
	if ( eLanguage == LANGUAGE_SYSTEM )
		eLanguage = MsLangId::getSystemUILanguage();

	switch( eLanguage )
	{
		case LANGUAGE_CHINESE:
		case LANGUAGE_CHINESE_SIMPLIFIED:
			mpArray = aImplSimplifiedChinese;
			mnElem = sizeof(aImplSimplifiedChinese) / sizeof(aImplSimplifiedChinese[0]);
			break;

#if 0 // #i89077# disabled by popular request
		case LANGUAGE_CHINESE_HONGKONG:
		case LANGUAGE_CHINESE_SINGAPORE:
		case LANGUAGE_CHINESE_MACAU:
		case LANGUAGE_CHINESE_TRADITIONAL:
			mpArray = aImplTraditionalChinese;
			mnElem = sizeof(aImplTraditionalChinese) / sizeof(aImplTraditionalChinese[0]);
			break;
#endif
			
		default:
			mpArray = NULL;
			mnElem = 0;
			break;
	};
}

//------------------------------------------------------------------------

long FontSizeNames::Name2Size( const String& rName ) const
{
	if ( mnElem )
	{
		ByteString aName( rName, RTL_TEXTENCODING_UTF8 );

		// linear search is sufficient for this rare case
		for( long i = mnElem; --i >= 0; )
			if ( aName == mpArray[i].mszUtf8Name )
				return mpArray[i].mnSize;
	}

	return 0;
}

//------------------------------------------------------------------------

String FontSizeNames::Size2Name( long nValue ) const
{
	String aStr;

	// binary search
	for( long lower = 0, upper = mnElem - 1; lower <= upper; )
	{
		long mid = (upper + lower) >> 1;
		if ( nValue == mpArray[mid].mnSize )
		{
			aStr = String( mpArray[mid].mszUtf8Name, RTL_TEXTENCODING_UTF8 );
			break;
		}
		else if ( nValue < mpArray[mid].mnSize )
			upper = mid - 1;
		else /* ( nValue > mpArray[mid].mnSize ) */
			lower = mid + 1;
	}

	return aStr;
}

//------------------------------------------------------------------------

String FontSizeNames::GetIndexName( sal_uLong nIndex ) const
{
	String aStr;

	if ( nIndex < mnElem )
		aStr = String( mpArray[nIndex].mszUtf8Name, RTL_TEXTENCODING_UTF8 );

	return aStr;
}

//------------------------------------------------------------------------

long FontSizeNames::GetIndexSize( sal_uLong nIndex ) const
{
	if ( nIndex >= mnElem )
		return 0;
	return mpArray[nIndex].mnSize;
}
