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