xref: /AOO41X/main/svtools/source/control/stdmenu.cxx (revision 5900e8ec128faec89519683efce668ccd8cc6084)
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 #include <string.h>
28cdf0e10cSrcweir #include <vcl/svapp.hxx>
29cdf0e10cSrcweir #include <vcl/i18nhelp.hxx>
30cdf0e10cSrcweir #include <svtools/ctrltool.hxx>
31cdf0e10cSrcweir #include <svtools/stdmenu.hxx>
32cdf0e10cSrcweir 
33cdf0e10cSrcweir // ========================================================================
34cdf0e10cSrcweir 
35cdf0e10cSrcweir FontNameMenu::FontNameMenu()
36cdf0e10cSrcweir {
37cdf0e10cSrcweir 	SetMenuFlags( GetMenuFlags() | MENU_FLAG_NOAUTOMNEMONICS );
38cdf0e10cSrcweir }
39cdf0e10cSrcweir 
40cdf0e10cSrcweir // -----------------------------------------------------------------------
41cdf0e10cSrcweir 
42cdf0e10cSrcweir FontNameMenu::~FontNameMenu()
43cdf0e10cSrcweir {
44cdf0e10cSrcweir }
45cdf0e10cSrcweir 
46cdf0e10cSrcweir // -----------------------------------------------------------------------
47cdf0e10cSrcweir 
48cdf0e10cSrcweir void FontNameMenu::Select()
49cdf0e10cSrcweir {
50cdf0e10cSrcweir 	maCurName = GetItemText( GetCurItemId() );
51cdf0e10cSrcweir 	maSelectHdl.Call( this );
52cdf0e10cSrcweir }
53cdf0e10cSrcweir 
54cdf0e10cSrcweir // -----------------------------------------------------------------------
55cdf0e10cSrcweir 
56cdf0e10cSrcweir void FontNameMenu::Highlight()
57cdf0e10cSrcweir {
58cdf0e10cSrcweir 	XubString aTempName = maCurName;
59cdf0e10cSrcweir 	maCurName = GetItemText( GetCurItemId() );
60cdf0e10cSrcweir 	maHighlightHdl.Call( this );
61cdf0e10cSrcweir 	maCurName = aTempName;
62cdf0e10cSrcweir }
63cdf0e10cSrcweir 
64cdf0e10cSrcweir // -----------------------------------------------------------------------
65cdf0e10cSrcweir 
66cdf0e10cSrcweir void FontNameMenu::Fill( const FontList* pList )
67cdf0e10cSrcweir {
68cdf0e10cSrcweir     // clear menu
69cdf0e10cSrcweir 	Clear();
70cdf0e10cSrcweir 
71cdf0e10cSrcweir     // add fonts
72cdf0e10cSrcweir     const vcl::I18nHelper& rI18nHelper = Application::GetSettings().GetUILocaleI18nHelper();
73cdf0e10cSrcweir     // more than 100 fonts reduces the speed of opening the menu.
74cdf0e10cSrcweir     // So only the first 100 fonts will be displayed.
75cdf0e10cSrcweir     sal_uInt16 nFontCount = ::std::min( pList->GetFontNameCount(), static_cast< sal_uInt16 >(100) );
76cdf0e10cSrcweir 	for ( sal_uInt16 i = 0; i < nFontCount; i++ )
77cdf0e10cSrcweir 	{
78cdf0e10cSrcweir 		const XubString& rName = pList->GetFontName( i ).GetName();
79cdf0e10cSrcweir 
80cdf0e10cSrcweir         // sort with the I18nHelper
81cdf0e10cSrcweir 		sal_uInt16 j = GetItemCount();
82cdf0e10cSrcweir 		while ( j )
83cdf0e10cSrcweir 		{
84cdf0e10cSrcweir 			XubString aText = GetItemText( GetItemId( j-1 ) );
85cdf0e10cSrcweir 			if ( rI18nHelper.CompareString( rName, aText ) > 0 )
86cdf0e10cSrcweir 				break;
87cdf0e10cSrcweir 			j--;
88cdf0e10cSrcweir 		}
89cdf0e10cSrcweir 		InsertItem( i+1, rName, MIB_RADIOCHECK | MIB_AUTOCHECK, j );
90cdf0e10cSrcweir 	}
91cdf0e10cSrcweir 
92cdf0e10cSrcweir 	SetCurName( maCurName );
93cdf0e10cSrcweir }
94cdf0e10cSrcweir 
95cdf0e10cSrcweir // -----------------------------------------------------------------------
96cdf0e10cSrcweir 
97cdf0e10cSrcweir void FontNameMenu::SetCurName( const XubString& rName )
98cdf0e10cSrcweir {
99cdf0e10cSrcweir 	maCurName = rName;
100cdf0e10cSrcweir 
101cdf0e10cSrcweir 	// Menueintrag checken
102cdf0e10cSrcweir 	sal_uInt16 nChecked = 0;
103cdf0e10cSrcweir 	sal_uInt16 nItemCount = GetItemCount();
104cdf0e10cSrcweir 	for( sal_uInt16 i = 0; i < nItemCount; i++ )
105cdf0e10cSrcweir 	{
106cdf0e10cSrcweir 		sal_uInt16 nItemId = GetItemId( i );
107cdf0e10cSrcweir 
108cdf0e10cSrcweir 		if ( IsItemChecked( nItemId ) )
109cdf0e10cSrcweir 			nChecked = nItemId;
110cdf0e10cSrcweir 
111cdf0e10cSrcweir 		XubString aText = GetItemText( nItemId );
112cdf0e10cSrcweir 		if ( aText == maCurName )
113cdf0e10cSrcweir 		{
114cdf0e10cSrcweir 			CheckItem( nItemId, sal_True );
115cdf0e10cSrcweir 			return;
116cdf0e10cSrcweir 		}
117cdf0e10cSrcweir 	}
118cdf0e10cSrcweir 
119cdf0e10cSrcweir 	if ( nChecked )
120cdf0e10cSrcweir 		CheckItem( nChecked, sal_False );
121cdf0e10cSrcweir }
122cdf0e10cSrcweir 
123cdf0e10cSrcweir // ========================================================================
124cdf0e10cSrcweir 
125cdf0e10cSrcweir FontStyleMenu::FontStyleMenu()
126cdf0e10cSrcweir {
127cdf0e10cSrcweir 	SetMenuFlags( GetMenuFlags() | MENU_FLAG_NOAUTOMNEMONICS );
128cdf0e10cSrcweir }
129cdf0e10cSrcweir 
130cdf0e10cSrcweir // -----------------------------------------------------------------------
131cdf0e10cSrcweir 
132cdf0e10cSrcweir FontStyleMenu::~FontStyleMenu()
133cdf0e10cSrcweir {
134cdf0e10cSrcweir }
135cdf0e10cSrcweir 
136cdf0e10cSrcweir // -----------------------------------------------------------------------
137cdf0e10cSrcweir 
138cdf0e10cSrcweir void FontStyleMenu::Select()
139cdf0e10cSrcweir {
140cdf0e10cSrcweir 	sal_uInt16 nCurId = GetCurItemId();
141cdf0e10cSrcweir 
142cdf0e10cSrcweir 	if ( (nCurId >= FONTSTYLEMENU_FIRSTID) && (nCurId <= FONTSTYLEMENU_LASTID) )
143cdf0e10cSrcweir 	{
144cdf0e10cSrcweir 		maCurStyle = GetItemText( nCurId );
145cdf0e10cSrcweir 		maSelectHdl.Call( this );
146cdf0e10cSrcweir 	}
147cdf0e10cSrcweir 	else
148cdf0e10cSrcweir 		PopupMenu::Select();
149cdf0e10cSrcweir }
150cdf0e10cSrcweir 
151cdf0e10cSrcweir // -----------------------------------------------------------------------
152cdf0e10cSrcweir 
153cdf0e10cSrcweir void FontStyleMenu::Highlight()
154cdf0e10cSrcweir {
155cdf0e10cSrcweir 	sal_uInt16 nCurId = GetCurItemId();
156cdf0e10cSrcweir 
157cdf0e10cSrcweir 	if ( (nCurId >= FONTSTYLEMENU_FIRSTID) && (nCurId <= FONTSTYLEMENU_LASTID) )
158cdf0e10cSrcweir 	{
159cdf0e10cSrcweir 		XubString aTempName = maCurStyle;
160cdf0e10cSrcweir 		maCurStyle = GetItemText( nCurId );
161cdf0e10cSrcweir 		maHighlightHdl.Call( this );
162cdf0e10cSrcweir 		maCurStyle = aTempName;
163cdf0e10cSrcweir 	}
164cdf0e10cSrcweir 	else
165cdf0e10cSrcweir 		PopupMenu::Highlight();
166cdf0e10cSrcweir }
167cdf0e10cSrcweir 
168cdf0e10cSrcweir // -----------------------------------------------------------------------
169cdf0e10cSrcweir 
170cdf0e10cSrcweir sal_Bool FontStyleMenu::ImplIsAlreadyInserted( const XubString& rStyleName, sal_uInt16 nCount )
171cdf0e10cSrcweir {
172cdf0e10cSrcweir 	for ( sal_uInt16 i = 0; i < nCount; i++ )
173cdf0e10cSrcweir 	{
174cdf0e10cSrcweir 		if ( GetItemText( i+FONTSTYLEMENU_FIRSTID ) == rStyleName )
175cdf0e10cSrcweir 			return sal_True;
176cdf0e10cSrcweir 	}
177cdf0e10cSrcweir 
178cdf0e10cSrcweir 	return sal_False;
179cdf0e10cSrcweir }
180cdf0e10cSrcweir 
181cdf0e10cSrcweir // -----------------------------------------------------------------------
182cdf0e10cSrcweir 
183cdf0e10cSrcweir void FontStyleMenu::Fill( const XubString& rName, const FontList* pList )
184cdf0e10cSrcweir {
185cdf0e10cSrcweir 	sal_uInt16 nItemId = GetItemId( 0 );
186cdf0e10cSrcweir 	while ( (nItemId >= FONTSTYLEMENU_FIRSTID) &&
187cdf0e10cSrcweir 			(nItemId <= FONTSTYLEMENU_LASTID) )
188cdf0e10cSrcweir 	{
189cdf0e10cSrcweir 		RemoveItem( 0 );
190cdf0e10cSrcweir 		nItemId = GetItemId( 0 );
191cdf0e10cSrcweir 	}
192cdf0e10cSrcweir 
193cdf0e10cSrcweir 	// Existiert ein Font mit diesem Namen
194cdf0e10cSrcweir 	sal_Handle hFontInfo = pList->GetFirstFontInfo( rName );
195cdf0e10cSrcweir 	if ( hFontInfo )
196cdf0e10cSrcweir 	{
197cdf0e10cSrcweir 		XubString	aStyleText;
198cdf0e10cSrcweir 		sal_uInt16		nPos = 0;
199cdf0e10cSrcweir 		sal_uInt16		nId = FONTSTYLEMENU_FIRSTID;
200cdf0e10cSrcweir 		FontWeight	eLastWeight = WEIGHT_DONTKNOW;
201cdf0e10cSrcweir 		FontItalic	eLastItalic = ITALIC_NONE;
202cdf0e10cSrcweir 		FontWidth	eLastWidth = WIDTH_DONTKNOW;
203cdf0e10cSrcweir 		sal_Bool		bNormal = sal_False;
204cdf0e10cSrcweir 		sal_Bool		bItalic = sal_False;
205cdf0e10cSrcweir 		sal_Bool		bBold = sal_False;
206cdf0e10cSrcweir 		sal_Bool		bBoldItalic = sal_False;
207cdf0e10cSrcweir 		sal_Bool		bInsert = sal_False;
208cdf0e10cSrcweir 		FontInfo	aInfo;
209cdf0e10cSrcweir 		while ( hFontInfo )
210cdf0e10cSrcweir 		{
211cdf0e10cSrcweir 			aInfo = pList->GetFontInfo( hFontInfo );
212cdf0e10cSrcweir 
213cdf0e10cSrcweir 			FontWeight	eWeight = aInfo.GetWeight();
214cdf0e10cSrcweir 			FontItalic	eItalic = aInfo.GetItalic();
215cdf0e10cSrcweir 			FontWidth	eWidth = aInfo.GetWidthType();
216cdf0e10cSrcweir 			// Only if the attributes are different, we insert the
217cdf0e10cSrcweir 			// Font to avoid double Entries in different languages
218cdf0e10cSrcweir 			if ( (eWeight != eLastWeight) || (eItalic != eLastItalic) ||
219cdf0e10cSrcweir 				 (eWidth != eLastWidth) )
220cdf0e10cSrcweir 			{
221cdf0e10cSrcweir 				if ( bInsert )
222cdf0e10cSrcweir 				{
223cdf0e10cSrcweir 					InsertItem( nId, aStyleText,
224cdf0e10cSrcweir 								MIB_RADIOCHECK | MIB_AUTOCHECK, nPos );
225cdf0e10cSrcweir 					nPos++;
226cdf0e10cSrcweir 					nId++;
227cdf0e10cSrcweir 				}
228cdf0e10cSrcweir 
229cdf0e10cSrcweir 				if ( eWeight <= WEIGHT_NORMAL )
230cdf0e10cSrcweir 				{
231cdf0e10cSrcweir 					if ( eItalic != ITALIC_NONE )
232cdf0e10cSrcweir 						bItalic = sal_True;
233cdf0e10cSrcweir 					else
234cdf0e10cSrcweir 						bNormal = sal_True;
235cdf0e10cSrcweir 				}
236cdf0e10cSrcweir 				else
237cdf0e10cSrcweir 				{
238cdf0e10cSrcweir 					if ( eItalic != ITALIC_NONE )
239cdf0e10cSrcweir 						bBoldItalic = sal_True;
240cdf0e10cSrcweir 					else
241cdf0e10cSrcweir 						bBold = sal_True;
242cdf0e10cSrcweir 				}
243cdf0e10cSrcweir 
244cdf0e10cSrcweir 				// For wrong StyleNames we replace this with the correct once
245cdf0e10cSrcweir 				aStyleText = pList->GetStyleName( aInfo );
246cdf0e10cSrcweir 				bInsert = !ImplIsAlreadyInserted( aStyleText, nPos );
247cdf0e10cSrcweir 				if ( !bInsert )
248cdf0e10cSrcweir 				{
249cdf0e10cSrcweir 					aStyleText = pList->GetStyleName( eWeight, eItalic );
250cdf0e10cSrcweir 					bInsert = !ImplIsAlreadyInserted( aStyleText, nPos );
251cdf0e10cSrcweir 				}
252cdf0e10cSrcweir 
253cdf0e10cSrcweir 				eLastWeight = eWeight;
254cdf0e10cSrcweir 				eLastItalic = eItalic;
255cdf0e10cSrcweir 				eLastWidth = eWidth;
256cdf0e10cSrcweir 			}
257cdf0e10cSrcweir 			else
258cdf0e10cSrcweir 			{
259cdf0e10cSrcweir 				if ( bInsert )
260cdf0e10cSrcweir 				{
261cdf0e10cSrcweir 					// If we have two names for the same attributes
262cdf0e10cSrcweir 					// we prefer the translated standard names
263cdf0e10cSrcweir 					const XubString& rAttrStyleText = pList->GetStyleName( eWeight, eItalic );
264cdf0e10cSrcweir 					if ( rAttrStyleText != aStyleText )
265cdf0e10cSrcweir 					{
266cdf0e10cSrcweir 						XubString aTempStyleText = pList->GetStyleName( aInfo );
267cdf0e10cSrcweir 						if ( rAttrStyleText == aTempStyleText )
268cdf0e10cSrcweir 							aStyleText = rAttrStyleText;
269cdf0e10cSrcweir 						bInsert = !ImplIsAlreadyInserted( aStyleText, nPos );
270cdf0e10cSrcweir 					}
271cdf0e10cSrcweir 				}
272cdf0e10cSrcweir 			}
273cdf0e10cSrcweir 
274cdf0e10cSrcweir 			if ( !bItalic && (aStyleText == pList->GetItalicStr()) )
275cdf0e10cSrcweir 				bItalic = sal_True;
276cdf0e10cSrcweir 			else if ( !bBold && (aStyleText == pList->GetBoldStr()) )
277cdf0e10cSrcweir 				bBold = sal_True;
278cdf0e10cSrcweir 			else if ( !bBoldItalic && (aStyleText == pList->GetBoldItalicStr()) )
279cdf0e10cSrcweir 				bBoldItalic = sal_True;
280cdf0e10cSrcweir 
281cdf0e10cSrcweir 			hFontInfo = pList->GetNextFontInfo( hFontInfo );
282cdf0e10cSrcweir 		}
283cdf0e10cSrcweir 
284cdf0e10cSrcweir 		if ( bInsert )
285cdf0e10cSrcweir 		{
286cdf0e10cSrcweir 			InsertItem( nId, aStyleText,
287cdf0e10cSrcweir 						MIB_RADIOCHECK | MIB_AUTOCHECK, nPos );
288cdf0e10cSrcweir 			nPos++;
289cdf0e10cSrcweir 			nId++;
290cdf0e10cSrcweir 		}
291cdf0e10cSrcweir 
292cdf0e10cSrcweir 		// Bestimmte Styles als Nachbildung
293cdf0e10cSrcweir 		if ( bNormal )
294cdf0e10cSrcweir 		{
295cdf0e10cSrcweir 			if ( !bItalic )
296cdf0e10cSrcweir 			{
297cdf0e10cSrcweir 				InsertItem( nId, pList->GetItalicStr(),
298cdf0e10cSrcweir 							MIB_RADIOCHECK | MIB_AUTOCHECK, nPos );
299cdf0e10cSrcweir 				nPos++;
300cdf0e10cSrcweir 				nId++;
301cdf0e10cSrcweir 			}
302cdf0e10cSrcweir 			if ( !bBold )
303cdf0e10cSrcweir 			{
304cdf0e10cSrcweir 				InsertItem( nId, pList->GetBoldStr(),
305cdf0e10cSrcweir 							MIB_RADIOCHECK | MIB_AUTOCHECK, nPos );
306cdf0e10cSrcweir 				nPos++;
307cdf0e10cSrcweir 				nId++;
308cdf0e10cSrcweir 			}
309cdf0e10cSrcweir 		}
310cdf0e10cSrcweir 		if ( !bBoldItalic )
311cdf0e10cSrcweir 		{
312cdf0e10cSrcweir 			if ( bNormal || bItalic || bBold )
313cdf0e10cSrcweir 			{
314cdf0e10cSrcweir 				InsertItem( nId, pList->GetBoldItalicStr(),
315cdf0e10cSrcweir 							MIB_RADIOCHECK | MIB_AUTOCHECK, nPos );
316cdf0e10cSrcweir 				nPos++;
317cdf0e10cSrcweir 				nId++;
318cdf0e10cSrcweir 			}
319cdf0e10cSrcweir 		}
320cdf0e10cSrcweir 	}
321cdf0e10cSrcweir 	else
322cdf0e10cSrcweir 	{
323cdf0e10cSrcweir 		// Wenn Font nicht, dann Standard-Styles einfuegen
324cdf0e10cSrcweir 		InsertItem( FONTSTYLEMENU_FIRSTID,	 pList->GetNormalStr(),
325cdf0e10cSrcweir 					MIB_RADIOCHECK | MIB_AUTOCHECK, 0 );
326cdf0e10cSrcweir 		InsertItem( FONTSTYLEMENU_FIRSTID+1, pList->GetItalicStr(),
327cdf0e10cSrcweir 					MIB_RADIOCHECK | MIB_AUTOCHECK, 0 );
328cdf0e10cSrcweir 		InsertItem( FONTSTYLEMENU_FIRSTID+2, pList->GetBoldStr(),
329cdf0e10cSrcweir 					MIB_RADIOCHECK | MIB_AUTOCHECK, 0 );
330cdf0e10cSrcweir 		InsertItem( FONTSTYLEMENU_FIRSTID+3, pList->GetBoldItalicStr(),
331cdf0e10cSrcweir 					MIB_RADIOCHECK | MIB_AUTOCHECK, 0 );
332cdf0e10cSrcweir 	}
333cdf0e10cSrcweir 
334cdf0e10cSrcweir 	SetCurStyle( maCurStyle );
335cdf0e10cSrcweir }
336cdf0e10cSrcweir 
337cdf0e10cSrcweir // -----------------------------------------------------------------------
338cdf0e10cSrcweir 
339cdf0e10cSrcweir void FontStyleMenu::SetCurStyle( const XubString& rStyle )
340cdf0e10cSrcweir {
341cdf0e10cSrcweir 	maCurStyle = rStyle;
342cdf0e10cSrcweir 
343cdf0e10cSrcweir 	// Menueintrag checken
344cdf0e10cSrcweir 	sal_uInt16 nChecked = 0;
345cdf0e10cSrcweir 	sal_uInt16 nItemCount = GetItemCount();
346cdf0e10cSrcweir 	for( sal_uInt16 i = 0; i < nItemCount; i++ )
347cdf0e10cSrcweir 	{
348cdf0e10cSrcweir 		sal_uInt16 nItemId = GetItemId( i );
349cdf0e10cSrcweir 
350cdf0e10cSrcweir 		if ( (nItemId < FONTSTYLEMENU_FIRSTID) ||
351cdf0e10cSrcweir 			 (nItemId > FONTSTYLEMENU_LASTID) )
352cdf0e10cSrcweir 			break;
353cdf0e10cSrcweir 
354cdf0e10cSrcweir 		if ( IsItemChecked( nItemId ) )
355cdf0e10cSrcweir 			nChecked = nItemId;
356cdf0e10cSrcweir 
357cdf0e10cSrcweir 		XubString aText = GetItemText( nItemId );
358cdf0e10cSrcweir 		if ( aText == maCurStyle )
359cdf0e10cSrcweir 		{
360cdf0e10cSrcweir 			CheckItem( nItemId, sal_True );
361cdf0e10cSrcweir 			return;
362cdf0e10cSrcweir 		}
363cdf0e10cSrcweir 	}
364cdf0e10cSrcweir 
365cdf0e10cSrcweir 	if ( nChecked )
366cdf0e10cSrcweir 		CheckItem( nChecked, sal_False );
367cdf0e10cSrcweir }
368cdf0e10cSrcweir 
369cdf0e10cSrcweir // ========================================================================
370cdf0e10cSrcweir 
371cdf0e10cSrcweir FontSizeMenu::FontSizeMenu()
372cdf0e10cSrcweir :    mpHeightAry( NULL )
373cdf0e10cSrcweir ,    mnCurHeight( 100 )
374cdf0e10cSrcweir {
375cdf0e10cSrcweir 	SetMenuFlags( GetMenuFlags() | MENU_FLAG_NOAUTOMNEMONICS );
376cdf0e10cSrcweir }
377cdf0e10cSrcweir 
378cdf0e10cSrcweir // -----------------------------------------------------------------------
379cdf0e10cSrcweir 
380cdf0e10cSrcweir FontSizeMenu::~FontSizeMenu()
381cdf0e10cSrcweir {
382cdf0e10cSrcweir 	if ( mpHeightAry )
383cdf0e10cSrcweir 		delete[] mpHeightAry;
384cdf0e10cSrcweir }
385cdf0e10cSrcweir 
386cdf0e10cSrcweir // -----------------------------------------------------------------------
387cdf0e10cSrcweir 
388cdf0e10cSrcweir void FontSizeMenu::Select()
389cdf0e10cSrcweir {
390cdf0e10cSrcweir 	const sal_uInt16 nCurItemId = GetCurItemId();
391cdf0e10cSrcweir 	mnCurHeight = mpHeightAry[ nCurItemId - 1 ];
392cdf0e10cSrcweir 	maSelectHdl.Call( this );
393cdf0e10cSrcweir }
394cdf0e10cSrcweir 
395cdf0e10cSrcweir // -----------------------------------------------------------------------
396cdf0e10cSrcweir 
397cdf0e10cSrcweir void FontSizeMenu::Highlight()
398cdf0e10cSrcweir {
399cdf0e10cSrcweir 	const long nTempHeight = mnCurHeight;
400cdf0e10cSrcweir 	const sal_uInt16 nCurItemId = GetCurItemId();
401cdf0e10cSrcweir 	if ( !nCurItemId )
402cdf0e10cSrcweir 		mnCurHeight = 0;
403cdf0e10cSrcweir 	else
404cdf0e10cSrcweir 	{
405cdf0e10cSrcweir 		//sal_Int32 nValue = GetItemText( nCurItemId ).ToInt32();
406cdf0e10cSrcweir 		mnCurHeight = mpHeightAry[ nCurItemId - 1 ];
407cdf0e10cSrcweir 	}
408cdf0e10cSrcweir 	maHighlightHdl.Call( this );
409cdf0e10cSrcweir 	mnCurHeight = nTempHeight;
410cdf0e10cSrcweir }
411cdf0e10cSrcweir 
412cdf0e10cSrcweir // -----------------------------------------------------------------------
413cdf0e10cSrcweir 
414cdf0e10cSrcweir void FontSizeMenu::Fill( const FontInfo& rInfo, const FontList* pList )
415cdf0e10cSrcweir {
416cdf0e10cSrcweir 	Clear();
417cdf0e10cSrcweir 
418cdf0e10cSrcweir 	// setup font size array
419cdf0e10cSrcweir 	if ( mpHeightAry )
420cdf0e10cSrcweir 		delete[] mpHeightAry;
421cdf0e10cSrcweir 
422cdf0e10cSrcweir 	const long* pTempAry;
423cdf0e10cSrcweir 	const long* pAry = pList->GetSizeAry( rInfo );
424cdf0e10cSrcweir 	sal_uInt16 nSizeCount = 0;
425cdf0e10cSrcweir 	while ( pAry[nSizeCount] )
426cdf0e10cSrcweir 		nSizeCount++;
427cdf0e10cSrcweir 
428cdf0e10cSrcweir 	sal_uInt16 nPos = 0;
429cdf0e10cSrcweir 
430cdf0e10cSrcweir 	// first insert font size names (for simplified/traditional chinese)
431cdf0e10cSrcweir     FontSizeNames aFontSizeNames( Application::GetSettings().GetUILanguage() );
432cdf0e10cSrcweir 	mpHeightAry = new long[nSizeCount+aFontSizeNames.Count()];
433cdf0e10cSrcweir 	if ( !aFontSizeNames.IsEmpty() )
434cdf0e10cSrcweir 	{
435cdf0e10cSrcweir 		if ( pAry == pList->GetStdSizeAry() )
436cdf0e10cSrcweir 		{
437cdf0e10cSrcweir 			// for scalable fonts all font size names
438cdf0e10cSrcweir 			sal_uLong nCount = aFontSizeNames.Count();
439cdf0e10cSrcweir 			for( sal_uLong i = 0; i < nCount; i++ )
440cdf0e10cSrcweir 			{
441cdf0e10cSrcweir 				String	aSizeName = aFontSizeNames.GetIndexName( i );
442cdf0e10cSrcweir 				long	nSize = aFontSizeNames.GetIndexSize( i );
443cdf0e10cSrcweir 				mpHeightAry[nPos] = nSize;
444cdf0e10cSrcweir 				nPos++; // Id is nPos+1
445cdf0e10cSrcweir 				InsertItem( nPos, aSizeName, MIB_RADIOCHECK | MIB_AUTOCHECK );
446cdf0e10cSrcweir 			}
447cdf0e10cSrcweir 		}
448cdf0e10cSrcweir 		else
449cdf0e10cSrcweir 		{
450cdf0e10cSrcweir 			// for fixed size fonts only selectable font size names
451cdf0e10cSrcweir 			pTempAry = pAry;
452cdf0e10cSrcweir 			while ( *pTempAry )
453cdf0e10cSrcweir 			{
454cdf0e10cSrcweir 				String aSizeName = aFontSizeNames.Size2Name( *pTempAry );
455cdf0e10cSrcweir 				if ( aSizeName.Len() )
456cdf0e10cSrcweir 				{
457cdf0e10cSrcweir 					mpHeightAry[nPos] = *pTempAry;
458cdf0e10cSrcweir 					nPos++; // Id is nPos+1
459cdf0e10cSrcweir 					InsertItem( nPos, aSizeName, MIB_RADIOCHECK | MIB_AUTOCHECK );
460cdf0e10cSrcweir 				}
461cdf0e10cSrcweir 				pTempAry++;
462cdf0e10cSrcweir 			}
463cdf0e10cSrcweir 		}
464cdf0e10cSrcweir 	}
465cdf0e10cSrcweir 
466cdf0e10cSrcweir 	// then insert numerical font size values
467cdf0e10cSrcweir     const vcl::I18nHelper& rI18nHelper = Application::GetSettings().GetUILocaleI18nHelper();
468cdf0e10cSrcweir 	pTempAry = pAry;
469cdf0e10cSrcweir 	while ( *pTempAry )
470cdf0e10cSrcweir 	{
471cdf0e10cSrcweir 		mpHeightAry[nPos] = *pTempAry;
472cdf0e10cSrcweir 		nPos++; // Id is nPos+1
473cdf0e10cSrcweir 		InsertItem( nPos, rI18nHelper.GetNum( *pTempAry, 1, sal_True, sal_False ), MIB_RADIOCHECK | MIB_AUTOCHECK );
474cdf0e10cSrcweir 		pTempAry++;
475cdf0e10cSrcweir 	}
476cdf0e10cSrcweir 
477cdf0e10cSrcweir 	SetCurHeight( mnCurHeight );
478cdf0e10cSrcweir }
479cdf0e10cSrcweir 
480cdf0e10cSrcweir // -----------------------------------------------------------------------
481cdf0e10cSrcweir 
482cdf0e10cSrcweir void FontSizeMenu::SetCurHeight( long nHeight )
483cdf0e10cSrcweir {
484cdf0e10cSrcweir 	mnCurHeight = nHeight;
485cdf0e10cSrcweir 
486cdf0e10cSrcweir 	// check menue item
487cdf0e10cSrcweir 	XubString	aHeight = Application::GetSettings().GetUILocaleI18nHelper().GetNum( nHeight, 1, sal_True, sal_False  );
488cdf0e10cSrcweir 	sal_uInt16		nChecked = 0;
489cdf0e10cSrcweir 	sal_uInt16		nItemCount = GetItemCount();
490cdf0e10cSrcweir 	for( sal_uInt16 i = 0; i < nItemCount; i++ )
491cdf0e10cSrcweir 	{
492cdf0e10cSrcweir 		sal_uInt16 nItemId = GetItemId( i );
493cdf0e10cSrcweir 
494cdf0e10cSrcweir 		if ( mpHeightAry[i] == nHeight )
495cdf0e10cSrcweir 		{
496cdf0e10cSrcweir 			CheckItem( nItemId, sal_True );
497cdf0e10cSrcweir 			return;
498cdf0e10cSrcweir 		}
499cdf0e10cSrcweir 
500cdf0e10cSrcweir 		if ( IsItemChecked( nItemId ) )
501cdf0e10cSrcweir 			nChecked = nItemId;
502cdf0e10cSrcweir 	}
503cdf0e10cSrcweir 
504cdf0e10cSrcweir 	if ( nChecked )
505cdf0e10cSrcweir 		CheckItem( nChecked, sal_False );
506cdf0e10cSrcweir }
507