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