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