1*5900e8ecSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*5900e8ecSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*5900e8ecSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*5900e8ecSAndrew Rist * distributed with this work for additional information 6*5900e8ecSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*5900e8ecSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*5900e8ecSAndrew Rist * "License"); you may not use this file except in compliance 9*5900e8ecSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*5900e8ecSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*5900e8ecSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*5900e8ecSAndrew Rist * software distributed under the License is distributed on an 15*5900e8ecSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*5900e8ecSAndrew Rist * KIND, either express or implied. See the License for the 17*5900e8ecSAndrew Rist * specific language governing permissions and limitations 18*5900e8ecSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*5900e8ecSAndrew Rist *************************************************************/ 21*5900e8ecSAndrew Rist 22*5900e8ecSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_svtools.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #define CTRLTOOL_CXX 28cdf0e10cSrcweir 29cdf0e10cSrcweir #include <string.h> 30cdf0e10cSrcweir 31cdf0e10cSrcweir #include <tools/debug.hxx> 32cdf0e10cSrcweir #include <i18npool/mslangid.hxx> 33cdf0e10cSrcweir #include <vcl/window.hxx> 34cdf0e10cSrcweir #include <vcl/svapp.hxx> 35cdf0e10cSrcweir #include <vcl/wrkwin.hxx> 36cdf0e10cSrcweir #include <svtools/svtools.hrc> 37cdf0e10cSrcweir #include <svtools/svtdata.hxx> 38cdf0e10cSrcweir #include <svtools/ctrltool.hxx> 39cdf0e10cSrcweir 40cdf0e10cSrcweir // ======================================================================= 41cdf0e10cSrcweir 42cdf0e10cSrcweir // Standard Fontgroessen fuer scalierbare Fonts 43cdf0e10cSrcweir static long aStdSizeAry[] = 44cdf0e10cSrcweir { 45cdf0e10cSrcweir 60, 46cdf0e10cSrcweir 70, 47cdf0e10cSrcweir 80, 48cdf0e10cSrcweir 90, 49cdf0e10cSrcweir 100, 50cdf0e10cSrcweir 105, 51cdf0e10cSrcweir 110, 52cdf0e10cSrcweir 120, 53cdf0e10cSrcweir 130, 54cdf0e10cSrcweir 140, 55cdf0e10cSrcweir 150, 56cdf0e10cSrcweir 160, 57cdf0e10cSrcweir 180, 58cdf0e10cSrcweir 200, 59cdf0e10cSrcweir 220, 60cdf0e10cSrcweir 240, 61cdf0e10cSrcweir 260, 62cdf0e10cSrcweir 280, 63cdf0e10cSrcweir 320, 64cdf0e10cSrcweir 360, 65cdf0e10cSrcweir 400, 66cdf0e10cSrcweir 440, 67cdf0e10cSrcweir 480, 68cdf0e10cSrcweir 540, 69cdf0e10cSrcweir 600, 70cdf0e10cSrcweir 660, 71cdf0e10cSrcweir 720, 72cdf0e10cSrcweir 800, 73cdf0e10cSrcweir 880, 74cdf0e10cSrcweir 960, 75cdf0e10cSrcweir 0 76cdf0e10cSrcweir }; 77cdf0e10cSrcweir 78cdf0e10cSrcweir // ======================================================================= 79cdf0e10cSrcweir 80cdf0e10cSrcweir // ----------------------------- 81cdf0e10cSrcweir // - class ImplFontListFonInfo - 82cdf0e10cSrcweir // ----------------------------- 83cdf0e10cSrcweir 84cdf0e10cSrcweir class ImplFontListFontInfo : public FontInfo 85cdf0e10cSrcweir { 86cdf0e10cSrcweir friend class FontList; 87cdf0e10cSrcweir 88cdf0e10cSrcweir private: 89cdf0e10cSrcweir OutputDevice* mpDevice; 90cdf0e10cSrcweir ImplFontListFontInfo* mpNext; 91cdf0e10cSrcweir 92cdf0e10cSrcweir public: 93cdf0e10cSrcweir ImplFontListFontInfo( const FontInfo& rInfo, 94cdf0e10cSrcweir OutputDevice* pDev ) : 95cdf0e10cSrcweir FontInfo( rInfo ) 96cdf0e10cSrcweir { 97cdf0e10cSrcweir mpDevice = pDev; 98cdf0e10cSrcweir } 99cdf0e10cSrcweir 100cdf0e10cSrcweir OutputDevice* GetDevice() const { return mpDevice; } 101cdf0e10cSrcweir }; 102cdf0e10cSrcweir 103cdf0e10cSrcweir // ------------------------------ 104cdf0e10cSrcweir // - class ImplFontListNameInfo - 105cdf0e10cSrcweir // ------------------------------ 106cdf0e10cSrcweir 107cdf0e10cSrcweir class ImplFontListNameInfo 108cdf0e10cSrcweir { 109cdf0e10cSrcweir friend class FontList; 110cdf0e10cSrcweir 111cdf0e10cSrcweir private: 112cdf0e10cSrcweir XubString maSearchName; 113cdf0e10cSrcweir ImplFontListFontInfo* mpFirst; 114cdf0e10cSrcweir sal_uInt16 mnType; 115cdf0e10cSrcweir 116cdf0e10cSrcweir ImplFontListNameInfo( const XubString& rSearchName ) : 117cdf0e10cSrcweir maSearchName( rSearchName ) 118cdf0e10cSrcweir {} 119cdf0e10cSrcweir 120cdf0e10cSrcweir const XubString& GetSearchName() const { return maSearchName; } 121cdf0e10cSrcweir }; 122cdf0e10cSrcweir 123cdf0e10cSrcweir // ======================================================================= 124cdf0e10cSrcweir 125cdf0e10cSrcweir static StringCompare ImplCompareFontInfo( ImplFontListFontInfo* pInfo1, 126cdf0e10cSrcweir ImplFontListFontInfo* pInfo2 ) 127cdf0e10cSrcweir { 128cdf0e10cSrcweir if ( pInfo1->GetWeight() < pInfo2->GetWeight() ) 129cdf0e10cSrcweir return COMPARE_LESS; 130cdf0e10cSrcweir else if ( pInfo1->GetWeight() > pInfo2->GetWeight() ) 131cdf0e10cSrcweir return COMPARE_GREATER; 132cdf0e10cSrcweir 133cdf0e10cSrcweir if ( pInfo1->GetItalic() < pInfo2->GetItalic() ) 134cdf0e10cSrcweir return COMPARE_LESS; 135cdf0e10cSrcweir else if ( pInfo1->GetItalic() > pInfo2->GetItalic() ) 136cdf0e10cSrcweir return COMPARE_GREATER; 137cdf0e10cSrcweir 138cdf0e10cSrcweir return pInfo1->GetStyleName().CompareTo( pInfo2->GetStyleName() ); 139cdf0e10cSrcweir } 140cdf0e10cSrcweir 141cdf0e10cSrcweir // ======================================================================= 142cdf0e10cSrcweir 143cdf0e10cSrcweir static void ImplMakeSearchString( XubString& rStr ) 144cdf0e10cSrcweir { 145cdf0e10cSrcweir rStr.ToLowerAscii(); 146cdf0e10cSrcweir } 147cdf0e10cSrcweir 148cdf0e10cSrcweir // ----------------------------------------------------------------------- 149cdf0e10cSrcweir 150cdf0e10cSrcweir static void ImplMakeSearchStringFromName( XubString& rStr ) 151cdf0e10cSrcweir { 152cdf0e10cSrcweir // check for features before alternate font separator 153cdf0e10cSrcweir if (rStr.Search(':') < rStr.Search(';')) 154cdf0e10cSrcweir rStr = rStr.GetToken( 0, ':' ); 155cdf0e10cSrcweir else 156cdf0e10cSrcweir rStr = rStr.GetToken( 0, ';' ); 157cdf0e10cSrcweir ImplMakeSearchString( rStr ); 158cdf0e10cSrcweir } 159cdf0e10cSrcweir 160cdf0e10cSrcweir // ----------------------------------------------------------------------- 161cdf0e10cSrcweir 162cdf0e10cSrcweir ImplFontListNameInfo* FontList::ImplFind( const XubString& rSearchName, sal_uLong* pIndex ) const 163cdf0e10cSrcweir { 164cdf0e10cSrcweir // Wenn kein Eintrag in der Liste oder der Eintrag groesser ist als 165cdf0e10cSrcweir // der Letzte, dann hinten dranhaengen. Wir vergleichen erst mit dem 166cdf0e10cSrcweir // letzten Eintrag, da die Liste von VCL auch sortiert zurueckkommt 167cdf0e10cSrcweir // und somit die Wahrscheinlichkeit das hinten angehaengt werden muss 168cdf0e10cSrcweir // sehr gross ist. 169cdf0e10cSrcweir StringCompare eComp; 170cdf0e10cSrcweir sal_uLong nCnt = Count(); 171cdf0e10cSrcweir if ( !nCnt ) 172cdf0e10cSrcweir { 173cdf0e10cSrcweir if ( pIndex ) 174cdf0e10cSrcweir *pIndex = LIST_APPEND; 175cdf0e10cSrcweir return NULL; 176cdf0e10cSrcweir } 177cdf0e10cSrcweir else 178cdf0e10cSrcweir { 179cdf0e10cSrcweir ImplFontListNameInfo* pCmpData = (ImplFontListNameInfo*)List::GetObject( nCnt-1 ); 180cdf0e10cSrcweir eComp = rSearchName.CompareTo( pCmpData->maSearchName ); 181cdf0e10cSrcweir if ( eComp == COMPARE_GREATER ) 182cdf0e10cSrcweir { 183cdf0e10cSrcweir if ( pIndex ) 184cdf0e10cSrcweir *pIndex = LIST_APPEND; 185cdf0e10cSrcweir return NULL; 186cdf0e10cSrcweir } 187cdf0e10cSrcweir else if ( eComp == COMPARE_EQUAL ) 188cdf0e10cSrcweir return pCmpData; 189cdf0e10cSrcweir } 190cdf0e10cSrcweir 191cdf0e10cSrcweir // Fonts in der Liste suchen 192cdf0e10cSrcweir ImplFontListNameInfo* pCompareData; 193cdf0e10cSrcweir ImplFontListNameInfo* pFoundData = NULL; 194cdf0e10cSrcweir sal_uLong nLow = 0; 195cdf0e10cSrcweir sal_uLong nHigh = nCnt-1; 196cdf0e10cSrcweir sal_uLong nMid; 197cdf0e10cSrcweir 198cdf0e10cSrcweir do 199cdf0e10cSrcweir { 200cdf0e10cSrcweir nMid = (nLow + nHigh) / 2; 201cdf0e10cSrcweir pCompareData = (ImplFontListNameInfo*)List::GetObject( nMid ); 202cdf0e10cSrcweir eComp = rSearchName.CompareTo( pCompareData->maSearchName ); 203cdf0e10cSrcweir if ( eComp == COMPARE_LESS ) 204cdf0e10cSrcweir { 205cdf0e10cSrcweir if ( !nMid ) 206cdf0e10cSrcweir break; 207cdf0e10cSrcweir nHigh = nMid-1; 208cdf0e10cSrcweir } 209cdf0e10cSrcweir else 210cdf0e10cSrcweir { 211cdf0e10cSrcweir if ( eComp == COMPARE_GREATER ) 212cdf0e10cSrcweir nLow = nMid + 1; 213cdf0e10cSrcweir else 214cdf0e10cSrcweir { 215cdf0e10cSrcweir pFoundData = pCompareData; 216cdf0e10cSrcweir break; 217cdf0e10cSrcweir } 218cdf0e10cSrcweir } 219cdf0e10cSrcweir } 220cdf0e10cSrcweir while ( nLow <= nHigh ); 221cdf0e10cSrcweir 222cdf0e10cSrcweir if ( pIndex ) 223cdf0e10cSrcweir { 224cdf0e10cSrcweir eComp = rSearchName.CompareTo( pCompareData->maSearchName ); 225cdf0e10cSrcweir if ( eComp == COMPARE_GREATER ) 226cdf0e10cSrcweir *pIndex = (nMid+1); 227cdf0e10cSrcweir else 228cdf0e10cSrcweir *pIndex = nMid; 229cdf0e10cSrcweir } 230cdf0e10cSrcweir 231cdf0e10cSrcweir return pFoundData; 232cdf0e10cSrcweir } 233cdf0e10cSrcweir 234cdf0e10cSrcweir // ----------------------------------------------------------------------- 235cdf0e10cSrcweir 236cdf0e10cSrcweir ImplFontListNameInfo* FontList::ImplFindByName( const XubString& rStr ) const 237cdf0e10cSrcweir { 238cdf0e10cSrcweir XubString aSearchName = rStr; 239cdf0e10cSrcweir ImplMakeSearchStringFromName( aSearchName ); 240cdf0e10cSrcweir return ImplFind( aSearchName, NULL ); 241cdf0e10cSrcweir } 242cdf0e10cSrcweir 243cdf0e10cSrcweir // ----------------------------------------------------------------------- 244cdf0e10cSrcweir 245cdf0e10cSrcweir void FontList::ImplInsertFonts( OutputDevice* pDevice, sal_Bool bAll, 246cdf0e10cSrcweir sal_Bool bInsertData ) 247cdf0e10cSrcweir { 248cdf0e10cSrcweir rtl_TextEncoding eSystemEncoding = gsl_getSystemTextEncoding(); 249cdf0e10cSrcweir 250cdf0e10cSrcweir sal_uInt16 nType; 251cdf0e10cSrcweir if ( pDevice->GetOutDevType() != OUTDEV_PRINTER ) 252cdf0e10cSrcweir nType = FONTLIST_FONTNAMETYPE_SCREEN; 253cdf0e10cSrcweir else 254cdf0e10cSrcweir nType = FONTLIST_FONTNAMETYPE_PRINTER; 255cdf0e10cSrcweir 256cdf0e10cSrcweir // Alle Fonts vom Device abfragen 257cdf0e10cSrcweir int n = pDevice->GetDevFontCount(); 258cdf0e10cSrcweir sal_uInt16 i; 259cdf0e10cSrcweir for( i = 0; i < n; i++ ) 260cdf0e10cSrcweir { 261cdf0e10cSrcweir FontInfo aFontInfo = pDevice->GetDevFont( i ); 262cdf0e10cSrcweir 263cdf0e10cSrcweir // Wenn keine Raster-Schriften angezeigt werden sollen, 264cdf0e10cSrcweir // dann diese ignorieren 265cdf0e10cSrcweir if ( !bAll && (aFontInfo.GetType() == TYPE_RASTER) ) 266cdf0e10cSrcweir continue; 267cdf0e10cSrcweir 268cdf0e10cSrcweir XubString aSearchName = aFontInfo.GetName(); 269cdf0e10cSrcweir ImplFontListNameInfo* pData; 270cdf0e10cSrcweir sal_uLong nIndex; 271cdf0e10cSrcweir ImplMakeSearchString( aSearchName ); 272cdf0e10cSrcweir pData = ImplFind( aSearchName, &nIndex ); 273cdf0e10cSrcweir 274cdf0e10cSrcweir if ( !pData ) 275cdf0e10cSrcweir { 276cdf0e10cSrcweir if ( bInsertData ) 277cdf0e10cSrcweir { 278cdf0e10cSrcweir ImplFontListFontInfo* pNewInfo = new ImplFontListFontInfo( aFontInfo, pDevice ); 279cdf0e10cSrcweir pData = new ImplFontListNameInfo( aSearchName ); 280cdf0e10cSrcweir pData->mpFirst = pNewInfo; 281cdf0e10cSrcweir pNewInfo->mpNext = NULL; 282cdf0e10cSrcweir pData->mnType = 0; 283cdf0e10cSrcweir Insert( (void*)pData, nIndex ); 284cdf0e10cSrcweir } 285cdf0e10cSrcweir } 286cdf0e10cSrcweir else 287cdf0e10cSrcweir { 288cdf0e10cSrcweir if ( bInsertData ) 289cdf0e10cSrcweir { 290cdf0e10cSrcweir sal_Bool bInsert = sal_True; 291cdf0e10cSrcweir ImplFontListFontInfo* pPrev = NULL; 292cdf0e10cSrcweir ImplFontListFontInfo* pTemp = pData->mpFirst; 293cdf0e10cSrcweir ImplFontListFontInfo* pNewInfo = new ImplFontListFontInfo( aFontInfo, pDevice ); 294cdf0e10cSrcweir while ( pTemp ) 295cdf0e10cSrcweir { 296cdf0e10cSrcweir StringCompare eComp = ImplCompareFontInfo( pNewInfo, pTemp ); 297cdf0e10cSrcweir if ( (eComp == COMPARE_LESS) || (eComp == COMPARE_EQUAL) ) 298cdf0e10cSrcweir { 299cdf0e10cSrcweir if ( eComp == COMPARE_EQUAL ) 300cdf0e10cSrcweir { 301cdf0e10cSrcweir // Overwrite charset, because charset should match 302cdf0e10cSrcweir // with the system charset 303cdf0e10cSrcweir if ( (pTemp->GetCharSet() != eSystemEncoding) && 304cdf0e10cSrcweir (pNewInfo->GetCharSet() == eSystemEncoding) ) 305cdf0e10cSrcweir { 306cdf0e10cSrcweir ImplFontListFontInfo* pTemp2 = pTemp->mpNext; 307cdf0e10cSrcweir *((FontInfo*)pTemp) = *((FontInfo*)pNewInfo); 308cdf0e10cSrcweir pTemp->mpNext = pTemp2; 309cdf0e10cSrcweir } 310cdf0e10cSrcweir delete pNewInfo; 311cdf0e10cSrcweir bInsert = sal_False; 312cdf0e10cSrcweir } 313cdf0e10cSrcweir 314cdf0e10cSrcweir break; 315cdf0e10cSrcweir } 316cdf0e10cSrcweir 317cdf0e10cSrcweir pPrev = pTemp; 318cdf0e10cSrcweir pTemp = pTemp->mpNext; 319cdf0e10cSrcweir } 320cdf0e10cSrcweir 321cdf0e10cSrcweir if ( bInsert ) 322cdf0e10cSrcweir { 323cdf0e10cSrcweir pNewInfo->mpNext = pTemp; 324cdf0e10cSrcweir if ( pPrev ) 325cdf0e10cSrcweir pPrev->mpNext = pNewInfo; 326cdf0e10cSrcweir else 327cdf0e10cSrcweir pData->mpFirst = pNewInfo; 328cdf0e10cSrcweir } 329cdf0e10cSrcweir } 330cdf0e10cSrcweir } 331cdf0e10cSrcweir 332cdf0e10cSrcweir if ( pData ) 333cdf0e10cSrcweir { 334cdf0e10cSrcweir pData->mnType |= nType; 335cdf0e10cSrcweir if ( aFontInfo.GetType() != TYPE_RASTER ) 336cdf0e10cSrcweir pData->mnType |= FONTLIST_FONTNAMETYPE_SCALABLE; 337cdf0e10cSrcweir } 338cdf0e10cSrcweir } 339cdf0e10cSrcweir } 340cdf0e10cSrcweir 341cdf0e10cSrcweir // ======================================================================= 342cdf0e10cSrcweir 343cdf0e10cSrcweir FontList::FontList( OutputDevice* pDevice, OutputDevice* pDevice2, sal_Bool bAll ) : 344cdf0e10cSrcweir List( 4096, sal::static_int_cast< sal_uInt16 >(pDevice->GetDevFontCount()), 32 ) 345cdf0e10cSrcweir { 346cdf0e10cSrcweir // Variablen initialisieren 347cdf0e10cSrcweir mpDev = pDevice; 348cdf0e10cSrcweir mpDev2 = pDevice2; 349cdf0e10cSrcweir mpSizeAry = NULL; 350cdf0e10cSrcweir 351cdf0e10cSrcweir // Stylenamen festlegen 352cdf0e10cSrcweir maLight = XubString( SvtResId( STR_SVT_STYLE_LIGHT ) ); 353cdf0e10cSrcweir maLightItalic = XubString( SvtResId( STR_SVT_STYLE_LIGHT_ITALIC ) ); 354cdf0e10cSrcweir maNormal = XubString( SvtResId( STR_SVT_STYLE_NORMAL ) ); 355cdf0e10cSrcweir maNormalItalic = XubString( SvtResId( STR_SVT_STYLE_NORMAL_ITALIC ) ); 356cdf0e10cSrcweir maBold = XubString( SvtResId( STR_SVT_STYLE_BOLD ) ); 357cdf0e10cSrcweir maBoldItalic = XubString( SvtResId( STR_SVT_STYLE_BOLD_ITALIC ) ); 358cdf0e10cSrcweir maBlack = XubString( SvtResId( STR_SVT_STYLE_BLACK ) ); 359cdf0e10cSrcweir maBlackItalic = XubString( SvtResId( STR_SVT_STYLE_BLACK_ITALIC ) ); 360cdf0e10cSrcweir 361cdf0e10cSrcweir ImplInsertFonts( pDevice, bAll, sal_True ); 362cdf0e10cSrcweir 363cdf0e10cSrcweir // Gegebenenfalls muessen wir mit den Bildschirmfonts vergleichen, 364cdf0e10cSrcweir // damit dort die eigentlich doppelten auf Equal mappen koennen 365cdf0e10cSrcweir sal_Bool bCompareWindow = sal_False; 366cdf0e10cSrcweir if ( !pDevice2 && (pDevice->GetOutDevType() == OUTDEV_PRINTER) ) 367cdf0e10cSrcweir { 368cdf0e10cSrcweir bCompareWindow = sal_True; 369cdf0e10cSrcweir pDevice2 = Application::GetDefaultDevice(); 370cdf0e10cSrcweir } 371cdf0e10cSrcweir 372cdf0e10cSrcweir if ( pDevice2 && 373cdf0e10cSrcweir (pDevice2->GetOutDevType() != pDevice->GetOutDevType()) ) 374cdf0e10cSrcweir ImplInsertFonts( pDevice2, bAll, !bCompareWindow ); 375cdf0e10cSrcweir } 376cdf0e10cSrcweir 377cdf0e10cSrcweir // ----------------------------------------------------------------------- 378cdf0e10cSrcweir 379cdf0e10cSrcweir FontList::~FontList() 380cdf0e10cSrcweir { 381cdf0e10cSrcweir // Gegebenenfalls SizeArray loeschen 382cdf0e10cSrcweir if ( mpSizeAry ) 383cdf0e10cSrcweir delete[] mpSizeAry; 384cdf0e10cSrcweir 385cdf0e10cSrcweir // FontInfos loeschen 386cdf0e10cSrcweir ImplFontListNameInfo* pData = (ImplFontListNameInfo*)First(); 387cdf0e10cSrcweir while ( pData ) 388cdf0e10cSrcweir { 389cdf0e10cSrcweir ImplFontListFontInfo* pTemp; 390cdf0e10cSrcweir ImplFontListFontInfo* pInfo = pData->mpFirst; 391cdf0e10cSrcweir while ( pInfo ) 392cdf0e10cSrcweir { 393cdf0e10cSrcweir pTemp = pInfo->mpNext; 394cdf0e10cSrcweir delete pInfo; 395cdf0e10cSrcweir pInfo = pTemp; 396cdf0e10cSrcweir } 397cdf0e10cSrcweir ImplFontListNameInfo* pNext = (ImplFontListNameInfo*)Next(); 398cdf0e10cSrcweir delete pData; 399cdf0e10cSrcweir pData = pNext; 400cdf0e10cSrcweir } 401cdf0e10cSrcweir } 402cdf0e10cSrcweir // ----------------------------------------------------------------------- 403cdf0e10cSrcweir FontList* FontList::Clone() const 404cdf0e10cSrcweir { 405cdf0e10cSrcweir FontList* pReturn = new FontList( 406cdf0e10cSrcweir mpDev, mpDev2, GetFontNameCount() == mpDev->GetDevFontCount()); 407cdf0e10cSrcweir return pReturn; 408cdf0e10cSrcweir } 409cdf0e10cSrcweir 410cdf0e10cSrcweir // ----------------------------------------------------------------------- 411cdf0e10cSrcweir 412cdf0e10cSrcweir const XubString& FontList::GetStyleName( FontWeight eWeight, FontItalic eItalic ) const 413cdf0e10cSrcweir { 414cdf0e10cSrcweir if ( eWeight > WEIGHT_BOLD ) 415cdf0e10cSrcweir { 416cdf0e10cSrcweir if ( eItalic > ITALIC_NONE ) 417cdf0e10cSrcweir return maBlackItalic; 418cdf0e10cSrcweir else 419cdf0e10cSrcweir return maBlack; 420cdf0e10cSrcweir } 421cdf0e10cSrcweir else if ( eWeight > WEIGHT_MEDIUM ) 422cdf0e10cSrcweir { 423cdf0e10cSrcweir if ( eItalic > ITALIC_NONE ) 424cdf0e10cSrcweir return maBoldItalic; 425cdf0e10cSrcweir else 426cdf0e10cSrcweir return maBold; 427cdf0e10cSrcweir } 428cdf0e10cSrcweir else if ( eWeight > WEIGHT_LIGHT ) 429cdf0e10cSrcweir { 430cdf0e10cSrcweir if ( eItalic > ITALIC_NONE ) 431cdf0e10cSrcweir return maNormalItalic; 432cdf0e10cSrcweir else 433cdf0e10cSrcweir return maNormal; 434cdf0e10cSrcweir } 435cdf0e10cSrcweir else if ( eWeight != WEIGHT_DONTKNOW ) 436cdf0e10cSrcweir { 437cdf0e10cSrcweir if ( eItalic > ITALIC_NONE ) 438cdf0e10cSrcweir return maLightItalic; 439cdf0e10cSrcweir else 440cdf0e10cSrcweir return maLight; 441cdf0e10cSrcweir } 442cdf0e10cSrcweir else 443cdf0e10cSrcweir { 444cdf0e10cSrcweir if ( eItalic > ITALIC_NONE ) 445cdf0e10cSrcweir return maNormalItalic; 446cdf0e10cSrcweir else 447cdf0e10cSrcweir return maNormal; 448cdf0e10cSrcweir } 449cdf0e10cSrcweir } 450cdf0e10cSrcweir 451cdf0e10cSrcweir // ----------------------------------------------------------------------- 452cdf0e10cSrcweir 453cdf0e10cSrcweir XubString FontList::GetStyleName( const FontInfo& rInfo ) const 454cdf0e10cSrcweir { 455cdf0e10cSrcweir XubString aStyleName = rInfo.GetStyleName(); 456cdf0e10cSrcweir FontWeight eWeight = rInfo.GetWeight(); 457cdf0e10cSrcweir FontItalic eItalic = rInfo.GetItalic(); 458cdf0e10cSrcweir 459cdf0e10cSrcweir // Nur wenn kein StyleName gesetzt ist, geben wir einen syntetischen 460cdf0e10cSrcweir // Namen zurueck 461cdf0e10cSrcweir if ( !aStyleName.Len() ) 462cdf0e10cSrcweir aStyleName = GetStyleName( eWeight, eItalic ); 463cdf0e10cSrcweir else 464cdf0e10cSrcweir { 465cdf0e10cSrcweir // Translate StyleName to localized name 466cdf0e10cSrcweir XubString aCompareStyleName = aStyleName; 467cdf0e10cSrcweir aCompareStyleName.ToLowerAscii(); 468cdf0e10cSrcweir aCompareStyleName.EraseAllChars( ' ' ); 469cdf0e10cSrcweir if ( aCompareStyleName.EqualsAscii( "bold" ) ) 470cdf0e10cSrcweir aStyleName = maBold; 471cdf0e10cSrcweir else if ( aCompareStyleName.EqualsAscii( "bolditalic" ) ) 472cdf0e10cSrcweir aStyleName = maBoldItalic; 473cdf0e10cSrcweir else if ( aCompareStyleName.EqualsAscii( "italic" ) ) 474cdf0e10cSrcweir aStyleName = maNormalItalic; 475cdf0e10cSrcweir else if ( aCompareStyleName.EqualsAscii( "standard" ) ) 476cdf0e10cSrcweir aStyleName = maNormal; 477cdf0e10cSrcweir else if ( aCompareStyleName.EqualsAscii( "regular" ) ) 478cdf0e10cSrcweir aStyleName = maNormal; 479cdf0e10cSrcweir else if ( aCompareStyleName.EqualsAscii( "medium" ) ) 480cdf0e10cSrcweir aStyleName = maNormal; 481cdf0e10cSrcweir else if ( aCompareStyleName.EqualsAscii( "light" ) ) 482cdf0e10cSrcweir aStyleName = maLight; 483cdf0e10cSrcweir else if ( aCompareStyleName.EqualsAscii( "lightitalic" ) ) 484cdf0e10cSrcweir aStyleName = maLightItalic; 485cdf0e10cSrcweir else if ( aCompareStyleName.EqualsAscii( "black" ) ) 486cdf0e10cSrcweir aStyleName = maBlack; 487cdf0e10cSrcweir else if ( aCompareStyleName.EqualsAscii( "blackitalic" ) ) 488cdf0e10cSrcweir aStyleName = maBlackItalic; 489cdf0e10cSrcweir 490cdf0e10cSrcweir // fix up StyleName, because the PS Printer driver from 491cdf0e10cSrcweir // W2000 returns wrong StyleNames (e.g. Bold instead of Bold Italic 492cdf0e10cSrcweir // for Helvetica) 493cdf0e10cSrcweir if ( eItalic > ITALIC_NONE ) 494cdf0e10cSrcweir { 495cdf0e10cSrcweir if ( (aStyleName == maNormal) || 496cdf0e10cSrcweir (aStyleName == maBold) || 497cdf0e10cSrcweir (aStyleName == maLight) || 498cdf0e10cSrcweir (aStyleName == maBlack) ) 499cdf0e10cSrcweir aStyleName = GetStyleName( eWeight, eItalic ); 500cdf0e10cSrcweir } 501cdf0e10cSrcweir } 502cdf0e10cSrcweir 503cdf0e10cSrcweir return aStyleName; 504cdf0e10cSrcweir } 505cdf0e10cSrcweir 506cdf0e10cSrcweir // ----------------------------------------------------------------------- 507cdf0e10cSrcweir 508cdf0e10cSrcweir XubString FontList::GetFontMapText( const FontInfo& rInfo ) const 509cdf0e10cSrcweir { 510cdf0e10cSrcweir if ( !rInfo.GetName().Len() ) 511cdf0e10cSrcweir { 512cdf0e10cSrcweir XubString aEmptryStr; 513cdf0e10cSrcweir return aEmptryStr; 514cdf0e10cSrcweir } 515cdf0e10cSrcweir 516cdf0e10cSrcweir // Search Fontname 517cdf0e10cSrcweir ImplFontListNameInfo* pData = ImplFindByName( rInfo.GetName() ); 518cdf0e10cSrcweir if ( !pData ) 519cdf0e10cSrcweir { 520cdf0e10cSrcweir if ( !maMapNotAvailable.Len() ) 521cdf0e10cSrcweir ((FontList*)this)->maMapNotAvailable = XubString( SvtResId( STR_SVT_FONTMAP_NOTAVAILABLE ) ); 522cdf0e10cSrcweir return maMapNotAvailable; 523cdf0e10cSrcweir } 524cdf0e10cSrcweir 525cdf0e10cSrcweir // search for synthetic style 526cdf0e10cSrcweir sal_uInt16 nType = pData->mnType; 527cdf0e10cSrcweir const XubString& rStyleName = rInfo.GetStyleName(); 528cdf0e10cSrcweir if ( rStyleName.Len() ) 529cdf0e10cSrcweir { 530cdf0e10cSrcweir sal_Bool bNotSynthetic = sal_False; 531cdf0e10cSrcweir sal_Bool bNoneAvailable = sal_False; 532cdf0e10cSrcweir FontWeight eWeight = rInfo.GetWeight(); 533cdf0e10cSrcweir FontItalic eItalic = rInfo.GetItalic(); 534cdf0e10cSrcweir ImplFontListFontInfo* pFontInfo = pData->mpFirst; 535cdf0e10cSrcweir while ( pFontInfo ) 536cdf0e10cSrcweir { 537cdf0e10cSrcweir if ( (eWeight == pFontInfo->GetWeight()) && 538cdf0e10cSrcweir (eItalic == pFontInfo->GetItalic()) ) 539cdf0e10cSrcweir { 540cdf0e10cSrcweir bNotSynthetic = sal_True; 541cdf0e10cSrcweir break; 542cdf0e10cSrcweir } 543cdf0e10cSrcweir 544cdf0e10cSrcweir pFontInfo = pFontInfo->mpNext; 545cdf0e10cSrcweir } 546cdf0e10cSrcweir 547cdf0e10cSrcweir if ( bNoneAvailable ) 548cdf0e10cSrcweir { 549cdf0e10cSrcweir XubString aEmptryStr; 550cdf0e10cSrcweir return aEmptryStr; 551cdf0e10cSrcweir } 552cdf0e10cSrcweir else if ( !bNotSynthetic ) 553cdf0e10cSrcweir { 554cdf0e10cSrcweir if ( !maMapStyleNotAvailable.Len() ) 555cdf0e10cSrcweir ((FontList*)this)->maMapStyleNotAvailable = XubString( SvtResId( STR_SVT_FONTMAP_STYLENOTAVAILABLE ) ); 556cdf0e10cSrcweir return maMapStyleNotAvailable; 557cdf0e10cSrcweir } 558cdf0e10cSrcweir } 559cdf0e10cSrcweir 560cdf0e10cSrcweir /* Size not available not implemented yet 561cdf0e10cSrcweir if ( !(nType & FONTLIST_FONTNAMETYPE_SCALABLE) ) 562cdf0e10cSrcweir { 563cdf0e10cSrcweir ... 564cdf0e10cSrcweir { 565cdf0e10cSrcweir if ( !maMapSizeNotAvailable.Len() ) 566cdf0e10cSrcweir ((FontList*)this)->maMapSizeNotAvailable = XubString( SvtResId( STR_SVT_FONTMAP_SIZENOTAVAILABLE ) ); 567cdf0e10cSrcweir return maMapSizeNotAvailable; 568cdf0e10cSrcweir } 569cdf0e10cSrcweir } 570cdf0e10cSrcweir */ 571cdf0e10cSrcweir 572cdf0e10cSrcweir // Only Printer-Font? 573cdf0e10cSrcweir if ( (nType & (FONTLIST_FONTNAMETYPE_PRINTER | FONTLIST_FONTNAMETYPE_SCREEN)) == FONTLIST_FONTNAMETYPE_PRINTER ) 574cdf0e10cSrcweir { 575cdf0e10cSrcweir if ( !maMapPrinterOnly.Len() ) 576cdf0e10cSrcweir ((FontList*)this)->maMapPrinterOnly = XubString( SvtResId( STR_SVT_FONTMAP_PRINTERONLY ) ); 577cdf0e10cSrcweir return maMapPrinterOnly; 578cdf0e10cSrcweir } 579cdf0e10cSrcweir // Only Screen-Font? 580cdf0e10cSrcweir else if ( (nType & (FONTLIST_FONTNAMETYPE_PRINTER | FONTLIST_FONTNAMETYPE_SCREEN)) == FONTLIST_FONTNAMETYPE_SCREEN 581cdf0e10cSrcweir && rInfo.GetType() == TYPE_RASTER ) 582cdf0e10cSrcweir { 583cdf0e10cSrcweir if ( !maMapScreenOnly.Len() ) 584cdf0e10cSrcweir ((FontList*)this)->maMapScreenOnly = XubString( SvtResId( STR_SVT_FONTMAP_SCREENONLY ) ); 585cdf0e10cSrcweir return maMapScreenOnly; 586cdf0e10cSrcweir } 587cdf0e10cSrcweir else 588cdf0e10cSrcweir { 589cdf0e10cSrcweir if ( !maMapBoth.Len() ) 590cdf0e10cSrcweir ((FontList*)this)->maMapBoth = XubString( SvtResId( STR_SVT_FONTMAP_BOTH ) ); 591cdf0e10cSrcweir return maMapBoth; 592cdf0e10cSrcweir } 593cdf0e10cSrcweir } 594cdf0e10cSrcweir 595cdf0e10cSrcweir // ----------------------------------------------------------------------- 596cdf0e10cSrcweir 597cdf0e10cSrcweir sal_uInt16 FontList::GetFontNameType( const XubString& rFontName ) const 598cdf0e10cSrcweir { 599cdf0e10cSrcweir ImplFontListNameInfo* pData = ImplFindByName( rFontName ); 600cdf0e10cSrcweir if ( pData ) 601cdf0e10cSrcweir return pData->mnType; 602cdf0e10cSrcweir else 603cdf0e10cSrcweir return 0; 604cdf0e10cSrcweir } 605cdf0e10cSrcweir 606cdf0e10cSrcweir // ----------------------------------------------------------------------- 607cdf0e10cSrcweir 608cdf0e10cSrcweir FontInfo FontList::Get( const XubString& rName, const XubString& rStyleName ) const 609cdf0e10cSrcweir { 610cdf0e10cSrcweir ImplFontListNameInfo* pData = ImplFindByName( rName ); 611cdf0e10cSrcweir ImplFontListFontInfo* pFontInfo = NULL; 612cdf0e10cSrcweir ImplFontListFontInfo* pFontNameInfo = NULL; 613cdf0e10cSrcweir if ( pData ) 614cdf0e10cSrcweir { 615cdf0e10cSrcweir ImplFontListFontInfo* pSearchInfo = pData->mpFirst; 616cdf0e10cSrcweir pFontNameInfo = pSearchInfo; 617cdf0e10cSrcweir pSearchInfo = pData->mpFirst; 618cdf0e10cSrcweir while ( pSearchInfo ) 619cdf0e10cSrcweir { 620cdf0e10cSrcweir if ( rStyleName.EqualsIgnoreCaseAscii( GetStyleName( *pSearchInfo ) ) ) 621cdf0e10cSrcweir { 622cdf0e10cSrcweir pFontInfo = pSearchInfo; 623cdf0e10cSrcweir break; 624cdf0e10cSrcweir } 625cdf0e10cSrcweir 626cdf0e10cSrcweir pSearchInfo = pSearchInfo->mpNext; 627cdf0e10cSrcweir } 628cdf0e10cSrcweir } 629cdf0e10cSrcweir 630cdf0e10cSrcweir // Konnten die Daten nicht gefunden werden, dann muessen bestimmte 631cdf0e10cSrcweir // Attribute nachgebildet werden 632cdf0e10cSrcweir FontInfo aInfo; 633cdf0e10cSrcweir if ( !pFontInfo ) 634cdf0e10cSrcweir { 635cdf0e10cSrcweir if ( pFontNameInfo ) 636cdf0e10cSrcweir aInfo = *pFontNameInfo; 637cdf0e10cSrcweir 638cdf0e10cSrcweir if ( rStyleName == maNormal ) 639cdf0e10cSrcweir { 640cdf0e10cSrcweir aInfo.SetItalic( ITALIC_NONE ); 641cdf0e10cSrcweir aInfo.SetWeight( WEIGHT_NORMAL ); 642cdf0e10cSrcweir } 643cdf0e10cSrcweir else if ( rStyleName == maNormalItalic ) 644cdf0e10cSrcweir { 645cdf0e10cSrcweir aInfo.SetItalic( ITALIC_NORMAL ); 646cdf0e10cSrcweir aInfo.SetWeight( WEIGHT_NORMAL ); 647cdf0e10cSrcweir } 648cdf0e10cSrcweir else if ( rStyleName == maBold ) 649cdf0e10cSrcweir { 650cdf0e10cSrcweir aInfo.SetItalic( ITALIC_NONE ); 651cdf0e10cSrcweir aInfo.SetWeight( WEIGHT_BOLD ); 652cdf0e10cSrcweir } 653cdf0e10cSrcweir else if ( rStyleName == maBoldItalic ) 654cdf0e10cSrcweir { 655cdf0e10cSrcweir aInfo.SetItalic( ITALIC_NORMAL ); 656cdf0e10cSrcweir aInfo.SetWeight( WEIGHT_BOLD ); 657cdf0e10cSrcweir } 658cdf0e10cSrcweir else if ( rStyleName == maLight ) 659cdf0e10cSrcweir { 660cdf0e10cSrcweir aInfo.SetItalic( ITALIC_NONE ); 661cdf0e10cSrcweir aInfo.SetWeight( WEIGHT_LIGHT ); 662cdf0e10cSrcweir } 663cdf0e10cSrcweir else if ( rStyleName == maLightItalic ) 664cdf0e10cSrcweir { 665cdf0e10cSrcweir aInfo.SetItalic( ITALIC_NORMAL ); 666cdf0e10cSrcweir aInfo.SetWeight( WEIGHT_LIGHT ); 667cdf0e10cSrcweir } 668cdf0e10cSrcweir else if ( rStyleName == maBlack ) 669cdf0e10cSrcweir { 670cdf0e10cSrcweir aInfo.SetItalic( ITALIC_NONE ); 671cdf0e10cSrcweir aInfo.SetWeight( WEIGHT_BLACK ); 672cdf0e10cSrcweir } 673cdf0e10cSrcweir else if ( rStyleName == maBlackItalic ) 674cdf0e10cSrcweir { 675cdf0e10cSrcweir aInfo.SetItalic( ITALIC_NORMAL ); 676cdf0e10cSrcweir aInfo.SetWeight( WEIGHT_BLACK ); 677cdf0e10cSrcweir } 678cdf0e10cSrcweir else 679cdf0e10cSrcweir { 680cdf0e10cSrcweir aInfo.SetItalic( ITALIC_NONE ); 681cdf0e10cSrcweir aInfo.SetWeight( WEIGHT_DONTKNOW ); 682cdf0e10cSrcweir } 683cdf0e10cSrcweir } 684cdf0e10cSrcweir else 685cdf0e10cSrcweir aInfo = *pFontInfo; 686cdf0e10cSrcweir 687cdf0e10cSrcweir // set Fontname to keep FontAlias 688cdf0e10cSrcweir aInfo.SetName( rName ); 689cdf0e10cSrcweir aInfo.SetStyleName( rStyleName ); 690cdf0e10cSrcweir 691cdf0e10cSrcweir return aInfo; 692cdf0e10cSrcweir } 693cdf0e10cSrcweir 694cdf0e10cSrcweir // ----------------------------------------------------------------------- 695cdf0e10cSrcweir 696cdf0e10cSrcweir FontInfo FontList::Get( const XubString& rName, 697cdf0e10cSrcweir FontWeight eWeight, FontItalic eItalic ) const 698cdf0e10cSrcweir { 699cdf0e10cSrcweir ImplFontListNameInfo* pData = ImplFindByName( rName ); 700cdf0e10cSrcweir ImplFontListFontInfo* pFontInfo = NULL; 701cdf0e10cSrcweir ImplFontListFontInfo* pFontNameInfo = NULL; 702cdf0e10cSrcweir if ( pData ) 703cdf0e10cSrcweir { 704cdf0e10cSrcweir ImplFontListFontInfo* pSearchInfo = pData->mpFirst; 705cdf0e10cSrcweir pFontNameInfo = pSearchInfo; 706cdf0e10cSrcweir while ( pSearchInfo ) 707cdf0e10cSrcweir { 708cdf0e10cSrcweir if ( (eWeight == pSearchInfo->GetWeight()) && 709cdf0e10cSrcweir (eItalic == pSearchInfo->GetItalic()) ) 710cdf0e10cSrcweir { 711cdf0e10cSrcweir pFontInfo = pSearchInfo; 712cdf0e10cSrcweir break; 713cdf0e10cSrcweir } 714cdf0e10cSrcweir 715cdf0e10cSrcweir pSearchInfo = pSearchInfo->mpNext; 716cdf0e10cSrcweir } 717cdf0e10cSrcweir } 718cdf0e10cSrcweir 719cdf0e10cSrcweir // Konnten die Daten nicht gefunden werden, dann muessen bestimmte 720cdf0e10cSrcweir // Attribute nachgebildet werden 721cdf0e10cSrcweir FontInfo aInfo; 722cdf0e10cSrcweir if ( !pFontInfo ) 723cdf0e10cSrcweir { 724cdf0e10cSrcweir // Falls der Fontname stimmt, uebernehmen wir soviel wie moeglich 725cdf0e10cSrcweir if ( pFontNameInfo ) 726cdf0e10cSrcweir { 727cdf0e10cSrcweir aInfo = *pFontNameInfo; 728cdf0e10cSrcweir aInfo.SetStyleName( XubString() ); 729cdf0e10cSrcweir } 730cdf0e10cSrcweir 731cdf0e10cSrcweir aInfo.SetWeight( eWeight ); 732cdf0e10cSrcweir aInfo.SetItalic( eItalic ); 733cdf0e10cSrcweir } 734cdf0e10cSrcweir else 735cdf0e10cSrcweir aInfo = *pFontInfo; 736cdf0e10cSrcweir 737cdf0e10cSrcweir // set Fontname to keep FontAlias 738cdf0e10cSrcweir aInfo.SetName( rName ); 739cdf0e10cSrcweir 740cdf0e10cSrcweir return aInfo; 741cdf0e10cSrcweir } 742cdf0e10cSrcweir 743cdf0e10cSrcweir // ----------------------------------------------------------------------- 744cdf0e10cSrcweir 745cdf0e10cSrcweir sal_Bool FontList::IsAvailable( const XubString& rName ) const 746cdf0e10cSrcweir { 747cdf0e10cSrcweir return (ImplFindByName( rName ) != 0); 748cdf0e10cSrcweir } 749cdf0e10cSrcweir 750cdf0e10cSrcweir // ----------------------------------------------------------------------- 751cdf0e10cSrcweir 752cdf0e10cSrcweir const FontInfo& FontList::GetFontName( sal_uInt16 nFont ) const 753cdf0e10cSrcweir { 754cdf0e10cSrcweir DBG_ASSERT( nFont < GetFontNameCount(), "FontList::GetFontName(): nFont >= Count" ); 755cdf0e10cSrcweir 756cdf0e10cSrcweir ImplFontListNameInfo* pData = (ImplFontListNameInfo*)List::GetObject( nFont ); 757cdf0e10cSrcweir return *(pData->mpFirst); 758cdf0e10cSrcweir } 759cdf0e10cSrcweir 760cdf0e10cSrcweir // ----------------------------------------------------------------------- 761cdf0e10cSrcweir 762cdf0e10cSrcweir sal_uInt16 FontList::GetFontNameType( sal_uInt16 nFont ) const 763cdf0e10cSrcweir { 764cdf0e10cSrcweir DBG_ASSERT( nFont < GetFontNameCount(), "FontList::GetFontNameType(): nFont >= Count" ); 765cdf0e10cSrcweir 766cdf0e10cSrcweir ImplFontListNameInfo* pData = (ImplFontListNameInfo*)List::GetObject( nFont ); 767cdf0e10cSrcweir return pData->mnType; 768cdf0e10cSrcweir } 769cdf0e10cSrcweir 770cdf0e10cSrcweir // ----------------------------------------------------------------------- 771cdf0e10cSrcweir 772cdf0e10cSrcweir sal_Handle FontList::GetFirstFontInfo( const XubString& rName ) const 773cdf0e10cSrcweir { 774cdf0e10cSrcweir ImplFontListNameInfo* pData = ImplFindByName( rName ); 775cdf0e10cSrcweir if ( !pData ) 776cdf0e10cSrcweir return (sal_Handle)NULL; 777cdf0e10cSrcweir else 778cdf0e10cSrcweir return (sal_Handle)pData->mpFirst; 779cdf0e10cSrcweir } 780cdf0e10cSrcweir 781cdf0e10cSrcweir // ----------------------------------------------------------------------- 782cdf0e10cSrcweir 783cdf0e10cSrcweir sal_Handle FontList::GetNextFontInfo( sal_Handle hFontInfo ) const 784cdf0e10cSrcweir { 785cdf0e10cSrcweir ImplFontListFontInfo* pInfo = (ImplFontListFontInfo*)(void*)hFontInfo; 786cdf0e10cSrcweir return (sal_Handle)(pInfo->mpNext); 787cdf0e10cSrcweir } 788cdf0e10cSrcweir 789cdf0e10cSrcweir // ----------------------------------------------------------------------- 790cdf0e10cSrcweir 791cdf0e10cSrcweir const FontInfo& FontList::GetFontInfo( sal_Handle hFontInfo ) const 792cdf0e10cSrcweir { 793cdf0e10cSrcweir ImplFontListFontInfo* pInfo = (ImplFontListFontInfo*)(void*)hFontInfo; 794cdf0e10cSrcweir return *pInfo; 795cdf0e10cSrcweir } 796cdf0e10cSrcweir 797cdf0e10cSrcweir // ----------------------------------------------------------------------- 798cdf0e10cSrcweir 799cdf0e10cSrcweir const long* FontList::GetSizeAry( const FontInfo& rInfo ) const 800cdf0e10cSrcweir { 801cdf0e10cSrcweir // Size-Array vorher loeschen 802cdf0e10cSrcweir if ( mpSizeAry ) 803cdf0e10cSrcweir { 804cdf0e10cSrcweir delete[] ((FontList*)this)->mpSizeAry; 805cdf0e10cSrcweir ((FontList*)this)->mpSizeAry = NULL; 806cdf0e10cSrcweir } 807cdf0e10cSrcweir 808cdf0e10cSrcweir // Falls kein Name, dann Standardgroessen 809cdf0e10cSrcweir if ( !rInfo.GetName().Len() ) 810cdf0e10cSrcweir return aStdSizeAry; 811cdf0e10cSrcweir 812cdf0e10cSrcweir // Zuerst nach dem Fontnamen suchen um das Device dann von dem 813cdf0e10cSrcweir // entsprechenden Font zu nehmen 814cdf0e10cSrcweir OutputDevice* pDevice = mpDev; 815cdf0e10cSrcweir ImplFontListNameInfo* pData = ImplFindByName( rInfo.GetName() ); 816cdf0e10cSrcweir if ( pData ) 817cdf0e10cSrcweir pDevice = pData->mpFirst->GetDevice(); 818cdf0e10cSrcweir 819cdf0e10cSrcweir int nDevSizeCount = pDevice->GetDevFontSizeCount( rInfo ); 820cdf0e10cSrcweir if ( !nDevSizeCount || 821cdf0e10cSrcweir (pDevice->GetDevFontSize( rInfo, 0 ).Height() == 0) ) 822cdf0e10cSrcweir return aStdSizeAry; 823cdf0e10cSrcweir 824cdf0e10cSrcweir MapMode aOldMapMode = pDevice->GetMapMode(); 825cdf0e10cSrcweir MapMode aMap( MAP_10TH_INCH, Point(), Fraction( 1, 72 ), Fraction( 1, 72 ) ); 826cdf0e10cSrcweir pDevice->SetMapMode( aMap ); 827cdf0e10cSrcweir 828cdf0e10cSrcweir sal_uInt16 i; 829cdf0e10cSrcweir sal_uInt16 nRealCount = 0; 830cdf0e10cSrcweir long nOldHeight = 0; 831cdf0e10cSrcweir ((FontList*)this)->mpSizeAry = new long[nDevSizeCount+1]; 832cdf0e10cSrcweir for ( i = 0; i < nDevSizeCount; i++ ) 833cdf0e10cSrcweir { 834cdf0e10cSrcweir Size aSize = pDevice->GetDevFontSize( rInfo, i ); 835cdf0e10cSrcweir if ( aSize.Height() != nOldHeight ) 836cdf0e10cSrcweir { 837cdf0e10cSrcweir nOldHeight = aSize.Height(); 838cdf0e10cSrcweir ((FontList*)this)->mpSizeAry[nRealCount] = nOldHeight; 839cdf0e10cSrcweir nRealCount++; 840cdf0e10cSrcweir } 841cdf0e10cSrcweir } 842cdf0e10cSrcweir ((FontList*)this)->mpSizeAry[nRealCount] = 0; 843cdf0e10cSrcweir 844cdf0e10cSrcweir pDevice->SetMapMode( aOldMapMode ); 845cdf0e10cSrcweir return mpSizeAry; 846cdf0e10cSrcweir } 847cdf0e10cSrcweir 848cdf0e10cSrcweir // ----------------------------------------------------------------------- 849cdf0e10cSrcweir 850cdf0e10cSrcweir const long* FontList::GetStdSizeAry() 851cdf0e10cSrcweir { 852cdf0e10cSrcweir return aStdSizeAry; 853cdf0e10cSrcweir } 854cdf0e10cSrcweir 855cdf0e10cSrcweir // ======================================================================= 856cdf0e10cSrcweir 857cdf0e10cSrcweir // --------------------------------- 858cdf0e10cSrcweir // - FontSizeNames & FsizeNameItem - 859cdf0e10cSrcweir // --------------------------------- 860cdf0e10cSrcweir 861cdf0e10cSrcweir struct ImplFSNameItem 862cdf0e10cSrcweir { 863cdf0e10cSrcweir long mnSize; 864cdf0e10cSrcweir const char* mszUtf8Name; 865cdf0e10cSrcweir }; 866cdf0e10cSrcweir 867cdf0e10cSrcweir //------------------------------------------------------------------------ 868cdf0e10cSrcweir 869cdf0e10cSrcweir static ImplFSNameItem aImplSimplifiedChinese[] = 870cdf0e10cSrcweir { 871cdf0e10cSrcweir { 50, "\xe5\x85\xab\xe5\x8f\xb7" }, 872cdf0e10cSrcweir { 55, "\xe4\xb8\x83\xe5\x8f\xb7" }, 873cdf0e10cSrcweir { 65, "\xe5\xb0\x8f\xe5\x85\xad" }, 874cdf0e10cSrcweir { 75, "\xe5\x85\xad\xe5\x8f\xb7" }, 875cdf0e10cSrcweir { 90, "\xe5\xb0\x8f\xe4\xba\x94" }, 876cdf0e10cSrcweir { 105, "\xe4\xba\x94\xe5\x8f\xb7" }, 877cdf0e10cSrcweir { 120, "\xe5\xb0\x8f\xe5\x9b\x9b" }, 878cdf0e10cSrcweir { 140, "\xe5\x9b\x9b\xe5\x8f\xb7" }, 879cdf0e10cSrcweir { 150, "\xe5\xb0\x8f\xe4\xb8\x89" }, 880cdf0e10cSrcweir { 160, "\xe4\xb8\x89\xe5\x8f\xb7" }, 881cdf0e10cSrcweir { 180, "\xe5\xb0\x8f\xe4\xba\x8c" }, 882cdf0e10cSrcweir { 220, "\xe4\xba\x8c\xe5\x8f\xb7" }, 883cdf0e10cSrcweir { 240, "\xe5\xb0\x8f\xe4\xb8\x80" }, 884cdf0e10cSrcweir { 260, "\xe4\xb8\x80\xe5\x8f\xb7" }, 885cdf0e10cSrcweir { 360, "\xe5\xb0\x8f\xe5\x88\x9d" }, 886cdf0e10cSrcweir { 420, "\xe5\x88\x9d\xe5\x8f\xb7" } 887cdf0e10cSrcweir }; 888cdf0e10cSrcweir 889cdf0e10cSrcweir // ----------------------------------------------------------------------- 890cdf0e10cSrcweir 891cdf0e10cSrcweir #if 0 // #i89077# disabled by popular request 892cdf0e10cSrcweir static ImplFSNameItem aImplTraditionalChinese[] = 893cdf0e10cSrcweir { 894cdf0e10cSrcweir { 50, "\xe5\x85\xab\xe8\x99\x9f" }, 895cdf0e10cSrcweir { 55, "\xe4\xb8\x83\xe8\x99\x9f" }, 896cdf0e10cSrcweir { 65, "\xe5\xb0\x8f\xe5\x85\xad" }, 897cdf0e10cSrcweir { 75, "\xe5\x85\xad\xe8\x99\x9f" }, 898cdf0e10cSrcweir { 90, "\xe5\xb0\x8f\xe4\xba\x94" }, 899cdf0e10cSrcweir { 105, "\xe4\xba\x94\xe8\x99\x9f" }, 900cdf0e10cSrcweir { 120, "\xe5\xb0\x8f\xe5\x9b\x9b" }, 901cdf0e10cSrcweir { 140, "\xe5\x9b\x9b\xe8\x99\x9f" }, 902cdf0e10cSrcweir { 150, "\xe5\xb0\x8f\xe4\xb8\x89" }, 903cdf0e10cSrcweir { 160, "\xe4\xb8\x89\xe8\x99\x9f" }, 904cdf0e10cSrcweir { 180, "\xe5\xb0\x8f\xe4\xba\x8c" }, 905cdf0e10cSrcweir { 220, "\xe4\xba\x8c\xe8\x99\x9f" }, 906cdf0e10cSrcweir { 240, "\xe5\xb0\x8f\xe4\xb8\x80" }, 907cdf0e10cSrcweir { 260, "\xe4\xb8\x80\xe8\x99\x9f" }, 908cdf0e10cSrcweir { 360, "\xe5\xb0\x8f\xe5\x88\x9d" }, 909cdf0e10cSrcweir { 420, "\xe5\x88\x9d\xe8\x99\x9f" } 910cdf0e10cSrcweir }; 911cdf0e10cSrcweir #endif 912cdf0e10cSrcweir 913cdf0e10cSrcweir //------------------------------------------------------------------------ 914cdf0e10cSrcweir 915cdf0e10cSrcweir FontSizeNames::FontSizeNames( LanguageType eLanguage ) 916cdf0e10cSrcweir { 917cdf0e10cSrcweir if ( eLanguage == LANGUAGE_DONTKNOW ) 918cdf0e10cSrcweir eLanguage = Application::GetSettings().GetUILanguage(); 919cdf0e10cSrcweir if ( eLanguage == LANGUAGE_SYSTEM ) 920cdf0e10cSrcweir eLanguage = MsLangId::getSystemUILanguage(); 921cdf0e10cSrcweir 922cdf0e10cSrcweir switch( eLanguage ) 923cdf0e10cSrcweir { 924cdf0e10cSrcweir case LANGUAGE_CHINESE: 925cdf0e10cSrcweir case LANGUAGE_CHINESE_SIMPLIFIED: 926cdf0e10cSrcweir mpArray = aImplSimplifiedChinese; 927cdf0e10cSrcweir mnElem = sizeof(aImplSimplifiedChinese) / sizeof(aImplSimplifiedChinese[0]); 928cdf0e10cSrcweir break; 929cdf0e10cSrcweir 930cdf0e10cSrcweir #if 0 // #i89077# disabled by popular request 931cdf0e10cSrcweir case LANGUAGE_CHINESE_HONGKONG: 932cdf0e10cSrcweir case LANGUAGE_CHINESE_SINGAPORE: 933cdf0e10cSrcweir case LANGUAGE_CHINESE_MACAU: 934cdf0e10cSrcweir case LANGUAGE_CHINESE_TRADITIONAL: 935cdf0e10cSrcweir mpArray = aImplTraditionalChinese; 936cdf0e10cSrcweir mnElem = sizeof(aImplTraditionalChinese) / sizeof(aImplTraditionalChinese[0]); 937cdf0e10cSrcweir break; 938cdf0e10cSrcweir #endif 939cdf0e10cSrcweir 940cdf0e10cSrcweir default: 941cdf0e10cSrcweir mpArray = NULL; 942cdf0e10cSrcweir mnElem = 0; 943cdf0e10cSrcweir break; 944cdf0e10cSrcweir }; 945cdf0e10cSrcweir } 946cdf0e10cSrcweir 947cdf0e10cSrcweir //------------------------------------------------------------------------ 948cdf0e10cSrcweir 949cdf0e10cSrcweir long FontSizeNames::Name2Size( const String& rName ) const 950cdf0e10cSrcweir { 951cdf0e10cSrcweir if ( mnElem ) 952cdf0e10cSrcweir { 953cdf0e10cSrcweir ByteString aName( rName, RTL_TEXTENCODING_UTF8 ); 954cdf0e10cSrcweir 955cdf0e10cSrcweir // linear search is sufficient for this rare case 956cdf0e10cSrcweir for( long i = mnElem; --i >= 0; ) 957cdf0e10cSrcweir if ( aName == mpArray[i].mszUtf8Name ) 958cdf0e10cSrcweir return mpArray[i].mnSize; 959cdf0e10cSrcweir } 960cdf0e10cSrcweir 961cdf0e10cSrcweir return 0; 962cdf0e10cSrcweir } 963cdf0e10cSrcweir 964cdf0e10cSrcweir //------------------------------------------------------------------------ 965cdf0e10cSrcweir 966cdf0e10cSrcweir String FontSizeNames::Size2Name( long nValue ) const 967cdf0e10cSrcweir { 968cdf0e10cSrcweir String aStr; 969cdf0e10cSrcweir 970cdf0e10cSrcweir // binary search 971cdf0e10cSrcweir for( long lower = 0, upper = mnElem - 1; lower <= upper; ) 972cdf0e10cSrcweir { 973cdf0e10cSrcweir long mid = (upper + lower) >> 1; 974cdf0e10cSrcweir if ( nValue == mpArray[mid].mnSize ) 975cdf0e10cSrcweir { 976cdf0e10cSrcweir aStr = String( mpArray[mid].mszUtf8Name, RTL_TEXTENCODING_UTF8 ); 977cdf0e10cSrcweir break; 978cdf0e10cSrcweir } 979cdf0e10cSrcweir else if ( nValue < mpArray[mid].mnSize ) 980cdf0e10cSrcweir upper = mid - 1; 981cdf0e10cSrcweir else /* ( nValue > mpArray[mid].mnSize ) */ 982cdf0e10cSrcweir lower = mid + 1; 983cdf0e10cSrcweir } 984cdf0e10cSrcweir 985cdf0e10cSrcweir return aStr; 986cdf0e10cSrcweir } 987cdf0e10cSrcweir 988cdf0e10cSrcweir //------------------------------------------------------------------------ 989cdf0e10cSrcweir 990cdf0e10cSrcweir String FontSizeNames::GetIndexName( sal_uLong nIndex ) const 991cdf0e10cSrcweir { 992cdf0e10cSrcweir String aStr; 993cdf0e10cSrcweir 994cdf0e10cSrcweir if ( nIndex < mnElem ) 995cdf0e10cSrcweir aStr = String( mpArray[nIndex].mszUtf8Name, RTL_TEXTENCODING_UTF8 ); 996cdf0e10cSrcweir 997cdf0e10cSrcweir return aStr; 998cdf0e10cSrcweir } 999cdf0e10cSrcweir 1000cdf0e10cSrcweir //------------------------------------------------------------------------ 1001cdf0e10cSrcweir 1002cdf0e10cSrcweir long FontSizeNames::GetIndexSize( sal_uLong nIndex ) const 1003cdf0e10cSrcweir { 1004cdf0e10cSrcweir if ( nIndex >= mnElem ) 1005cdf0e10cSrcweir return 0; 1006cdf0e10cSrcweir return mpArray[nIndex].mnSize; 1007cdf0e10cSrcweir } 1008