| /************************************************************** |
| * |
| * 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; |
| } |