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 SwTextPaintInfo &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<SwTextPaintInfo&>(rInf).SetFont(&aFont);
69 :
70 : // draw the pilcrow
71 0 : rInf.DrawText(OUString(CH_PAR), *this);
72 :
73 0 : const_cast<SwTextPaintInfo&>(rInf).SetFont(const_cast<SwFont*>(pOldFnt));
74 : }
75 0 : }
76 :
77 557 : SwBreakPortion::SwBreakPortion( const SwLinePortion &rPortion )
78 557 : : SwLinePortion( rPortion )
79 : {
80 557 : nLineLength = 1;
81 557 : SetWhichPor( POR_BRK );
82 557 : }
83 :
84 0 : sal_Int32 SwBreakPortion::GetCrsrOfst( const sal_uInt16 ) const
85 0 : { return 0; }
86 :
87 1203 : sal_uInt16 SwBreakPortion::GetViewWidth( const SwTextSizeInfo & ) const
88 1203 : { return 0; }
89 :
90 462 : SwLinePortion *SwBreakPortion::Compress()
91 462 : { return (GetPortion() && GetPortion()->InTextGrp() ? 0 : this); }
92 :
93 618 : void SwBreakPortion::Paint( const SwTextPaintInfo &rInf ) const
94 : {
95 618 : if( rInf.OnWin() && rInf.GetOpt().IsLineBreak() )
96 0 : rInf.DrawLineBreak( *this );
97 618 : }
98 :
99 557 : bool SwBreakPortion::Format( SwTextFormatInfo &rInf )
100 : {
101 557 : const SwLinePortion *pRoot = rInf.GetRoot();
102 557 : Width( 0 );
103 557 : Height( pRoot->Height() );
104 557 : SetAscent( pRoot->GetAscent() );
105 557 : if ( rInf.GetIdx()+1 == rInf.GetText().getLength() )
106 297 : rInf.SetNewLine( true );
107 557 : return true;
108 : }
109 :
110 1 : void SwBreakPortion::HandlePortion( SwPortionHandler& rPH ) const
111 : {
112 1 : rPH.Text( GetLen(), GetWhichPor() );
113 1 : }
114 :
115 324 : SwKernPortion::SwKernPortion( SwLinePortion &rPortion, short nKrn,
116 : bool bBG, bool bGK ) :
117 324 : nKern( nKrn ), bBackground( bBG ), bGridKern( bGK )
118 : {
119 324 : Height( rPortion.Height() );
120 324 : SetAscent( rPortion.GetAscent() );
121 324 : nLineLength = 0;
122 324 : SetWhichPor( POR_KERN );
123 324 : if( nKern > 0 )
124 308 : Width( nKern );
125 324 : rPortion.Insert( this );
126 324 : }
127 :
128 109 : SwKernPortion::SwKernPortion( const SwLinePortion& rPortion ) :
129 109 : nKern( 0 ), bBackground( false ), bGridKern( true )
130 : {
131 109 : Height( rPortion.Height() );
132 109 : SetAscent( rPortion.GetAscent() );
133 :
134 109 : nLineLength = 0;
135 109 : SetWhichPor( POR_KERN );
136 109 : }
137 :
138 5 : void SwKernPortion::Paint( const SwTextPaintInfo &rInf ) const
139 : {
140 5 : if( Width() )
141 : {
142 : // bBackground is set for Kerning Portions between two fields
143 5 : if ( bBackground )
144 0 : rInf.DrawViewOpt( *this, POR_FLD );
145 :
146 5 : rInf.DrawBackBrush( *this );
147 :
148 : // do we have to repaint a post it portion?
149 5 : if( rInf.OnWin() && pPortion && !pPortion->Width() )
150 0 : pPortion->PrePaint( rInf, this );
151 :
152 5 : if( rInf.GetFont()->IsPaintBlank() )
153 : {
154 1 : OUString aTextDouble(" ");
155 :
156 1 : SwRect aClipRect;
157 1 : rInf.CalcRect( *this, &aClipRect, 0 );
158 2 : SwSaveClip aClip( const_cast<OutputDevice*>(rInf.GetOut()) );
159 1 : aClip.ChgClip( aClipRect, 0 );
160 2 : rInf.DrawText( aTextDouble, *this, 0, 2, true );
161 : }
162 : }
163 5 : }
164 :
165 261 : void SwKernPortion::FormatEOL( SwTextFormatInfo &rInf )
166 : {
167 261 : if ( bGridKern )
168 300 : return;
169 :
170 222 : if( rInf.GetLast() == this )
171 222 : rInf.SetLast( FindPrevPortion( rInf.GetRoot() ) );
172 222 : if( nKern < 0 )
173 8 : Width( -nKern );
174 : else
175 214 : Width( 0 );
176 222 : 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 6 : SwArrowPortion::SwArrowPortion( const SwTextPaintInfo &rInf )
189 6 : : bLeft( false )
190 : {
191 6 : Height( (sal_uInt16)(rInf.GetTextFrm()->Prt().Height()) );
192 12 : aPos.X() = rInf.GetTextFrm()->Frm().Left() +
193 12 : rInf.GetTextFrm()->Prt().Right();
194 12 : aPos.Y() = rInf.GetTextFrm()->Frm().Top() +
195 12 : rInf.GetTextFrm()->Prt().Bottom();
196 6 : SetWhichPor( POR_ARROW );
197 6 : }
198 :
199 0 : void SwArrowPortion::Paint( const SwTextPaintInfo &rInf ) const
200 : {
201 0 : const_cast<SwArrowPortion*>(this)->aPos = rInf.GetPos();
202 0 : }
203 :
204 0 : SwLinePortion *SwArrowPortion::Compress() { return this; }
205 :
206 74089 : SwTwips SwTextFrm::EmptyHeight() const
207 : {
208 74089 : if (IsCollapse()) {
209 225 : SwViewShell *pSh = getRootFrm()->GetCurrShell();
210 225 : if ( pSh->IsA( TYPE(SwCrsrShell) ) ) {
211 216 : SwCrsrShell *pCrSh = static_cast<SwCrsrShell*>(pSh);
212 216 : SwContentFrm *pCurrFrm=pCrSh->GetCurrFrm();
213 216 : if (pCurrFrm==static_cast<SwContentFrm const *>(this)) {
214 : // do nothing
215 : } else {
216 216 : return 1;
217 : }
218 : } else {
219 9 : return 1;
220 : }
221 : }
222 : OSL_ENSURE( ! IsVertical() || ! IsSwapped(),"SwTextFrm::EmptyHeight with swapped frame" );
223 :
224 : SwFont *pFnt;
225 73864 : const SwTextNode& rTextNode = *GetTextNode();
226 73864 : const IDocumentSettingAccess* pIDSA = rTextNode.getIDocumentSettingAccess();
227 73864 : SwViewShell *pSh = getRootFrm()->GetCurrShell();
228 73864 : if ( rTextNode.HasSwAttrSet() )
229 : {
230 42531 : const SwAttrSet *pAttrSet = &( rTextNode.GetSwAttrSet() );
231 42531 : pFnt = new SwFont( pAttrSet, pIDSA );
232 : }
233 : else
234 : {
235 31333 : SwFontAccess aFontAccess( &rTextNode.GetAnyFormatColl(), pSh);
236 31333 : pFnt = new SwFont( aFontAccess.Get()->GetFont() );
237 31333 : pFnt->ChkMagic( pSh, pFnt->GetActual() );
238 : }
239 :
240 73864 : if ( IsVertical() )
241 5 : pFnt->SetVertical( 2700 );
242 :
243 73864 : OutputDevice* pOut = pSh ? pSh->GetOut() : 0;
244 74013 : if ( !pOut || !pSh->GetViewOptions()->getBrowseMode() ||
245 149 : pSh->GetViewOptions()->IsPrtFormat() )
246 : {
247 73715 : pOut = rTextNode.getIDocumentDeviceAccess()->getReferenceDevice(true);
248 : }
249 :
250 73864 : const IDocumentRedlineAccess* pIDRA = rTextNode.getIDocumentRedlineAccess();
251 73864 : if( IDocumentRedlineAccess::IsShowChanges( pIDRA->GetRedlineMode() ) )
252 : {
253 73515 : const sal_uInt16 nRedlPos = pIDRA->GetRedlinePos( rTextNode, USHRT_MAX );
254 73515 : if( USHRT_MAX != nRedlPos )
255 : {
256 281 : SwAttrHandler aAttrHandler;
257 281 : aAttrHandler.Init( GetTextNode()->GetSwAttrSet(),
258 562 : *GetTextNode()->getIDocumentSettingAccess(), NULL );
259 : SwRedlineItr aRedln( rTextNode, *pFnt, aAttrHandler,
260 281 : nRedlPos, true );
261 : }
262 : }
263 :
264 : SwTwips nRet;
265 73864 : if( !pOut )
266 0 : nRet = IsVertical() ?
267 0 : Prt().SSize().Width() + 1 :
268 0 : Prt().SSize().Height() + 1;
269 : else
270 : {
271 73864 : pFnt->SetFntChg( true );
272 73864 : pFnt->ChgPhysFnt( pSh, *pOut );
273 73864 : nRet = pFnt->GetHeight( pSh, *pOut );
274 : }
275 73864 : delete pFnt;
276 73864 : return nRet;
277 : }
278 :
279 29045 : bool SwTextFrm::FormatEmpty()
280 : {
281 : OSL_ENSURE( ! IsVertical() || ! IsSwapped(),"SwTextFrm::FormatEmpty with swapped frame" );
282 :
283 29045 : bool bCollapse = EmptyHeight( ) == 1 && this->IsCollapse( );
284 :
285 114405 : if ( HasFollow() || GetTextNode()->GetpSwpHints() ||
286 53975 : 0 != GetTextNode()->GetNumRule() ||
287 53305 : GetTextNode()->HasHiddenCharAttribute( true ) ||
288 82109 : IsInFootnote() || ( HasPara() && GetPara()->IsPrepMustFit() ) )
289 2613 : return false;
290 26432 : const SwAttrSet& aSet = GetTextNode()->GetSwAttrSet();
291 26432 : const SvxAdjust nAdjust = aSet.GetAdjust().GetAdjust();
292 52789 : if( !bCollapse && ( ( ( ! IsRightToLeft() && ( SVX_ADJUST_LEFT != nAdjust ) ) ||
293 44868 : ( IsRightToLeft() && ( SVX_ADJUST_RIGHT != nAdjust ) ) ) ||
294 22422 : aSet.GetRegister().GetValue() ) )
295 3935 : return false;
296 22497 : const SvxLineSpacingItem &rSpacing = aSet.GetLineSpacing();
297 45750 : if( !bCollapse && ( SVX_LINE_SPACE_MIN == rSpacing.GetLineSpaceRule() ||
298 43621 : SVX_LINE_SPACE_FIX == rSpacing.GetLineSpaceRule() ||
299 21395 : aSet.GetLRSpace().IsAutoFirst() ) )
300 1027 : return false;
301 :
302 21470 : SwTextFly aTextFly( this );
303 21470 : SwRect aRect;
304 21470 : bool bFirstFlyCheck = 0 != Prt().Height();
305 74148 : if ( !bCollapse && bFirstFlyCheck &&
306 35363 : aTextFly.IsOn() && aTextFly.IsAnyObj( aRect ) )
307 3093 : return false;
308 :
309 18377 : SwTwips nHeight = EmptyHeight();
310 :
311 36439 : if ( GetTextNode()->GetSwAttrSet().GetParaGrid().GetValue() &&
312 18062 : IsInDocBody() )
313 : {
314 13583 : SwTextGridItem const*const pGrid(GetGridItem(FindPageFrm()));
315 13583 : if ( pGrid )
316 4 : nHeight = pGrid->GetBaseHeight() + pGrid->GetRubyHeight();
317 : }
318 :
319 18377 : SWRECTFN( this )
320 18377 : const SwTwips nChg = nHeight - (Prt().*fnRect->fnGetHeight)();
321 :
322 18377 : if( !nChg )
323 5997 : SetUndersized( false );
324 18377 : AdjustFrm( nChg );
325 :
326 18377 : if( HasBlinkPor() )
327 : {
328 0 : ClearPara();
329 0 : ResetBlinkPor();
330 : }
331 18377 : SetCacheIdx( USHRT_MAX );
332 18377 : if( !IsEmpty() )
333 : {
334 11322 : SetEmpty( true );
335 11322 : SetCompletePaint();
336 : }
337 66638 : if( !bCollapse && !bFirstFlyCheck &&
338 33801 : aTextFly.IsOn() && aTextFly.IsAnyObj( aRect ) )
339 1742 : 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 16635 : HideAndShowObjects();
345 16635 : return true;
346 : }
347 :
348 0 : bool SwTextFrm::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 = const_cast<SwPageFrm*>(static_cast<const SwPageFrm*>(pFrm))->FindPageDesc();
363 0 : if( pDesc )
364 : {
365 0 : rRegDiff = pDesc->GetRegHeight();
366 0 : if( !rRegDiff )
367 : {
368 0 : const SwTextFormatColl *pFormat = pDesc->GetRegisterFormatColl();
369 0 : if( pFormat )
370 : {
371 0 : const SvxLineSpacingItem &rSpace = pFormat->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( pFormat, 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 = GetTextNode()->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 2 : void SwHiddenTextPortion::Paint( const SwTextPaintInfo & rInf) const
459 : {
460 : (void)rInf;
461 : #ifdef DBG_UTIL
462 : OutputDevice* pOut = const_cast<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 : static_cast<OutputDevice*>(pOut)->DrawRect( aRect.SVRect() );
471 : pOut->SetFillColor( aOldColor );
472 : #endif
473 2 : }
474 :
475 4 : bool SwHiddenTextPortion::Format( SwTextFormatInfo &rInf )
476 : {
477 4 : Width( 0 );
478 4 : rInf.GetTextFrm()->HideFootnotes( rInf.GetIdx(), rInf.GetIdx() + GetLen() );
479 :
480 4 : return false;
481 : };
482 :
483 0 : void SwControlCharPortion::Paint( const SwTextPaintInfo &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 : // rText = sal_Unicode(0x2514); break;
508 : // case CHAR_RLM :
509 : // rText = sal_Unicode(0x2518); break;
510 : }
511 :
512 0 : if ( !mnHalfCharWidth )
513 0 : mnHalfCharWidth = rInf.GetTextSize( 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< SwTextPaintInfo& >( rInf ).SetPos( aNewPos );
519 :
520 0 : rInf.DrawText( aOutString, *this );
521 :
522 0 : const_cast< SwTextPaintInfo& >( rInf ).SetPos( aOldPos );
523 : }
524 : }
525 0 : }
526 :
527 280 : bool SwControlCharPortion::Format( SwTextFormatInfo &rInf )
528 : {
529 280 : const SwLinePortion* pRoot = rInf.GetRoot();
530 280 : Width( 0 );
531 280 : Height( pRoot->Height() );
532 280 : SetAscent( pRoot->GetAscent() );
533 :
534 280 : return false;
535 : }
536 :
537 0 : sal_uInt16 SwControlCharPortion::GetViewWidth( const SwTextSizeInfo& rInf ) const
538 : {
539 0 : if( !mnViewWidth )
540 0 : mnViewWidth = rInf.GetTextSize(OUString(' ')).Width();
541 :
542 0 : return mnViewWidth;
543 177 : }
544 :
545 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|