blob: 40237398575a0ac87b63804f9ab645bd168d1bc4 [file] [log] [blame]
/**************************************************************
*
* 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 );
}