/**************************************************************
 *
 * 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"

#include <string.h>
#include <vcl/svapp.hxx>
#include <vcl/i18nhelp.hxx>
#include <svtools/ctrltool.hxx>
#include <svtools/stdmenu.hxx>

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

FontNameMenu::FontNameMenu()
{
	SetMenuFlags( GetMenuFlags() | MENU_FLAG_NOAUTOMNEMONICS );
}

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

FontNameMenu::~FontNameMenu()
{
}

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

void FontNameMenu::Select()
{
	maCurName = GetItemText( GetCurItemId() );
	maSelectHdl.Call( this );
}

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

void FontNameMenu::Highlight()
{
	XubString aTempName = maCurName;
	maCurName = GetItemText( GetCurItemId() );
	maHighlightHdl.Call( this );
	maCurName = aTempName;
}

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

void FontNameMenu::Fill( const FontList* pList )
{
    // clear menu
	Clear();

    // add fonts
    const vcl::I18nHelper& rI18nHelper = Application::GetSettings().GetUILocaleI18nHelper();
    // more than 100 fonts reduces the speed of opening the menu.
    // So only the first 100 fonts will be displayed.
    sal_uInt16 nFontCount = ::std::min( pList->GetFontNameCount(), static_cast< sal_uInt16 >(100) );
	for ( sal_uInt16 i = 0; i < nFontCount; i++ )
	{
		const XubString& rName = pList->GetFontName( i ).GetName();

        // sort with the I18nHelper
		sal_uInt16 j = GetItemCount();
		while ( j )
		{
			XubString aText = GetItemText( GetItemId( j-1 ) );
			if ( rI18nHelper.CompareString( rName, aText ) > 0 )
				break;
			j--;
		}
		InsertItem( i+1, rName, MIB_RADIOCHECK | MIB_AUTOCHECK, j );
	}

	SetCurName( maCurName );
}

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

void FontNameMenu::SetCurName( const XubString& rName )
{
	maCurName = rName;

	// Menueintrag checken
	sal_uInt16 nChecked = 0;
	sal_uInt16 nItemCount = GetItemCount();
	for( sal_uInt16 i = 0; i < nItemCount; i++ )
	{
		sal_uInt16 nItemId = GetItemId( i );

		if ( IsItemChecked( nItemId ) )
			nChecked = nItemId;

		XubString aText = GetItemText( nItemId );
		if ( aText == maCurName )
		{
			CheckItem( nItemId, sal_True );
			return;
		}
	}

	if ( nChecked )
		CheckItem( nChecked, sal_False );
}

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

FontStyleMenu::FontStyleMenu()
{
	SetMenuFlags( GetMenuFlags() | MENU_FLAG_NOAUTOMNEMONICS );
}

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

FontStyleMenu::~FontStyleMenu()
{
}

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

void FontStyleMenu::Select()
{
	sal_uInt16 nCurId = GetCurItemId();

	if ( (nCurId >= FONTSTYLEMENU_FIRSTID) && (nCurId <= FONTSTYLEMENU_LASTID) )
	{
		maCurStyle = GetItemText( nCurId );
		maSelectHdl.Call( this );
	}
	else
		PopupMenu::Select();
}

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

void FontStyleMenu::Highlight()
{
	sal_uInt16 nCurId = GetCurItemId();

	if ( (nCurId >= FONTSTYLEMENU_FIRSTID) && (nCurId <= FONTSTYLEMENU_LASTID) )
	{
		XubString aTempName = maCurStyle;
		maCurStyle = GetItemText( nCurId );
		maHighlightHdl.Call( this );
		maCurStyle = aTempName;
	}
	else
		PopupMenu::Highlight();
}

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

sal_Bool FontStyleMenu::ImplIsAlreadyInserted( const XubString& rStyleName, sal_uInt16 nCount )
{
	for ( sal_uInt16 i = 0; i < nCount; i++ )
	{
		if ( GetItemText( i+FONTSTYLEMENU_FIRSTID ) == rStyleName )
			return sal_True;
	}

	return sal_False;
}

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

void FontStyleMenu::Fill( const XubString& rName, const FontList* pList )
{
	sal_uInt16 nItemId = GetItemId( 0 );
	while ( (nItemId >= FONTSTYLEMENU_FIRSTID) &&
			(nItemId <= FONTSTYLEMENU_LASTID) )
	{
		RemoveItem( 0 );
		nItemId = GetItemId( 0 );
	}

	// Existiert ein Font mit diesem Namen
	sal_Handle hFontInfo = pList->GetFirstFontInfo( rName );
	if ( hFontInfo )
	{
		XubString	aStyleText;
		sal_uInt16		nPos = 0;
		sal_uInt16		nId = FONTSTYLEMENU_FIRSTID;
		FontWeight	eLastWeight = WEIGHT_DONTKNOW;
		FontItalic	eLastItalic = ITALIC_NONE;
		FontWidth	eLastWidth = WIDTH_DONTKNOW;
		sal_Bool		bNormal = sal_False;
		sal_Bool		bItalic = sal_False;
		sal_Bool		bBold = sal_False;
		sal_Bool		bBoldItalic = sal_False;
		sal_Bool		bInsert = sal_False;
		FontInfo	aInfo;
		while ( hFontInfo )
		{
			aInfo = pList->GetFontInfo( hFontInfo );

			FontWeight	eWeight = aInfo.GetWeight();
			FontItalic	eItalic = aInfo.GetItalic();
			FontWidth	eWidth = aInfo.GetWidthType();
			// Only if the attributes are different, we insert the
			// Font to avoid double Entries in different languages
			if ( (eWeight != eLastWeight) || (eItalic != eLastItalic) ||
				 (eWidth != eLastWidth) )
			{
				if ( bInsert )
				{
					InsertItem( nId, aStyleText,
								MIB_RADIOCHECK | MIB_AUTOCHECK, nPos );
					nPos++;
					nId++;
				}

				if ( eWeight <= WEIGHT_NORMAL )
				{
					if ( eItalic != ITALIC_NONE )
						bItalic = sal_True;
					else
						bNormal = sal_True;
				}
				else
				{
					if ( eItalic != ITALIC_NONE )
						bBoldItalic = sal_True;
					else
						bBold = sal_True;
				}

				// For wrong StyleNames we replace this with the correct once
				aStyleText = pList->GetStyleName( aInfo );
				bInsert = !ImplIsAlreadyInserted( aStyleText, nPos );
				if ( !bInsert )
				{
					aStyleText = pList->GetStyleName( eWeight, eItalic );
					bInsert = !ImplIsAlreadyInserted( aStyleText, nPos );
				}

				eLastWeight = eWeight;
				eLastItalic = eItalic;
				eLastWidth = eWidth;
			}
			else
			{
				if ( bInsert )
				{
					// If we have two names for the same attributes
					// we prefer the translated standard names
					const XubString& rAttrStyleText = pList->GetStyleName( eWeight, eItalic );
					if ( rAttrStyleText != aStyleText )
					{
						XubString aTempStyleText = pList->GetStyleName( aInfo );
						if ( rAttrStyleText == aTempStyleText )
							aStyleText = rAttrStyleText;
						bInsert = !ImplIsAlreadyInserted( aStyleText, nPos );
					}
				}
			}

			if ( !bItalic && (aStyleText == pList->GetItalicStr()) )
				bItalic = sal_True;
			else if ( !bBold && (aStyleText == pList->GetBoldStr()) )
				bBold = sal_True;
			else if ( !bBoldItalic && (aStyleText == pList->GetBoldItalicStr()) )
				bBoldItalic = sal_True;

			hFontInfo = pList->GetNextFontInfo( hFontInfo );
		}

		if ( bInsert )
		{
			InsertItem( nId, aStyleText,
						MIB_RADIOCHECK | MIB_AUTOCHECK, nPos );
			nPos++;
			nId++;
		}

		// Bestimmte Styles als Nachbildung
		if ( bNormal )
		{
			if ( !bItalic )
			{
				InsertItem( nId, pList->GetItalicStr(),
							MIB_RADIOCHECK | MIB_AUTOCHECK, nPos );
				nPos++;
				nId++;
			}
			if ( !bBold )
			{
				InsertItem( nId, pList->GetBoldStr(),
							MIB_RADIOCHECK | MIB_AUTOCHECK, nPos );
				nPos++;
				nId++;
			}
		}
		if ( !bBoldItalic )
		{
			if ( bNormal || bItalic || bBold )
			{
				InsertItem( nId, pList->GetBoldItalicStr(),
							MIB_RADIOCHECK | MIB_AUTOCHECK, nPos );
				nPos++;
				nId++;
			}
		}
	}
	else
	{
		// Wenn Font nicht, dann Standard-Styles einfuegen
		InsertItem( FONTSTYLEMENU_FIRSTID,	 pList->GetNormalStr(),
					MIB_RADIOCHECK | MIB_AUTOCHECK, 0 );
		InsertItem( FONTSTYLEMENU_FIRSTID+1, pList->GetItalicStr(),
					MIB_RADIOCHECK | MIB_AUTOCHECK, 0 );
		InsertItem( FONTSTYLEMENU_FIRSTID+2, pList->GetBoldStr(),
					MIB_RADIOCHECK | MIB_AUTOCHECK, 0 );
		InsertItem( FONTSTYLEMENU_FIRSTID+3, pList->GetBoldItalicStr(),
					MIB_RADIOCHECK | MIB_AUTOCHECK, 0 );
	}

	SetCurStyle( maCurStyle );
}

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

void FontStyleMenu::SetCurStyle( const XubString& rStyle )
{
	maCurStyle = rStyle;

	// Menueintrag checken
	sal_uInt16 nChecked = 0;
	sal_uInt16 nItemCount = GetItemCount();
	for( sal_uInt16 i = 0; i < nItemCount; i++ )
	{
		sal_uInt16 nItemId = GetItemId( i );

		if ( (nItemId < FONTSTYLEMENU_FIRSTID) ||
			 (nItemId > FONTSTYLEMENU_LASTID) )
			break;

		if ( IsItemChecked( nItemId ) )
			nChecked = nItemId;

		XubString aText = GetItemText( nItemId );
		if ( aText == maCurStyle )
		{
			CheckItem( nItemId, sal_True );
			return;
		}
	}

	if ( nChecked )
		CheckItem( nChecked, sal_False );
}

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

FontSizeMenu::FontSizeMenu()
:    mpHeightAry( NULL )
,    mnCurHeight( 100 )
{
	SetMenuFlags( GetMenuFlags() | MENU_FLAG_NOAUTOMNEMONICS );
}

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

FontSizeMenu::~FontSizeMenu()
{
	if ( mpHeightAry )
		delete[] mpHeightAry;
}

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

void FontSizeMenu::Select()
{
	const sal_uInt16 nCurItemId = GetCurItemId();
	mnCurHeight = mpHeightAry[ nCurItemId - 1 ];
	maSelectHdl.Call( this );
}

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

void FontSizeMenu::Highlight()
{
	const long nTempHeight = mnCurHeight;
	const sal_uInt16 nCurItemId = GetCurItemId();
	if ( !nCurItemId )
		mnCurHeight = 0;
	else
	{
		//sal_Int32 nValue = GetItemText( nCurItemId ).ToInt32();
		mnCurHeight = mpHeightAry[ nCurItemId - 1 ];
	}
	maHighlightHdl.Call( this );
	mnCurHeight = nTempHeight;
}

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

void FontSizeMenu::Fill( const FontInfo& rInfo, const FontList* pList )
{
	Clear();

	// setup font size array
	if ( mpHeightAry )
		delete[] mpHeightAry;

	const long* pTempAry;
	const long* pAry = pList->GetSizeAry( rInfo );
	sal_uInt16 nSizeCount = 0;
	while ( pAry[nSizeCount] )
		nSizeCount++;

	sal_uInt16 nPos = 0;

	// first insert font size names (for simplified/traditional chinese)
    FontSizeNames aFontSizeNames( Application::GetSettings().GetUILanguage() );
	mpHeightAry = new long[nSizeCount+aFontSizeNames.Count()];
	if ( !aFontSizeNames.IsEmpty() )
	{
		if ( pAry == pList->GetStdSizeAry() )
		{
			// for scalable fonts all font size names
			sal_uLong nCount = aFontSizeNames.Count();
			for( sal_uLong i = 0; i < nCount; i++ )
			{
				String	aSizeName = aFontSizeNames.GetIndexName( i );
				long	nSize = aFontSizeNames.GetIndexSize( i );
				mpHeightAry[nPos] = nSize;
				nPos++; // Id is nPos+1
				InsertItem( nPos, aSizeName, MIB_RADIOCHECK | MIB_AUTOCHECK );
			}
		}
		else
		{
			// for fixed size fonts only selectable font size names
			pTempAry = pAry;
			while ( *pTempAry )
			{
				String aSizeName = aFontSizeNames.Size2Name( *pTempAry );
				if ( aSizeName.Len() )
				{
					mpHeightAry[nPos] = *pTempAry;
					nPos++; // Id is nPos+1
					InsertItem( nPos, aSizeName, MIB_RADIOCHECK | MIB_AUTOCHECK );
				}
				pTempAry++;
			}
		}
	}

	// then insert numerical font size values
    const vcl::I18nHelper& rI18nHelper = Application::GetSettings().GetUILocaleI18nHelper();
	pTempAry = pAry;
	while ( *pTempAry )
	{
		mpHeightAry[nPos] = *pTempAry;
		nPos++; // Id is nPos+1
		InsertItem( nPos, rI18nHelper.GetNum( *pTempAry, 1, sal_True, sal_False ), MIB_RADIOCHECK | MIB_AUTOCHECK );
		pTempAry++;
	}

	SetCurHeight( mnCurHeight );
}

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

void FontSizeMenu::SetCurHeight( long nHeight )
{
	mnCurHeight = nHeight;

	// check menue item
	XubString	aHeight = Application::GetSettings().GetUILocaleI18nHelper().GetNum( nHeight, 1, sal_True, sal_False  );
	sal_uInt16		nChecked = 0;
	sal_uInt16		nItemCount = GetItemCount();
	for( sal_uInt16 i = 0; i < nItemCount; i++ )
	{
		sal_uInt16 nItemId = GetItemId( i );

		if ( mpHeightAry[i] == nHeight )
		{
			CheckItem( nItemId, sal_True );
			return;
		}

		if ( IsItemChecked( nItemId ) )
			nChecked = nItemId;
	}

	if ( nChecked )
		CheckItem( nChecked, sal_False );
}
