Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <hintids.hxx>
21 : #include <sfx2/printer.hxx>
22 : #include <editeng/lspcitem.hxx>
23 : #include <editeng/adjustitem.hxx>
24 : #include <editeng/escapementitem.hxx>
25 : #include <editeng/lrspitem.hxx>
26 : #include <editeng/pgrditem.hxx>
27 : #include <vcl/window.hxx>
28 : #include <vcl/svapp.hxx>
29 : #include <viewsh.hxx>
30 : #include <viewopt.hxx>
31 : #include <ndtxt.hxx>
32 : #include <pagefrm.hxx>
33 : #include <paratr.hxx>
34 : #include <SwPortionHandler.hxx>
35 : #include <porrst.hxx>
36 : #include <inftxt.hxx>
37 : #include <txtpaint.hxx>
38 : #include <swfntcch.hxx>
39 : #include <tgrditem.hxx>
40 : #include <pagedesc.hxx>
41 : #include <frmatr.hxx>
42 : #include <redlnitr.hxx>
43 : #include <porfly.hxx>
44 : #include <atrhndl.hxx>
45 : #include "rootfrm.hxx"
46 :
47 : #include <IDocumentRedlineAccess.hxx>
48 : #include <IDocumentSettingAccess.hxx>
49 : #include <IDocumentDeviceAccess.hxx>
50 :
51 : #include <crsrsh.hxx>
52 :
53 0 : SwTmpEndPortion::SwTmpEndPortion( const SwLinePortion &rPortion )
54 : {
55 0 : Height( rPortion.Height() );
56 0 : SetAscent( rPortion.GetAscent() );
57 0 : SetWhichPor( POR_TMPEND );
58 0 : }
59 :
60 0 : void SwTmpEndPortion::Paint( const SwTxtPaintInfo &rInf ) const
61 : {
62 0 : if (rInf.OnWin() && rInf.GetOpt().IsParagraph())
63 : {
64 0 : const SwFont* pOldFnt = rInf.GetFont();
65 :
66 0 : SwFont aFont(*pOldFnt);
67 0 : aFont.SetColor(NON_PRINTING_CHARACTER_COLOR);
68 0 : const_cast<SwTxtPaintInfo&>(rInf).SetFont(&aFont);
69 :
70 : // draw the pilcrow
71 0 : rInf.DrawText(OUString(CH_PAR), *this);
72 :
73 0 : const_cast<SwTxtPaintInfo&>(rInf).SetFont(const_cast<SwFont*>(pOldFnt));
74 : }
75 0 : }
76 :
77 886 : SwBreakPortion::SwBreakPortion( const SwLinePortion &rPortion )
78 886 : : SwLinePortion( rPortion )
79 : {
80 886 : nLineLength = 1;
81 886 : SetWhichPor( POR_BRK );
82 886 : }
83 :
84 0 : sal_Int32 SwBreakPortion::GetCrsrOfst( const sal_uInt16 ) const
85 0 : { return 0; }
86 :
87 1222 : sal_uInt16 SwBreakPortion::GetViewWidth( const SwTxtSizeInfo & ) const
88 1222 : { return 0; }
89 :
90 630 : SwLinePortion *SwBreakPortion::Compress()
91 630 : { return (GetPortion() && GetPortion()->InTxtGrp() ? 0 : this); }
92 :
93 948 : void SwBreakPortion::Paint( const SwTxtPaintInfo &rInf ) const
94 : {
95 948 : if( rInf.OnWin() && rInf.GetOpt().IsLineBreak() )
96 0 : rInf.DrawLineBreak( *this );
97 948 : }
98 :
99 886 : bool SwBreakPortion::Format( SwTxtFormatInfo &rInf )
100 : {
101 886 : const SwLinePortion *pRoot = rInf.GetRoot();
102 886 : Width( 0 );
103 886 : Height( pRoot->Height() );
104 886 : SetAscent( pRoot->GetAscent() );
105 886 : if ( rInf.GetIdx()+1 == rInf.GetTxt().getLength() )
106 372 : rInf.SetNewLine( true );
107 886 : return true;
108 : }
109 :
110 2 : void SwBreakPortion::HandlePortion( SwPortionHandler& rPH ) const
111 : {
112 2 : rPH.Text( GetLen(), GetWhichPor() );
113 2 : }
114 :
115 662 : SwKernPortion::SwKernPortion( SwLinePortion &rPortion, short nKrn,
116 : bool bBG, bool bGK ) :
117 662 : nKern( nKrn ), bBackground( bBG ), bGridKern( bGK )
118 : {
119 662 : Height( rPortion.Height() );
120 662 : SetAscent( rPortion.GetAscent() );
121 662 : nLineLength = 0;
122 662 : SetWhichPor( POR_KERN );
123 662 : if( nKern > 0 )
124 630 : Width( nKern );
125 662 : rPortion.Insert( this );
126 662 : }
127 :
128 140 : SwKernPortion::SwKernPortion( const SwLinePortion& rPortion ) :
129 140 : nKern( 0 ), bBackground( false ), bGridKern( true )
130 : {
131 140 : Height( rPortion.Height() );
132 140 : SetAscent( rPortion.GetAscent() );
133 :
134 140 : nLineLength = 0;
135 140 : SetWhichPor( POR_KERN );
136 140 : }
137 :
138 8 : void SwKernPortion::Paint( const SwTxtPaintInfo &rInf ) const
139 : {
140 8 : if( Width() )
141 : {
142 : // bBackground is set for Kerning Portions between two fields
143 8 : if ( bBackground )
144 0 : rInf.DrawViewOpt( *this, POR_FLD );
145 :
146 8 : rInf.DrawBackBrush( *this );
147 :
148 : // do we have to repaint a post it portion?
149 8 : if( rInf.OnWin() && pPortion && !pPortion->Width() )
150 0 : pPortion->PrePaint( rInf, this );
151 :
152 8 : if( rInf.GetFont()->IsPaintBlank() )
153 : {
154 0 : OUString aTxtDouble(" ");
155 :
156 0 : SwRect aClipRect;
157 0 : rInf.CalcRect( *this, &aClipRect, 0 );
158 0 : SwSaveClip aClip( (OutputDevice*)rInf.GetOut() );
159 0 : aClip.ChgClip( aClipRect, 0 );
160 0 : rInf.DrawText( aTxtDouble, *this, 0, 2, true );
161 : }
162 : }
163 8 : }
164 :
165 566 : void SwKernPortion::FormatEOL( SwTxtFormatInfo &rInf )
166 : {
167 566 : if ( bGridKern )
168 620 : return;
169 :
170 512 : if( rInf.GetLast() == this )
171 512 : rInf.SetLast( FindPrevPortion( rInf.GetRoot() ) );
172 512 : if( nKern < 0 )
173 16 : Width( -nKern );
174 : else
175 496 : Width( 0 );
176 512 : rInf.GetLast()->FormatEOL( rInf );
177 : }
178 :
179 0 : SwArrowPortion::SwArrowPortion( const SwLinePortion &rPortion ) :
180 0 : bLeft( true )
181 : {
182 0 : Height( rPortion.Height() );
183 0 : SetAscent( rPortion.GetAscent() );
184 0 : nLineLength = 0;
185 0 : SetWhichPor( POR_ARROW );
186 0 : }
187 :
188 24 : SwArrowPortion::SwArrowPortion( const SwTxtPaintInfo &rInf )
189 24 : : bLeft( false )
190 : {
191 24 : Height( (sal_uInt16)(rInf.GetTxtFrm()->Prt().Height()) );
192 48 : aPos.X() = rInf.GetTxtFrm()->Frm().Left() +
193 48 : rInf.GetTxtFrm()->Prt().Right();
194 48 : aPos.Y() = rInf.GetTxtFrm()->Frm().Top() +
195 48 : rInf.GetTxtFrm()->Prt().Bottom();
196 24 : SetWhichPor( POR_ARROW );
197 24 : }
198 :
199 0 : void SwArrowPortion::Paint( const SwTxtPaintInfo &rInf ) const
200 : {
201 0 : ((SwArrowPortion*)this)->aPos = rInf.GetPos();
202 0 : }
203 :
204 0 : SwLinePortion *SwArrowPortion::Compress() { return this; }
205 :
206 140086 : SwTwips SwTxtFrm::EmptyHeight() const
207 : {
208 140086 : if (IsCollapse()) {
209 456 : SwViewShell *pSh = getRootFrm()->GetCurrShell();
210 456 : if ( pSh->IsA( TYPE(SwCrsrShell) ) ) {
211 456 : SwCrsrShell *pCrSh=(SwCrsrShell*)pSh;
212 456 : SwCntntFrm *pCurrFrm=pCrSh->GetCurrFrm();
213 456 : if (pCurrFrm==(SwCntntFrm*)this) {
214 : // do nothing
215 : } else {
216 456 : return 1;
217 : }
218 : } else {
219 0 : return 1;
220 : }
221 : }
222 : OSL_ENSURE( ! IsVertical() || ! IsSwapped(),"SwTxtFrm::EmptyHeight with swapped frame" );
223 :
224 : SwFont *pFnt;
225 139630 : const SwTxtNode& rTxtNode = *GetTxtNode();
226 139630 : const IDocumentSettingAccess* pIDSA = rTxtNode.getIDocumentSettingAccess();
227 139630 : SwViewShell *pSh = getRootFrm()->GetCurrShell();
228 139630 : if ( rTxtNode.HasSwAttrSet() )
229 : {
230 81514 : const SwAttrSet *pAttrSet = &( rTxtNode.GetSwAttrSet() );
231 81514 : pFnt = new SwFont( pAttrSet, pIDSA );
232 : }
233 : else
234 : {
235 58116 : SwFontAccess aFontAccess( &rTxtNode.GetAnyFmtColl(), pSh);
236 58116 : pFnt = new SwFont( aFontAccess.Get()->GetFont() );
237 58116 : pFnt->ChkMagic( pSh, pFnt->GetActual() );
238 : }
239 :
240 139630 : if ( IsVertical() )
241 6 : pFnt->SetVertical( 2700 );
242 :
243 139630 : OutputDevice* pOut = pSh ? pSh->GetOut() : 0;
244 139854 : if ( !pOut || !pSh->GetViewOptions()->getBrowseMode() ||
245 224 : pSh->GetViewOptions()->IsPrtFormat() )
246 : {
247 139406 : pOut = rTxtNode.getIDocumentDeviceAccess()->getReferenceDevice(true);
248 : }
249 :
250 139630 : const IDocumentRedlineAccess* pIDRA = rTxtNode.getIDocumentRedlineAccess();
251 139630 : if( IDocumentRedlineAccess::IsShowChanges( pIDRA->GetRedlineMode() ) )
252 : {
253 139552 : const sal_uInt16 nRedlPos = pIDRA->GetRedlinePos( rTxtNode, USHRT_MAX );
254 139552 : if( USHRT_MAX != nRedlPos )
255 : {
256 562 : SwAttrHandler aAttrHandler;
257 562 : aAttrHandler.Init( GetTxtNode()->GetSwAttrSet(),
258 1124 : *GetTxtNode()->getIDocumentSettingAccess(), NULL );
259 : SwRedlineItr aRedln( rTxtNode, *pFnt, aAttrHandler,
260 562 : nRedlPos, true );
261 : }
262 : }
263 :
264 : SwTwips nRet;
265 139630 : if( !pOut )
266 0 : nRet = IsVertical() ?
267 0 : Prt().SSize().Width() + 1 :
268 0 : Prt().SSize().Height() + 1;
269 : else
270 : {
271 139630 : pFnt->SetFntChg( true );
272 139630 : pFnt->ChgPhysFnt( pSh, *pOut );
273 139630 : nRet = pFnt->GetHeight( pSh, *pOut );
274 : }
275 139630 : delete pFnt;
276 139630 : return nRet;
277 : }
278 :
279 55371 : bool SwTxtFrm::FormatEmpty()
280 : {
281 : OSL_ENSURE( ! IsVertical() || ! IsSwapped(),"SwTxtFrm::FormatEmpty with swapped frame" );
282 :
283 55371 : bool bCollapse = EmptyHeight( ) == 1 && this->IsCollapse( );
284 :
285 217974 : if ( HasFollow() || GetTxtNode()->GetpSwpHints() ||
286 101462 : 0 != GetTxtNode()->GetNumRule() ||
287 98994 : GetTxtNode()->HasHiddenCharAttribute( true ) ||
288 153953 : IsInFtn() || ( HasPara() && GetPara()->IsPrepMustFit() ) )
289 6220 : return false;
290 49151 : const SwAttrSet& aSet = GetTxtNode()->GetSwAttrSet();
291 49151 : const SvxAdjust nAdjust = aSet.GetAdjust().GetAdjust();
292 98150 : if( !bCollapse && ( ( ( ! IsRightToLeft() && ( SVX_ADJUST_LEFT != nAdjust ) ) ||
293 83190 : ( IsRightToLeft() && ( SVX_ADJUST_RIGHT != nAdjust ) ) ) ||
294 41571 : aSet.GetRegister().GetValue() ) )
295 7428 : return false;
296 41723 : const SvxLineSpacingItem &rSpacing = aSet.GetLineSpacing();
297 84960 : if( !bCollapse && ( SVX_LINE_SPACE_MIN == rSpacing.GetLineSpaceRule() ||
298 80644 : SVX_LINE_SPACE_FIX == rSpacing.GetLineSpaceRule() ||
299 39489 : aSet.GetLRSpace().IsAutoFirst() ) )
300 2082 : return false;
301 :
302 39641 : SwTxtFly aTxtFly( this );
303 39641 : SwRect aRect;
304 39641 : bool bFirstFlyCheck = 0 != Prt().Height();
305 137006 : if ( !bCollapse && bFirstFlyCheck &&
306 65203 : aTxtFly.IsOn() && aTxtFly.IsAnyObj( aRect ) )
307 5653 : return false;
308 :
309 33988 : SwTwips nHeight = EmptyHeight();
310 :
311 67414 : if ( GetTxtNode()->GetSwAttrSet().GetParaGrid().GetValue() &&
312 33426 : IsInDocBody() )
313 : {
314 24624 : SwTextGridItem const*const pGrid(GetGridItem(FindPageFrm()));
315 24624 : if ( pGrid )
316 0 : nHeight = pGrid->GetBaseHeight() + pGrid->GetRubyHeight();
317 : }
318 :
319 33988 : SWRECTFN( this )
320 33988 : const SwTwips nChg = nHeight - (Prt().*fnRect->fnGetHeight)();
321 :
322 33988 : if( !nChg )
323 11240 : SetUndersized( false );
324 33988 : AdjustFrm( nChg );
325 :
326 33988 : if( HasBlinkPor() )
327 : {
328 0 : ClearPara();
329 0 : ResetBlinkPor();
330 : }
331 33988 : SetCacheIdx( USHRT_MAX );
332 33988 : if( !IsEmpty() )
333 : {
334 20784 : SetEmpty( true );
335 20784 : SetCompletePaint();
336 : }
337 123066 : if( !bCollapse && !bFirstFlyCheck &&
338 61966 : aTxtFly.IsOn() && aTxtFly.IsAnyObj( aRect ) )
339 3312 : return false;
340 :
341 : // #i35635# - call method <HideAndShowObjects()>
342 : // to assure that objects anchored at the empty paragraph are
343 : // correctly visible resp. invisible.
344 30676 : HideAndShowObjects();
345 30676 : return true;
346 : }
347 :
348 0 : bool SwTxtFrm::FillRegister( SwTwips& rRegStart, sal_uInt16& rRegDiff )
349 : {
350 0 : const SwFrm *pFrm = this;
351 0 : rRegDiff = 0;
352 0 : while( !( ( FRM_BODY | FRM_FLY )
353 0 : & pFrm->GetType() ) && pFrm->GetUpper() )
354 0 : pFrm = pFrm->GetUpper();
355 0 : if( ( FRM_BODY| FRM_FLY ) & pFrm->GetType() )
356 : {
357 0 : SWRECTFN( pFrm )
358 0 : rRegStart = (pFrm->*fnRect->fnGetPrtTop)();
359 0 : pFrm = pFrm->FindPageFrm();
360 0 : if( pFrm->IsPageFrm() )
361 : {
362 0 : SwPageDesc* pDesc = ((SwPageFrm*)pFrm)->FindPageDesc();
363 0 : if( pDesc )
364 : {
365 0 : rRegDiff = pDesc->GetRegHeight();
366 0 : if( !rRegDiff )
367 : {
368 0 : const SwTxtFmtColl *pFmt = pDesc->GetRegisterFmtColl();
369 0 : if( pFmt )
370 : {
371 0 : const SvxLineSpacingItem &rSpace = pFmt->GetLineSpacing();
372 0 : if( SVX_LINE_SPACE_FIX == rSpace.GetLineSpaceRule() )
373 : {
374 0 : rRegDiff = rSpace.GetLineHeight();
375 0 : pDesc->SetRegHeight( rRegDiff );
376 0 : pDesc->SetRegAscent( ( 4 * rRegDiff ) / 5 );
377 : }
378 : else
379 : {
380 0 : SwViewShell *pSh = getRootFrm()->GetCurrShell();
381 0 : SwFontAccess aFontAccess( pFmt, pSh );
382 0 : SwFont aFnt( aFontAccess.Get()->GetFont() );
383 :
384 0 : OutputDevice *pOut = 0;
385 0 : if( !pSh || !pSh->GetViewOptions()->getBrowseMode() ||
386 0 : pSh->GetViewOptions()->IsPrtFormat() )
387 0 : pOut = GetTxtNode()->getIDocumentDeviceAccess()->getReferenceDevice( true );
388 :
389 0 : if( pSh && !pOut )
390 0 : pOut = pSh->GetWin();
391 :
392 0 : if( !pOut )
393 0 : pOut = Application::GetDefaultDevice();
394 :
395 0 : MapMode aOldMap( pOut->GetMapMode() );
396 0 : pOut->SetMapMode( MapMode( MAP_TWIP ) );
397 :
398 0 : aFnt.ChgFnt( pSh, *pOut );
399 0 : rRegDiff = aFnt.GetHeight( pSh, *pOut );
400 0 : sal_uInt16 nNetHeight = rRegDiff;
401 :
402 0 : switch( rSpace.GetLineSpaceRule() )
403 : {
404 : case SVX_LINE_SPACE_AUTO:
405 0 : break;
406 : case SVX_LINE_SPACE_MIN:
407 : {
408 0 : if( rRegDiff < rSpace.GetLineHeight() )
409 0 : rRegDiff = rSpace.GetLineHeight();
410 0 : break;
411 : }
412 : default:
413 : OSL_FAIL( ": unknown LineSpaceRule" );
414 : }
415 0 : switch( rSpace.GetInterLineSpaceRule() )
416 : {
417 : case SVX_INTER_LINE_SPACE_OFF:
418 0 : break;
419 : case SVX_INTER_LINE_SPACE_PROP:
420 : {
421 0 : long nTmp = rSpace.GetPropLineSpace();
422 0 : if( nTmp < 50 )
423 0 : nTmp = nTmp ? 50 : 100;
424 0 : nTmp *= rRegDiff;
425 0 : nTmp /= 100;
426 0 : if( !nTmp )
427 0 : ++nTmp;
428 0 : rRegDiff = (sal_uInt16)nTmp;
429 0 : nNetHeight = rRegDiff;
430 0 : break;
431 : }
432 : case SVX_INTER_LINE_SPACE_FIX:
433 : {
434 0 : rRegDiff = rRegDiff + rSpace.GetInterLineSpace();
435 0 : nNetHeight = rRegDiff;
436 0 : break;
437 : }
438 : default: OSL_FAIL( ": unknown InterLineSpaceRule" );
439 : }
440 0 : pDesc->SetRegHeight( rRegDiff );
441 : pDesc->SetRegAscent( rRegDiff - nNetHeight +
442 0 : aFnt.GetAscent( pSh, *pOut ) );
443 0 : pOut->SetMapMode( aOldMap );
444 : }
445 : }
446 : }
447 0 : const long nTmpDiff = pDesc->GetRegAscent() - rRegDiff;
448 0 : if ( bVert )
449 0 : rRegStart -= nTmpDiff;
450 : else
451 0 : rRegStart += nTmpDiff;
452 : }
453 : }
454 : }
455 0 : return ( 0 != rRegDiff );
456 : }
457 :
458 4 : void SwHiddenTextPortion::Paint( const SwTxtPaintInfo & rInf) const
459 : {
460 : (void)rInf;
461 : #ifdef DBG_UTIL
462 : OutputDevice* pOut = (OutputDevice*)rInf.GetOut();
463 : Color aCol( SwViewOption::GetFieldShadingsColor() );
464 : Color aOldColor( pOut->GetFillColor() );
465 : pOut->SetFillColor( aCol );
466 : Point aPos( rInf.GetPos() );
467 : aPos.Y() -= 150;
468 : aPos.X() -= 25;
469 : SwRect aRect( aPos, Size( 100, 200 ) );
470 : ((OutputDevice*)pOut)->DrawRect( aRect.SVRect() );
471 : pOut->SetFillColor( aOldColor );
472 : #endif
473 4 : }
474 :
475 8 : bool SwHiddenTextPortion::Format( SwTxtFormatInfo &rInf )
476 : {
477 8 : Width( 0 );
478 8 : rInf.GetTxtFrm()->HideFootnotes( rInf.GetIdx(), rInf.GetIdx() + GetLen() );
479 :
480 8 : return false;
481 : };
482 :
483 0 : void SwControlCharPortion::Paint( const SwTxtPaintInfo &rInf ) const
484 : {
485 0 : if ( Width() ) // is only set during prepaint mode
486 : {
487 0 : rInf.DrawViewOpt( *this, POR_CONTROLCHAR );
488 :
489 0 : if ( !rInf.GetOpt().IsPagePreview() &&
490 0 : !rInf.GetOpt().IsReadonly() &&
491 0 : SwViewOption::IsFieldShadings() &&
492 0 : CHAR_ZWNBSP != mcChar )
493 : {
494 0 : SwFont aTmpFont( *rInf.GetFont() );
495 0 : aTmpFont.SetEscapement( CHAR_ZWSP == mcChar ? DFLT_ESC_AUTO_SUB : -25 );
496 0 : const sal_uInt16 nProp = 40;
497 0 : aTmpFont.SetProportion( nProp ); // a smaller font
498 0 : SwFontSave aFontSave( rInf, &aTmpFont );
499 :
500 0 : OUString aOutString;
501 :
502 0 : switch ( mcChar )
503 : {
504 : case CHAR_ZWSP :
505 0 : aOutString = "/"; break;
506 : // case CHAR_LRM :
507 : // rTxt = sal_Unicode(0x2514); break;
508 : // case CHAR_RLM :
509 : // rTxt = sal_Unicode(0x2518); break;
510 : }
511 :
512 0 : if ( !mnHalfCharWidth )
513 0 : mnHalfCharWidth = rInf.GetTxtSize( aOutString ).Width() / 2;
514 :
515 0 : Point aOldPos = rInf.GetPos();
516 0 : Point aNewPos( aOldPos );
517 0 : aNewPos.X() = aNewPos.X() + ( Width() / 2 ) - mnHalfCharWidth;
518 0 : const_cast< SwTxtPaintInfo& >( rInf ).SetPos( aNewPos );
519 :
520 0 : rInf.DrawText( aOutString, *this );
521 :
522 0 : const_cast< SwTxtPaintInfo& >( rInf ).SetPos( aOldPos );
523 : }
524 : }
525 0 : }
526 :
527 0 : bool SwControlCharPortion::Format( SwTxtFormatInfo &rInf )
528 : {
529 0 : const SwLinePortion* pRoot = rInf.GetRoot();
530 0 : Width( 0 );
531 0 : Height( pRoot->Height() );
532 0 : SetAscent( pRoot->GetAscent() );
533 :
534 0 : return false;
535 : }
536 :
537 0 : sal_uInt16 SwControlCharPortion::GetViewWidth( const SwTxtSizeInfo& rInf ) const
538 : {
539 0 : if( !mnViewWidth )
540 0 : mnViewWidth = rInf.GetTxtSize(OUString(' ')).Width();
541 :
542 0 : return mnViewWidth;
543 270 : }
544 :
545 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|