xref: /AOO41X/main/svx/source/dialog/svxbmpnumvalueset.cxx (revision f6e50924346d0b8c0b07c91832a97665dd718b0c)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26 #include <svx/dialmgr.hxx>
27 #ifndef _SVX_DIALOGS_HRC
28 #include <svx/dialogs.hrc>
29 #endif
30 #include <tools/shl.hxx>
31 #include <i18npool/mslangid.hxx>
32 #include <svtools/valueset.hxx>
33 #include <svl/languageoptions.hxx>
34 #ifndef _SVX_HELPID_HRC
35 #include <helpid.hrc>
36 #endif
37 #include <editeng/numitem.hxx>
38 #include <svl/eitem.hxx>
39 #include <vcl/svapp.hxx>
40 #include <svx/gallery.hxx>
41 #include <svl/urihelper.hxx>
42 #include <editeng/brshitem.hxx>
43 #include <svl/intitem.hxx>
44 #include <sfx2/objsh.hxx>
45 #include <vcl/graph.hxx>
46 #include <vcl/msgbox.hxx>
47 #include <editeng/flstitem.hxx>
48 #include <svx/dlgutil.hxx>
49 #ifndef _XTABLE_HXX //autogen
50 
51 #include <svx/xtable.hxx>
52 #endif
53 #include <svx/drawitem.hxx>
54 #include <svx/numvset.hxx>
55 #include <svx/htmlmode.hxx>
56 #include <unotools/pathoptions.hxx>
57 #include <svtools/ctrltool.hxx>
58 #include <editeng/unolingu.hxx>
59 #include <com/sun/star/style/NumberingType.hpp>
60 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
61 #include <com/sun/star/container/XIndexAccess.hpp>
62 #include <com/sun/star/text/XDefaultNumberingProvider.hpp>
63 #include <com/sun/star/text/XNumberingFormatter.hpp>
64 #include <com/sun/star/beans/PropertyValue.hpp>
65 #include <comphelper/processfactory.hxx>
66 #include <com/sun/star/text/XNumberingTypeInfo.hpp>
67 
68 #include <algorithm>
69 #include <sfx2/opengrf.hxx>
70 
71 using namespace com::sun::star::uno;
72 using namespace com::sun::star::beans;
73 using namespace com::sun::star::lang;
74 using namespace com::sun::star::i18n;
75 using namespace com::sun::star::text;
76 using namespace com::sun::star::container;
77 using namespace com::sun::star::style;
78 using rtl::OUString;
79 
80 #define C2U(cChar) OUString::createFromAscii(cChar)
81 #define NUM_PAGETYPE_BULLET         0
82 #define NUM_PAGETYPE_SINGLENUM      1
83 #define NUM_PAGETYPE_NUM            2
84 #define NUM_PAGETYPE_BMP            3
85 #define PAGETYPE_USER_START         10
86 
87 #define SHOW_NUMBERING              0
88 #define SHOW_BULLET                 1
89 #define SHOW_BITMAP                 2
90 
91 #define MAX_BMP_WIDTH               16
92 #define MAX_BMP_HEIGHT              16
93 
94 static const sal_Char cNumberingType[] = "NumberingType";
95 static const sal_Char cValue[] = "Value";
96 static const sal_Char cParentNumbering[] = "ParentNumbering";
97 static const sal_Char cPrefix[] = "Prefix";
98 static const sal_Char cSuffix[] = "Suffix";
99 static const sal_Char cBulletChar[] = "BulletChar";
100 static const sal_Char cBulletFontName[] = "BulletFontName";
101 
102 /* -----------------28.10.98 08:32-------------------
103  *
104  * --------------------------------------------------*/
105 // Die Auswahl an Bullets aus den StarSymbol
106 static const sal_Unicode aBulletTypes[] =
107 {
108     0x2022,
109     0x25cf,
110     0xe00c,
111     0xe00a,
112     0x2794,
113     0x27a2,
114     0x2717,
115     0x2714
116 };
117 
lcl_GetDefaultBulletFont()118 static Font& lcl_GetDefaultBulletFont()
119 {
120     static sal_Bool bInit = 0;
121     static Font aDefBulletFont( UniString::CreateFromAscii(
122                                 RTL_CONSTASCII_STRINGPARAM( "StarSymbol" ) ),
123                                 String(), Size( 0, 14 ) );
124     if(!bInit)
125     {
126         aDefBulletFont.SetCharSet( RTL_TEXTENCODING_SYMBOL );
127         aDefBulletFont.SetFamily( FAMILY_DONTKNOW );
128         aDefBulletFont.SetPitch( PITCH_DONTKNOW );
129         aDefBulletFont.SetWeight( WEIGHT_DONTKNOW );
130         aDefBulletFont.SetTransparent( sal_True );
131         bInit = sal_True;
132     }
133     return aDefBulletFont;
134 }
135 
lcl_PaintLevel(OutputDevice * pVDev,sal_Int16 nNumberingType,const OUString & rBulletChar,const OUString & rText,const OUString & rFontName,Point & rLeft,Font & rRuleFont,const Font & rTextFont)136 static void lcl_PaintLevel(OutputDevice* pVDev, sal_Int16 nNumberingType,
137                         const OUString& rBulletChar, const OUString& rText, const OUString& rFontName,
138                         Point& rLeft, Font& rRuleFont, const Font& rTextFont)
139 {
140 
141     if(NumberingType::CHAR_SPECIAL == nNumberingType )
142     {
143         rRuleFont.SetStyleName(rFontName);
144         pVDev->SetFont(rRuleFont);
145         pVDev->DrawText(rLeft, rBulletChar);
146         rLeft.X() += pVDev->GetTextWidth(rBulletChar);
147     }
148     else
149     {
150         pVDev->SetFont(rTextFont);
151         pVDev->DrawText(rLeft, rText);
152         rLeft.X() += pVDev->GetTextWidth(rText);
153     }
154 }
UserDraw(const UserDrawEvent & rUDEvt)155 void  SvxNumValueSet::UserDraw( const UserDrawEvent& rUDEvt )
156 {
157     static sal_uInt16 __READONLY_DATA aLinesArr[] =
158     {
159         15, 10,
160         20, 30,
161         25, 50,
162         30, 70,
163         35, 90, // up to here line positions
164         05, 10, // character positions
165         10, 30,
166         15, 50,
167         20, 70,
168         25, 90,
169     };
170 
171     const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
172     const Color aBackColor = rStyleSettings.GetFieldColor();
173     const Color aTextColor = rStyleSettings.GetFieldTextColor();
174 
175     OutputDevice*  pDev = rUDEvt.GetDevice();
176     Rectangle aRect = rUDEvt.GetRect();
177     sal_uInt16  nItemId = rUDEvt.GetItemId();
178     long nRectWidth = aRect.GetWidth();
179     long nRectHeight = aRect.GetHeight();
180     Size aRectSize(nRectWidth, aRect.GetHeight());
181     Point aBLPos = aRect.TopLeft();
182     Font aOldFont = pDev->GetFont();
183     Color aOldColor = pDev->GetLineColor();
184     pDev->SetLineColor(aTextColor);
185     Font aFont(OutputDevice::GetDefaultFont(
186                 DEFAULTFONT_UI_SANS, MsLangId::getSystemLanguage(), DEFAULTFONT_FLAGS_ONLYONE));
187 
188     Size aSize = aFont.GetSize();
189 
190     Font aRuleFont( lcl_GetDefaultBulletFont() );
191     aSize.Height() = nRectHeight/6;
192     aRuleFont.SetSize(aSize);
193     aRuleFont.SetColor(aTextColor);
194     aRuleFont.SetFillColor(aBackColor);
195     if(nPageType == NUM_PAGETYPE_BULLET)
196         aFont = aRuleFont;
197     else if(nPageType == NUM_PAGETYPE_NUM)
198     {
199         aSize.Height() = nRectHeight/8;
200     }
201     aFont.SetColor(aTextColor);
202     aFont.SetFillColor(aBackColor);
203     aFont.SetSize( aSize );
204     pDev->SetFont(aFont);
205 
206     if(!pVDev)
207     {
208         // Die Linien werden nur einmalig in das VirtualDevice gepainted
209         // nur die Gliederungspage bekommt es aktuell
210         pVDev = new VirtualDevice(*pDev);
211         pVDev->SetMapMode(pDev->GetMapMode());
212         pVDev->EnableRTL( IsRTLEnabled() );
213         pVDev->SetOutputSize( aRectSize );
214         aOrgRect = aRect;
215         pVDev->SetFillColor( aBackColor );
216         pVDev->DrawRect(aOrgRect);
217 
218         if(aBackColor == aLineColor)
219             aLineColor.Invert();
220         pVDev->SetLineColor(aLineColor);
221         // Linien nur einmalig Zeichnen
222         if(nPageType != NUM_PAGETYPE_NUM)
223         {
224             Point aStart(aBLPos.X() + nRectWidth *25 / 100,0);
225             Point aEnd(aBLPos.X() + nRectWidth * 9 / 10,0);
226             for( sal_uInt16 i = 11; i < 100; i += 33)
227             {
228                 aStart.Y() = aEnd.Y() = aBLPos.Y() + nRectHeight  * i / 100;
229                 pVDev->DrawLine(aStart, aEnd);
230                 aStart.Y() = aEnd.Y() = aBLPos.Y() + nRectHeight  * (i + 11) / 100;
231                 pVDev->DrawLine(aStart, aEnd);
232             }
233         }
234     }
235     pDev->DrawOutDev(   aRect.TopLeft(), aRectSize,
236                         aOrgRect.TopLeft(), aRectSize,
237                         *pVDev );
238     // jetzt kommt der Text
239     const OUString sValue(C2U(cValue));
240     if( NUM_PAGETYPE_SINGLENUM == nPageType ||
241             NUM_PAGETYPE_BULLET == nPageType )
242     {
243         Point aStart(aBLPos.X() + nRectWidth / 9,0);
244         for( sal_uInt16 i = 0; i < 3; i++ )
245         {
246             sal_uInt16 nY = 11 + i * 33;
247             aStart.Y() = aBLPos.Y() + nRectHeight  * nY / 100;
248             String sText;
249             if(nPageType == NUM_PAGETYPE_BULLET)
250             {
251                 sText = aBulletTypes[nItemId - 1];
252                 aStart.Y() -= pDev->GetTextHeight()/2;
253                 aStart.X() = aBLPos.X() + 5;
254             }
255             else
256             {
257                 if(xFormatter.is() && aNumSettings.getLength() > nItemId - 1)
258                 {
259                     Sequence<PropertyValue> aLevel = aNumSettings.getConstArray()[nItemId - 1];
260                     try
261                     {
262                         aLevel.realloc(aLevel.getLength() + 1);
263                         PropertyValue& rValue = aLevel.getArray()[aLevel.getLength() - 1];
264                         rValue.Name = sValue;
265                         rValue.Value <<= (sal_Int32)(i + 1);
266                         sText = xFormatter->makeNumberingString( aLevel, aLocale );
267                     }
268                     catch(Exception&)
269                     {
270                         DBG_ERROR("Exception in DefaultNumberingProvider::makeNumberingString");
271                     }
272                 }
273                 // knapp neben dem linken Rand beginnen
274                 aStart.X() = aBLPos.X() + 2;
275                 aStart.Y() -= pDev->GetTextHeight()/2;
276             }
277             pDev->DrawText(aStart, sText);
278         }
279     }
280     else if(NUM_PAGETYPE_NUM == nPageType )
281     {
282         // Outline numbering has to be painted into the virtual device
283         // to get correct lines
284         // has to be made again
285         pVDev->DrawRect(aOrgRect);
286         long nStartX = aOrgRect.TopLeft().X();
287         long nStartY = aOrgRect.TopLeft().Y();
288 
289         if(xFormatter.is() && aOutlineSettings.getLength() > nItemId - 1)
290         {
291             Reference<XIndexAccess> xLevel = aOutlineSettings.getArray()[nItemId - 1];
292             try
293             {
294                 OUString sLevelTexts[5];
295                 OUString sFontNames[5];
296                 OUString sBulletChars[5];
297                 sal_Int16 aNumberingTypes[5];
298                 OUString sPrefixes[5];
299                 OUString sSuffixes[5];
300                 sal_Int16 aParentNumberings[5];
301 
302                 sal_Int32 nLevelCount = xLevel->getCount();
303                 if(nLevelCount > 5)
304                     nLevelCount = 5;
305                 for( sal_Int32 i = 0; i < nLevelCount && i < 5; i++)
306                 {
307                     long nTop = nStartY + nRectHeight * (aLinesArr[2 * i + 11])/100 ;
308                     Point aLeft(nStartX + nRectWidth *  (aLinesArr[2 * i + 10])/ 100, nTop );
309 
310                     Any aLevelAny = xLevel->getByIndex(i);
311                     Sequence<PropertyValue> aLevel;
312                     aLevelAny >>= aLevel;
313                     const PropertyValue* pValues = aLevel.getConstArray();
314                     aNumberingTypes[i] = 0;
315                     for(sal_Int32 nProperty = 0; nProperty < aLevel.getLength() - 1; nProperty++)
316                     {
317                         if(pValues[nProperty].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cNumberingType)))
318                             pValues[nProperty].Value >>= aNumberingTypes[i];
319                         else if(pValues[nProperty].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cBulletFontName)))
320                             pValues[nProperty].Value >>= sFontNames[i];
321                         else if(pValues[nProperty].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cBulletChar)))
322                             pValues[nProperty].Value >>= sBulletChars[i];
323                         else if(pValues[nProperty].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cPrefix)))
324                             pValues[nProperty].Value >>= sPrefixes[i];
325                         else if(pValues[nProperty].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cSuffix)))
326                             pValues[nProperty].Value >>= sSuffixes[i];
327                         else if(pValues[nProperty].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cParentNumbering)))
328                             pValues[nProperty].Value >>= aParentNumberings[i];
329                     }
330                     Sequence< PropertyValue > aProperties(2);
331                     PropertyValue* pProperties = aProperties.getArray();
332                     pProperties[0].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NumberingType"));
333                     pProperties[0].Value <<= aNumberingTypes[i];
334                     pProperties[1].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Value"));
335                     pProperties[1].Value <<= (sal_Int32)1;
336                     try
337                     {
338                         sLevelTexts[i] = xFormatter->makeNumberingString( aProperties, aLocale );
339                     }
340                     catch(Exception&)
341                     {
342                         DBG_ERROR("Exception in DefaultNumberingProvider::makeNumberingString");
343                     }
344 
345                     aLeft.Y() -= (pDev->GetTextHeight()/2);
346                     if(sPrefixes[i].getLength() &&
347                         !sPrefixes[i].equalsAsciiL(" ", 1) &&
348                         sPrefixes[i].getStr()[0] != 0)
349                     {
350                         pVDev->SetFont(aFont);
351                         pVDev->DrawText(aLeft, sPrefixes[i]);
352                         aLeft.X() += pDev->GetTextWidth(sPrefixes[i]);
353                     }
354                     if(aParentNumberings[i])
355                     {
356                         //insert old numberings here
357                         sal_Int32 nStartLevel = std::min((sal_Int32)aParentNumberings[i], i);
358                         for(sal_Int32 nParentLevel = i - nStartLevel; nParentLevel < i; nParentLevel++)
359                         {
360                             OUString sTmp(sLevelTexts[nParentLevel]);
361                             sTmp += C2U(".");
362                             lcl_PaintLevel(pVDev,
363                                     aNumberingTypes[nParentLevel],
364                                     sBulletChars[nParentLevel],
365                                     sTmp,
366                                     sFontNames[nParentLevel],
367                                     aLeft,
368                                     aRuleFont,
369                                     aFont);
370                         }
371                     }
372                     lcl_PaintLevel(pVDev,
373                                     aNumberingTypes[i],
374                                     sBulletChars[i],
375                                     sLevelTexts[i],
376                                     sFontNames[i],
377                                     aLeft,
378                                     aRuleFont,
379                                     aFont);
380                     if(sSuffixes[i].getLength()&&
381                         !sSuffixes[i].equalsAsciiL(" ", 1) &&
382                         sSuffixes[i].getStr()[0] != 0)
383                     {
384                         pVDev->SetFont(aFont);
385                         pVDev->DrawText(aLeft, sSuffixes[i]);
386                         aLeft.X() += pDev->GetTextWidth(sSuffixes[i]);
387                     }
388 
389                     long nLineTop = nStartY + nRectHeight * aLinesArr[2 * i + 1]/100 ;
390                     Point aLineLeft(aLeft.X() /*+ nStartX + nRectWidth * aLinesArr[2 * i]/ 100*/, nLineTop );
391                     Point aLineRight(nStartX + nRectWidth * 90 /100, nLineTop );
392                     pVDev->DrawLine(aLineLeft,  aLineRight);
393                 }
394 
395             }
396 #ifdef DBG_UTIL
397             catch(Exception&)
398             {
399                 static sal_Bool bAssert = sal_False;
400                 if(!bAssert)
401                 {
402                     DBG_ERROR("exception in ::UserDraw");
403                     bAssert = sal_True;
404                 }
405             }
406 #else
407             catch(Exception&)
408             {
409             }
410 #endif
411         }
412         pDev->DrawOutDev(   aRect.TopLeft(), aRectSize,
413                             aOrgRect.TopLeft(), aRectSize,
414                             *pVDev );
415     }
416 
417     pDev->SetFont(aOldFont);
418     pDev->SetLineColor(aOldColor);
419 }
420 
421 /**************************************************************************/
422 /*                                                                        */
423 /*                                                                        */
424 /**************************************************************************/
425 
SvxNumValueSet(Window * pParent,const ResId & rResId,sal_uInt16 nType)426 SvxNumValueSet::SvxNumValueSet( Window* pParent, const ResId& rResId, sal_uInt16 nType ) :
427 
428     ValueSet( pParent, rResId ),
429 
430     aLineColor  ( COL_LIGHTGRAY ),
431     nPageType   ( nType ),
432     bHTMLMode   ( sal_False ),
433     pVDev       ( NULL )
434 {
435     SetColCount( 4 );
436     SetLineCount( 2 );
437     SetStyle( GetStyle() | WB_ITEMBORDER | WB_DOUBLEBORDER );
438     if(NUM_PAGETYPE_BULLET == nType)
439     {
440         for ( sal_uInt16 i = 0; i < 8; i++ )
441         {
442             InsertItem( i + 1, i );
443             SetItemText( i + 1, SVX_RESSTR( RID_SVXSTR_BULLET_DESCRIPTIONS + i ) );
444         }
445     }
446 }
447 
448 /*-----------------08.02.97 12.38-------------------
449 
450 --------------------------------------------------*/
451 
~SvxNumValueSet()452  SvxNumValueSet::~SvxNumValueSet()
453 {
454     delete pVDev;
455 }
456 /* -----------------------------30.01.01 16:24--------------------------------
457 
458  ---------------------------------------------------------------------------*/
SetNumberingSettings(const Sequence<Sequence<PropertyValue>> & aNum,Reference<XNumberingFormatter> & xFormat,const Locale & rLocale)459 void SvxNumValueSet::SetNumberingSettings(
460     const Sequence<Sequence<PropertyValue> >& aNum,
461     Reference<XNumberingFormatter>& xFormat,
462     const Locale& rLocale   )
463 {
464     aNumSettings = aNum;
465     xFormatter = xFormat;
466     aLocale = rLocale;
467     if(aNum.getLength() > 8)
468             SetStyle( GetStyle()|WB_VSCROLL);
469     for ( sal_uInt16 i = 0; i < aNum.getLength(); i++ )
470     {
471             InsertItem( i + 1, i );
472             if( i < 8 )
473                 SetItemText( i + 1, SVX_RESSTR( RID_SVXSTR_SINGLENUM_DESCRIPTIONS + i ));
474     }
475 }
476 /* -----------------------------31.01.01 09:50--------------------------------
477 
478  ---------------------------------------------------------------------------*/
SetOutlineNumberingSettings(Sequence<Reference<XIndexAccess>> & rOutline,Reference<XNumberingFormatter> & xFormat,const Locale & rLocale)479 void SvxNumValueSet::SetOutlineNumberingSettings(
480             Sequence<Reference<XIndexAccess> >& rOutline,
481             Reference<XNumberingFormatter>& xFormat,
482             const Locale& rLocale)
483 {
484     aOutlineSettings = rOutline;
485     xFormatter = xFormat;
486     aLocale = rLocale;
487     if(aOutlineSettings.getLength() > 8)
488         SetStyle( GetStyle() | WB_VSCROLL );
489     for ( sal_uInt16 i = 0; i < aOutlineSettings.getLength(); i++ )
490     {
491         InsertItem( i + 1, i );
492         if( i < 8 )
493             SetItemText( i + 1, SVX_RESSTR( RID_SVXSTR_OUTLINENUM_DESCRIPTIONS + i ));
494     }
495 }
496 
SvxBmpNumValueSet(Window * pParent,const ResId & rResId)497 SvxBmpNumValueSet::SvxBmpNumValueSet( Window* pParent, const ResId& rResId/*, const List& rStrNames*/ ) :
498 
499     SvxNumValueSet( pParent, rResId, NUM_PAGETYPE_BMP ),
500 //    rStrList    ( rStrNames ),
501     bGrfNotFound( sal_False )
502 
503 {
504     GalleryExplorer::BeginLocking(GALLERY_THEME_BULLETS);
505     SetStyle( GetStyle() | WB_VSCROLL );
506     SetLineCount( 3 );
507     aFormatTimer.SetTimeout(300);
508     aFormatTimer.SetTimeoutHdl(LINK(this, SvxBmpNumValueSet, FormatHdl_Impl));
509 }
510 
511 /*-----------------13.02.97 09.41-------------------
512 
513 --------------------------------------------------*/
514 
~SvxBmpNumValueSet()515  SvxBmpNumValueSet::~SvxBmpNumValueSet()
516 {
517     GalleryExplorer::EndLocking(GALLERY_THEME_BULLETS);
518     aFormatTimer.Stop();
519 }
520 /*-----------------13.02.97 09.41-------------------
521 
522 --------------------------------------------------*/
523 
UserDraw(const UserDrawEvent & rUDEvt)524 void    SvxBmpNumValueSet::UserDraw( const UserDrawEvent& rUDEvt )
525 {
526     SvxNumValueSet::UserDraw(rUDEvt);
527 
528     Rectangle aRect = rUDEvt.GetRect();
529     OutputDevice*  pDev = rUDEvt.GetDevice();
530     sal_uInt16  nItemId = rUDEvt.GetItemId();
531     Point aBLPos = aRect.TopLeft();
532 
533     int nRectHeight = aRect.GetHeight();
534     Size aSize(nRectHeight/8, nRectHeight/8);
535 
536     Graphic aGraphic;
537     if(!GalleryExplorer::GetGraphicObj( GALLERY_THEME_BULLETS, nItemId - 1,
538                         &aGraphic, NULL))
539     {
540         bGrfNotFound = sal_True;
541     }
542     else
543     {
544         Point aPos(aBLPos.X() + 5, 0);
545         for( sal_uInt16 i = 0; i < 3; i++ )
546         {
547             sal_uInt16 nY = 11 + i * 33;
548             aPos.Y() = aBLPos.Y() + nRectHeight  * nY / 100;
549             aGraphic.Draw( pDev, aPos, aSize );
550         }
551     }
552 }
553 
554 /*-----------------14.02.97 07.34-------------------
555 
556 --------------------------------------------------*/
557 
IMPL_LINK(SvxBmpNumValueSet,FormatHdl_Impl,Timer *,EMPTYARG)558 IMPL_LINK(SvxBmpNumValueSet, FormatHdl_Impl, Timer*, EMPTYARG)
559 {
560     // nur, wenn eine Grafik nicht da war, muss formatiert werden
561     if(bGrfNotFound)
562     {
563         bGrfNotFound = sal_False;
564         Format();
565     }
566     Invalidate();
567     return 0;
568 }
569