xref: /trunk/main/svtools/source/control/ctrltool.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
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:
ImplFontListFontInfo(const FontInfo & rInfo,OutputDevice * pDev)93cdf0e10cSrcweir                             ImplFontListFontInfo( const FontInfo& rInfo,
94cdf0e10cSrcweir                                                   OutputDevice* pDev ) :
95cdf0e10cSrcweir                                 FontInfo( rInfo )
96cdf0e10cSrcweir                             {
97cdf0e10cSrcweir                                 mpDevice = pDev;
98cdf0e10cSrcweir                             }
99cdf0e10cSrcweir 
GetDevice() const100cdf0e10cSrcweir     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 
ImplFontListNameInfo(const XubString & rSearchName)116cdf0e10cSrcweir                             ImplFontListNameInfo( const XubString& rSearchName ) :
117cdf0e10cSrcweir                                 maSearchName( rSearchName )
118cdf0e10cSrcweir                             {}
119cdf0e10cSrcweir 
GetSearchName() const120cdf0e10cSrcweir     const XubString&        GetSearchName() const { return maSearchName; }
121cdf0e10cSrcweir };
122cdf0e10cSrcweir 
123cdf0e10cSrcweir // =======================================================================
124cdf0e10cSrcweir 
ImplCompareFontInfo(ImplFontListFontInfo * pInfo1,ImplFontListFontInfo * pInfo2)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 
ImplMakeSearchString(XubString & rStr)143cdf0e10cSrcweir static void ImplMakeSearchString( XubString& rStr )
144cdf0e10cSrcweir {
145cdf0e10cSrcweir     rStr.ToLowerAscii();
146cdf0e10cSrcweir }
147cdf0e10cSrcweir 
148cdf0e10cSrcweir // -----------------------------------------------------------------------
149cdf0e10cSrcweir 
ImplMakeSearchStringFromName(XubString & rStr)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 
ImplFind(const XubString & rSearchName,sal_uLong * pIndex) const162cdf0e10cSrcweir 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 
ImplFindByName(const XubString & rStr) const236cdf0e10cSrcweir ImplFontListNameInfo* FontList::ImplFindByName( const XubString& rStr ) const
237cdf0e10cSrcweir {
238cdf0e10cSrcweir     XubString aSearchName = rStr;
239cdf0e10cSrcweir     ImplMakeSearchStringFromName( aSearchName );
240cdf0e10cSrcweir     return ImplFind( aSearchName, NULL );
241cdf0e10cSrcweir }
242cdf0e10cSrcweir 
243cdf0e10cSrcweir // -----------------------------------------------------------------------
244cdf0e10cSrcweir 
ImplInsertFonts(OutputDevice * pDevice,sal_Bool bAll,sal_Bool bInsertData)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 
FontList(OutputDevice * pDevice,OutputDevice * pDevice2,sal_Bool bAll)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 
~FontList()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 // -----------------------------------------------------------------------
Clone() const403cdf0e10cSrcweir FontList* FontList::Clone() const
404cdf0e10cSrcweir {
405cdf0e10cSrcweir     FontList* pReturn = new FontList(
406cdf0e10cSrcweir             mpDev, mpDev2, GetFontNameCount() == mpDev->GetDevFontCount());
407cdf0e10cSrcweir     return pReturn;
408cdf0e10cSrcweir }
409cdf0e10cSrcweir 
410cdf0e10cSrcweir // -----------------------------------------------------------------------
411cdf0e10cSrcweir 
GetStyleName(FontWeight eWeight,FontItalic eItalic) const412cdf0e10cSrcweir 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 
GetStyleName(const FontInfo & rInfo) const453cdf0e10cSrcweir 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 
GetFontMapText(const FontInfo & rInfo) const508cdf0e10cSrcweir 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 
GetFontNameType(const XubString & rFontName) const597cdf0e10cSrcweir 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 
Get(const XubString & rName,const XubString & rStyleName) const608cdf0e10cSrcweir 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 
Get(const XubString & rName,FontWeight eWeight,FontItalic eItalic) const696cdf0e10cSrcweir 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 
IsAvailable(const XubString & rName) const745cdf0e10cSrcweir sal_Bool FontList::IsAvailable( const XubString& rName ) const
746cdf0e10cSrcweir {
747cdf0e10cSrcweir     return (ImplFindByName( rName ) != 0);
748cdf0e10cSrcweir }
749cdf0e10cSrcweir 
750cdf0e10cSrcweir // -----------------------------------------------------------------------
751cdf0e10cSrcweir 
GetFontName(sal_uInt16 nFont) const752cdf0e10cSrcweir 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 
GetFontNameType(sal_uInt16 nFont) const762cdf0e10cSrcweir 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 
GetFirstFontInfo(const XubString & rName) const772cdf0e10cSrcweir 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 
GetNextFontInfo(sal_Handle hFontInfo) const783cdf0e10cSrcweir 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 
GetFontInfo(sal_Handle hFontInfo) const791cdf0e10cSrcweir const FontInfo& FontList::GetFontInfo( sal_Handle hFontInfo ) const
792cdf0e10cSrcweir {
793cdf0e10cSrcweir     ImplFontListFontInfo* pInfo = (ImplFontListFontInfo*)(void*)hFontInfo;
794cdf0e10cSrcweir     return *pInfo;
795cdf0e10cSrcweir }
796cdf0e10cSrcweir 
797cdf0e10cSrcweir // -----------------------------------------------------------------------
798cdf0e10cSrcweir 
GetSizeAry(const FontInfo & rInfo) const799cdf0e10cSrcweir 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 
GetStdSizeAry()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 
FontSizeNames(LanguageType eLanguage)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 
Name2Size(const String & rName) const949cdf0e10cSrcweir 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 
Size2Name(long nValue) const966cdf0e10cSrcweir 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 
GetIndexName(sal_uLong nIndex) const990cdf0e10cSrcweir 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 
GetIndexSize(sal_uLong nIndex) const1002cdf0e10cSrcweir long FontSizeNames::GetIndexSize( sal_uLong nIndex ) const
1003cdf0e10cSrcweir {
1004cdf0e10cSrcweir     if ( nIndex >= mnElem )
1005cdf0e10cSrcweir         return 0;
1006cdf0e10cSrcweir     return mpArray[nIndex].mnSize;
1007cdf0e10cSrcweir }
1008