xref: /aoo4110/main/svx/source/dialog/fntctrl.cxx (revision b1cdbd2c)
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_svx.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski // include ---------------------------------------------------------------
28*b1cdbd2cSJim Jagielski #include <sfx2/viewsh.hxx>		// SfxViewShell
29*b1cdbd2cSJim Jagielski #include <sfx2/printer.hxx>		// Printer
30*b1cdbd2cSJim Jagielski #include <vcl/metric.hxx>
31*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
32*b1cdbd2cSJim Jagielski #include <unicode/uchar.h>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Reference.h>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/XBreakIterator.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiServiceFactory.hpp>
36*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_I18N_SCRIPTTYPE_HDL_
39*b1cdbd2cSJim Jagielski #include <com/sun/star/i18n/ScriptType.hdl>
40*b1cdbd2cSJim Jagielski #endif
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski #ifndef _SVSTDARR_HXX
43*b1cdbd2cSJim Jagielski #define _SVSTDARR_USHORTS
44*b1cdbd2cSJim Jagielski #define _SVSTDARR_ULONGS
45*b1cdbd2cSJim Jagielski #define _SVSTDARR_XUB_STRLEN
46*b1cdbd2cSJim Jagielski #include <svl/svstdarr.hxx>
47*b1cdbd2cSJim Jagielski #endif
48*b1cdbd2cSJim Jagielski #include <svtools/colorcfg.hxx>
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski #include <svx/fntctrl.hxx>
51*b1cdbd2cSJim Jagielski #include <svx/dialogs.hrc>
52*b1cdbd2cSJim Jagielski #define TEXT_WIDTH	20
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
55*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
56*b1cdbd2cSJim Jagielski using ::com::sun::star::i18n::XBreakIterator;
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
59*b1cdbd2cSJim Jagielski // small helper functions to set fonts
60*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
61*b1cdbd2cSJim Jagielski namespace
62*b1cdbd2cSJim Jagielski {
scaleFontWidth(Font & _rFont,const OutputDevice & rOutDev,long & _n100PercentFont)63*b1cdbd2cSJim Jagielski 	void scaleFontWidth(Font& _rFont,const OutputDevice& rOutDev,long& _n100PercentFont)
64*b1cdbd2cSJim Jagielski 	{
65*b1cdbd2cSJim Jagielski 		_rFont.SetWidth( 0 );
66*b1cdbd2cSJim Jagielski 		_n100PercentFont = rOutDev.GetFontMetric( _rFont ).GetWidth();
67*b1cdbd2cSJim Jagielski 	}
68*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------
initFont(Font & _rFont)69*b1cdbd2cSJim Jagielski 	void initFont(Font& _rFont)
70*b1cdbd2cSJim Jagielski 	{
71*b1cdbd2cSJim Jagielski 		_rFont.SetTransparent(sal_True);
72*b1cdbd2cSJim Jagielski 		_rFont.SetAlign(ALIGN_BASELINE);
73*b1cdbd2cSJim Jagielski 	}
74*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------
setFontSize(Font & _rFont)75*b1cdbd2cSJim Jagielski 	void setFontSize(Font& _rFont)
76*b1cdbd2cSJim Jagielski 	{
77*b1cdbd2cSJim Jagielski 		Size aSize( _rFont.GetSize() );
78*b1cdbd2cSJim Jagielski         aSize.Height() = ( aSize.Height() * 3 ) / 5;
79*b1cdbd2cSJim Jagielski         aSize.Width() = ( aSize.Width() * 3 ) / 5;
80*b1cdbd2cSJim Jagielski         _rFont.SetSize( aSize );
81*b1cdbd2cSJim Jagielski 	}
82*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------
calcFontHeightAnyAscent(OutputDevice * _pWin,Font & _rFont,long & _nHeight,long & _nAscent)83*b1cdbd2cSJim Jagielski 	void calcFontHeightAnyAscent(OutputDevice* _pWin,Font& _rFont,long& _nHeight,long& _nAscent)
84*b1cdbd2cSJim Jagielski 	{
85*b1cdbd2cSJim Jagielski         if ( !_nHeight )
86*b1cdbd2cSJim Jagielski         {
87*b1cdbd2cSJim Jagielski             _pWin->SetFont( _rFont );
88*b1cdbd2cSJim Jagielski             FontMetric aMetric( _pWin->GetFontMetric() );
89*b1cdbd2cSJim Jagielski             _nHeight = aMetric.GetLineHeight();
90*b1cdbd2cSJim Jagielski             _nAscent = aMetric.GetAscent();
91*b1cdbd2cSJim Jagielski         }
92*b1cdbd2cSJim Jagielski 	}
93*b1cdbd2cSJim Jagielski 	// -----------------------------------------------------------------------
setFont(const SvxFont & rNewFont,SvxFont & rImplFont)94*b1cdbd2cSJim Jagielski 	void setFont( const SvxFont& rNewFont, SvxFont& rImplFont )
95*b1cdbd2cSJim Jagielski 	{
96*b1cdbd2cSJim Jagielski 		rImplFont = rNewFont;
97*b1cdbd2cSJim Jagielski 		rImplFont.SetTransparent( sal_True );
98*b1cdbd2cSJim Jagielski 		rImplFont.SetAlign( ALIGN_BASELINE );
99*b1cdbd2cSJim Jagielski 	}
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski }
102*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski // class FontPrevWin_Impl -----------------------------------------------
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski class FontPrevWin_Impl
108*b1cdbd2cSJim Jagielski {
109*b1cdbd2cSJim Jagielski 	friend class SvxFontPrevWindow;
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski 	SvxFont         				aFont;
112*b1cdbd2cSJim Jagielski 	Printer*        				pPrinter;
113*b1cdbd2cSJim Jagielski 	sal_Bool            				bDelPrinter;
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski 	Reference < XBreakIterator >	xBreak;
116*b1cdbd2cSJim Jagielski 	SvULongs						aTextWidth;
117*b1cdbd2cSJim Jagielski 	SvXub_StrLens					aScriptChg;
118*b1cdbd2cSJim Jagielski 	SvUShorts						aScriptType;
119*b1cdbd2cSJim Jagielski 	SvxFont							aCJKFont;
120*b1cdbd2cSJim Jagielski 	SvxFont							aCTLFont;
121*b1cdbd2cSJim Jagielski 	String							aText;
122*b1cdbd2cSJim Jagielski 	String							aScriptText;
123*b1cdbd2cSJim Jagielski 	Color*							pColor;
124*b1cdbd2cSJim Jagielski 	Color*							pBackColor;
125*b1cdbd2cSJim Jagielski 	long							nAscent;
126*b1cdbd2cSJim Jagielski 	sal_Unicode						cStartBracket;
127*b1cdbd2cSJim Jagielski 	sal_Unicode						cEndBracket;
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski 	long							n100PercentFontWidth;		// initial -1 -> not set yet
130*b1cdbd2cSJim Jagielski 	long							n100PercentFontWidthCJK;
131*b1cdbd2cSJim Jagielski 	long							n100PercentFontWidthCTL;
132*b1cdbd2cSJim Jagielski 	sal_uInt16							nFontWidthScale;
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski 	sal_Bool							bSelection		: 1,
135*b1cdbd2cSJim Jagielski 									bGetSelection   : 1,
136*b1cdbd2cSJim Jagielski 									bUseResText     : 1,
137*b1cdbd2cSJim Jagielski 									bTwoLines       : 1,
138*b1cdbd2cSJim Jagielski 									bIsCJKUI        : 1,
139*b1cdbd2cSJim Jagielski                                     bIsCTLUI        : 1,
140*b1cdbd2cSJim Jagielski                                     bUseFontNameAsText : 1,
141*b1cdbd2cSJim Jagielski                                     bTextInited     : 1;
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski 	void				_CheckScript();
144*b1cdbd2cSJim Jagielski public:
FontPrevWin_Impl()145*b1cdbd2cSJim Jagielski 	inline FontPrevWin_Impl() :
146*b1cdbd2cSJim Jagielski 		pPrinter( NULL ), bDelPrinter( sal_False ),
147*b1cdbd2cSJim Jagielski         pColor( NULL ), pBackColor( 0 ),
148*b1cdbd2cSJim Jagielski         cStartBracket( 0 ), cEndBracket( 0 ), nFontWidthScale( 100 ),
149*b1cdbd2cSJim Jagielski         bSelection( sal_False ), bGetSelection( sal_False ), bUseResText( sal_False ),
150*b1cdbd2cSJim Jagielski         bTwoLines( sal_False ),
151*b1cdbd2cSJim Jagielski         bIsCJKUI( sal_False ), bIsCTLUI( sal_False ),
152*b1cdbd2cSJim Jagielski         bUseFontNameAsText( sal_False ), bTextInited( sal_False )
153*b1cdbd2cSJim Jagielski 		{
154*b1cdbd2cSJim Jagielski 			Invalidate100PercentFontWidth();
155*b1cdbd2cSJim Jagielski 		}
156*b1cdbd2cSJim Jagielski 
~FontPrevWin_Impl()157*b1cdbd2cSJim Jagielski 	inline ~FontPrevWin_Impl()
158*b1cdbd2cSJim Jagielski 	{
159*b1cdbd2cSJim Jagielski         delete pColor;
160*b1cdbd2cSJim Jagielski         delete pBackColor;
161*b1cdbd2cSJim Jagielski         if( bDelPrinter )
162*b1cdbd2cSJim Jagielski 			delete pPrinter;
163*b1cdbd2cSJim Jagielski 	}
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski 	void				CheckScript();
166*b1cdbd2cSJim Jagielski     Size				CalcTextSize( OutputDevice* pWin, OutputDevice* pPrt, SvxFont &rFont );
167*b1cdbd2cSJim Jagielski     void				DrawPrev( OutputDevice* pWin, Printer* pPrt, Point &rPt, SvxFont &rFont );
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski 	sal_Bool				SetFontWidthScale( sal_uInt16 nScaleInPercent );
170*b1cdbd2cSJim Jagielski 	inline void			Invalidate100PercentFontWidth();
171*b1cdbd2cSJim Jagielski 	inline sal_Bool			Is100PercentFontWidthValid() const;
172*b1cdbd2cSJim Jagielski 	void				ScaleFontWidth( const OutputDevice& rOutDev );
173*b1cdbd2cSJim Jagielski 							// scales rNonCJKFont and aCJKFont depending on nFontWidthScale and
174*b1cdbd2cSJim Jagielski 							//  sets the 100%-Font-Widths
175*b1cdbd2cSJim Jagielski };
176*b1cdbd2cSJim Jagielski 
CheckScript()177*b1cdbd2cSJim Jagielski void FontPrevWin_Impl::CheckScript()
178*b1cdbd2cSJim Jagielski {
179*b1cdbd2cSJim Jagielski 	if( aText != aScriptText )
180*b1cdbd2cSJim Jagielski 		_CheckScript();
181*b1cdbd2cSJim Jagielski }
182*b1cdbd2cSJim Jagielski 
Invalidate100PercentFontWidth()183*b1cdbd2cSJim Jagielski inline void FontPrevWin_Impl::Invalidate100PercentFontWidth()
184*b1cdbd2cSJim Jagielski {
185*b1cdbd2cSJim Jagielski 	n100PercentFontWidth = n100PercentFontWidthCJK = n100PercentFontWidthCTL = -1;
186*b1cdbd2cSJim Jagielski }
187*b1cdbd2cSJim Jagielski 
Is100PercentFontWidthValid() const188*b1cdbd2cSJim Jagielski inline sal_Bool FontPrevWin_Impl::Is100PercentFontWidthValid() const
189*b1cdbd2cSJim Jagielski {
190*b1cdbd2cSJim Jagielski 	DBG_ASSERT(	( n100PercentFontWidth == -1 && n100PercentFontWidthCJK == -1 ) ||
191*b1cdbd2cSJim Jagielski 				( n100PercentFontWidth != -1 && n100PercentFontWidthCJK != -1 ) ||
192*b1cdbd2cSJim Jagielski 				( n100PercentFontWidth == -1 && n100PercentFontWidthCTL == -1 ) ||
193*b1cdbd2cSJim Jagielski 				( n100PercentFontWidth != -1 && n100PercentFontWidthCTL != -1 ),
194*b1cdbd2cSJim Jagielski 				"*FontPrevWin_Impl::Is100PercentFontWidthValid(): 100PercentFontWidth's not synchronous" );
195*b1cdbd2cSJim Jagielski 	return n100PercentFontWidth != -1;
196*b1cdbd2cSJim Jagielski }
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski // class FontPrevWin_Impl -----------------------------------------------
199*b1cdbd2cSJim Jagielski 
200*b1cdbd2cSJim Jagielski /*-----------------19.7.2001 08:44------------------
201*b1cdbd2cSJim Jagielski  * void FontPrevWin_Impl::_CheckScript()
202*b1cdbd2cSJim Jagielski  * evalutates the scripttypes of the actual string.
203*b1cdbd2cSJim Jagielski  * Afterwards the positions of script change are notified in aScriptChg,
204*b1cdbd2cSJim Jagielski  * the scripttypes in aScriptType.
205*b1cdbd2cSJim Jagielski  * The aTextWidth array will be filled with zero.
206*b1cdbd2cSJim Jagielski  * --------------------------------------------------*/
207*b1cdbd2cSJim Jagielski 
_CheckScript()208*b1cdbd2cSJim Jagielski void FontPrevWin_Impl::_CheckScript()
209*b1cdbd2cSJim Jagielski {
210*b1cdbd2cSJim Jagielski     aScriptText = aText;
211*b1cdbd2cSJim Jagielski     size_t nCnt = aScriptChg.size();
212*b1cdbd2cSJim Jagielski     if( nCnt )
213*b1cdbd2cSJim Jagielski     {
214*b1cdbd2cSJim Jagielski         aScriptChg.clear();
215*b1cdbd2cSJim Jagielski         aScriptType.Remove( 0, nCnt );
216*b1cdbd2cSJim Jagielski         aTextWidth.Remove( 0, nCnt );
217*b1cdbd2cSJim Jagielski         nCnt = 0;
218*b1cdbd2cSJim Jagielski     }
219*b1cdbd2cSJim Jagielski     if( !xBreak.is() )
220*b1cdbd2cSJim Jagielski     {
221*b1cdbd2cSJim Jagielski         Reference< XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory();
222*b1cdbd2cSJim Jagielski         xBreak = Reference< XBreakIterator >(xMSF->createInstance(
223*b1cdbd2cSJim Jagielski 				::rtl::OUString::createFromAscii( "com.sun.star.i18n.BreakIterator" ) ),UNO_QUERY);
224*b1cdbd2cSJim Jagielski     }
225*b1cdbd2cSJim Jagielski     if( xBreak.is() )
226*b1cdbd2cSJim Jagielski     {
227*b1cdbd2cSJim Jagielski         sal_uInt16 nScript = xBreak->getScriptType( aText, 0 );
228*b1cdbd2cSJim Jagielski         sal_uInt16 nChg = 0;
229*b1cdbd2cSJim Jagielski         if( com::sun::star::i18n::ScriptType::WEAK == nScript )
230*b1cdbd2cSJim Jagielski         {
231*b1cdbd2cSJim Jagielski             nChg = (xub_StrLen)xBreak->endOfScript( aText, nChg, nScript );
232*b1cdbd2cSJim Jagielski             if( nChg < aText.Len() )
233*b1cdbd2cSJim Jagielski                 nScript = xBreak->getScriptType( aText, nChg );
234*b1cdbd2cSJim Jagielski             else
235*b1cdbd2cSJim Jagielski                 nScript = com::sun::star::i18n::ScriptType::LATIN;
236*b1cdbd2cSJim Jagielski         }
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski         do
239*b1cdbd2cSJim Jagielski         {
240*b1cdbd2cSJim Jagielski             nChg = (xub_StrLen)xBreak->endOfScript( aText, nChg, nScript );
241*b1cdbd2cSJim Jagielski             if (nChg < aText.Len() && nChg > 0 &&
242*b1cdbd2cSJim Jagielski                 (com::sun::star::i18n::ScriptType::WEAK ==
243*b1cdbd2cSJim Jagielski                  xBreak->getScriptType(aText, nChg - 1)))
244*b1cdbd2cSJim Jagielski             {
245*b1cdbd2cSJim Jagielski                 int8_t nType = u_charType(aText.GetChar(nChg) );
246*b1cdbd2cSJim Jagielski                 if (nType == U_NON_SPACING_MARK || nType == U_ENCLOSING_MARK ||
247*b1cdbd2cSJim Jagielski                     nType == U_COMBINING_SPACING_MARK )
248*b1cdbd2cSJim Jagielski                 {
249*b1cdbd2cSJim Jagielski                     aScriptChg.push_back( nChg - 1 );
250*b1cdbd2cSJim Jagielski                 }
251*b1cdbd2cSJim Jagielski                 else
252*b1cdbd2cSJim Jagielski                 {
253*b1cdbd2cSJim Jagielski                     aScriptChg.push_back( nChg );
254*b1cdbd2cSJim Jagielski                 }
255*b1cdbd2cSJim Jagielski             }
256*b1cdbd2cSJim Jagielski             else
257*b1cdbd2cSJim Jagielski             {
258*b1cdbd2cSJim Jagielski                 aScriptChg.push_back( nChg );
259*b1cdbd2cSJim Jagielski             }
260*b1cdbd2cSJim Jagielski             aScriptType.Insert( nScript, nCnt );
261*b1cdbd2cSJim Jagielski             aTextWidth.Insert( sal_uIntPtr(0), nCnt++ );
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski             if( nChg < aText.Len() )
264*b1cdbd2cSJim Jagielski                 nScript = xBreak->getScriptType( aText, nChg );
265*b1cdbd2cSJim Jagielski             else
266*b1cdbd2cSJim Jagielski                 break;
267*b1cdbd2cSJim Jagielski         } while( sal_True );
268*b1cdbd2cSJim Jagielski     }
269*b1cdbd2cSJim Jagielski }
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski /*-----------------19.7.2001 08:48------------------
272*b1cdbd2cSJim Jagielski  * Size FontPrevWin_Impl::CalcTextSize(..)
273*b1cdbd2cSJim Jagielski  * fills the aTextWidth array with the text width of every part
274*b1cdbd2cSJim Jagielski  * of the actual string without a script change inside.
275*b1cdbd2cSJim Jagielski  * For Latin parts the given rFont will be used,
276*b1cdbd2cSJim Jagielski  * for Asian parts the aCJKFont.
277*b1cdbd2cSJim Jagielski  * The returned size contains the whole string.
278*b1cdbd2cSJim Jagielski  * The member nAscent is calculated to the maximal ascent of all used fonts.
279*b1cdbd2cSJim Jagielski  * --------------------------------------------------*/
280*b1cdbd2cSJim Jagielski 
CalcTextSize(OutputDevice * pWin,OutputDevice * _pPrinter,SvxFont & rFont)281*b1cdbd2cSJim Jagielski Size FontPrevWin_Impl::CalcTextSize( OutputDevice* pWin, OutputDevice* _pPrinter,
282*b1cdbd2cSJim Jagielski     SvxFont &rFont )
283*b1cdbd2cSJim Jagielski {
284*b1cdbd2cSJim Jagielski     sal_uInt16 nScript;
285*b1cdbd2cSJim Jagielski     sal_uInt16 nIdx = 0;
286*b1cdbd2cSJim Jagielski     xub_StrLen nStart = 0;
287*b1cdbd2cSJim Jagielski     xub_StrLen nEnd;
288*b1cdbd2cSJim Jagielski     size_t nCnt = aScriptChg.size();
289*b1cdbd2cSJim Jagielski     if( nCnt )
290*b1cdbd2cSJim Jagielski     {
291*b1cdbd2cSJim Jagielski         nEnd = aScriptChg[ nIdx ];
292*b1cdbd2cSJim Jagielski         nScript = aScriptType[ nIdx ];
293*b1cdbd2cSJim Jagielski     }
294*b1cdbd2cSJim Jagielski     else
295*b1cdbd2cSJim Jagielski     {
296*b1cdbd2cSJim Jagielski         nEnd = aText.Len();
297*b1cdbd2cSJim Jagielski         nScript = com::sun::star::i18n::ScriptType::LATIN;
298*b1cdbd2cSJim Jagielski     }
299*b1cdbd2cSJim Jagielski     long nTxtWidth = 0;
300*b1cdbd2cSJim Jagielski     long nCJKHeight = 0;
301*b1cdbd2cSJim Jagielski 	long nCTLHeight = 0;
302*b1cdbd2cSJim Jagielski     long nHeight = 0;
303*b1cdbd2cSJim Jagielski     nAscent = 0;
304*b1cdbd2cSJim Jagielski     long nCJKAscent = 0;
305*b1cdbd2cSJim Jagielski 	long nCTLAscent = 0;
306*b1cdbd2cSJim Jagielski     do
307*b1cdbd2cSJim Jagielski     {
308*b1cdbd2cSJim Jagielski         SvxFont& rFnt = (nScript==com::sun::star::i18n::ScriptType::ASIAN) ? aCJKFont : ((nScript==com::sun::star::i18n::ScriptType::COMPLEX) ? aCTLFont : rFont);
309*b1cdbd2cSJim Jagielski         sal_uIntPtr nWidth = rFnt.GetTxtSize( _pPrinter, aText, nStart, nEnd-nStart ).
310*b1cdbd2cSJim Jagielski                        Width();
311*b1cdbd2cSJim Jagielski         aTextWidth[ nIdx++ ] = nWidth;
312*b1cdbd2cSJim Jagielski         nTxtWidth += nWidth;
313*b1cdbd2cSJim Jagielski 		switch(nScript)
314*b1cdbd2cSJim Jagielski 		{
315*b1cdbd2cSJim Jagielski 			case com::sun::star::i18n::ScriptType::ASIAN:
316*b1cdbd2cSJim Jagielski 				calcFontHeightAnyAscent(pWin,aCJKFont,nCJKHeight,nCJKAscent);
317*b1cdbd2cSJim Jagielski 				break;
318*b1cdbd2cSJim Jagielski 			case com::sun::star::i18n::ScriptType::COMPLEX:
319*b1cdbd2cSJim Jagielski 				calcFontHeightAnyAscent(pWin,aCTLFont,nCTLHeight,nCTLAscent);
320*b1cdbd2cSJim Jagielski 				break;
321*b1cdbd2cSJim Jagielski 			default:
322*b1cdbd2cSJim Jagielski 				calcFontHeightAnyAscent(pWin,rFont,nHeight,nAscent);
323*b1cdbd2cSJim Jagielski 		}
324*b1cdbd2cSJim Jagielski 
325*b1cdbd2cSJim Jagielski         if( nEnd < aText.Len() && nIdx < nCnt )
326*b1cdbd2cSJim Jagielski         {
327*b1cdbd2cSJim Jagielski             nStart = nEnd;
328*b1cdbd2cSJim Jagielski             nEnd = aScriptChg[ nIdx ];
329*b1cdbd2cSJim Jagielski             nScript = aScriptType[ nIdx ];
330*b1cdbd2cSJim Jagielski         }
331*b1cdbd2cSJim Jagielski         else
332*b1cdbd2cSJim Jagielski             break;
333*b1cdbd2cSJim Jagielski     }
334*b1cdbd2cSJim Jagielski     while( sal_True );
335*b1cdbd2cSJim Jagielski     nHeight -= nAscent;
336*b1cdbd2cSJim Jagielski     nCJKHeight -= nCJKAscent;
337*b1cdbd2cSJim Jagielski 	nCTLHeight -= nCTLAscent;
338*b1cdbd2cSJim Jagielski     if( nHeight < nCJKHeight )
339*b1cdbd2cSJim Jagielski         nHeight = nCJKHeight;
340*b1cdbd2cSJim Jagielski     if( nAscent < nCJKAscent )
341*b1cdbd2cSJim Jagielski         nAscent = nCJKAscent;
342*b1cdbd2cSJim Jagielski 	if( nHeight < nCTLHeight )
343*b1cdbd2cSJim Jagielski         nHeight = nCTLHeight;
344*b1cdbd2cSJim Jagielski     if( nAscent < nCTLAscent )
345*b1cdbd2cSJim Jagielski         nAscent = nCTLAscent;
346*b1cdbd2cSJim Jagielski     nHeight += nAscent;
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski     Size aTxtSize( nTxtWidth, nHeight );
349*b1cdbd2cSJim Jagielski     return aTxtSize;
350*b1cdbd2cSJim Jagielski }
351*b1cdbd2cSJim Jagielski 
352*b1cdbd2cSJim Jagielski /*-----------------19.7.2001 08:54------------------
353*b1cdbd2cSJim Jagielski  * void FontPrevWin_Impl::DrawPrev(..)
354*b1cdbd2cSJim Jagielski  * calls SvxFont::DrawPrev(..) for every part of the string without a script
355*b1cdbd2cSJim Jagielski  * change inside, for Asian parts the aCJKFont will be used, otherwise the
356*b1cdbd2cSJim Jagielski  * given rFont.
357*b1cdbd2cSJim Jagielski  * --------------------------------------------------*/
358*b1cdbd2cSJim Jagielski 
DrawPrev(OutputDevice * pWin,Printer * _pPrinter,Point & rPt,SvxFont & rFont)359*b1cdbd2cSJim Jagielski void FontPrevWin_Impl::DrawPrev( OutputDevice* pWin, Printer* _pPrinter,
360*b1cdbd2cSJim Jagielski     Point &rPt, SvxFont &rFont )
361*b1cdbd2cSJim Jagielski {
362*b1cdbd2cSJim Jagielski     Font aOldFont = _pPrinter->GetFont();
363*b1cdbd2cSJim Jagielski     sal_uInt16 nScript;
364*b1cdbd2cSJim Jagielski     sal_uInt16 nIdx = 0;
365*b1cdbd2cSJim Jagielski     xub_StrLen nStart = 0;
366*b1cdbd2cSJim Jagielski     xub_StrLen nEnd;
367*b1cdbd2cSJim Jagielski     size_t nCnt = aScriptChg.size();
368*b1cdbd2cSJim Jagielski     if( nCnt )
369*b1cdbd2cSJim Jagielski     {
370*b1cdbd2cSJim Jagielski         nEnd = aScriptChg[ nIdx ];
371*b1cdbd2cSJim Jagielski         nScript = aScriptType[ nIdx ];
372*b1cdbd2cSJim Jagielski     }
373*b1cdbd2cSJim Jagielski     else
374*b1cdbd2cSJim Jagielski     {
375*b1cdbd2cSJim Jagielski         nEnd = aText.Len();
376*b1cdbd2cSJim Jagielski         nScript = com::sun::star::i18n::ScriptType::LATIN;
377*b1cdbd2cSJim Jagielski     }
378*b1cdbd2cSJim Jagielski     do
379*b1cdbd2cSJim Jagielski     {
380*b1cdbd2cSJim Jagielski         SvxFont& rFnt = (nScript==com::sun::star::i18n::ScriptType::ASIAN) ? aCJKFont : ((nScript==com::sun::star::i18n::ScriptType::COMPLEX) ? aCTLFont : rFont);
381*b1cdbd2cSJim Jagielski         _pPrinter->SetFont( rFnt );
382*b1cdbd2cSJim Jagielski 
383*b1cdbd2cSJim Jagielski         rFnt.DrawPrev( pWin, _pPrinter, rPt, aText, nStart, nEnd - nStart );
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski         rPt.X() += aTextWidth[ nIdx++ ];
386*b1cdbd2cSJim Jagielski         if( nEnd < aText.Len() && nIdx < nCnt )
387*b1cdbd2cSJim Jagielski         {
388*b1cdbd2cSJim Jagielski             nStart = nEnd;
389*b1cdbd2cSJim Jagielski             nEnd = aScriptChg[ nIdx ];
390*b1cdbd2cSJim Jagielski             nScript = aScriptType[ nIdx ];
391*b1cdbd2cSJim Jagielski         }
392*b1cdbd2cSJim Jagielski         else
393*b1cdbd2cSJim Jagielski             break;
394*b1cdbd2cSJim Jagielski     }
395*b1cdbd2cSJim Jagielski     while( sal_True );
396*b1cdbd2cSJim Jagielski     _pPrinter->SetFont( aOldFont );
397*b1cdbd2cSJim Jagielski }
398*b1cdbd2cSJim Jagielski 
399*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
400*b1cdbd2cSJim Jagielski 
SetFontWidthScale(sal_uInt16 nScale)401*b1cdbd2cSJim Jagielski sal_Bool FontPrevWin_Impl::SetFontWidthScale( sal_uInt16 nScale )
402*b1cdbd2cSJim Jagielski {
403*b1cdbd2cSJim Jagielski 	if( nFontWidthScale != nScale )
404*b1cdbd2cSJim Jagielski 	{
405*b1cdbd2cSJim Jagielski 		nFontWidthScale = nScale;
406*b1cdbd2cSJim Jagielski 		return sal_True;
407*b1cdbd2cSJim Jagielski 	}
408*b1cdbd2cSJim Jagielski 
409*b1cdbd2cSJim Jagielski 	return sal_False;
410*b1cdbd2cSJim Jagielski }
411*b1cdbd2cSJim Jagielski 
412*b1cdbd2cSJim Jagielski 
413*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
414*b1cdbd2cSJim Jagielski 
ScaleFontWidth(const OutputDevice & rOutDev)415*b1cdbd2cSJim Jagielski void FontPrevWin_Impl::ScaleFontWidth( const OutputDevice& rOutDev )
416*b1cdbd2cSJim Jagielski {
417*b1cdbd2cSJim Jagielski 	if( !Is100PercentFontWidthValid() )
418*b1cdbd2cSJim Jagielski 	{
419*b1cdbd2cSJim Jagielski 		scaleFontWidth(aFont,rOutDev,n100PercentFontWidth);
420*b1cdbd2cSJim Jagielski 		scaleFontWidth(aCJKFont,rOutDev,n100PercentFontWidthCJK);
421*b1cdbd2cSJim Jagielski 		scaleFontWidth(aCTLFont,rOutDev,n100PercentFontWidthCTL);
422*b1cdbd2cSJim Jagielski 	}
423*b1cdbd2cSJim Jagielski 
424*b1cdbd2cSJim Jagielski 	aFont.SetWidth( n100PercentFontWidth * nFontWidthScale / 100 );
425*b1cdbd2cSJim Jagielski 	aCJKFont.SetWidth( n100PercentFontWidthCJK * nFontWidthScale / 100 );
426*b1cdbd2cSJim Jagielski 	aCTLFont.SetWidth( n100PercentFontWidthCTL * nFontWidthScale / 100 );
427*b1cdbd2cSJim Jagielski }
428*b1cdbd2cSJim Jagielski 
429*b1cdbd2cSJim Jagielski // class SvxFontPrevWindow -----------------------------------------------
430*b1cdbd2cSJim Jagielski 
InitSettings(sal_Bool bForeground,sal_Bool bBackground)431*b1cdbd2cSJim Jagielski void SvxFontPrevWindow::InitSettings( sal_Bool bForeground, sal_Bool bBackground )
432*b1cdbd2cSJim Jagielski {
433*b1cdbd2cSJim Jagielski 	const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
434*b1cdbd2cSJim Jagielski 
435*b1cdbd2cSJim Jagielski 	if ( bForeground )
436*b1cdbd2cSJim Jagielski 	{
437*b1cdbd2cSJim Jagielski 		svtools::ColorConfig aColorConfig;
438*b1cdbd2cSJim Jagielski 		Color aTextColor( aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor );
439*b1cdbd2cSJim Jagielski 
440*b1cdbd2cSJim Jagielski 		if ( IsControlForeground() )
441*b1cdbd2cSJim Jagielski 			aTextColor = GetControlForeground();
442*b1cdbd2cSJim Jagielski 		SetTextColor( aTextColor );
443*b1cdbd2cSJim Jagielski 	}
444*b1cdbd2cSJim Jagielski 
445*b1cdbd2cSJim Jagielski 	if ( bBackground )
446*b1cdbd2cSJim Jagielski 	{
447*b1cdbd2cSJim Jagielski 		if ( IsControlBackground() )
448*b1cdbd2cSJim Jagielski 			SetBackground( GetControlBackground() );
449*b1cdbd2cSJim Jagielski 		else
450*b1cdbd2cSJim Jagielski 			SetBackground( rStyleSettings.GetWindowColor() );
451*b1cdbd2cSJim Jagielski 	}
452*b1cdbd2cSJim Jagielski 	Invalidate();
453*b1cdbd2cSJim Jagielski }
454*b1cdbd2cSJim Jagielski 
455*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
456*b1cdbd2cSJim Jagielski 
SvxFontPrevWindow(Window * pParent,const ResId & rId)457*b1cdbd2cSJim Jagielski SvxFontPrevWindow::SvxFontPrevWindow( Window* pParent, const ResId& rId ) :
458*b1cdbd2cSJim Jagielski 
459*b1cdbd2cSJim Jagielski 	Window     ( pParent, rId )
460*b1cdbd2cSJim Jagielski {
461*b1cdbd2cSJim Jagielski 	pImpl = new FontPrevWin_Impl;
462*b1cdbd2cSJim Jagielski 	SfxViewShell* pSh = SfxViewShell::Current();
463*b1cdbd2cSJim Jagielski 
464*b1cdbd2cSJim Jagielski 	if ( pSh )
465*b1cdbd2cSJim Jagielski 		pImpl->pPrinter = pSh->GetPrinter();
466*b1cdbd2cSJim Jagielski 
467*b1cdbd2cSJim Jagielski 	if ( !pImpl->pPrinter )
468*b1cdbd2cSJim Jagielski 	{
469*b1cdbd2cSJim Jagielski 		pImpl->pPrinter = new Printer;
470*b1cdbd2cSJim Jagielski 		pImpl->bDelPrinter = sal_True;
471*b1cdbd2cSJim Jagielski 	}
472*b1cdbd2cSJim Jagielski 	SetMapMode( MapMode( MAP_TWIP ) );
473*b1cdbd2cSJim Jagielski 	initFont(pImpl->aFont);
474*b1cdbd2cSJim Jagielski 	initFont(pImpl->aCJKFont);
475*b1cdbd2cSJim Jagielski 	initFont(pImpl->aCTLFont);
476*b1cdbd2cSJim Jagielski 	InitSettings( sal_True, sal_True );
477*b1cdbd2cSJim Jagielski     SetBorderStyle( WINDOW_BORDER_MONO );
478*b1cdbd2cSJim Jagielski 
479*b1cdbd2cSJim Jagielski     LanguageType eLanguage = Application::GetSettings().GetUILanguage();
480*b1cdbd2cSJim Jagielski     switch( eLanguage )
481*b1cdbd2cSJim Jagielski     {
482*b1cdbd2cSJim Jagielski         case LANGUAGE_CHINESE:
483*b1cdbd2cSJim Jagielski         case LANGUAGE_JAPANESE:
484*b1cdbd2cSJim Jagielski         case LANGUAGE_KOREAN:
485*b1cdbd2cSJim Jagielski         case LANGUAGE_KOREAN_JOHAB:
486*b1cdbd2cSJim Jagielski         case LANGUAGE_CHINESE_SIMPLIFIED:
487*b1cdbd2cSJim Jagielski         case LANGUAGE_CHINESE_HONGKONG:
488*b1cdbd2cSJim Jagielski         case LANGUAGE_CHINESE_SINGAPORE:
489*b1cdbd2cSJim Jagielski         case LANGUAGE_CHINESE_MACAU:
490*b1cdbd2cSJim Jagielski         case LANGUAGE_CHINESE_TRADITIONAL:
491*b1cdbd2cSJim Jagielski             pImpl->bIsCJKUI = sal_True;
492*b1cdbd2cSJim Jagielski             break;
493*b1cdbd2cSJim Jagielski         // TODO: CTL Locale
494*b1cdbd2cSJim Jagielski         //  pImpl->bIsCTLUI = sal_True;
495*b1cdbd2cSJim Jagielski         //  break;
496*b1cdbd2cSJim Jagielski         default:
497*b1cdbd2cSJim Jagielski             pImpl->bIsCJKUI = pImpl->bIsCTLUI = sal_False;
498*b1cdbd2cSJim Jagielski             break;
499*b1cdbd2cSJim Jagielski     }
500*b1cdbd2cSJim Jagielski }
501*b1cdbd2cSJim Jagielski 
502*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
503*b1cdbd2cSJim Jagielski 
~SvxFontPrevWindow()504*b1cdbd2cSJim Jagielski SvxFontPrevWindow::~SvxFontPrevWindow()
505*b1cdbd2cSJim Jagielski {
506*b1cdbd2cSJim Jagielski     delete pImpl;
507*b1cdbd2cSJim Jagielski }
508*b1cdbd2cSJim Jagielski 
509*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
GetCTLFont()510*b1cdbd2cSJim Jagielski SvxFont& SvxFontPrevWindow::GetCTLFont()
511*b1cdbd2cSJim Jagielski {
512*b1cdbd2cSJim Jagielski     return pImpl->aCTLFont;
513*b1cdbd2cSJim Jagielski }
514*b1cdbd2cSJim Jagielski 
515*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
516*b1cdbd2cSJim Jagielski 
GetCJKFont()517*b1cdbd2cSJim Jagielski SvxFont& SvxFontPrevWindow::GetCJKFont()
518*b1cdbd2cSJim Jagielski {
519*b1cdbd2cSJim Jagielski     return pImpl->aCJKFont;
520*b1cdbd2cSJim Jagielski }
521*b1cdbd2cSJim Jagielski 
522*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
523*b1cdbd2cSJim Jagielski 
StateChanged(StateChangedType nType)524*b1cdbd2cSJim Jagielski void SvxFontPrevWindow::StateChanged( StateChangedType nType )
525*b1cdbd2cSJim Jagielski {
526*b1cdbd2cSJim Jagielski 	if ( nType == STATE_CHANGE_CONTROLFOREGROUND )
527*b1cdbd2cSJim Jagielski 		InitSettings( sal_True, sal_False );
528*b1cdbd2cSJim Jagielski 	else if ( nType == STATE_CHANGE_CONTROLBACKGROUND )
529*b1cdbd2cSJim Jagielski 		InitSettings( sal_False, sal_True );
530*b1cdbd2cSJim Jagielski 
531*b1cdbd2cSJim Jagielski 	Window::StateChanged( nType );
532*b1cdbd2cSJim Jagielski }
533*b1cdbd2cSJim Jagielski 
534*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
535*b1cdbd2cSJim Jagielski 
DataChanged(const DataChangedEvent & rDCEvt)536*b1cdbd2cSJim Jagielski void SvxFontPrevWindow::DataChanged( const DataChangedEvent& rDCEvt )
537*b1cdbd2cSJim Jagielski {
538*b1cdbd2cSJim Jagielski 	if ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
539*b1cdbd2cSJim Jagielski 		InitSettings( sal_True, sal_True );
540*b1cdbd2cSJim Jagielski 	else
541*b1cdbd2cSJim Jagielski 		Window::DataChanged( rDCEvt );
542*b1cdbd2cSJim Jagielski }
543*b1cdbd2cSJim Jagielski 
GetFont()544*b1cdbd2cSJim Jagielski SvxFont& SvxFontPrevWindow::GetFont()
545*b1cdbd2cSJim Jagielski {
546*b1cdbd2cSJim Jagielski 	pImpl->Invalidate100PercentFontWidth();		// because the user might change the size
547*b1cdbd2cSJim Jagielski 	return pImpl->aFont;
548*b1cdbd2cSJim Jagielski }
549*b1cdbd2cSJim Jagielski 
GetFont() const550*b1cdbd2cSJim Jagielski const SvxFont& SvxFontPrevWindow::GetFont() const
551*b1cdbd2cSJim Jagielski {
552*b1cdbd2cSJim Jagielski 	return pImpl->aFont;
553*b1cdbd2cSJim Jagielski }
554*b1cdbd2cSJim Jagielski 
555*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
556*b1cdbd2cSJim Jagielski 
SetPreviewText(const::rtl::OUString & rString)557*b1cdbd2cSJim Jagielski void SvxFontPrevWindow::SetPreviewText( const ::rtl::OUString& rString )
558*b1cdbd2cSJim Jagielski {
559*b1cdbd2cSJim Jagielski     pImpl->aText = rString;
560*b1cdbd2cSJim Jagielski     pImpl->bTextInited = sal_True;
561*b1cdbd2cSJim Jagielski }
562*b1cdbd2cSJim Jagielski 
563*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
564*b1cdbd2cSJim Jagielski 
SetFontNameAsPreviewText()565*b1cdbd2cSJim Jagielski void SvxFontPrevWindow::SetFontNameAsPreviewText()
566*b1cdbd2cSJim Jagielski {
567*b1cdbd2cSJim Jagielski     pImpl->bUseFontNameAsText = sal_True;
568*b1cdbd2cSJim Jagielski }
569*b1cdbd2cSJim Jagielski 
570*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
571*b1cdbd2cSJim Jagielski 
SetFont(const SvxFont & rOutFont)572*b1cdbd2cSJim Jagielski void SvxFontPrevWindow::SetFont( const SvxFont& rOutFont )
573*b1cdbd2cSJim Jagielski {
574*b1cdbd2cSJim Jagielski 	setFont( rOutFont, pImpl->aFont );
575*b1cdbd2cSJim Jagielski 
576*b1cdbd2cSJim Jagielski 	pImpl->Invalidate100PercentFontWidth();
577*b1cdbd2cSJim Jagielski 	Invalidate();
578*b1cdbd2cSJim Jagielski }
579*b1cdbd2cSJim Jagielski 
580*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
581*b1cdbd2cSJim Jagielski 
SetFont(const SvxFont & rNormalOutFont,const SvxFont & rCJKOutFont,const SvxFont & rCTLFont)582*b1cdbd2cSJim Jagielski void SvxFontPrevWindow::SetFont( const SvxFont& rNormalOutFont, const SvxFont& rCJKOutFont, const SvxFont& rCTLFont )
583*b1cdbd2cSJim Jagielski {
584*b1cdbd2cSJim Jagielski 	setFont( rNormalOutFont, pImpl->aFont );
585*b1cdbd2cSJim Jagielski 	setFont( rCJKOutFont, pImpl->aCJKFont );
586*b1cdbd2cSJim Jagielski 	setFont( rCTLFont, pImpl->aCTLFont );
587*b1cdbd2cSJim Jagielski 
588*b1cdbd2cSJim Jagielski 
589*b1cdbd2cSJim Jagielski 	pImpl->Invalidate100PercentFontWidth();
590*b1cdbd2cSJim Jagielski 	Invalidate();
591*b1cdbd2cSJim Jagielski }
592*b1cdbd2cSJim Jagielski 
593*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
594*b1cdbd2cSJim Jagielski 
SetCJKFont(const SvxFont & rCJKOutFont)595*b1cdbd2cSJim Jagielski void SvxFontPrevWindow::SetCJKFont( const SvxFont &rCJKOutFont )
596*b1cdbd2cSJim Jagielski {
597*b1cdbd2cSJim Jagielski 	setFont( rCJKOutFont, pImpl->aCJKFont );
598*b1cdbd2cSJim Jagielski 
599*b1cdbd2cSJim Jagielski 	pImpl->Invalidate100PercentFontWidth();
600*b1cdbd2cSJim Jagielski 	Invalidate();
601*b1cdbd2cSJim Jagielski }
602*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
SetCTLFont(const SvxFont & rCTLOutFont)603*b1cdbd2cSJim Jagielski void SvxFontPrevWindow::SetCTLFont( const SvxFont &rCTLOutFont )
604*b1cdbd2cSJim Jagielski {
605*b1cdbd2cSJim Jagielski 	setFont( rCTLOutFont, pImpl->aCTLFont );
606*b1cdbd2cSJim Jagielski 
607*b1cdbd2cSJim Jagielski 	pImpl->Invalidate100PercentFontWidth();
608*b1cdbd2cSJim Jagielski 	Invalidate();
609*b1cdbd2cSJim Jagielski }
610*b1cdbd2cSJim Jagielski 
611*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
612*b1cdbd2cSJim Jagielski 
SetColor(const Color & rColor)613*b1cdbd2cSJim Jagielski void SvxFontPrevWindow::SetColor(const Color &rColor)
614*b1cdbd2cSJim Jagielski {
615*b1cdbd2cSJim Jagielski 	delete pImpl->pColor;
616*b1cdbd2cSJim Jagielski 	pImpl->pColor = new Color( rColor );
617*b1cdbd2cSJim Jagielski 	Invalidate();
618*b1cdbd2cSJim Jagielski }
619*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
620*b1cdbd2cSJim Jagielski 
ResetColor()621*b1cdbd2cSJim Jagielski void SvxFontPrevWindow::ResetColor()
622*b1cdbd2cSJim Jagielski {
623*b1cdbd2cSJim Jagielski     delete pImpl->pColor;
624*b1cdbd2cSJim Jagielski     pImpl->pColor = 0;
625*b1cdbd2cSJim Jagielski     Invalidate();
626*b1cdbd2cSJim Jagielski }
627*b1cdbd2cSJim Jagielski 
628*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
629*b1cdbd2cSJim Jagielski 
SetBackColor(const Color & rColor)630*b1cdbd2cSJim Jagielski void SvxFontPrevWindow::SetBackColor(const Color &rColor)
631*b1cdbd2cSJim Jagielski {
632*b1cdbd2cSJim Jagielski     delete pImpl->pBackColor;
633*b1cdbd2cSJim Jagielski     pImpl->pBackColor = new Color( rColor );
634*b1cdbd2cSJim Jagielski 	Invalidate();
635*b1cdbd2cSJim Jagielski }
636*b1cdbd2cSJim Jagielski 
637*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
638*b1cdbd2cSJim Jagielski 
UseResourceText(sal_Bool bUse)639*b1cdbd2cSJim Jagielski void SvxFontPrevWindow::UseResourceText( sal_Bool bUse )
640*b1cdbd2cSJim Jagielski {
641*b1cdbd2cSJim Jagielski 	pImpl->bUseResText = bUse;
642*b1cdbd2cSJim Jagielski }
643*b1cdbd2cSJim Jagielski 
644*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
645*b1cdbd2cSJim Jagielski 
Paint(const Rectangle &)646*b1cdbd2cSJim Jagielski void SvxFontPrevWindow::Paint( const Rectangle& )
647*b1cdbd2cSJim Jagielski {
648*b1cdbd2cSJim Jagielski 	Printer* pPrinter = pImpl->pPrinter;
649*b1cdbd2cSJim Jagielski 	SvxFont& rFont = pImpl->aFont;
650*b1cdbd2cSJim Jagielski 	SvxFont& rCJKFont = pImpl->aCJKFont;
651*b1cdbd2cSJim Jagielski 	// TODO: SvxFont& rCTLFont = pImpl->aCTLFont;
652*b1cdbd2cSJim Jagielski 
653*b1cdbd2cSJim Jagielski     if ( pImpl->bUseResText )
654*b1cdbd2cSJim Jagielski 		pImpl->aText = GetText();
655*b1cdbd2cSJim Jagielski 	else if ( !pImpl->bSelection && !pImpl->bTextInited )
656*b1cdbd2cSJim Jagielski 	{
657*b1cdbd2cSJim Jagielski 		SfxViewShell* pSh = SfxViewShell::Current();
658*b1cdbd2cSJim Jagielski 
659*b1cdbd2cSJim Jagielski 		if ( pSh && !pImpl->bGetSelection && !pImpl->bUseFontNameAsText )
660*b1cdbd2cSJim Jagielski 		{
661*b1cdbd2cSJim Jagielski 			pImpl->aText = pSh->GetSelectionText();
662*b1cdbd2cSJim Jagielski 			pImpl->bGetSelection = sal_True;
663*b1cdbd2cSJim Jagielski 			pImpl->bSelection = pImpl->aText.Len() != 0;
664*b1cdbd2cSJim Jagielski 
665*b1cdbd2cSJim Jagielski 		}
666*b1cdbd2cSJim Jagielski 
667*b1cdbd2cSJim Jagielski 		if ( !pImpl->bSelection || pImpl->bUseFontNameAsText )
668*b1cdbd2cSJim Jagielski         {
669*b1cdbd2cSJim Jagielski 			pImpl->aText = rFont.GetName();
670*b1cdbd2cSJim Jagielski             if( pImpl->bIsCJKUI )
671*b1cdbd2cSJim Jagielski                 pImpl->aText += rCJKFont.GetName();
672*b1cdbd2cSJim Jagielski             //TODO bIsCTLUI
673*b1cdbd2cSJim Jagielski         }
674*b1cdbd2cSJim Jagielski 
675*b1cdbd2cSJim Jagielski 		if ( !pImpl->aText.Len() )
676*b1cdbd2cSJim Jagielski 			pImpl->aText = GetText();
677*b1cdbd2cSJim Jagielski 
678*b1cdbd2cSJim Jagielski         // remove line feeds and carriage returns from string
679*b1cdbd2cSJim Jagielski         bool bNotEmpty = false;
680*b1cdbd2cSJim Jagielski         for ( xub_StrLen i = 0; i < pImpl->aText.Len(); ++i )
681*b1cdbd2cSJim Jagielski         {
682*b1cdbd2cSJim Jagielski             if ( 0xa == pImpl->aText.GetChar( i ) ||
683*b1cdbd2cSJim Jagielski                  0xd == pImpl->aText.GetChar( i ) )
684*b1cdbd2cSJim Jagielski                  pImpl->aText.SetChar( i, ' ' );
685*b1cdbd2cSJim Jagielski             else
686*b1cdbd2cSJim Jagielski                 bNotEmpty = true;
687*b1cdbd2cSJim Jagielski         }
688*b1cdbd2cSJim Jagielski         if ( !bNotEmpty )
689*b1cdbd2cSJim Jagielski 			pImpl->aText = GetText();
690*b1cdbd2cSJim Jagielski 
691*b1cdbd2cSJim Jagielski 		if ( pImpl->aText.Len() > (TEXT_WIDTH-1) )
692*b1cdbd2cSJim Jagielski 			pImpl->aText.Erase( pImpl->aText.Search( sal_Unicode( ' ' ), TEXT_WIDTH ) );
693*b1cdbd2cSJim Jagielski 	}
694*b1cdbd2cSJim Jagielski 
695*b1cdbd2cSJim Jagielski 	// calculate text width scaling
696*b1cdbd2cSJim Jagielski 	pImpl->ScaleFontWidth( *this/*, rFont*/ );
697*b1cdbd2cSJim Jagielski 
698*b1cdbd2cSJim Jagielski     pImpl->CheckScript();
699*b1cdbd2cSJim Jagielski     Size aTxtSize = pImpl->CalcTextSize( this, pPrinter, rFont );
700*b1cdbd2cSJim Jagielski 
701*b1cdbd2cSJim Jagielski 	const Size aLogSize( GetOutputSize() );
702*b1cdbd2cSJim Jagielski 
703*b1cdbd2cSJim Jagielski 	long nX = aLogSize.Width()  / 2 - aTxtSize.Width() / 2;
704*b1cdbd2cSJim Jagielski 	long nY = aLogSize.Height() / 2 - aTxtSize.Height() / 2;
705*b1cdbd2cSJim Jagielski 
706*b1cdbd2cSJim Jagielski     if ( nY + pImpl->nAscent > aLogSize.Height() )
707*b1cdbd2cSJim Jagielski         nY = aLogSize.Height() - pImpl->nAscent;
708*b1cdbd2cSJim Jagielski 
709*b1cdbd2cSJim Jagielski     if ( pImpl->pBackColor )
710*b1cdbd2cSJim Jagielski 	{
711*b1cdbd2cSJim Jagielski         Rectangle aRect( Point( 0, 0 ), aLogSize );
712*b1cdbd2cSJim Jagielski 		Color aLineCol = GetLineColor();
713*b1cdbd2cSJim Jagielski 		Color aFillCol = GetFillColor();
714*b1cdbd2cSJim Jagielski 		SetLineColor();
715*b1cdbd2cSJim Jagielski         SetFillColor( *pImpl->pBackColor );
716*b1cdbd2cSJim Jagielski 		DrawRect( aRect );
717*b1cdbd2cSJim Jagielski 		SetLineColor( aLineCol );
718*b1cdbd2cSJim Jagielski 		SetFillColor( aFillCol );
719*b1cdbd2cSJim Jagielski 	}
720*b1cdbd2cSJim Jagielski     if ( pImpl->pColor )
721*b1cdbd2cSJim Jagielski 	{
722*b1cdbd2cSJim Jagielski 		Rectangle aRect( Point( nX, nY ), aTxtSize );
723*b1cdbd2cSJim Jagielski 		Color aLineCol = GetLineColor();
724*b1cdbd2cSJim Jagielski 		Color aFillCol = GetFillColor();
725*b1cdbd2cSJim Jagielski 		SetLineColor();
726*b1cdbd2cSJim Jagielski 		SetFillColor( *pImpl->pColor );
727*b1cdbd2cSJim Jagielski 		DrawRect( aRect );
728*b1cdbd2cSJim Jagielski 		SetLineColor( aLineCol );
729*b1cdbd2cSJim Jagielski 		SetFillColor( aFillCol );
730*b1cdbd2cSJim Jagielski 	}
731*b1cdbd2cSJim Jagielski 
732*b1cdbd2cSJim Jagielski     long nStdAscent = pImpl->nAscent;
733*b1cdbd2cSJim Jagielski 	nY += nStdAscent;
734*b1cdbd2cSJim Jagielski 
735*b1cdbd2cSJim Jagielski 	if(pImpl->bTwoLines)
736*b1cdbd2cSJim Jagielski 	{
737*b1cdbd2cSJim Jagielski 		SvxFont aSmallFont( rFont );
738*b1cdbd2cSJim Jagielski 		Size aOldSize = pImpl->aCJKFont.GetSize();
739*b1cdbd2cSJim Jagielski 		setFontSize(aSmallFont);
740*b1cdbd2cSJim Jagielski 		setFontSize(pImpl->aCJKFont);
741*b1cdbd2cSJim Jagielski 
742*b1cdbd2cSJim Jagielski 		long nStartBracketWidth = 0;
743*b1cdbd2cSJim Jagielski 		long nEndBracketWidth = 0;
744*b1cdbd2cSJim Jagielski 		long nTextWidth = 0;
745*b1cdbd2cSJim Jagielski 		if(pImpl->cStartBracket)
746*b1cdbd2cSJim Jagielski 		{
747*b1cdbd2cSJim Jagielski 			String sBracket(pImpl->cStartBracket);
748*b1cdbd2cSJim Jagielski 			nStartBracketWidth = rFont.GetTxtSize( pPrinter, sBracket ).Width();
749*b1cdbd2cSJim Jagielski 		}
750*b1cdbd2cSJim Jagielski 		if(pImpl->cEndBracket)
751*b1cdbd2cSJim Jagielski 		{
752*b1cdbd2cSJim Jagielski 			String sBracket(pImpl->cEndBracket);
753*b1cdbd2cSJim Jagielski 			nEndBracketWidth = rFont.GetTxtSize( pPrinter, sBracket ).Width();
754*b1cdbd2cSJim Jagielski 		}
755*b1cdbd2cSJim Jagielski         nTextWidth = pImpl->CalcTextSize( this, pPrinter, aSmallFont ).Width();
756*b1cdbd2cSJim Jagielski 		long nResultWidth = nStartBracketWidth;
757*b1cdbd2cSJim Jagielski 		nResultWidth += nEndBracketWidth;
758*b1cdbd2cSJim Jagielski 		nResultWidth += nTextWidth;
759*b1cdbd2cSJim Jagielski 
760*b1cdbd2cSJim Jagielski         long _nX = (aLogSize.Width() - nResultWidth) / 2;
761*b1cdbd2cSJim Jagielski         DrawLine( Point( 0,  nY ), Point( _nX, nY ) );
762*b1cdbd2cSJim Jagielski         DrawLine( Point( _nX + nResultWidth, nY ), Point( aLogSize.Width(), nY ) );
763*b1cdbd2cSJim Jagielski 
764*b1cdbd2cSJim Jagielski         long nSmallAscent = pImpl->nAscent;
765*b1cdbd2cSJim Jagielski 		long nOffset = (nStdAscent - nSmallAscent ) / 2;
766*b1cdbd2cSJim Jagielski 
767*b1cdbd2cSJim Jagielski 		if(pImpl->cStartBracket)
768*b1cdbd2cSJim Jagielski 		{
769*b1cdbd2cSJim Jagielski 			String sBracket(pImpl->cStartBracket);
770*b1cdbd2cSJim Jagielski             rFont.DrawPrev( this, pPrinter, Point( _nX, nY - nOffset - 4), sBracket );
771*b1cdbd2cSJim Jagielski             _nX += nStartBracketWidth;
772*b1cdbd2cSJim Jagielski 		}
773*b1cdbd2cSJim Jagielski 
774*b1cdbd2cSJim Jagielski         Point aTmpPoint1( _nX, nY - nSmallAscent - 2 );
775*b1cdbd2cSJim Jagielski         Point aTmpPoint2( _nX, nY );
776*b1cdbd2cSJim Jagielski         pImpl->DrawPrev( this, pPrinter, aTmpPoint1, aSmallFont );
777*b1cdbd2cSJim Jagielski         pImpl->DrawPrev( this, pPrinter, aTmpPoint2, aSmallFont );
778*b1cdbd2cSJim Jagielski 
779*b1cdbd2cSJim Jagielski         _nX += nTextWidth;
780*b1cdbd2cSJim Jagielski 		if(pImpl->cEndBracket)
781*b1cdbd2cSJim Jagielski 		{
782*b1cdbd2cSJim Jagielski             Point aTmpPoint( _nX + 1, nY - nOffset - 4);
783*b1cdbd2cSJim Jagielski 			String sBracket(pImpl->cEndBracket);
784*b1cdbd2cSJim Jagielski 			rFont.DrawPrev( this, pPrinter, aTmpPoint, sBracket );
785*b1cdbd2cSJim Jagielski 		}
786*b1cdbd2cSJim Jagielski         pImpl->aCJKFont.SetSize( aOldSize );
787*b1cdbd2cSJim Jagielski 	}
788*b1cdbd2cSJim Jagielski 	else
789*b1cdbd2cSJim Jagielski 	{
790*b1cdbd2cSJim Jagielski 		Color aLineCol = GetLineColor();
791*b1cdbd2cSJim Jagielski 
792*b1cdbd2cSJim Jagielski 		SetLineColor( rFont.GetColor() );
793*b1cdbd2cSJim Jagielski         DrawLine( Point( 0,  nY ), Point( nX, nY ) );
794*b1cdbd2cSJim Jagielski         DrawLine( Point( nX + aTxtSize.Width(), nY ), Point( aLogSize.Width(), nY ) );
795*b1cdbd2cSJim Jagielski 
796*b1cdbd2cSJim Jagielski 		SetLineColor( aLineCol );
797*b1cdbd2cSJim Jagielski 
798*b1cdbd2cSJim Jagielski         Point aTmpPoint( nX, nY );
799*b1cdbd2cSJim Jagielski         pImpl->DrawPrev( this, pPrinter, aTmpPoint, rFont );
800*b1cdbd2cSJim Jagielski 	}
801*b1cdbd2cSJim Jagielski }
802*b1cdbd2cSJim Jagielski /* -----------------------------04.12.00 16:26--------------------------------
803*b1cdbd2cSJim Jagielski 
804*b1cdbd2cSJim Jagielski  ---------------------------------------------------------------------------*/
IsTwoLines() const805*b1cdbd2cSJim Jagielski sal_Bool SvxFontPrevWindow::IsTwoLines() const
806*b1cdbd2cSJim Jagielski {
807*b1cdbd2cSJim Jagielski 	return pImpl->bTwoLines;
808*b1cdbd2cSJim Jagielski }
809*b1cdbd2cSJim Jagielski /* -----------------------------04.12.00 16:26--------------------------------
810*b1cdbd2cSJim Jagielski 
811*b1cdbd2cSJim Jagielski  ---------------------------------------------------------------------------*/
SetTwoLines(sal_Bool bSet)812*b1cdbd2cSJim Jagielski void SvxFontPrevWindow::SetTwoLines(sal_Bool bSet)
813*b1cdbd2cSJim Jagielski {
814*b1cdbd2cSJim Jagielski 	pImpl->bTwoLines = bSet;}
815*b1cdbd2cSJim Jagielski 
816*b1cdbd2cSJim Jagielski /* -----------------------------04.12.00 16:26--------------------------------
817*b1cdbd2cSJim Jagielski 
818*b1cdbd2cSJim Jagielski  ---------------------------------------------------------------------------*/
SetBrackets(sal_Unicode cStart,sal_Unicode cEnd)819*b1cdbd2cSJim Jagielski void SvxFontPrevWindow::SetBrackets(sal_Unicode cStart, sal_Unicode cEnd)
820*b1cdbd2cSJim Jagielski {
821*b1cdbd2cSJim Jagielski 	pImpl->cStartBracket = cStart;
822*b1cdbd2cSJim Jagielski 	pImpl->cEndBracket = cEnd;
823*b1cdbd2cSJim Jagielski }
824*b1cdbd2cSJim Jagielski 
825*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
826*b1cdbd2cSJim Jagielski 
SetFontWidthScale(sal_uInt16 n)827*b1cdbd2cSJim Jagielski void SvxFontPrevWindow::SetFontWidthScale( sal_uInt16 n )
828*b1cdbd2cSJim Jagielski {
829*b1cdbd2cSJim Jagielski 	if( pImpl->SetFontWidthScale( n ) )
830*b1cdbd2cSJim Jagielski 		Invalidate();
831*b1cdbd2cSJim Jagielski }
832*b1cdbd2cSJim Jagielski 
833*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
834*b1cdbd2cSJim Jagielski 
AutoCorrectFontColor(void)835*b1cdbd2cSJim Jagielski void SvxFontPrevWindow::AutoCorrectFontColor( void )
836*b1cdbd2cSJim Jagielski {
837*b1cdbd2cSJim Jagielski 	Color	aFontColor( GetTextColor() );
838*b1cdbd2cSJim Jagielski 
839*b1cdbd2cSJim Jagielski 	if( COL_AUTO == pImpl->aFont.GetColor().GetColor() )
840*b1cdbd2cSJim Jagielski 		pImpl->aFont.SetColor( aFontColor );
841*b1cdbd2cSJim Jagielski 
842*b1cdbd2cSJim Jagielski 	if( COL_AUTO == pImpl->aCJKFont.GetColor().GetColor() )
843*b1cdbd2cSJim Jagielski 		pImpl->aCJKFont.SetColor( aFontColor );
844*b1cdbd2cSJim Jagielski 
845*b1cdbd2cSJim Jagielski 	if( COL_AUTO == pImpl->aCTLFont.GetColor().GetColor() )
846*b1cdbd2cSJim Jagielski 		pImpl->aCTLFont.SetColor( aFontColor );
847*b1cdbd2cSJim Jagielski }
848