xref: /AOO41X/main/cui/source/tabpages/numpages.cxx (revision 54628ca40d27d15cc98fe861da7fff7e60c2f7d6)
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_cui.hxx"
26 
27 #include <com/sun/star/text/HoriOrientation.hpp>
28 #include <com/sun/star/text/VertOrientation.hpp>
29 #include <com/sun/star/text/RelOrientation.hpp>
30 
31 #include <numpages.hxx>
32 #include <numpages.hrc>
33 #include <dialmgr.hxx>
34 #include <cuires.hrc>
35 #include <tools/shl.hxx>
36 #include <i18npool/mslangid.hxx>
37 #include <svtools/valueset.hxx>
38 #include <helpid.hrc>
39 #include <editeng/numitem.hxx>
40 #include <svl/eitem.hxx>
41 #include <vcl/svapp.hxx>
42 #include <svx/gallery.hxx>
43 #include <svl/urihelper.hxx>
44 #include <editeng/brshitem.hxx>
45 #include <svl/intitem.hxx>
46 #include <sfx2/objsh.hxx>
47 #include <vcl/graph.hxx>
48 #include <vcl/msgbox.hxx>
49 #include "cuicharmap.hxx"
50 #include <editeng/flstitem.hxx>
51 #include <svx/dlgutil.hxx>
52 #include <svx/xtable.hxx>
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 #include <svx/dialmgr.hxx>
68 #include <svx/dialogs.hrc>
69 
70 #include <algorithm>
71 #include <vector>
72 #include "sfx2/opengrf.hxx"
73 
74 #include <cuires.hrc> //CHINA001
75 #include <sfx2/request.hxx> //CHINA001
76 #include <svl/aeitem.hxx> //add CHINA001
77 #include <svl/stritem.hxx>//add CHINA001
78 #include <svl/slstitm.hxx> //add CHINA001
79 
80 using namespace com::sun::star;
81 using namespace com::sun::star::uno;
82 using namespace com::sun::star::beans;
83 using namespace com::sun::star::lang;
84 using namespace com::sun::star::i18n;
85 using namespace com::sun::star::text;
86 using namespace com::sun::star::container;
87 using namespace com::sun::star::style;
88 using rtl::OUString;
89 #define C2U(cChar) OUString::createFromAscii(cChar)
90 
91 SV_IMPL_PTRARR(SvxNumSettingsArr_Impl,SvxNumSettings_ImplPtr);
92 
93 /*-----------------07.02.97 15.37-------------------
94 
95 --------------------------------------------------*/
96 #define NUM_PAGETYPE_BULLET         0
97 #define NUM_PAGETYPE_SINGLENUM      1
98 #define NUM_PAGETYPE_NUM            2
99 #define NUM_PAGETYPE_BMP            3
100 #define PAGETYPE_USER_START         10
101 
102 #define SHOW_NUMBERING              0
103 #define SHOW_BULLET                 1
104 #define SHOW_BITMAP                 2
105 
106 #define MAX_BMP_WIDTH               16
107 #define MAX_BMP_HEIGHT              16
108 
109 static sal_Bool bLastRelative =         sal_False;
110 static const sal_Char cNumberingType[] = "NumberingType";
111 static const sal_Char cValue[] = "Value";
112 static const sal_Char cParentNumbering[] = "ParentNumbering";
113 static const sal_Char cPrefix[] = "Prefix";
114 static const sal_Char cSuffix[] = "Suffix";
115 static const sal_Char cBulletChar[] = "BulletChar";
116 static const sal_Char cBulletFontName[] = "BulletFontName";
117 /* -----------------------------31.01.01 10:23--------------------------------
118 
119  ---------------------------------------------------------------------------*/
120 Reference<XDefaultNumberingProvider> lcl_GetNumberingProvider()
121 {
122     Reference< XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory();
123     Reference < XInterface > xI = xMSF->createInstance(
124         ::rtl::OUString::createFromAscii( "com.sun.star.text.DefaultNumberingProvider" ) );
125     Reference<XDefaultNumberingProvider> xRet(xI, UNO_QUERY);
126     DBG_ASSERT(xRet.is(), "service missing: \"com.sun.star.text.DefaultNumberingProvider\"");
127 
128     return xRet;
129 }
130 /* -----------------------------31.01.01 11:40--------------------------------
131 
132  ---------------------------------------------------------------------------*/
133 SvxNumSettings_ImplPtr lcl_CreateNumSettingsPtr(const Sequence<PropertyValue>& rLevelProps)
134 {
135     const PropertyValue* pValues = rLevelProps.getConstArray();
136     SvxNumSettings_ImplPtr pNew = new SvxNumSettings_Impl;
137     for(sal_Int32 j = 0; j < rLevelProps.getLength(); j++)
138     {
139         if(pValues[j].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cNumberingType)))
140             pValues[j].Value >>= pNew->nNumberType;
141         else if(pValues[j].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cPrefix)))
142             pValues[j].Value >>= pNew->sPrefix;
143         else if(pValues[j].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cSuffix)))
144             pValues[j].Value >>= pNew->sSuffix;
145         else if(pValues[j].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cParentNumbering)))
146             pValues[j].Value >>= pNew->nParentNumbering;
147         else if(pValues[j].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cBulletChar)))
148             pValues[j].Value >>= pNew->sBulletChar;
149         else if(pValues[j].Name.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(cBulletFontName)))
150             pValues[j].Value >>= pNew->sBulletFont;
151     }
152     return pNew;
153 }
154 /* -----------------28.10.98 08:32-------------------
155  *
156  * --------------------------------------------------*/
157 // Die Auswahl an Bullets aus den StarSymbol
158 static const sal_Unicode aBulletTypes[] =
159 {
160     0x2022,
161     0x25cf,
162     0xe00c,
163     0xe00a,
164     0x2794,
165     0x27a2,
166     0x2717,
167     0x2714
168 };
169 /* -----------------28.10.98 09:42-------------------
170  *
171  * --------------------------------------------------*/
172 static sal_Char __READONLY_DATA aNumChar[] =
173 {
174     'A', //CHARS_UPPER_LETTER
175     'a', //CHARS_LOWER_LETTER
176     'I', //ROMAN_UPPER
177     'i', //ROMAN_LOWER
178     '1', //ARABIC
179     ' '
180 };
181 
182 /*-----------------18.03.98 08:35-------------------
183     Ist eins der maskierten Formate gesetzt?
184 --------------------------------------------------*/
185 sal_Bool lcl_IsNumFmtSet(SvxNumRule* pNum, sal_uInt16 nLevelMask)
186 {
187     sal_Bool bRet = sal_False;
188     sal_uInt16 nMask = 1;
189     for( sal_uInt16 i = 0; i < SVX_MAX_NUM && !bRet; i++ )
190     {
191         if(nLevelMask & nMask)
192             bRet |= 0 != pNum->Get( i );
193         nMask <<= 1 ;
194     }
195     return bRet;
196 }
197 /* -----------------28.10.98 08:50-------------------
198  *
199  * --------------------------------------------------*/
200 
201 Font& lcl_GetDefaultBulletFont()
202 {
203     static sal_Bool bInit = 0;
204     static Font aDefBulletFont( UniString::CreateFromAscii(
205                                 RTL_CONSTASCII_STRINGPARAM( "StarSymbol" ) ),
206                                 String(), Size( 0, 14 ) );
207     if(!bInit)
208     {
209         aDefBulletFont.SetCharSet( RTL_TEXTENCODING_SYMBOL );
210         aDefBulletFont.SetFamily( FAMILY_DONTKNOW );
211         aDefBulletFont.SetPitch( PITCH_DONTKNOW );
212         aDefBulletFont.SetWeight( WEIGHT_DONTKNOW );
213         aDefBulletFont.SetTransparent( sal_True );
214         bInit = sal_True;
215     }
216     return aDefBulletFont;
217 }
218 
219 
220 /**************************************************************************/
221 /*                                                                        */
222 /*                                                                        */
223 /**************************************************************************/
224 
225 
226 SvxSingleNumPickTabPage::SvxSingleNumPickTabPage(Window* pParent,
227                                const SfxItemSet& rSet)  :
228     SfxTabPage( pParent, CUI_RES( RID_SVXPAGE_PICK_SINGLE_NUM ), rSet ),
229     aValuesFL(      this, CUI_RES(FL_VALUES) ),
230     pExamplesVS(    new SvxNumValueSet(this, CUI_RES(VS_VALUES), NUM_PAGETYPE_SINGLENUM )),
231     pActNum(0),
232     pSaveNum(0),
233     nActNumLvl( USHRT_MAX ),
234     bModified(sal_False),
235     bPreset(sal_False),
236     nNumItemId(SID_ATTR_NUMBERING_RULE)
237 {
238     FreeResource();
239     SetExchangeSupport();
240     pExamplesVS->SetSelectHdl(LINK(this, SvxSingleNumPickTabPage, NumSelectHdl_Impl));
241     pExamplesVS->SetDoubleClickHdl(LINK(this, SvxSingleNumPickTabPage, DoubleClickHdl_Impl));
242     pExamplesVS->SetHelpId(HID_VALUESET_SINGLENUM );
243 
244     Reference<XDefaultNumberingProvider> xDefNum = lcl_GetNumberingProvider();
245     if(xDefNum.is())
246     {
247         Sequence< Sequence< PropertyValue > > aNumberings;
248         LanguageType eLang = Application::GetSettings().GetLanguage();
249         Locale aLocale = SvxCreateLocale(eLang);
250         try
251         {
252             aNumberings =
253                 xDefNum->getDefaultContinuousNumberingLevels( aLocale );
254 
255 
256             sal_Int32 nLength = aNumberings.getLength() > NUM_VALUSET_COUNT ? NUM_VALUSET_COUNT :aNumberings.getLength();
257 
258             const Sequence<PropertyValue>* pValuesArr = aNumberings.getConstArray();
259             for(sal_Int32 i = 0; i < nLength; i++)
260             {
261                 SvxNumSettings_ImplPtr pNew = lcl_CreateNumSettingsPtr(pValuesArr[i]);
262                 aNumSettingsArr.Insert(pNew, aNumSettingsArr.Count());
263             }
264         }
265         catch(Exception&)
266         {
267         }
268         Reference<XNumberingFormatter> xFormat(xDefNum, UNO_QUERY);
269         pExamplesVS->SetNumberingSettings(aNumberings, xFormat, aLocale);
270     }
271 }
272 /*-----------------07.02.97 12.08-------------------
273 
274 --------------------------------------------------*/
275 
276  SvxSingleNumPickTabPage::~SvxSingleNumPickTabPage()
277 {
278     delete pActNum;
279     delete pExamplesVS;
280     delete pSaveNum;
281     aNumSettingsArr.DeleteAndDestroy(0, aNumSettingsArr.Count());
282 }
283 
284 /*-----------------07.02.97 12.13-------------------
285 
286 --------------------------------------------------*/
287 
288 SfxTabPage*  SvxSingleNumPickTabPage::Create( Window* pParent,
289                                 const SfxItemSet& rAttrSet)
290 {
291     return new SvxSingleNumPickTabPage(pParent, rAttrSet);
292 }
293 
294 /*-----------------07.02.97 12.09-------------------
295 
296 --------------------------------------------------*/
297 
298 
299 sal_Bool  SvxSingleNumPickTabPage::FillItemSet( SfxItemSet& rSet )
300 {
301     if( (bPreset || bModified) && pSaveNum)
302     {
303         *pSaveNum = *pActNum;
304         rSet.Put(SvxNumBulletItem( *pSaveNum ), nNumItemId);
305         rSet.Put(SfxBoolItem(SID_PARAM_NUM_PRESET, bPreset));
306     }
307 
308     return bModified;
309 }
310 
311 /*-----------------08.02.97 16.27-------------------
312 
313 --------------------------------------------------*/
314 
315 void  SvxSingleNumPickTabPage::ActivatePage(const SfxItemSet& rSet)
316 {
317     const SfxPoolItem* pItem;
318     bPreset = sal_False;
319     sal_Bool bIsPreset = sal_False;
320     const SfxItemSet* pExampleSet = GetTabDialog()->GetExampleSet();
321     if(pExampleSet)
322     {
323         if(SFX_ITEM_SET == pExampleSet->GetItemState(SID_PARAM_NUM_PRESET, sal_False, &pItem))
324             bIsPreset = ((const SfxBoolItem*)pItem)->GetValue();
325         if(SFX_ITEM_SET == pExampleSet->GetItemState(SID_PARAM_CUR_NUM_LEVEL, sal_False, &pItem))
326             nActNumLvl = ((const SfxUInt16Item*)pItem)->GetValue();
327     }
328     if(SFX_ITEM_SET == rSet.GetItemState(nNumItemId, sal_False, &pItem))
329     {
330         delete pSaveNum;
331         pSaveNum = new SvxNumRule(*((SvxNumBulletItem*)pItem)->GetNumRule());
332     }
333     if(*pSaveNum != *pActNum)
334     {
335         *pActNum = *pSaveNum;
336         pExamplesVS->SetNoSelection();
337     }
338     // ersten Eintrag vorselektieren
339     if(pActNum && (!lcl_IsNumFmtSet(pActNum, nActNumLvl) || bIsPreset))
340     {
341         pExamplesVS->SelectItem(1);
342         NumSelectHdl_Impl(pExamplesVS);
343         bPreset = sal_True;
344     }
345     bPreset |= bIsPreset;
346 
347     bModified = sal_False;
348 }
349 
350 /*-----------------08.02.97 11.28-------------------
351 
352 --------------------------------------------------*/
353 
354 int  SvxSingleNumPickTabPage::DeactivatePage(SfxItemSet *_pSet)
355 {
356     if(_pSet)
357         FillItemSet(*_pSet);
358     return sal_True;
359 }
360 
361 /*-----------------07.02.97 12.09-------------------
362 
363 --------------------------------------------------*/
364 
365 
366 void  SvxSingleNumPickTabPage::Reset( const SfxItemSet& rSet )
367 {
368     const SfxPoolItem* pItem;
369 //  nActNumLvl = ((SwNumBulletTabDialog*)GetTabDialog())->GetActNumLevel();
370     //im Draw gibt es das Item als WhichId, im Writer nur als SlotId
371     SfxItemState eState = rSet.GetItemState(SID_ATTR_NUMBERING_RULE, sal_False, &pItem);
372     if(eState != SFX_ITEM_SET)
373     {
374         nNumItemId = rSet.GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE);
375         eState = rSet.GetItemState(nNumItemId, sal_False, &pItem);
376 
377         if( eState != SFX_ITEM_SET )
378         {
379             pItem = &static_cast< const SvxNumBulletItem& >( rSet.Get( nNumItemId, sal_True ) );
380             eState = SFX_ITEM_SET;
381         }
382     }
383     DBG_ASSERT(eState == SFX_ITEM_SET, "kein Item gefunden!");
384     delete pSaveNum;
385     pSaveNum = new SvxNumRule(*((SvxNumBulletItem*)pItem)->GetNumRule());
386 
387     if(!pActNum)
388         pActNum = new  SvxNumRule(*pSaveNum);
389     else if(*pSaveNum != *pActNum)
390         *pActNum = *pSaveNum;
391 }
392 /*-----------------08.02.97 11.40-------------------
393 
394 --------------------------------------------------*/
395 
396 IMPL_LINK(SvxSingleNumPickTabPage, NumSelectHdl_Impl, ValueSet*, EMPTYARG)
397 {
398     if(pActNum)
399     {
400         bPreset = sal_False;
401         bModified = sal_True;
402         sal_uInt16 nIdx = pExamplesVS->GetSelectItemId() - 1;
403         DBG_ASSERT(aNumSettingsArr.Count() > nIdx, "wrong index");
404         if(aNumSettingsArr.Count() <= nIdx)
405             return 0;
406         SvxNumSettings_ImplPtr _pSet = aNumSettingsArr.GetObject(nIdx);
407         sal_Int16 eNewType = _pSet->nNumberType;
408         const sal_Unicode cLocalPrefix = _pSet->sPrefix.getLength() ? _pSet->sPrefix.getStr()[0] : 0;
409         const sal_Unicode cLocalSuffix = _pSet->sSuffix.getLength() ? _pSet->sSuffix.getStr()[0] : 0;
410 
411         sal_uInt16 nMask = 1;
412         for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
413         {
414             if(nActNumLvl & nMask)
415             {
416                 SvxNumberFormat aFmt(pActNum->GetLevel(i));
417                 aFmt.SetNumberingType(eNewType);
418                 String aEmptyStr;
419                 if(cLocalPrefix == ' ')
420                     aFmt.SetPrefix( aEmptyStr );
421                 else
422                     aFmt.SetPrefix(_pSet->sPrefix);
423                 if(cLocalSuffix == ' ')
424                     aFmt.SetSuffix( aEmptyStr );
425                 else
426                     aFmt.SetSuffix(_pSet->sSuffix);
427                 aFmt.SetCharFmtName(sNumCharFmtName);
428                 // #62069# // #92724#
429                 aFmt.SetBulletRelSize(100);
430                 pActNum->SetLevel(i, aFmt);
431             }
432             nMask <<= 1 ;
433         }
434     }
435     return 0;
436 }
437 
438 /*-----------------06.06.97 11.15-------------------
439 
440 --------------------------------------------------*/
441 IMPL_LINK(SvxSingleNumPickTabPage, DoubleClickHdl_Impl, ValueSet*, EMPTYARG)
442 {
443     NumSelectHdl_Impl(pExamplesVS);
444     OKButton& rOk = GetTabDialog()->GetOKButton();
445     rOk.GetClickHdl().Call(&rOk);
446     return 0;
447 }
448 
449 /**************************************************************************/
450 /*                                                                        */
451 /*                                                                        */
452 /**************************************************************************/
453 
454 
455 SvxBulletPickTabPage::SvxBulletPickTabPage(Window* pParent,
456                                const SfxItemSet& rSet)  :
457     SfxTabPage( pParent, CUI_RES( RID_SVXPAGE_PICK_BULLET ), rSet ),
458     aValuesFL(      this, CUI_RES(FL_VALUES) ),
459     pExamplesVS(    new SvxNumValueSet(this, CUI_RES(VS_VALUES), NUM_PAGETYPE_BULLET )),
460     pActNum(0),
461     pSaveNum(0),
462     nActNumLvl( USHRT_MAX ),
463     bModified(sal_False),
464     bPreset(sal_False),
465     nNumItemId(SID_ATTR_NUMBERING_RULE)
466 {
467     FreeResource();
468     SetExchangeSupport();
469     pExamplesVS->SetSelectHdl(LINK(this, SvxBulletPickTabPage, NumSelectHdl_Impl));
470     pExamplesVS->SetDoubleClickHdl(LINK(this, SvxBulletPickTabPage, DoubleClickHdl_Impl));
471     pExamplesVS->SetHelpId(HID_VALUESET_BULLET    );
472 
473 }
474 /*-----------------07.02.97 12.10-------------------
475 
476 --------------------------------------------------*/
477 
478 
479  SvxBulletPickTabPage::~SvxBulletPickTabPage()
480 {
481     delete pActNum;
482     delete pExamplesVS;
483     delete pSaveNum;
484 }
485 /*-----------------07.02.97 12.10-------------------
486 
487 --------------------------------------------------*/
488 
489 
490 SfxTabPage*  SvxBulletPickTabPage::Create( Window* pParent,
491                                 const SfxItemSet& rAttrSet)
492 {
493     return new SvxBulletPickTabPage(pParent, rAttrSet);
494 }
495 
496 /*-----------------07.02.97 12.10-------------------
497 
498 --------------------------------------------------*/
499 
500 
501 sal_Bool  SvxBulletPickTabPage::FillItemSet( SfxItemSet& rSet )
502 {
503     if( (bPreset || bModified) && pActNum)
504     {
505         *pSaveNum = *pActNum;
506         rSet.Put(SvxNumBulletItem( *pSaveNum ), nNumItemId);
507         rSet.Put(SfxBoolItem(SID_PARAM_NUM_PRESET, bPreset));
508     }
509     return bModified;
510 }
511 /*-----------------08.02.97 16.28-------------------
512 
513 --------------------------------------------------*/
514 
515 void  SvxBulletPickTabPage::ActivatePage(const SfxItemSet& rSet)
516 {
517     const SfxPoolItem* pItem;
518     bPreset = sal_False;
519     sal_Bool bIsPreset = sal_False;
520     const SfxItemSet* pExampleSet = GetTabDialog()->GetExampleSet();
521     if(pExampleSet)
522     {
523         if(SFX_ITEM_SET == pExampleSet->GetItemState(SID_PARAM_NUM_PRESET, sal_False, &pItem))
524             bIsPreset = ((const SfxBoolItem*)pItem)->GetValue();
525         if(SFX_ITEM_SET == pExampleSet->GetItemState(SID_PARAM_CUR_NUM_LEVEL, sal_False, &pItem))
526             nActNumLvl = ((const SfxUInt16Item*)pItem)->GetValue();
527     }
528     if(SFX_ITEM_SET == rSet.GetItemState(nNumItemId, sal_False, &pItem))
529     {
530         delete pSaveNum;
531         pSaveNum = new SvxNumRule(*((SvxNumBulletItem*)pItem)->GetNumRule());
532     }
533     if(*pSaveNum != *pActNum)
534     {
535         *pActNum = *pSaveNum;
536         pExamplesVS->SetNoSelection();
537     }
538     // ersten Eintrag vorselektieren
539     if(pActNum && (!lcl_IsNumFmtSet(pActNum, nActNumLvl) || bIsPreset))
540     {
541         pExamplesVS->SelectItem(1);
542         NumSelectHdl_Impl(pExamplesVS);
543         bPreset = sal_True;
544     }
545     bPreset |= bIsPreset;
546     bModified = sal_False;
547 }
548 /*-----------------08.02.97 11.28-------------------
549 
550 --------------------------------------------------*/
551 
552 int  SvxBulletPickTabPage::DeactivatePage(SfxItemSet *_pSet)
553 {
554     if(_pSet)
555         FillItemSet(*_pSet);
556     return sal_True;
557 }
558 
559 /*-----------------07.02.97 12.11-------------------
560 
561 --------------------------------------------------*/
562 
563 
564 void  SvxBulletPickTabPage::Reset( const SfxItemSet& rSet )
565 {
566     const SfxPoolItem* pItem;
567     //im Draw gibt es das Item als WhichId, im Writer nur als SlotId
568     SfxItemState eState = rSet.GetItemState(SID_ATTR_NUMBERING_RULE, sal_False, &pItem);
569     if(eState != SFX_ITEM_SET)
570     {
571         nNumItemId = rSet.GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE);
572         eState = rSet.GetItemState(nNumItemId, sal_False, &pItem);
573 
574         if( eState != SFX_ITEM_SET )
575         {
576             pItem = &static_cast< const SvxNumBulletItem& >( rSet.Get( nNumItemId, sal_True ) );
577             eState = SFX_ITEM_SET;
578         }
579 
580     }
581     DBG_ASSERT(eState == SFX_ITEM_SET, "kein Item gefunden!");
582     delete pSaveNum;
583     pSaveNum = new SvxNumRule(*((SvxNumBulletItem*)pItem)->GetNumRule());
584 
585 //  nActNumLvl = ((SwNumBulletTabDialog*)GetTabDialog())->GetActNumLevel();
586 
587     if(!pActNum)
588         pActNum = new  SvxNumRule(*pSaveNum);
589     else if(*pSaveNum != *pActNum)
590         *pActNum = *pSaveNum;
591 }
592 /*-----------------08.02.97 11.58-------------------
593 
594 --------------------------------------------------*/
595 
596 IMPL_LINK(SvxBulletPickTabPage, NumSelectHdl_Impl, ValueSet*, EMPTYARG)
597 {
598     if(pActNum)
599     {
600         bPreset = sal_False;
601         bModified = sal_True;
602         sal_Unicode cChar = aBulletTypes[pExamplesVS->GetSelectItemId() - 1];
603         Font& rActBulletFont = lcl_GetDefaultBulletFont();
604 
605         sal_uInt16 nMask = 1;
606         for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
607         {
608             if(nActNumLvl & nMask)
609             {
610                 SvxNumberFormat aFmt(pActNum->GetLevel(i));
611                 aFmt.SetNumberingType( SVX_NUM_CHAR_SPECIAL );
612                 // #i93908# clear suffix for bullet lists
613                 aFmt.SetPrefix(::rtl::OUString());
614                 aFmt.SetSuffix(::rtl::OUString());
615                 aFmt.SetBulletFont(&rActBulletFont);
616                 aFmt.SetBulletChar(cChar );
617                 aFmt.SetCharFmtName(sBulletCharFmtName);
618                 // #62069# // #92724#
619                 aFmt.SetBulletRelSize(45);
620                 pActNum->SetLevel(i, aFmt);
621             }
622             nMask <<= 1;
623         }
624     }
625 
626     return 0;
627 }
628 
629 /*-----------------06.06.97 11.16-------------------
630 
631 --------------------------------------------------*/
632 IMPL_LINK(SvxBulletPickTabPage, DoubleClickHdl_Impl, ValueSet*, EMPTYARG)
633 {
634     NumSelectHdl_Impl(pExamplesVS);
635     OKButton& rOk = GetTabDialog()->GetOKButton();
636     rOk.GetClickHdl().Call(&rOk);
637     return 0;
638 }
639 
640 //Add CHINA001
641 void SvxBulletPickTabPage::PageCreated(SfxAllItemSet aSet)
642 {
643 
644     SFX_ITEMSET_ARG (&aSet,pBulletCharFmt,SfxStringItem,SID_BULLET_CHAR_FMT,sal_False);
645 
646     if (pBulletCharFmt)
647         SetCharFmtName( pBulletCharFmt->GetValue());
648 
649 
650 }
651 //end of add CHINA001
652 /**************************************************************************/
653 /*                                                                        */
654 /*                                                                        */
655 /**************************************************************************/
656 
657 
658 SvxNumPickTabPage::SvxNumPickTabPage(Window* pParent,
659                                const SfxItemSet& rSet) :
660     SfxTabPage( pParent, CUI_RES( RID_SVXPAGE_PICK_NUM ), rSet ),
661     aValuesFL(      this, CUI_RES(FL_VALUES) ),
662     pExamplesVS(    new SvxNumValueSet(this, CUI_RES(VS_VALUES), NUM_PAGETYPE_NUM )),
663     pActNum(0),
664     pSaveNum(0),
665     nActNumLvl( USHRT_MAX ),
666     nNumItemId(SID_ATTR_NUMBERING_RULE),
667     bModified(sal_False),
668     bPreset(sal_False)
669 {
670 
671     FreeResource();
672 
673     SetExchangeSupport();
674 
675     pExamplesVS->SetSelectHdl(LINK(this, SvxNumPickTabPage, NumSelectHdl_Impl));
676     pExamplesVS->SetDoubleClickHdl(LINK(this, SvxNumPickTabPage, DoubleClickHdl_Impl));
677     pExamplesVS->SetHelpId(HID_VALUESET_NUM       );
678 
679     Reference<XDefaultNumberingProvider> xDefNum = lcl_GetNumberingProvider();
680     if(xDefNum.is())
681     {
682         Sequence<Reference<XIndexAccess> > aOutlineAccess;
683         LanguageType eLang = Application::GetSettings().GetLanguage();
684         Locale aLocale = SvxCreateLocale(eLang);
685         try
686         {
687             aOutlineAccess = xDefNum->getDefaultOutlineNumberings( aLocale );
688 
689             for(sal_Int32 nItem = 0;
690                 nItem < aOutlineAccess.getLength() && nItem < NUM_VALUSET_COUNT;
691                 nItem++ )
692             {
693                 SvxNumSettingsArr_Impl& rItemArr = aNumSettingsArrays[ nItem ];
694 
695                 Reference<XIndexAccess> xLevel = aOutlineAccess.getConstArray()[nItem];
696                 for(sal_Int32 nLevel = 0; nLevel < xLevel->getCount() && nLevel < 5; nLevel++)
697                 {
698                     Any aValueAny = xLevel->getByIndex(nLevel);
699                     Sequence<PropertyValue> aLevelProps;
700                     aValueAny >>= aLevelProps;
701                     SvxNumSettings_ImplPtr pNew = lcl_CreateNumSettingsPtr(aLevelProps);
702                     rItemArr.Insert( pNew, rItemArr.Count() );
703                 }
704             }
705         }
706         catch(Exception&)
707         {
708         }
709         Reference<XNumberingFormatter> xFormat(xDefNum, UNO_QUERY);
710         pExamplesVS->SetOutlineNumberingSettings(aOutlineAccess, xFormat, aLocale);
711     }
712 }
713 /*-----------------07.02.97 12.12-------------------
714 
715 --------------------------------------------------*/
716 
717 
718  SvxNumPickTabPage::~SvxNumPickTabPage()
719 {
720     delete pActNum;
721     delete pExamplesVS;
722     delete pSaveNum;
723 }
724 
725 /*-----------------07.02.97 12.12-------------------
726 
727 --------------------------------------------------*/
728 
729 
730 SfxTabPage*  SvxNumPickTabPage::Create( Window* pParent,
731                                 const SfxItemSet& rAttrSet)
732 {
733     return new SvxNumPickTabPage(pParent, rAttrSet);
734 }
735 
736 /*-----------------07.02.97 12.12-------------------
737 
738 --------------------------------------------------*/
739 
740 
741 sal_Bool  SvxNumPickTabPage::FillItemSet( SfxItemSet& rSet )
742 {
743     if( (bPreset || bModified) && pActNum)
744     {
745         *pSaveNum = *pActNum;
746         rSet.Put(SvxNumBulletItem( *pSaveNum ), nNumItemId);
747         rSet.Put(SfxBoolItem(SID_PARAM_NUM_PRESET, bPreset));
748     }
749     return bModified;
750 }
751 /*-----------------08.02.97 16.28-------------------
752 
753 --------------------------------------------------*/
754 
755 void  SvxNumPickTabPage::ActivatePage(const SfxItemSet& rSet)
756 {
757     const SfxPoolItem* pItem;
758     bPreset = sal_False;
759     sal_Bool bIsPreset = sal_False;
760     const SfxItemSet* pExampleSet = GetTabDialog()->GetExampleSet();
761     if(pExampleSet)
762     {
763         if(SFX_ITEM_SET == pExampleSet->GetItemState(SID_PARAM_NUM_PRESET, sal_False, &pItem))
764             bIsPreset = ((const SfxBoolItem*)pItem)->GetValue();
765         if(SFX_ITEM_SET == pExampleSet->GetItemState(SID_PARAM_CUR_NUM_LEVEL, sal_False, &pItem))
766             nActNumLvl = ((const SfxUInt16Item*)pItem)->GetValue();
767     }
768     if(SFX_ITEM_SET == rSet.GetItemState(nNumItemId, sal_False, &pItem))
769     {
770         delete pSaveNum;
771         pSaveNum = new SvxNumRule(*((SvxNumBulletItem*)pItem)->GetNumRule());
772     }
773     if(*pSaveNum != *pActNum)
774     {
775         *pActNum = *pSaveNum;
776         pExamplesVS->SetNoSelection();
777     }
778     // ersten Eintrag vorselektieren
779     if(pActNum && (!lcl_IsNumFmtSet(pActNum, nActNumLvl) || bIsPreset))
780     {
781         pExamplesVS->SelectItem(1);
782         NumSelectHdl_Impl(pExamplesVS);
783         bPreset = sal_True;
784     }
785     bPreset |= bIsPreset;
786     bModified = sal_False;
787 }
788 
789 /* -----------------08.02.97 11.29-------------------
790 
791 --------------------------------------------------*/
792 
793 int  SvxNumPickTabPage::DeactivatePage(SfxItemSet *_pSet)
794 {
795     if(_pSet)
796         FillItemSet(*_pSet);
797     return sal_True;
798 }
799 
800 /*-----------------07.02.97 12.12-------------------
801 
802 --------------------------------------------------*/
803 
804 void  SvxNumPickTabPage::Reset( const SfxItemSet& rSet )
805 {
806     const SfxPoolItem* pItem;
807     //im Draw gibt es das Item als WhichId, im Writer nur als SlotId
808     SfxItemState eState = rSet.GetItemState(SID_ATTR_NUMBERING_RULE, sal_False, &pItem);
809     if(eState != SFX_ITEM_SET)
810     {
811         nNumItemId = rSet.GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE);
812         eState = rSet.GetItemState(nNumItemId, sal_False, &pItem);
813 
814         if( eState != SFX_ITEM_SET )
815         {
816             pItem = &static_cast< const SvxNumBulletItem& >( rSet.Get( nNumItemId, sal_True ) );
817             eState = SFX_ITEM_SET;
818         }
819 
820     }
821     DBG_ASSERT(eState == SFX_ITEM_SET, "kein Item gefunden!");
822     delete pSaveNum;
823     pSaveNum = new SvxNumRule(*((SvxNumBulletItem*)pItem)->GetNumRule());
824 
825 //  nActNumLvl = ((SwNumBulletTabDialog*)GetTabDialog())->GetActNumLevel();
826     if(!pActNum)
827         pActNum = new  SvxNumRule(*pSaveNum);
828     else if(*pSaveNum != *pActNum)
829         *pActNum = *pSaveNum;
830 
831 }
832 
833 /*-----------------08.02.97 11.58-------------------
834     Hier werden alle Ebenen veraendert,
835 --------------------------------------------------*/
836 
837 IMPL_LINK(SvxNumPickTabPage, NumSelectHdl_Impl, ValueSet*, EMPTYARG)
838 {
839     if(pActNum)
840     {
841         bPreset = sal_False;
842         bModified = sal_True;
843 
844         const FontList*  pList = 0;
845 
846         SvxNumSettingsArr_Impl& rItemArr = aNumSettingsArrays[pExamplesVS->GetSelectItemId() - 1];
847 
848         Font& rActBulletFont = lcl_GetDefaultBulletFont();
849         SvxNumSettings_ImplPtr pLevelSettings = 0;
850         for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
851         {
852             if(rItemArr.Count() > i)
853                 pLevelSettings = rItemArr[i];
854             if(!pLevelSettings)
855                 break;
856             SvxNumberFormat aFmt(pActNum->GetLevel(i));
857             aFmt.SetNumberingType( pLevelSettings->nNumberType );
858             sal_uInt16 nUpperLevelOrChar = (sal_uInt16)pLevelSettings->nParentNumbering;
859             if(aFmt.GetNumberingType() == SVX_NUM_CHAR_SPECIAL)
860             {
861                 // #i93908# clear suffix for bullet lists
862                 aFmt.SetPrefix(::rtl::OUString());
863                 aFmt.SetSuffix(::rtl::OUString());
864                 if( pLevelSettings->sBulletFont.getLength() &&
865                     pLevelSettings->sBulletFont.compareTo(
866                             rActBulletFont.GetName()))
867                 {
868                     //search for the font
869                     if(!pList)
870                     {
871                         SfxObjectShell* pCurDocShell = SfxObjectShell::Current();
872                         const SvxFontListItem* pFontListItem =
873                                 (const SvxFontListItem* )pCurDocShell
874                                                     ->GetItem( SID_ATTR_CHAR_FONTLIST );
875                         pList = pFontListItem ? pFontListItem->GetFontList() : 0;
876                     }
877                     if(pList && pList->IsAvailable( pLevelSettings->sBulletFont ) )
878                     {
879                         FontInfo aInfo = pList->Get(
880                             pLevelSettings->sBulletFont,WEIGHT_NORMAL, ITALIC_NONE);
881                         Font aFont(aInfo);
882                         aFmt.SetBulletFont(&aFont);
883                     }
884                     else
885                     {
886                         //if it cannot be found then create a new one
887                         Font aCreateFont( pLevelSettings->sBulletFont,
888                                                 String(), Size( 0, 14 ) );
889                         aCreateFont.SetCharSet( RTL_TEXTENCODING_DONTKNOW );
890                         aCreateFont.SetFamily( FAMILY_DONTKNOW );
891                         aCreateFont.SetPitch( PITCH_DONTKNOW );
892                         aCreateFont.SetWeight( WEIGHT_DONTKNOW );
893                         aCreateFont.SetTransparent( sal_True );
894                         aFmt.SetBulletFont( &aCreateFont );
895                     }
896                 }
897                 else
898                     aFmt.SetBulletFont( &rActBulletFont );
899 
900                 aFmt.SetBulletChar( pLevelSettings->sBulletChar.getLength()
901                                         ? pLevelSettings->sBulletChar.getStr()[0]
902                                         : 0 );
903                 aFmt.SetCharFmtName( sBulletCharFmtName );
904                 // #62069# // #92724#
905                 aFmt.SetBulletRelSize(45);
906             }
907             else
908             {
909                 aFmt.SetIncludeUpperLevels(sal::static_int_cast< sal_uInt8 >(0 != nUpperLevelOrChar ? pActNum->GetLevelCount() : 0));
910                 aFmt.SetCharFmtName(sNumCharFmtName);
911                 // #62069# // #92724#
912                 aFmt.SetBulletRelSize(100);
913                 // #i93908#
914                 aFmt.SetPrefix(pLevelSettings->sPrefix);
915                 aFmt.SetSuffix(pLevelSettings->sSuffix);
916             }
917             pActNum->SetLevel(i, aFmt);
918         }
919     }
920     return 0;
921 }
922 
923 /*-----------------06.06.97 11.16-------------------
924 
925 --------------------------------------------------*/
926 IMPL_LINK(SvxNumPickTabPage, DoubleClickHdl_Impl, ValueSet*, EMPTYARG)
927 {
928     NumSelectHdl_Impl(pExamplesVS);
929     OKButton& rOk = GetTabDialog()->GetOKButton();
930     rOk.GetClickHdl().Call(&rOk);
931     return 0;
932 }
933 
934 //add CHINA001 begin
935 void SvxNumPickTabPage::PageCreated(SfxAllItemSet aSet)
936 {
937     SFX_ITEMSET_ARG (&aSet,pNumCharFmt,SfxStringItem,SID_NUM_CHAR_FMT,sal_False);
938     SFX_ITEMSET_ARG (&aSet,pBulletCharFmt,SfxStringItem,SID_BULLET_CHAR_FMT,sal_False);
939 
940 
941     if (pNumCharFmt &&pBulletCharFmt)
942         SetCharFmtNames( pNumCharFmt->GetValue(),pBulletCharFmt->GetValue());
943 }
944 //end of CHINA001
945 
946 /**************************************************************************/
947 /*                                                                        */
948 /*                                                                        */
949 /**************************************************************************/
950 
951 SvxBitmapPickTabPage::SvxBitmapPickTabPage(Window* pParent,
952                                const SfxItemSet& rSet) :
953     SfxTabPage( pParent, CUI_RES( RID_SVXPAGE_PICK_BMP ), rSet ),
954     aValuesFL(      this, CUI_RES(FL_VALUES) ),
955     pExamplesVS(    new SvxBmpNumValueSet(this, CUI_RES(VS_VALUES)/*, aGrfNames*/ )),
956     aErrorText(     this, CUI_RES(FT_ERROR)),
957     aLinkedCB(      this, CUI_RES(CB_LINKED)),
958     pActNum(0),
959     pSaveNum(0),
960     nActNumLvl( USHRT_MAX ),
961     nNumItemId(SID_ATTR_NUMBERING_RULE),
962     bModified(sal_False),
963     bPreset(sal_False)
964 {
965     FreeResource();
966     SetExchangeSupport();
967     eCoreUnit = rSet.GetPool()->GetMetric(rSet.GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE));
968     pExamplesVS->SetSelectHdl(LINK(this, SvxBitmapPickTabPage, NumSelectHdl_Impl));
969     pExamplesVS->SetDoubleClickHdl(LINK(this, SvxBitmapPickTabPage, DoubleClickHdl_Impl));
970     aLinkedCB.SetClickHdl(LINK(this, SvxBitmapPickTabPage, LinkBmpHdl_Impl));
971 
972     // Grafiknamen ermitteln
973 
974     GalleryExplorer::FillObjList(GALLERY_THEME_BULLETS, aGrfNames);
975     pExamplesVS->SetHelpId(HID_VALUESET_NUMBMP    );
976     for(sal_uInt16 i = 0; i < aGrfNames.Count(); i++)
977     {
978         pExamplesVS->InsertItem( i + 1, i);
979         String* pGrfNm = (String*) aGrfNames.GetObject(i);
980         INetURLObject aObj(*pGrfNm);
981         if(aObj.GetProtocol() == INET_PROT_FILE)
982             *pGrfNm = aObj.PathToFileName();
983         pExamplesVS->SetItemText( i + 1, *pGrfNm );
984     }
985     if(!aGrfNames.Count())
986     {
987         aErrorText.Show();
988     }
989     else
990     {
991         pExamplesVS->Show();
992         pExamplesVS->Format();
993     }
994 
995     pExamplesVS->SetAccessibleRelationMemberOf( &aValuesFL );
996 }
997 
998 /*-----------------12.02.97 07.46-------------------
999 
1000 --------------------------------------------------*/
1001 
1002  SvxBitmapPickTabPage::~SvxBitmapPickTabPage()
1003 {
1004     String* pStr = (String*)aGrfNames.First();
1005     while( pStr )
1006     {
1007         delete pStr;
1008         pStr = (String*)aGrfNames.Next();
1009     }
1010     delete pExamplesVS;
1011     delete pActNum;
1012     delete pSaveNum;
1013 }
1014 
1015 /*-----------------12.02.97 07.46-------------------
1016 
1017 --------------------------------------------------*/
1018 
1019 SfxTabPage*  SvxBitmapPickTabPage::Create( Window* pParent,
1020                                 const SfxItemSet& rAttrSet)
1021 {
1022     return new SvxBitmapPickTabPage(pParent, rAttrSet);
1023 }
1024 
1025 /*-----------------12.02.97 07.46-------------------
1026 
1027 --------------------------------------------------*/
1028 
1029 void  SvxBitmapPickTabPage::ActivatePage(const SfxItemSet& rSet)
1030 {
1031     const SfxPoolItem* pItem;
1032     bPreset = sal_False;
1033     sal_Bool bIsPreset = sal_False;
1034 //  nActNumLvl = ((SwNumBulletTabDialog*)GetTabDialog())->GetActNumLevel();
1035     const SfxItemSet* pExampleSet = GetTabDialog()->GetExampleSet();
1036     if(pExampleSet)
1037     {
1038         if(SFX_ITEM_SET == pExampleSet->GetItemState(SID_PARAM_NUM_PRESET, sal_False, &pItem))
1039             bIsPreset = ((const SfxBoolItem*)pItem)->GetValue();
1040         if(SFX_ITEM_SET == pExampleSet->GetItemState(SID_PARAM_CUR_NUM_LEVEL, sal_False, &pItem))
1041             nActNumLvl = ((const SfxUInt16Item*)pItem)->GetValue();
1042     }
1043     if(SFX_ITEM_SET == rSet.GetItemState(nNumItemId, sal_False, &pItem))
1044     {
1045         delete pSaveNum;
1046         pSaveNum = new SvxNumRule(*((SvxNumBulletItem*)pItem)->GetNumRule());
1047     }
1048     if(*pSaveNum != *pActNum)
1049     {
1050         *pActNum = *pSaveNum;
1051         pExamplesVS->SetNoSelection();
1052     }
1053     // ersten Eintrag vorselektieren
1054     if(aGrfNames.Count() &&
1055         (pActNum && (!lcl_IsNumFmtSet(pActNum, nActNumLvl) || bIsPreset)))
1056     {
1057         pExamplesVS->SelectItem(1);
1058         NumSelectHdl_Impl(pExamplesVS);
1059         bPreset = sal_True;
1060     }
1061     bPreset |= bIsPreset;
1062     bModified = sal_False;
1063 }
1064 /*-----------------12.02.97 07.46-------------------
1065 
1066 --------------------------------------------------*/
1067 
1068 int  SvxBitmapPickTabPage::DeactivatePage(SfxItemSet *_pSet)
1069 {
1070     if(_pSet)
1071         FillItemSet(*_pSet);
1072     return sal_True;
1073 }
1074 /*-----------------12.02.97 07.46-------------------
1075 
1076 --------------------------------------------------*/
1077 
1078 sal_Bool  SvxBitmapPickTabPage::FillItemSet( SfxItemSet& rSet )
1079 {
1080     if ( !aGrfNames.Count() )
1081     {
1082 // das ist im SfxItemSet leider nicht zulaessig #52134#
1083 //      rSet.DisableItem(SID_ATTR_NUMBERING_RULE);
1084         return sal_False;
1085     }
1086     if( (bPreset || bModified) && pActNum)
1087     {
1088         *pSaveNum = *pActNum;
1089         rSet.Put(SvxNumBulletItem( *pSaveNum ), nNumItemId);
1090         rSet.Put(SfxBoolItem(SID_PARAM_NUM_PRESET, bPreset));
1091     }
1092 
1093     return bModified;
1094 }
1095 /*-----------------12.02.97 07.46-------------------
1096 
1097 --------------------------------------------------*/
1098 
1099 void  SvxBitmapPickTabPage::Reset( const SfxItemSet& rSet )
1100 {
1101     const SfxPoolItem* pItem;
1102     //im Draw gibt es das Item als WhichId, im Writer nur als SlotId
1103     SfxItemState eState = rSet.GetItemState(SID_ATTR_NUMBERING_RULE, sal_False, &pItem);
1104     if(eState != SFX_ITEM_SET)
1105     {
1106         nNumItemId = rSet.GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE);
1107         eState = rSet.GetItemState(nNumItemId, sal_False, &pItem);
1108 
1109         if( eState != SFX_ITEM_SET )
1110         {
1111             pItem = &static_cast< const SvxNumBulletItem& >( rSet.Get( nNumItemId, sal_True ) );
1112             eState = SFX_ITEM_SET;
1113         }
1114 
1115     }
1116     DBG_ASSERT(eState == SFX_ITEM_SET, "kein Item gefunden!");
1117     delete pSaveNum;
1118     pSaveNum = new SvxNumRule(*((SvxNumBulletItem*)pItem)->GetNumRule());
1119 
1120     if(!pActNum)
1121         pActNum = new  SvxNumRule(*pSaveNum);
1122     else if(*pSaveNum != *pActNum)
1123         *pActNum = *pSaveNum;
1124     if(!pActNum->IsFeatureSupported(NUM_ENABLE_LINKED_BMP))
1125     {
1126         aLinkedCB.Check(sal_False);
1127         aLinkedCB.Enable(sal_False);
1128     }
1129     else if(!pActNum->IsFeatureSupported(NUM_ENABLE_EMBEDDED_BMP))
1130     {
1131         aLinkedCB.Check(sal_True);
1132         aLinkedCB.Enable(sal_False);
1133     }
1134 }
1135 
1136 /*-----------------12.02.97 07.53-------------------
1137 
1138 --------------------------------------------------*/
1139 
1140 IMPL_LINK(SvxBitmapPickTabPage, NumSelectHdl_Impl, ValueSet*, EMPTYARG)
1141 {
1142     if(pActNum)
1143     {
1144         bPreset = sal_False;
1145         bModified = sal_True;
1146         sal_uInt16 nIdx = pExamplesVS->GetSelectItemId() - 1;
1147 
1148         String* pGrfName = 0;
1149         if(aGrfNames.Count() > nIdx)
1150             pGrfName = (String*)aGrfNames.GetObject(nIdx);
1151 
1152         sal_uInt16 nMask = 1;
1153         String aEmptyStr;
1154         sal_uInt16 nSetNumberingType = SVX_NUM_BITMAP;
1155         if(aLinkedCB.IsChecked())
1156             nSetNumberingType |= LINK_TOKEN;
1157         for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
1158         {
1159             if(nActNumLvl & nMask)
1160             {
1161                 SvxNumberFormat aFmt(pActNum->GetLevel(i));
1162                 aFmt.SetNumberingType(nSetNumberingType);
1163                 aFmt.SetPrefix( aEmptyStr );
1164                 aFmt.SetSuffix( aEmptyStr );
1165                 aFmt.SetCharFmtName( sNumCharFmtName );
1166 
1167                 Graphic aGraphic;
1168                 if(GalleryExplorer::GetGraphicObj( GALLERY_THEME_BULLETS, nIdx, &aGraphic))
1169                 {
1170                     Size aSize = SvxNumberFormat::GetGraphicSizeMM100(&aGraphic);
1171                     sal_Int16 eOrient = text::VertOrientation::LINE_CENTER;
1172                     aSize = OutputDevice::LogicToLogic(aSize, MAP_100TH_MM, (MapUnit)eCoreUnit);
1173                     SvxBrushItem aBrush(aGraphic, GPOS_AREA, SID_ATTR_BRUSH );
1174                     aFmt.SetGraphicBrush( &aBrush, &aSize, &eOrient );
1175                 }
1176                 else if(pGrfName)
1177                     aFmt.SetGraphic( *pGrfName );
1178                 pActNum->SetLevel(i, aFmt);
1179             }
1180             nMask <<= 1 ;
1181         }
1182     }
1183 
1184     return 0;
1185 }
1186 
1187 /*-----------------06.06.97 11.17-------------------
1188 
1189 --------------------------------------------------*/
1190 IMPL_LINK(SvxBitmapPickTabPage, DoubleClickHdl_Impl, ValueSet*, EMPTYARG)
1191 {
1192     NumSelectHdl_Impl(pExamplesVS);
1193     OKButton& rOk = GetTabDialog()->GetOKButton();
1194     rOk.GetClickHdl().Call(&rOk);
1195     return 0;
1196 }
1197 /* -----------------03.11.99 13:46-------------------
1198 
1199  --------------------------------------------------*/
1200 IMPL_LINK(SvxBitmapPickTabPage, LinkBmpHdl_Impl, CheckBox*, EMPTYARG )
1201 {
1202     if(!pExamplesVS->IsNoSelection())
1203     {
1204         NumSelectHdl_Impl(pExamplesVS);
1205     }
1206     return 0;
1207 }
1208 /*-----------------13.02.97 09.40-------------------
1209 
1210 --------------------------------------------------*/
1211 
1212 //CHINA001 SvxBmpNumValueSet::SvxBmpNumValueSet( Window* pParent, const ResId& rResId/*, const List& rStrNames*/ ) :
1213 //CHINA001
1214 //CHINA001 SvxNumValueSet( pParent, rResId, NUM_PAGETYPE_BMP ),
1215 //CHINA001 //    rStrList    ( rStrNames ),
1216 //CHINA001 bGrfNotFound( sal_False )
1217 //CHINA001
1218 //CHINA001 {
1219 //CHINA001 GalleryExplorer::BeginLocking(GALLERY_THEME_BULLETS);
1220 //CHINA001 SetStyle( GetStyle() | WB_VSCROLL );
1221 //CHINA001 SetLineCount( 3 );
1222 //CHINA001 aFormatTimer.SetTimeout(300);
1223 //CHINA001 aFormatTimer.SetTimeoutHdl(LINK(this, SvxBmpNumValueSet, FormatHdl_Impl));
1224 //CHINA001 }
1225 //CHINA001
1226 //CHINA001 /*-----------------13.02.97 09.41-------------------
1227 //CHINA001
1228 //CHINA001 --------------------------------------------------*/
1229 //CHINA001
1230 //CHINA001 SvxBmpNumValueSet::~SvxBmpNumValueSet()
1231 //CHINA001 {
1232 //CHINA001 GalleryExplorer::EndLocking(GALLERY_THEME_BULLETS);
1233 //CHINA001 aFormatTimer.Stop();
1234 //CHINA001 }
1235 //CHINA001 /*-----------------13.02.97 09.41-------------------
1236 //CHINA001
1237 //CHINA001 --------------------------------------------------*/
1238 //CHINA001
1239 //CHINA001 void     SvxBmpNumValueSet::UserDraw( const UserDrawEvent& rUDEvt )
1240 //CHINA001 {
1241 //CHINA001 SvxNumValueSet::UserDraw(rUDEvt);
1242 //CHINA001
1243 //CHINA001 Rectangle aRect = rUDEvt.GetRect();
1244 //CHINA001 OutputDevice*  pDev = rUDEvt.GetDevice();
1245 //CHINA001 sal_uInt16   nItemId = rUDEvt.GetItemId();
1246 //CHINA001 Point aBLPos = aRect.TopLeft();
1247 //CHINA001
1248 //CHINA001 int nRectHeight = aRect.GetHeight();
1249 //CHINA001 Size aSize(nRectHeight/8, nRectHeight/8);
1250 //CHINA001
1251 //CHINA001 Graphic aGraphic;
1252 //CHINA001 if(!GalleryExplorer::GetGraphicObj( GALLERY_THEME_BULLETS, nItemId - 1,
1253 //CHINA001 &aGraphic, NULL))
1254 //CHINA001 {
1255 //CHINA001 bGrfNotFound = sal_True;
1256 //CHINA001  }
1257 //CHINA001  else
1258 //CHINA001 {
1259 //CHINA001 Point aPos(aBLPos.X() + 5, 0);
1260 //CHINA001 for( sal_uInt16 i = 0; i < 3; i++ )
1261 //CHINA001 {
1262 //CHINA001 sal_uInt16 nY = 11 + i * 33;
1263 //CHINA001 aPos.Y() = aBLPos.Y() + nRectHeight  * nY / 100;
1264 //CHINA001 aGraphic.Draw( pDev, aPos, aSize );
1265 //CHINA001      }
1266 //CHINA001  }
1267 //CHINA001 }
1268 //CHINA001
1269 //CHINA001 /*-----------------14.02.97 07.34-------------------
1270 //CHINA001
1271 //CHINA001 --------------------------------------------------*/
1272 //CHINA001
1273 //CHINA001 IMPL_LINK(SvxBmpNumValueSet, FormatHdl_Impl, Timer*, EMPTYARG)
1274 //CHINA001 {
1275 //CHINA001 // nur, wenn eine Grafik nicht da war, muss formatiert werden
1276 //CHINA001 if(bGrfNotFound)
1277 //CHINA001 {
1278 //CHINA001 bGrfNotFound = sal_False;
1279 //CHINA001 Format();
1280 //CHINA001  }
1281 //CHINA001 Invalidate();
1282 //CHINA001 return 0;
1283 //CHINA001 }
1284 /*-----------------01.12.97 16:15-------------------
1285     Tabpage Numerierungsoptionen
1286 --------------------------------------------------*/
1287 #define NUM_NO_GRAPHIC 1000
1288 SvxNumOptionsTabPage::SvxNumOptionsTabPage(Window* pParent,
1289                                const SfxItemSet& rSet) :
1290     SfxTabPage( pParent, CUI_RES( RID_SVXPAGE_NUM_OPTIONS ), rSet ),
1291 
1292     aFormatFL(      this, CUI_RES(FL_FORMAT   )),
1293     aLevelFT(       this, CUI_RES(FT_LEVEL    )),
1294     aLevelLB(       this, CUI_RES(LB_LEVEL  )),
1295     aFmtFT(         this, CUI_RES(FT_FMT        )),
1296     aFmtLB(         this, CUI_RES(LB_FMT        )),
1297     aPrefixFT(      this, CUI_RES(FT_PREFIX )),
1298     aPrefixED(      this, CUI_RES(ED_PREFIX )),
1299     aSuffixFT(      this, CUI_RES(FT_SUFFIX )),
1300     aSuffixED(      this, CUI_RES(ED_SUFFIX )),
1301     aCharFmtFT(     this, CUI_RES(FT_CHARFMT    )),
1302     aCharFmtLB(     this, CUI_RES(LB_CHARFMT    )),
1303     aBulColorFT(    this, CUI_RES(FT_BUL_COLOR)),
1304     aBulColLB(      this, CUI_RES(LB_BUL_COLOR)),
1305     aBulRelSizeFT(  this, CUI_RES(FT_BUL_REL_SIZE)),
1306     aBulRelSizeMF(  this, CUI_RES(MF_BUL_REL_SIZE)),
1307     aAllLevelFT(    this, CUI_RES(FT_ALL_LEVEL)),
1308     aAllLevelNF(    this, CUI_RES(NF_ALL_LEVEL)),
1309     aStartFT(       this, CUI_RES(FT_START  )),
1310     aStartED(       this, CUI_RES(ED_START  )),
1311     aBulletPB(      this, CUI_RES(PB_BULLET )),
1312     aAlignFT(       this, CUI_RES(FT_ALIGN  )),
1313     aAlignLB(       this, CUI_RES(LB_ALIGN  )),
1314     aBitmapFT(      this, CUI_RES(FT_BITMAP )),
1315     aBitmapMB(      this, CUI_RES(MB_BITMAP )),
1316     aSizeFT(        this, CUI_RES(FT_SIZE       )),
1317     aWidthMF(       this, CUI_RES(MF_WIDTH  )),
1318     aMultFT(        this, CUI_RES(FT_MULT       )),
1319     aHeightMF(      this, CUI_RES(MF_HEIGHT )),
1320     aRatioCB(       this, CUI_RES(CB_RATIO  )),
1321     aOrientFT(      this, CUI_RES(FT_ORIENT )),
1322     aOrientLB(      this, CUI_RES(LB_ORIENT )),
1323     aSameLevelFL(   this, CUI_RES(FL_SAME_LEVEL)),
1324     aSameLevelCB(   this, CUI_RES(CB_SAME_LEVEL)),
1325     pPreviewWIN(    new SvxNumberingPreview(this, CUI_RES(WIN_PREVIEW   ))),
1326     pActNum(0),
1327     pSaveNum(0),
1328     bLastWidthModified(sal_False),
1329     bModified(sal_False),
1330     bPreset(sal_False),
1331     bAutomaticCharStyles(sal_True),
1332     bHTMLMode(sal_False),
1333     bMenuButtonInitialized(sal_False),
1334     sBullet(CUI_RES(STR_BULLET)),
1335     nBullet(0xff),
1336     nActNumLvl(USHRT_MAX),
1337     nNumItemId(SID_ATTR_NUMBERING_RULE)
1338 {
1339     sStartWith = aStartFT.GetText();
1340     pPreviewWIN->SetBackground(Wallpaper(Color(COL_TRANSPARENT)));
1341     SetExchangeSupport();
1342     aActBulletFont = lcl_GetDefaultBulletFont();
1343 
1344     aBulletPB.SetClickHdl(LINK(this, SvxNumOptionsTabPage, BulletHdl_Impl));
1345     aFmtLB.SetSelectHdl(LINK(this, SvxNumOptionsTabPage, NumberTypeSelectHdl_Impl));
1346     aBitmapMB.SetSelectHdl(LINK(this, SvxNumOptionsTabPage, GraphicHdl_Impl));
1347     aLevelLB.SetSelectHdl(LINK(this, SvxNumOptionsTabPage, LevelHdl_Impl));
1348     aCharFmtLB.SetSelectHdl(LINK(this, SvxNumOptionsTabPage, CharFmtHdl_Impl));
1349     aWidthMF.SetModifyHdl(LINK(this, SvxNumOptionsTabPage, SizeHdl_Impl));
1350     aHeightMF.SetModifyHdl(LINK(this, SvxNumOptionsTabPage, SizeHdl_Impl));
1351     aRatioCB.SetClickHdl(LINK(this, SvxNumOptionsTabPage, RatioHdl_Impl));
1352     aStartED.SetModifyHdl(LINK(this, SvxNumOptionsTabPage, EditModifyHdl_Impl));
1353     aPrefixED.SetModifyHdl(LINK(this, SvxNumOptionsTabPage, EditModifyHdl_Impl));
1354     aSuffixED.SetModifyHdl(LINK(this, SvxNumOptionsTabPage, EditModifyHdl_Impl));
1355     aAllLevelNF.SetModifyHdl(LINK(this,SvxNumOptionsTabPage, AllLevelHdl_Impl));
1356     aOrientLB.SetSelectHdl(LINK(this, SvxNumOptionsTabPage, OrientHdl_Impl));
1357     aSameLevelCB.SetClickHdl(LINK(this, SvxNumOptionsTabPage, SameLevelHdl_Impl));
1358     aBulRelSizeMF.SetModifyHdl(LINK(this,SvxNumOptionsTabPage, BulRelSizeHdl_Impl));
1359     aBulColLB.SetSelectHdl(LINK(this, SvxNumOptionsTabPage, BulColorHdl_Impl));
1360     aInvalidateTimer.SetTimeoutHdl(LINK(this, SvxNumOptionsTabPage, PreviewInvalidateHdl_Impl));
1361     aInvalidateTimer.SetTimeout(50);
1362 
1363     aBitmapMB.GetPopupMenu()->SetHighlightHdl(LINK(this, SvxNumOptionsTabPage, PopupActivateHdl_Impl));
1364     PopupMenu* pPopup = new PopupMenu;
1365     aBitmapMB.GetPopupMenu()->SetPopupMenu( MN_GALLERY, pPopup );
1366 
1367     pPopup->InsertItem( NUM_NO_GRAPHIC, String(CUI_RES(ST_POPUP_EMPTY_ENTRY)) );
1368     pPopup->EnableItem( NUM_NO_GRAPHIC, sal_False );
1369 
1370     eCoreUnit = rSet.GetPool()->GetMetric(rSet.GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE));
1371 
1372     aBitmapMB.SetAccessibleRelationLabeledBy( &aBitmapFT );
1373 
1374     FreeResource();
1375 
1376     //get advanced numbering types from the component
1377     Reference<XDefaultNumberingProvider> xDefNum = lcl_GetNumberingProvider();
1378     Reference<XNumberingTypeInfo> xInfo(xDefNum, UNO_QUERY);
1379 
1380     // Extended numbering schemes present in the resource but not offered by
1381     // the i18n framework per configuration must be removed from the listbox.
1382     // Watch out for the ugly 0x88/*SVX_NUM_BITMAP|0x80*/ to not remove that.
1383     const sal_uInt16 nDontRemove = 0xffff;
1384     ::std::vector< sal_uInt16> aRemove( aFmtLB.GetEntryCount(), nDontRemove);
1385     for (size_t i=0; i<aRemove.size(); ++i)
1386     {
1387         sal_uInt16 nEntryData = (sal_uInt16)(sal_uLong)aFmtLB.GetEntryData(
1388             sal::static_int_cast< sal_uInt16 >(i));
1389         if (nEntryData > NumberingType::CHARS_LOWER_LETTER_N &&
1390                 nEntryData != (SVX_NUM_BITMAP | 0x80))
1391             aRemove[i] = nEntryData;
1392     }
1393     if(xInfo.is())
1394     {
1395         Sequence<sal_Int16> aTypes = xInfo->getSupportedNumberingTypes(  );
1396         const sal_Int16* pTypes = aTypes.getConstArray();
1397         for(sal_Int32 nType = 0; nType < aTypes.getLength(); nType++)
1398         {
1399             sal_Int16 nCurrent = pTypes[nType];
1400             if(nCurrent > NumberingType::CHARS_LOWER_LETTER_N)
1401             {
1402                 sal_Bool bInsert = sal_True;
1403                 for(sal_uInt16 nEntry = 0; nEntry < aFmtLB.GetEntryCount(); nEntry++)
1404                 {
1405                     sal_uInt16 nEntryData = (sal_uInt16)(sal_uLong)aFmtLB.GetEntryData(nEntry);
1406                     if(nEntryData == (sal_uInt16) nCurrent)
1407                     {
1408                         bInsert = sal_False;
1409                         aRemove[nEntry] = nDontRemove;
1410                         break;
1411                     }
1412                 }
1413                 if(bInsert)
1414                 {
1415                     OUString aIdent = xInfo->getNumberingIdentifier( nCurrent );
1416                     sal_uInt16 nPos = aFmtLB.InsertEntry(aIdent);
1417                     aFmtLB.SetEntryData(nPos,(void*)(sal_uLong)nCurrent);
1418                 }
1419             }
1420         }
1421     }
1422     for (size_t i=0; i<aRemove.size(); ++i)
1423     {
1424         if (aRemove[i] != nDontRemove)
1425         {
1426             sal_uInt16 nPos = aFmtLB.GetEntryPos( (void*)(sal_uLong)aRemove[i]);
1427             aFmtLB.RemoveEntry( nPos);
1428         }
1429     }
1430 
1431     aBulletPB.SetAccessibleRelationMemberOf(&aFormatFL);
1432     aBulletPB.SetAccessibleRelationLabeledBy(&aStartFT);
1433     aBulletPB.SetAccessibleName(aStartFT.GetText());
1434 }
1435 
1436 /*-----------------01.12.97 16:30-------------------
1437 
1438 --------------------------------------------------*/
1439 SvxNumOptionsTabPage::~SvxNumOptionsTabPage()
1440 {
1441     delete aBitmapMB.GetPopupMenu()->GetPopupMenu( MN_GALLERY );
1442     String* pStr = (String*)aGrfNames.First();
1443     while( pStr )
1444     {
1445         delete pStr;
1446         pStr = (String*)aGrfNames.Next();
1447     }
1448     delete pActNum;
1449     delete pPreviewWIN;
1450     delete pSaveNum;
1451 }
1452 
1453 /*-----------------03.12.97 07:52-------------------
1454 
1455 --------------------------------------------------*/
1456 void SvxNumOptionsTabPage::SetMetric(FieldUnit eMetric)
1457 {
1458     if(eMetric == FUNIT_MM)
1459     {
1460         aWidthMF     .SetDecimalDigits(1);
1461         aHeightMF     .SetDecimalDigits(1);
1462     }
1463     aWidthMF .SetUnit( eMetric );
1464     aHeightMF .SetUnit( eMetric );
1465 }
1466 
1467 /*-----------------01.12.97 16:30-------------------
1468 
1469 --------------------------------------------------*/
1470 SfxTabPage* SvxNumOptionsTabPage::Create( Window* pParent,
1471                                 const SfxItemSet& rAttrSet)
1472 {
1473     return new SvxNumOptionsTabPage(pParent, rAttrSet);
1474 };
1475 /*-----------------01.12.97 16:29-------------------
1476 
1477 --------------------------------------------------*/
1478 void    SvxNumOptionsTabPage::ActivatePage(const SfxItemSet& rSet)
1479 {
1480     const SfxPoolItem* pItem;
1481     const SfxItemSet* pExampleSet = GetTabDialog()->GetExampleSet();
1482     sal_uInt16 nTmpNumLvl = USHRT_MAX;
1483     if(pExampleSet)
1484     {
1485         if(SFX_ITEM_SET == pExampleSet->GetItemState(SID_PARAM_NUM_PRESET, sal_False, &pItem))
1486             bPreset = ((const SfxBoolItem*)pItem)->GetValue();
1487         if(SFX_ITEM_SET == pExampleSet->GetItemState(SID_PARAM_CUR_NUM_LEVEL, sal_False, &pItem))
1488             nTmpNumLvl = ((const SfxUInt16Item*)pItem)->GetValue();
1489     }
1490     if(SFX_ITEM_SET == rSet.GetItemState(nNumItemId, sal_False, &pItem))
1491     {
1492         delete pSaveNum;
1493         pSaveNum = new SvxNumRule(*((SvxNumBulletItem*)pItem)->GetNumRule());
1494     }
1495     //
1496     bModified = (!pActNum->Get( 0 ) || bPreset);
1497     if(*pActNum != *pSaveNum ||
1498         nActNumLvl != nTmpNumLvl)
1499     {
1500         nActNumLvl = nTmpNumLvl;
1501         sal_uInt16 nMask = 1;
1502         aLevelLB.SetUpdateMode(sal_False);
1503         aLevelLB.SetNoSelection();
1504         aLevelLB.SelectEntryPos( pActNum->GetLevelCount(), nActNumLvl == USHRT_MAX);
1505         if(nActNumLvl != USHRT_MAX)
1506             for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
1507             {
1508                 if(nActNumLvl & nMask)
1509                     aLevelLB.SelectEntryPos( i, sal_True);
1510                 nMask <<= 1 ;
1511             }
1512         aLevelLB.SetUpdateMode(sal_True);
1513         *pActNum = *pSaveNum;
1514         InitControls();
1515     }
1516 
1517 }
1518 /*-----------------01.12.97 16:29-------------------
1519 
1520 --------------------------------------------------*/
1521 int     SvxNumOptionsTabPage::DeactivatePage(SfxItemSet * _pSet)
1522 {
1523     if(_pSet)
1524         FillItemSet(*_pSet);
1525     return sal_True;
1526 }
1527 /*-----------------01.12.97 16:29-------------------
1528 
1529 --------------------------------------------------*/
1530 sal_Bool    SvxNumOptionsTabPage::FillItemSet( SfxItemSet& rSet )
1531 {
1532     rSet.Put(SfxUInt16Item(SID_PARAM_CUR_NUM_LEVEL, nActNumLvl));
1533     if(bModified && pActNum)
1534     {
1535         *pSaveNum = *pActNum;
1536         rSet.Put(SvxNumBulletItem( *pSaveNum ), nNumItemId);
1537         rSet.Put(SfxBoolItem(SID_PARAM_NUM_PRESET, sal_False));
1538     }
1539     return bModified;
1540 };
1541 /*-----------------01.12.97 16:29-------------------
1542 
1543 --------------------------------------------------*/
1544 void    SvxNumOptionsTabPage::Reset( const SfxItemSet& rSet )
1545 {
1546     const SfxPoolItem* pItem;
1547     //im Draw gibt es das Item als WhichId, im Writer nur als SlotId
1548     SfxItemState eState = rSet.GetItemState(SID_ATTR_NUMBERING_RULE, sal_False, &pItem);
1549     if(eState != SFX_ITEM_SET)
1550     {
1551         nNumItemId = rSet.GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE);
1552         eState = rSet.GetItemState(nNumItemId, sal_False, &pItem);
1553 
1554         if( eState != SFX_ITEM_SET )
1555         {
1556             pItem = &static_cast< const SvxNumBulletItem& >( rSet.Get( nNumItemId, sal_True ) );
1557             eState = SFX_ITEM_SET;
1558         }
1559 
1560     }
1561     DBG_ASSERT(eState == SFX_ITEM_SET, "kein Item gefunden!");
1562     delete pSaveNum;
1563     pSaveNum = new SvxNumRule(*((SvxNumBulletItem*)pItem)->GetNumRule());
1564 
1565     // Ebenen einfuegen
1566     if(!aLevelLB.GetEntryCount())
1567     {
1568         for(sal_uInt16 i = 1; i <= pSaveNum->GetLevelCount(); i++)
1569             aLevelLB.InsertEntry( UniString::CreateFromInt32(i));
1570         if(pSaveNum->GetLevelCount() > 1)
1571         {
1572             String sEntry( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "1 - " ) ) );
1573             sEntry += UniString::CreateFromInt32( pSaveNum->GetLevelCount() );
1574             aLevelLB.InsertEntry(sEntry);
1575             aLevelLB.SelectEntry(sEntry);
1576         }
1577         else
1578             aLevelLB.SelectEntryPos(0);
1579     }
1580     else
1581         aLevelLB.SelectEntryPos(aLevelLB.GetEntryCount() - 1);
1582 
1583 //  nActNumLvl = ((SwNumBulletTabDialog*)GetTabDialog())->GetActNumLevel();
1584     sal_uInt16 nMask = 1;
1585     aLevelLB.SetUpdateMode(sal_False);
1586     aLevelLB.SetNoSelection();
1587     if(nActNumLvl == USHRT_MAX)
1588     {
1589         aLevelLB.SelectEntryPos( pSaveNum->GetLevelCount(), sal_True);
1590     }
1591     else
1592         for(sal_uInt16 i = 0; i < pSaveNum->GetLevelCount(); i++)
1593         {
1594             if(nActNumLvl & nMask)
1595                 aLevelLB.SelectEntryPos( i, sal_True);
1596             nMask <<= 1 ;
1597         }
1598     aLevelLB.SetUpdateMode(sal_True);
1599 
1600     if(!pActNum)
1601         pActNum = new  SvxNumRule(*pSaveNum);
1602     else if(*pSaveNum != *pActNum)
1603         *pActNum = *pSaveNum;
1604     pPreviewWIN->SetNumRule(pActNum);
1605     aSameLevelCB.Check(pActNum->IsContinuousNumbering());
1606 
1607     //ColorListBox bei Bedarf fuellen
1608     if ( pActNum->IsFeatureSupported( NUM_BULLET_COLOR ) )
1609     {
1610         SfxObjectShell* pDocSh = SfxObjectShell::Current();
1611         DBG_ASSERT( pDocSh, "DocShell not found!" );
1612         XColorTable* pColorTable = NULL;
1613         FASTBOOL bKillTable = sal_False;
1614         if ( pDocSh )
1615         {
1616             pItem = pDocSh->GetItem( SID_COLOR_TABLE );
1617             if ( pItem )
1618                 pColorTable = ( (SvxColorTableItem*)pItem )->GetColorTable();
1619         }
1620 
1621         if ( !pColorTable )
1622         {
1623             pColorTable = new XColorTable( SvtPathOptions().GetPalettePath() );
1624             bKillTable = sal_True;
1625         }
1626 
1627         aBulColLB.InsertEntry( Color( COL_AUTO ), SVX_RESSTR( RID_SVXSTR_AUTOMATIC ));
1628 
1629         for ( long i = 0; i < pColorTable->Count(); i++ )
1630         {
1631             XColorEntry* pEntry = pColorTable->GetColor(i);
1632             aBulColLB.InsertEntry( pEntry->GetColor(), pEntry->GetName() );
1633         }
1634 
1635         if ( bKillTable )
1636             delete pColorTable;
1637     }
1638 
1639     SfxObjectShell* pShell;
1640     if ( SFX_ITEM_SET == rSet.GetItemState( SID_HTML_MODE, sal_False, &pItem )
1641          || ( 0 != ( pShell = SfxObjectShell::Current()) &&
1642               0 != ( pItem = pShell->GetItem( SID_HTML_MODE ) ) ) )
1643     {
1644         sal_uInt16 nHtmlMode = ((SfxUInt16Item*)pItem)->GetValue();
1645         bHTMLMode = 0 != (nHtmlMode&HTMLMODE_ON);
1646     }
1647 
1648     sal_Bool bCharFmt = pActNum->IsFeatureSupported(NUM_CHAR_STYLE);
1649     aCharFmtFT.Show(bCharFmt);
1650     aCharFmtLB.Show(bCharFmt);
1651 
1652     sal_Bool bContinuous = pActNum->IsFeatureSupported(NUM_CONTINUOUS);
1653 
1654     sal_Bool bAllLevel = bContinuous && !bHTMLMode;
1655     aAllLevelFT.Show(bAllLevel);
1656     aAllLevelNF.Show(bAllLevel);
1657 
1658     aSameLevelFL.Show(bContinuous);
1659     aSameLevelCB.Show(bContinuous);
1660     //wieder Missbrauch: im Draw gibt es die Numerierung nur bis zum Bitmap
1661     // without SVX_NUM_NUMBER_NONE
1662     //remove types that are unsupported by Draw/Impress
1663     if(!bContinuous)
1664     {
1665         sal_uInt16 nFmtCount = aFmtLB.GetEntryCount();
1666         for(sal_uInt16 i = nFmtCount; i; i--)
1667         {
1668             sal_uInt16 nEntryData = (sal_uInt16)(sal_uLong)aFmtLB.GetEntryData(i - 1);
1669             if(/*SVX_NUM_NUMBER_NONE == nEntryData ||*/
1670                 ((SVX_NUM_BITMAP|LINK_TOKEN) ==  nEntryData))
1671                 aFmtLB.RemoveEntry(i - 1);
1672         }
1673     }
1674     //one must be enabled
1675     if(!pActNum->IsFeatureSupported(NUM_ENABLE_LINKED_BMP))
1676     {
1677         long nData = SVX_NUM_BITMAP|LINK_TOKEN;
1678         sal_uInt16 nPos = aFmtLB.GetEntryPos((void*)nData);
1679         if(LISTBOX_ENTRY_NOTFOUND != nPos)
1680             aFmtLB.RemoveEntry(nPos);
1681     }
1682     else if(!pActNum->IsFeatureSupported(NUM_ENABLE_EMBEDDED_BMP))
1683     {
1684         long nData = SVX_NUM_BITMAP;
1685         sal_uInt16 nPos = aFmtLB.GetEntryPos((void*)nData);
1686         if(LISTBOX_ENTRY_NOTFOUND != nPos)
1687             aFmtLB.RemoveEntry(nPos);
1688     }
1689     if(pActNum->IsFeatureSupported(NUM_SYMBOL_ALIGNMENT))
1690     {
1691         aAlignFT.Show();
1692         aAlignLB.Show();
1693         Size aSz(aFormatFL.GetSizePixel());
1694         aSz.Height() = aLevelFT.GetSizePixel().Height();
1695         aFormatFL.SetSizePixel(aSz);
1696         aAlignLB.SetSelectHdl(LINK(this, SvxNumOptionsTabPage, EditModifyHdl_Impl));
1697     }
1698 
1699     //MegaHack: Aufgrund eines nicht fixbaren 'designfehlers' im Impress
1700     //Alle arten der numerischen Aufzaehlungen loeschen
1701     if(pActNum->IsFeatureSupported(NUM_NO_NUMBERS))
1702     {
1703         sal_uInt16 nFmtCount = aFmtLB.GetEntryCount();
1704         for(sal_uInt16 i = nFmtCount; i; i--)
1705         {
1706             sal_uInt16 nEntryData = (sal_uInt16)(sal_uLong)aFmtLB.GetEntryData(i - 1);
1707             if( /*nEntryData >= SVX_NUM_CHARS_UPPER_LETTER &&*/  nEntryData <= SVX_NUM_NUMBER_NONE)
1708                 aFmtLB.RemoveEntry(i - 1);
1709         }
1710     }
1711 
1712     InitControls();
1713     bModified = sal_False;
1714 
1715 }
1716 /*-----------------02.12.97 13:47-------------------
1717 
1718 --------------------------------------------------*/
1719 void SvxNumOptionsTabPage::InitControls()
1720 {
1721     sal_Bool bShowBullet    = sal_True;
1722     sal_Bool bShowBitmap    = sal_True;
1723     sal_Bool bSameType      = sal_True;
1724     sal_Bool bSameStart     = sal_True;
1725     sal_Bool bSamePrefix    = sal_True;
1726     sal_Bool bSameSuffix    = sal_True;
1727     sal_Bool bAllLevel      = sal_True;
1728     sal_Bool bSameCharFmt   = sal_True;
1729     sal_Bool bSameVOrient   = sal_True;
1730     sal_Bool bSameSize      = sal_True;
1731     sal_Bool bSameBulColor  = sal_True;
1732     sal_Bool bSameBulRelSize= sal_True;
1733     sal_Bool bSameAdjust    = sal_True;
1734 
1735     const SvxNumberFormat* aNumFmtArr[SVX_MAX_NUM];
1736     String sFirstCharFmt;
1737     sal_Int16 eFirstOrient = text::VertOrientation::NONE;
1738     Size aFirstSize(0,0);
1739     sal_uInt16 nMask = 1;
1740     sal_uInt16 nLvl = USHRT_MAX;
1741     sal_uInt16 nHighestLevel = 0;
1742     String aEmptyStr;
1743 
1744     sal_Bool bBullColor = pActNum->IsFeatureSupported(NUM_BULLET_COLOR);
1745     sal_Bool bBullRelSize = pActNum->IsFeatureSupported(NUM_BULLET_REL_SIZE);
1746     for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
1747     {
1748         if(nActNumLvl & nMask)
1749         {
1750             aNumFmtArr[i] = &pActNum->GetLevel(i);
1751             bShowBullet &= aNumFmtArr[i]->GetNumberingType() == SVX_NUM_CHAR_SPECIAL;
1752             bShowBitmap &= (aNumFmtArr[i]->GetNumberingType()&(~LINK_TOKEN)) == SVX_NUM_BITMAP;
1753             if(USHRT_MAX == nLvl)
1754             {
1755                 nLvl = i;
1756                 sFirstCharFmt = aNumFmtArr[i]->GetCharFmtName();
1757                 eFirstOrient = aNumFmtArr[i]->GetVertOrient();
1758                 if(bShowBitmap)
1759                     aFirstSize = aNumFmtArr[i]->GetGraphicSize();
1760             }
1761             if( i > nLvl)
1762             {
1763                 bSameType &=   aNumFmtArr[i]->GetNumberingType() == aNumFmtArr[nLvl]->GetNumberingType();
1764                 bSameStart = aNumFmtArr[i]->GetStart() == aNumFmtArr[nLvl]->GetStart();
1765 
1766                 bSamePrefix = aNumFmtArr[i]->GetPrefix() == aNumFmtArr[nLvl]->GetPrefix();
1767                 bSameSuffix = aNumFmtArr[i]->GetSuffix() == aNumFmtArr[nLvl]->GetSuffix();
1768                 bAllLevel &= aNumFmtArr[i]->GetIncludeUpperLevels() == aNumFmtArr[nLvl]->GetIncludeUpperLevels();
1769                 bSameCharFmt    &=  sFirstCharFmt == aNumFmtArr[i]->GetCharFmtName();
1770                 bSameVOrient    &= eFirstOrient == aNumFmtArr[i]->GetVertOrient();
1771                 if(bShowBitmap && bSameSize)
1772                     bSameSize &= aNumFmtArr[i]->GetGraphicSize() == aFirstSize;
1773                 bSameBulColor &= aNumFmtArr[i]->GetBulletColor() == aNumFmtArr[nLvl]->GetBulletColor();
1774                 bSameBulRelSize &= aNumFmtArr[i]->GetBulletRelSize() == aNumFmtArr[nLvl]->GetBulletRelSize();
1775                 bSameAdjust     &= aNumFmtArr[i]->GetNumAdjust() == aNumFmtArr[nLvl]->GetNumAdjust();
1776             }
1777             nHighestLevel = i;
1778         }
1779         else
1780             aNumFmtArr[i] = 0;
1781 
1782         nMask <<= 1 ;
1783 
1784     }
1785     SwitchNumberType(bShowBullet ? 1 : bShowBitmap ? 2 : 0);
1786     CheckForStartValue_Impl(aNumFmtArr[nLvl]->GetNumberingType());
1787     if(bShowBitmap)
1788     {
1789         if(!bSameVOrient || eFirstOrient == text::VertOrientation::NONE)
1790             aOrientLB.SetNoSelection();
1791         else
1792             aOrientLB.SelectEntryPos(
1793                 sal::static_int_cast< sal_uInt16 >(eFirstOrient - 1));
1794                 // kein text::VertOrientation::NONE
1795 
1796         if(bSameSize)
1797         {
1798             SetMetricValue(aHeightMF, aFirstSize.Height(), eCoreUnit);
1799             SetMetricValue(aWidthMF, aFirstSize.Width(), eCoreUnit);
1800         }
1801         else
1802         {
1803             aHeightMF.SetText(aEmptyStr);
1804             aWidthMF.SetText(aEmptyStr);
1805         }
1806     }
1807 
1808     if(bSameType)
1809     {
1810         sal_uInt16 nLBData = (sal_uInt16) aNumFmtArr[nLvl]->GetNumberingType();
1811         aFmtLB.SelectEntryPos(aFmtLB.GetEntryPos( (void*)sal::static_int_cast<sal_uIntPtr>( nLBData ) ));
1812     }
1813     else
1814         aFmtLB.SetNoSelection();
1815 
1816     aAllLevelNF.Enable(nHighestLevel > 0 && !aSameLevelCB.IsChecked());
1817     aAllLevelNF.SetMax(nHighestLevel + 1);
1818     if(bAllLevel)
1819     {
1820         aAllLevelNF.SetValue(aNumFmtArr[nLvl]->GetIncludeUpperLevels());
1821     }
1822     else
1823     {
1824         aAllLevelNF.SetText(aEmptyStr);
1825     }
1826     if(bSameAdjust)
1827     {
1828         sal_uInt16 nPos = 1; // zentriert
1829         if(aNumFmtArr[nLvl]->GetNumAdjust() == SVX_ADJUST_LEFT)
1830             nPos = 0;
1831         else if(aNumFmtArr[nLvl]->GetNumAdjust() == SVX_ADJUST_RIGHT)
1832             nPos = 2;
1833         aAlignLB.SelectEntryPos(nPos);
1834     }
1835     else
1836     {
1837         aAlignLB.SetNoSelection();
1838     }
1839 
1840     if(bBullRelSize)
1841     {
1842         if(bSameBulRelSize)
1843             aBulRelSizeMF.SetValue(aNumFmtArr[nLvl]->GetBulletRelSize());
1844         else
1845             aBulRelSizeMF.SetText(aEmptyStr);
1846     }
1847     if(bBullColor)
1848     {
1849         if(bSameBulColor)
1850             aBulColLB.SelectEntry(aNumFmtArr[nLvl]->GetBulletColor());
1851         else
1852             aBulColLB.SetNoSelection();
1853     }
1854     switch(nBullet)
1855     {
1856         case SHOW_NUMBERING:
1857             if(bSameStart)
1858             {
1859                 aStartED.SetValue(aNumFmtArr[nLvl]->GetStart());
1860             }
1861             else
1862                 aStartED.SetText(aEmptyStr);
1863         break;
1864         case SHOW_BULLET:
1865         {
1866 //              const Font* pFnt = aNumFmtArr[Lvl]->GetBulletFont();
1867 //              if(pFnt)
1868 //                  ChgTxtFont(aBulletFT, *pFnt);
1869 //              aBulletFT.SetText(String((char)aNumFmtArr[nLvl]->GetBulletChar()));
1870         }
1871         break;
1872         case SHOW_BITMAP:
1873         break;
1874     }
1875 
1876     if(bSamePrefix)
1877         aPrefixED.SetText(aNumFmtArr[nLvl]->GetPrefix());
1878     else
1879         aPrefixED.SetText(aEmptyStr);
1880     if(bSameSuffix)
1881         aSuffixED.SetText(aNumFmtArr[nLvl]->GetSuffix());
1882     else
1883         aSuffixED.SetText(aEmptyStr);
1884 
1885     if(bSameCharFmt)
1886     {
1887         if(sFirstCharFmt.Len())
1888                 aCharFmtLB.SelectEntry(sFirstCharFmt);
1889         else
1890             aCharFmtLB.SelectEntryPos( 0 );
1891     }
1892     else
1893         aCharFmtLB.SetNoSelection();
1894 
1895     pPreviewWIN->SetLevel(nActNumLvl);
1896     pPreviewWIN->Invalidate();
1897 }
1898 
1899 /*-----------------02.12.97 14:01-------------------
1900      0 - Nummer; 1 - Bullet; 2 - Bitmap
1901 --------------------------------------------------*/
1902 
1903 void SvxNumOptionsTabPage::SwitchNumberType( sal_uInt8 nType, sal_Bool )
1904 {
1905     if(nBullet == nType)
1906         return;
1907     nBullet = nType;
1908     sal_Bool bBitmap = sal_False;
1909     sal_Bool bBullet = sal_False;
1910     sal_Bool bEnableBitmap = sal_False;
1911     if(nType == SHOW_NUMBERING)
1912     {
1913         // Label umschalten, alten Text merken
1914         aStartFT.SetText(sStartWith);
1915 
1916     }
1917     else if(nType == SHOW_BULLET)
1918     {
1919         // Label umschalten, alten Text merken
1920         aStartFT.SetText(sBullet);
1921         bBullet = sal_True;
1922     }
1923     else
1924     {
1925         bBitmap = sal_True;
1926         bEnableBitmap = sal_True;
1927     }
1928     sal_Bool bNumeric = !(bBitmap||bBullet);
1929     aPrefixFT.Show(bNumeric);
1930     aPrefixED.Show(bNumeric);
1931     aSuffixFT.Show(bNumeric);
1932     aSuffixED.Show(bNumeric);
1933 
1934     sal_Bool bCharFmt = pActNum->IsFeatureSupported(NUM_CHAR_STYLE);
1935     aCharFmtFT.Show(!bBitmap && bCharFmt);
1936     aCharFmtLB.Show(!bBitmap && bCharFmt);
1937 
1938     // das ist eigentlich Missbrauch, da fuer die vollst. Numerierung kein
1939     // eigenes Flag existiert
1940     sal_Bool bAllLevelFeature = pActNum->IsFeatureSupported(NUM_CONTINUOUS);
1941     sal_Bool bAllLevel = bNumeric && bAllLevelFeature && !bHTMLMode;
1942     aAllLevelFT.Show(bAllLevel);
1943     aAllLevelNF.Show(bAllLevel);
1944 
1945     aStartFT.Show(!bBitmap);
1946     aStartED.Show(!(bBullet||bBitmap));
1947 
1948     aBulletPB.Show(bBullet);
1949     sal_Bool bBullColor = pActNum->IsFeatureSupported(NUM_BULLET_COLOR);
1950     aBulColorFT.Show(   !bBitmap && bBullColor );
1951     aBulColLB.Show(     !bBitmap && bBullColor );
1952     sal_Bool bBullResSize = pActNum->IsFeatureSupported(NUM_BULLET_REL_SIZE);
1953     aBulRelSizeFT.Show( !bBitmap && bBullResSize );
1954     aBulRelSizeMF.Show( !bBitmap && bBullResSize );
1955 
1956     aBitmapFT   .Show(bBitmap);
1957     aBitmapMB   .Show(bBitmap);
1958 
1959     aSizeFT     .Show(bBitmap);
1960     aWidthMF    .Show(bBitmap);
1961     aMultFT     .Show(bBitmap);
1962     aHeightMF   .Show(bBitmap);
1963     aRatioCB    .Show(bBitmap);
1964 
1965     aOrientFT   .Show(bBitmap &&  bAllLevelFeature);
1966     aOrientLB   .Show(bBitmap &&  bAllLevelFeature);
1967 
1968     aSizeFT     .Enable(bEnableBitmap);
1969     aWidthMF    .Enable(bEnableBitmap);
1970     aMultFT     .Enable(bEnableBitmap);
1971     aHeightMF   .Enable(bEnableBitmap);
1972     aRatioCB    .Enable(bEnableBitmap);
1973     aOrientFT   .Enable(bEnableBitmap);
1974     aOrientLB   .Enable(bEnableBitmap);
1975 
1976 }
1977 /*-----------------02.12.97 13:51-------------------
1978 
1979 --------------------------------------------------*/
1980 IMPL_LINK( SvxNumOptionsTabPage, LevelHdl_Impl, ListBox *, pBox )
1981 {
1982     sal_uInt16 nSaveNumLvl = nActNumLvl;
1983     nActNumLvl = 0;
1984     if(pBox->IsEntryPosSelected( pActNum->GetLevelCount() ) &&
1985         (pBox->GetSelectEntryCount() == 1 || nSaveNumLvl != 0xffff))
1986     {
1987         nActNumLvl = 0xFFFF;
1988         pBox->SetUpdateMode(sal_False);
1989         for( sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++ )
1990             pBox->SelectEntryPos( i, sal_False );
1991         pBox->SetUpdateMode(sal_True);
1992     }
1993     else if(pBox->GetSelectEntryCount())
1994     {
1995         sal_uInt16 nMask = 1;
1996         for( sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++ )
1997         {
1998             if(pBox->IsEntryPosSelected( i ))
1999                 nActNumLvl |= nMask;
2000             nMask <<= 1;
2001         }
2002         pBox->SelectEntryPos( pActNum->GetLevelCount(), sal_False );
2003     }
2004     else
2005     {
2006         nActNumLvl = nSaveNumLvl;
2007         sal_uInt16 nMask = 1;
2008         for( sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++ )
2009         {
2010             if(nActNumLvl & nMask)
2011             {
2012                 pBox->SelectEntryPos(i);
2013                 break;
2014             }
2015             nMask <<=1;
2016         }
2017     }
2018     InitControls();
2019     return 0;
2020 }
2021 /* -----------------------------05.04.2002 15:30------------------------------
2022 
2023  ---------------------------------------------------------------------------*/
2024 IMPL_LINK( SvxNumOptionsTabPage, PreviewInvalidateHdl_Impl, Timer*, EMPTYARG )
2025 {
2026     pPreviewWIN->Invalidate();
2027     return 0;
2028 }
2029 /*-----------------03.12.97 12:01-------------------
2030 
2031 --------------------------------------------------*/
2032 IMPL_LINK( SvxNumOptionsTabPage, AllLevelHdl_Impl, NumericField*, pBox )
2033 {
2034     for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2035     {
2036         sal_uInt16 nMask = 1;
2037         for(sal_uInt16 e = 0; e < pActNum->GetLevelCount(); e++)
2038         {
2039             if(nActNumLvl & nMask)
2040             {
2041                 SvxNumberFormat aNumFmt(pActNum->GetLevel(e));
2042                 aNumFmt.SetIncludeUpperLevels((sal_uInt8) std::min(pBox->GetValue(), sal_Int64(e + 1)) );
2043                 pActNum->SetLevel(e, aNumFmt);
2044             }
2045             nMask <<= 1;
2046         }
2047     }
2048     SetModified();
2049     return 0;
2050 }
2051 
2052 /*-----------------02.12.97 08:56-------------------
2053 
2054 --------------------------------------------------*/
2055 IMPL_LINK( SvxNumOptionsTabPage, NumberTypeSelectHdl_Impl, ListBox *, pBox )
2056 {
2057     String sSelectStyle;
2058     sal_Int16 eOldType;
2059     sal_Bool bShowOrient = sal_False;
2060     sal_Bool bBmp = sal_False;
2061     String aEmptyStr;
2062     sal_uInt16 nMask = 1;
2063     for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2064     {
2065         if(nActNumLvl & nMask)
2066         {
2067             SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
2068             eOldType = aNumFmt.GetNumberingType();
2069             // PAGEDESC gibt es nicht
2070             sal_uInt16 nNumType = (sal_uInt16)(sal_uLong)pBox->GetEntryData(pBox->GetSelectEntryPos());
2071             aNumFmt.SetNumberingType((sal_Int16)nNumType);
2072             sal_uInt16 nNumberingType = aNumFmt.GetNumberingType();
2073             if(SVX_NUM_BITMAP == (nNumberingType&(~LINK_TOKEN)))
2074             {
2075                 bBmp |= 0 != aNumFmt.GetBrush();
2076                 aNumFmt.SetIncludeUpperLevels( sal_False );
2077                 aNumFmt.SetSuffix( aEmptyStr );
2078                 aNumFmt.SetPrefix( aEmptyStr );
2079                 if(!bBmp)
2080                     aNumFmt.SetGraphic(aEmptyStr);
2081                 pActNum->SetLevel(i, aNumFmt);
2082                 SwitchNumberType(SHOW_BITMAP, bBmp );
2083                 bShowOrient = sal_True;
2084             }
2085             else if( SVX_NUM_CHAR_SPECIAL == nNumberingType )
2086             {
2087                 aNumFmt.SetIncludeUpperLevels( sal_False );
2088                 aNumFmt.SetSuffix( aEmptyStr );
2089                 aNumFmt.SetPrefix( aEmptyStr );
2090                 if( !aNumFmt.GetBulletFont() )
2091                     aNumFmt.SetBulletFont(&aActBulletFont);
2092                 if( !aNumFmt.GetBulletChar() )
2093                     aNumFmt.SetBulletChar( SVX_DEF_BULLET );
2094                 pActNum->SetLevel(i, aNumFmt);
2095                 SwitchNumberType(SHOW_BULLET);
2096                 //ChgTxtFont(aBulletFT, *aNumFmt.GetBulletFont());
2097                 //aBulletFT.SetText( aNumFmt.GetBulletChar() );
2098                 // Zuweisung der Zeichenvorlage automatisch
2099                 if(bAutomaticCharStyles)
2100                 {
2101                     sSelectStyle = sBulletCharFmtName;
2102                 }
2103             }
2104             else
2105             {
2106                 aNumFmt.SetPrefix( aPrefixED.GetText() );
2107                 aNumFmt.SetSuffix( aSuffixED.GetText() );
2108 //              aNumFmt.SetBulletFont(0);
2109                 SwitchNumberType(SHOW_NUMBERING);
2110                 pActNum->SetLevel(i, aNumFmt);
2111                 CheckForStartValue_Impl(nNumberingType);
2112 
2113                 // Zuweisung der Zeichenvorlage automatisch
2114                 if(bAutomaticCharStyles)
2115                 {
2116                     sSelectStyle = sNumCharFmtName;
2117                 }
2118             }
2119         }
2120         nMask <<= 1;
2121     }
2122     sal_Bool bAllLevelFeature = pActNum->IsFeatureSupported(NUM_CONTINUOUS);
2123     if(bShowOrient && bAllLevelFeature)
2124     {
2125         aOrientFT.Show();
2126         aOrientLB.Show();
2127     }
2128     else
2129     {
2130         aOrientFT.Hide();
2131         aOrientLB.Hide();
2132     }
2133     SetModified();
2134     if(sSelectStyle.Len())
2135     {
2136         aCharFmtLB.SelectEntry(sSelectStyle);
2137         CharFmtHdl_Impl(&aCharFmtLB);
2138         // bAutomaticCharStyles wird im CharFmtHdl_Impl zurueckgesetzt
2139         bAutomaticCharStyles = sal_True;
2140     }
2141     return 0;
2142 }
2143 /* -----------------06.11.2002 14:27-----------------
2144  *
2145  * --------------------------------------------------*/
2146 void SvxNumOptionsTabPage::CheckForStartValue_Impl(sal_uInt16 nNumberingType)
2147 {
2148     sal_Bool bIsNull = aStartED.GetValue() == 0;
2149     sal_Bool bNoZeroAllowed = nNumberingType < SVX_NUM_ARABIC ||
2150                         SVX_NUM_CHARS_UPPER_LETTER_N == nNumberingType ||
2151                         SVX_NUM_CHARS_LOWER_LETTER_N == nNumberingType;
2152     aStartED.SetMin(bNoZeroAllowed ? 1 : 0);
2153     if(bIsNull && bNoZeroAllowed)
2154         aStartED.GetModifyHdl().Call(&aStartED);
2155 }
2156 /*-----------------03.12.97 16:43-------------------
2157 
2158 --------------------------------------------------*/
2159 IMPL_LINK( SvxNumOptionsTabPage, OrientHdl_Impl, ListBox *, pBox )
2160 {
2161     sal_uInt16 nPos = pBox->GetSelectEntryPos();
2162     nPos ++; // kein VERT_NONE
2163 
2164     sal_uInt16 nMask = 1;
2165     for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2166     {
2167         if(nActNumLvl & nMask)
2168         {
2169             SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
2170             if(SVX_NUM_BITMAP == (aNumFmt.GetNumberingType()&(~LINK_TOKEN)))
2171             {
2172                 const SvxBrushItem* pBrushItem =  aNumFmt.GetBrush();
2173                 const Size& rSize = aNumFmt.GetGraphicSize();
2174                 sal_Int16 eOrient = (sal_Int16)nPos;
2175                 aNumFmt.SetGraphicBrush( pBrushItem, &rSize, &eOrient );
2176                 pActNum->SetLevel(i, aNumFmt);
2177             }
2178         }
2179         nMask <<= 1;
2180     }
2181     SetModified(sal_False);
2182     return 0;
2183 
2184 }
2185 
2186 /*-----------------06.12.97 12:00-------------------
2187 
2188 --------------------------------------------------*/
2189 IMPL_LINK( SvxNumOptionsTabPage, SameLevelHdl_Impl, CheckBox *, pBox )
2190 {
2191     sal_Bool bSet = pBox->IsChecked();
2192     pActNum->SetContinuousNumbering(bSet);
2193     sal_Bool bRepaint = sal_False;
2194     for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2195     {
2196         SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
2197         if(aNumFmt.GetNumberingType() != SVX_NUM_NUMBER_NONE)
2198         {
2199             bRepaint = sal_True;
2200             break;
2201         }
2202     }
2203     SetModified(bRepaint);
2204     InitControls();
2205     return 0;
2206 }
2207 /* -----------------16.11.98 14:20-------------------
2208  *
2209  * --------------------------------------------------*/
2210 IMPL_LINK( SvxNumOptionsTabPage, BulColorHdl_Impl, ColorListBox*, pBox )
2211 {
2212     Color nSetColor = pBox->GetSelectEntryColor();
2213 
2214     sal_uInt16 nMask = 1;
2215     for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2216     {
2217         if(nActNumLvl & nMask)
2218         {
2219             SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
2220             aNumFmt.SetBulletColor(nSetColor);
2221             pActNum->SetLevel(i, aNumFmt);
2222         }
2223         nMask <<= 1;
2224     }
2225     SetModified();
2226     return 0;
2227 }
2228 /* -----------------16.11.98 14:20-------------------
2229  *
2230  * --------------------------------------------------*/
2231 IMPL_LINK( SvxNumOptionsTabPage, BulRelSizeHdl_Impl, MetricField *, pField)
2232 {
2233     sal_uInt16 nRelSize = (sal_uInt16)pField->GetValue();
2234 
2235     sal_uInt16 nMask = 1;
2236     for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2237     {
2238         if(nActNumLvl & nMask)
2239         {
2240             SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
2241             aNumFmt.SetBulletRelSize(nRelSize);
2242             pActNum->SetLevel(i, aNumFmt);
2243         }
2244         nMask <<= 1;
2245     }
2246     SetModified();
2247     return 0;
2248 }
2249 
2250 /*-----------------02.12.97 10:50-------------------
2251 
2252 --------------------------------------------------*/
2253 IMPL_LINK( SvxNumOptionsTabPage, GraphicHdl_Impl, MenuButton *, pButton )
2254 {
2255     sal_uInt16                  nItemId = pButton->GetCurItemId();
2256     String                  aGrfName;
2257     Size                    aSize;
2258     sal_Bool                bSucc(sal_False);
2259     SvxOpenGraphicDialog    aGrfDlg( CUI_RES(RID_STR_EDIT_GRAPHIC) );
2260 
2261     if(MN_GALLERY_ENTRY <= nItemId )
2262     {
2263         aGrfName = *((String*)aGrfNames.GetObject( nItemId - MN_GALLERY_ENTRY));
2264         Graphic aGraphic;
2265         if(GalleryExplorer::GetGraphicObj( GALLERY_THEME_BULLETS, nItemId - MN_GALLERY_ENTRY, &aGraphic))
2266         {
2267             aSize = SvxNumberFormat::GetGraphicSizeMM100(&aGraphic);
2268             bSucc = sal_True;
2269         }
2270     }
2271     else
2272     {
2273         aGrfDlg.EnableLink( sal_False );
2274         aGrfDlg.AsLink( sal_False );
2275         if ( !aGrfDlg.Execute() )
2276         {
2277             // ausgewaehlten Filter merken
2278             aGrfName = aGrfDlg.GetPath();
2279 
2280             Graphic aGraphic;
2281             if( !aGrfDlg.GetGraphic(aGraphic) )
2282             {
2283                 aSize = SvxNumberFormat::GetGraphicSizeMM100(&aGraphic);
2284                 bSucc = sal_True;
2285             }
2286         }
2287     }
2288     if(bSucc)
2289     {
2290         aSize = OutputDevice::LogicToLogic(aSize, MAP_100TH_MM, (MapUnit)eCoreUnit);
2291 
2292         sal_uInt16 nMask = 1;
2293         for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2294         {
2295             if(nActNumLvl & nMask)
2296             {
2297                 SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
2298                 aNumFmt.SetCharFmtName(sNumCharFmtName);
2299                 aNumFmt.SetGraphic(aGrfName);
2300 
2301                 // Size schon mal fuer spaeteren Groessenabgleich setzen
2302                 const SvxBrushItem* pBrushItem = aNumFmt.GetBrush();
2303                 // initiate asynchronous loading
2304                 sal_Int16 eOrient = aNumFmt.GetVertOrient();
2305                 aNumFmt.SetGraphicBrush( pBrushItem, &aSize, &eOrient );
2306                 aInitSize[i] = aNumFmt.GetGraphicSize();
2307 
2308                 pActNum->SetLevel(i, aNumFmt);
2309             }
2310             nMask <<= 1;
2311         }
2312         aRatioCB .Enable();
2313         aSizeFT .Enable();
2314         aMultFT.Enable();
2315         aWidthMF .Enable();
2316         aHeightMF.Enable();
2317         SetMetricValue(aWidthMF, aSize.Width(), eCoreUnit);
2318         SetMetricValue(aHeightMF, aSize.Height(), eCoreUnit);
2319         aOrientFT.Enable();
2320         aOrientLB.Enable();
2321         SetModified();
2322         //needed due to asynchronous loading of graphics in the SvxBrushItem
2323         aInvalidateTimer.Start();
2324     }
2325     return 0;
2326 }
2327 /* -----------------27.07.99 12:20-------------------
2328 
2329  --------------------------------------------------*/
2330 IMPL_LINK( SvxNumOptionsTabPage, PopupActivateHdl_Impl, Menu *, EMPTYARG )
2331 {
2332     if(!bMenuButtonInitialized)
2333     {
2334         bMenuButtonInitialized = sal_True;
2335         EnterWait();
2336         PopupMenu* pPopup = aBitmapMB.GetPopupMenu()->GetPopupMenu( MN_GALLERY );
2337         GalleryExplorer::FillObjList(GALLERY_THEME_BULLETS, aGrfNames);
2338         if(aGrfNames.Count())
2339         {
2340             pPopup->RemoveItem( pPopup->GetItemPos( NUM_NO_GRAPHIC ));
2341             String aEmptyStr;
2342             GalleryExplorer::BeginLocking(GALLERY_THEME_BULLETS);
2343 
2344             for(sal_uInt16 i = 0; i < aGrfNames.Count(); i++)
2345             {
2346                 Graphic aGraphic;
2347                 String sGrfName = *(const String*)aGrfNames.GetObject(i);
2348                 INetURLObject aObj(sGrfName);
2349                 if(aObj.GetProtocol() == INET_PROT_FILE)
2350                     sGrfName = aObj.PathToFileName();
2351                 if(GalleryExplorer::GetGraphicObj( GALLERY_THEME_BULLETS, i, &aGraphic))
2352                 {
2353                     Bitmap aBitmap(aGraphic.GetBitmap());
2354                     Size aSize(aBitmap.GetSizePixel());
2355                     if(aSize.Width() > MAX_BMP_WIDTH ||
2356                         aSize.Height() > MAX_BMP_HEIGHT)
2357                     {
2358                         sal_Bool bWidth = aSize.Width() > aSize.Height();
2359                         double nScale = bWidth ?
2360                                             (double)MAX_BMP_WIDTH / (double)aSize.Width():
2361                                                 (double)MAX_BMP_HEIGHT / (double)aSize.Height();
2362                         aBitmap.Scale(nScale, nScale);
2363                     }
2364                     Image aImage(aBitmap);
2365 
2366                     pPopup->InsertItem(MN_GALLERY_ENTRY + i, sGrfName, aImage );
2367                 }
2368                 else
2369                 {
2370                     Image aImage;
2371                     pPopup->InsertItem(
2372                         MN_GALLERY_ENTRY + i, sGrfName, aImage );
2373                 }
2374             }
2375             GalleryExplorer::EndLocking(GALLERY_THEME_BULLETS);
2376         }
2377         LeaveWait();
2378     }
2379     return 0;
2380 }
2381 
2382 /*-----------------02.12.97 10:58-------------------
2383 
2384 --------------------------------------------------*/
2385 IMPL_LINK( SvxNumOptionsTabPage, BulletHdl_Impl, Button *, EMPTYARG )
2386 {
2387     SvxCharacterMap* pMap = new SvxCharacterMap( this, sal_True );
2388 
2389     sal_uInt16 nMask = 1;
2390     const Font* pFmtFont = 0;
2391     sal_Bool bSameBullet = sal_True;
2392     sal_Unicode cBullet = 0;
2393     sal_Bool bFirst = sal_True;
2394     for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2395     {
2396         if(nActNumLvl & nMask)
2397         {
2398             const SvxNumberFormat&  rCurFmt = pActNum->GetLevel(i);
2399             if(bFirst)
2400             {
2401                  cBullet = rCurFmt.GetBulletChar();
2402             }
2403             else if(rCurFmt.GetBulletChar() != cBullet )
2404             {
2405                 bSameBullet = sal_False;
2406                 break;
2407             }
2408             if(!pFmtFont)
2409                 pFmtFont = rCurFmt.GetBulletFont();
2410             bFirst = sal_False;
2411         }
2412         nMask <<= 1;
2413 
2414     }
2415 
2416     if(pFmtFont)
2417         pMap->SetCharFont(*pFmtFont);
2418     else
2419         pMap->SetCharFont(aActBulletFont);
2420     if(bSameBullet)
2421         pMap->SetChar( cBullet );
2422     if(pMap->Execute() == RET_OK)
2423     {
2424         // Font Numrules umstellen
2425         aActBulletFont = pMap->GetCharFont();
2426 
2427         sal_uInt16 _nMask = 1;
2428         for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2429         {
2430             if(nActNumLvl & _nMask)
2431             {
2432                 SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
2433                 aNumFmt.SetBulletFont(&aActBulletFont); ;
2434                 aNumFmt.SetBulletChar( (sal_Unicode) pMap->GetChar() );
2435                 pActNum->SetLevel(i, aNumFmt);
2436             }
2437             _nMask <<= 1;
2438         }
2439 
2440         SetModified();
2441     }
2442     delete pMap;
2443     return 0;
2444 }
2445 
2446 /*-----------------03.03.97 15:21-------------------
2447 
2448 --------------------------------------------------*/
2449 
2450 IMPL_LINK( SvxNumOptionsTabPage, SizeHdl_Impl, MetricField *, pField)
2451 {
2452     sal_Bool bWidth = pField == &aWidthMF;
2453     bLastWidthModified = bWidth;
2454     sal_Bool bRatio = aRatioCB.IsChecked();
2455     long nWidthVal = static_cast<long>(aWidthMF.Denormalize(aWidthMF.GetValue(FUNIT_100TH_MM)));
2456     long nHeightVal = static_cast<long>(aHeightMF.Denormalize(aHeightMF.GetValue(FUNIT_100TH_MM)));
2457     nWidthVal = OutputDevice::LogicToLogic( nWidthVal ,
2458                                                 MAP_100TH_MM, (MapUnit)eCoreUnit );
2459     nHeightVal = OutputDevice::LogicToLogic( nHeightVal,
2460                                                 MAP_100TH_MM, (MapUnit)eCoreUnit);
2461     double  fSizeRatio;
2462 
2463     sal_Bool bRepaint = sal_False;
2464     sal_uInt16 nMask = 1;
2465     for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2466     {
2467         if(nActNumLvl & nMask)
2468         {
2469             SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
2470             if(SVX_NUM_BITMAP == (aNumFmt.GetNumberingType()&(~LINK_TOKEN)))
2471             {
2472                 Size aSize(aNumFmt.GetGraphicSize() );
2473                 Size aSaveSize(aSize);
2474 
2475                 if (aInitSize[i].Height())
2476                     fSizeRatio = (double)aInitSize[i].Width() / (double)aInitSize[i].Height();
2477                 else
2478                     fSizeRatio = (double)1;
2479 
2480                 if(bWidth)
2481                 {
2482                     long nDelta = nWidthVal - aInitSize[i].Width();
2483                     aSize.Width() = nWidthVal;
2484                     if (bRatio)
2485                     {
2486                         aSize.Height() = aInitSize[i].Height() + (long)((double)nDelta / fSizeRatio);
2487                         aHeightMF.SetUserValue(aHeightMF.Normalize(
2488                             OutputDevice::LogicToLogic( aSize.Height(), (MapUnit)eCoreUnit, MAP_100TH_MM )),
2489                                 FUNIT_100TH_MM);
2490                     }
2491                 }
2492                 else
2493                 {
2494                     long nDelta = nHeightVal - aInitSize[i].Height();
2495                     aSize.Height() = nHeightVal;
2496                     if (bRatio)
2497                     {
2498                         aSize.Width() = aInitSize[i].Width() + (long)((double)nDelta * fSizeRatio);
2499                         aWidthMF.SetUserValue(aWidthMF.Normalize(
2500                             OutputDevice::LogicToLogic( aSize.Width(), (MapUnit)eCoreUnit, MAP_100TH_MM )),
2501                                 FUNIT_100TH_MM);
2502                     }
2503                 }
2504                 const SvxBrushItem* pBrushItem =  aNumFmt.GetBrush();
2505                 sal_Int16 eOrient = aNumFmt.GetVertOrient();
2506                 if(aSize != aSaveSize)
2507                     bRepaint = sal_True;
2508                 aNumFmt.SetGraphicBrush( pBrushItem, &aSize, &eOrient );
2509                 pActNum->SetLevel(i, aNumFmt);
2510             }
2511         }
2512         nMask <<= 1;
2513     }
2514     SetModified(bRepaint);
2515     return 0;
2516 }
2517 
2518 /*------------------------------------------------------------------------
2519  Beschreibung:
2520 ------------------------------------------------------------------------*/
2521 
2522 IMPL_LINK( SvxNumOptionsTabPage, RatioHdl_Impl, CheckBox *, pBox )
2523 {
2524     if (pBox->IsChecked())
2525     {
2526         if (bLastWidthModified)
2527             SizeHdl_Impl(&aWidthMF);
2528         else
2529             SizeHdl_Impl(&aHeightMF);
2530     }
2531     return 0;
2532 }
2533 
2534 /*-----------------02.12.97 16:07-------------------
2535 
2536 --------------------------------------------------*/
2537 IMPL_LINK( SvxNumOptionsTabPage, CharFmtHdl_Impl, ListBox *, EMPTYARG )
2538 {
2539     bAutomaticCharStyles = sal_False;
2540     sal_uInt16 nEntryPos = aCharFmtLB.GetSelectEntryPos();
2541     String sEntry = aCharFmtLB.GetSelectEntry();
2542     sal_uInt16 nMask = 1;
2543     String aEmptyStr;
2544     for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2545     {
2546         if(nActNumLvl & nMask)
2547         {
2548             SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
2549             if( 0 == nEntryPos )
2550                 aNumFmt.SetCharFmtName(aEmptyStr);
2551             else
2552             {
2553                 if(SVX_NUM_BITMAP != (aNumFmt.GetNumberingType()&(~LINK_TOKEN)))
2554                     aNumFmt.SetCharFmtName(sEntry);
2555             }
2556             pActNum->SetLevel(i, aNumFmt);
2557         }
2558         nMask <<= 1;
2559     }
2560     SetModified(sal_False);
2561     return 0;
2562 
2563 };
2564 
2565 /*-----------------03.12.97 11:01-------------------
2566 
2567 --------------------------------------------------*/
2568 IMPL_LINK( SvxNumOptionsTabPage, EditModifyHdl_Impl, Edit *, pEdit )
2569 {
2570     sal_Bool bPrefix = pEdit == &aPrefixED;
2571     sal_Bool bSuffix = pEdit == &aSuffixED;
2572     sal_Bool bStart = pEdit == &aStartED;
2573     sal_uInt16 nMask = 1;
2574     for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2575     {
2576         if(nActNumLvl & nMask)
2577         {
2578             SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
2579             if(bPrefix)
2580                 aNumFmt.SetPrefix( aPrefixED.GetText() );
2581             else if(bSuffix)
2582                 aNumFmt.SetSuffix( aSuffixED.GetText() );
2583             else if(bStart)
2584                 aNumFmt.SetStart( (sal_uInt16)aStartED.GetValue() );
2585             else //align
2586             {
2587                 sal_uInt16 nPos = aAlignLB.GetSelectEntryPos();
2588                 SvxAdjust eAdjust = SVX_ADJUST_CENTER;
2589                 if(nPos == 0)
2590                     eAdjust = SVX_ADJUST_LEFT;
2591                 else if(nPos == 2)
2592                     eAdjust = SVX_ADJUST_RIGHT;
2593                 aNumFmt.SetNumAdjust( eAdjust );
2594             }
2595             pActNum->SetLevel(i, aNumFmt);
2596         }
2597         nMask <<= 1;
2598     }
2599     SetModified();
2600 
2601     return 0;
2602 }
2603 
2604 /*-----------------09.12.97 11:49-------------------
2605 
2606 --------------------------------------------------*/
2607 sal_uInt16 lcl_DrawGraphic(VirtualDevice* pVDev, const SvxNumberFormat &rFmt, sal_uInt16 nXStart,
2608                         sal_uInt16 nYStart, sal_uInt16 nDivision)
2609 {
2610     const SvxBrushItem* pBrushItem = rFmt.GetBrush();
2611     sal_uInt16 nRet = 0;
2612     if(pBrushItem)
2613     {
2614         const Graphic* pGrf = pBrushItem->GetGraphic();
2615         if(pGrf)
2616         {
2617             Size aGSize( rFmt.GetGraphicSize() );
2618             aGSize.Width() /= nDivision;
2619             nRet = (sal_uInt16)aGSize.Width();
2620             aGSize.Height() /= nDivision;
2621             pGrf->Draw( pVDev, Point(nXStart,nYStart),
2622                     pVDev->PixelToLogic( aGSize ) );
2623         }
2624     }
2625     return nRet;
2626 
2627 }
2628 
2629 /*-----------------09.12.97 11:54-------------------
2630 
2631 --------------------------------------------------*/
2632 sal_uInt16 lcl_DrawBullet(VirtualDevice* pVDev,
2633             const SvxNumberFormat& rFmt, sal_uInt16 nXStart,
2634             sal_uInt16 nYStart, const Size& rSize)
2635 {
2636     Font aTmpFont(pVDev->GetFont());
2637 
2638     //per Uno kann es sein, dass kein Font gesetzt ist!
2639     Font aFont(rFmt.GetBulletFont() ? *rFmt.GetBulletFont() : aTmpFont);
2640     Size aTmpSize(rSize);
2641     aTmpSize.Width() *= rFmt.GetBulletRelSize();
2642     aTmpSize.Width() /= 100 ;
2643     aTmpSize.Height() *= rFmt.GetBulletRelSize();
2644     aTmpSize.Height() /= 100 ;
2645     // bei einer Hoehe von Null wird in Ursprungshoehe gezeichnet
2646     if(!aTmpSize.Height())
2647         aTmpSize.Height() = 1;
2648     aFont.SetSize(aTmpSize);
2649     aFont.SetTransparent(sal_True);
2650     Color aBulletColor = rFmt.GetBulletColor();
2651     if(aBulletColor.GetColor() == COL_AUTO)
2652         aBulletColor = Color(pVDev->GetFillColor().IsDark() ? COL_WHITE : COL_BLACK);
2653     else if(aBulletColor == pVDev->GetFillColor())
2654         aBulletColor.Invert();
2655     aFont.SetColor(aBulletColor);
2656     pVDev->SetFont( aFont );
2657     String aText(sal_Unicode(rFmt.GetBulletChar()));
2658     long nY = nYStart;
2659     nY -= ((aTmpSize.Height() - rSize.Height())/ 2);
2660     pVDev->DrawText( Point(nXStart, nY), aText );
2661     sal_uInt16 nRet = (sal_uInt16)pVDev->GetTextWidth(aText);
2662 
2663     pVDev->SetFont(aTmpFont);
2664     return nRet;
2665 }
2666 /*-----------------02.12.97 10:34-------------------
2667     Vorschau der Numerierung painten
2668 --------------------------------------------------*/
2669 void    SvxNumberingPreview::Paint( const Rectangle& /*rRect*/ )
2670 {
2671     Size aSize(PixelToLogic(GetOutputSizePixel()));
2672     Rectangle aRect(Point(0,0), aSize);
2673 
2674     const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
2675     const Color aBackColor = rStyleSettings.GetFieldColor();
2676     const Color aTextColor = rStyleSettings.GetFieldTextColor();
2677 
2678     VirtualDevice* pVDev = new VirtualDevice(*this);
2679     pVDev->EnableRTL( IsRTLEnabled() );
2680     pVDev->SetMapMode(GetMapMode());
2681     pVDev->SetOutputSize( aSize );
2682 
2683     Color aLineColor(COL_LIGHTGRAY);
2684     if(aLineColor == aBackColor)
2685         aLineColor.Invert();
2686     pVDev->SetLineColor(aLineColor);
2687     pVDev->SetFillColor( aBackColor );
2688     pVDev->DrawRect(aRect);
2689 
2690     if(pActNum)
2691     {
2692         sal_uInt16 nWidthRelation;
2693         if(nPageWidth)
2694         {
2695             nWidthRelation = sal_uInt16 (nPageWidth / aSize.Width());
2696             if(bPosition)
2697                 nWidthRelation = nWidthRelation * 2 / 3;
2698             else
2699                 nWidthRelation = nWidthRelation / 4;
2700         }
2701         else
2702             nWidthRelation = 30; // Kapiteldialog
2703 
2704         //Hoehe pro Ebene
2705         sal_uInt16 nXStep = sal::static_int_cast< sal_uInt16 >(aSize.Width() / (3 * pActNum->GetLevelCount()));
2706         if(pActNum->GetLevelCount() < 10)
2707             nXStep /= 2;
2708         sal_uInt16 nYStart = 4;
2709         // fuer ein einziges Level darf nicht die gesamte Hoehe benutzt werden
2710         sal_uInt16 nYStep = sal::static_int_cast< sal_uInt16 >((aSize.Height() - 6)/ (pActNum->GetLevelCount() > 1 ? pActNum->GetLevelCount() : 5));
2711         aStdFont = OutputDevice::GetDefaultFont(
2712                 DEFAULTFONT_UI_SANS, MsLangId::getSystemLanguage(), DEFAULTFONT_FLAGS_ONLYONE);
2713         aStdFont.SetColor(aTextColor);
2714         aStdFont.SetFillColor(aBackColor);
2715 
2716         //
2717         sal_uInt16 nFontHeight = nYStep * 6 / 10;
2718         if(bPosition)
2719             nFontHeight = nYStep * 15 / 10;
2720         aStdFont.SetSize(Size( 0, nFontHeight ));
2721 
2722         SvxNodeNum aNum( (sal_uInt8)0 );
2723         sal_uInt16 nPreNum = pActNum->GetLevel(0).GetStart();
2724 
2725         if(bPosition)
2726         {
2727             sal_uInt16 nLineHeight = nFontHeight * 8 / 7;
2728             sal_uInt8 nStart = 0;
2729             while( !(nActLevel & (1<<nStart)) )
2730             {
2731                 nStart++;
2732             }
2733             if(nStart)
2734                 nStart--;
2735             sal_uInt8 nEnd = std::min( (sal_uInt8)(nStart + 3), (sal_uInt8)pActNum->GetLevelCount() );
2736             for( sal_uInt8 nLevel = nStart; nLevel < nEnd; ++nLevel )
2737             {
2738                 const SvxNumberFormat &rFmt = pActNum->GetLevel(nLevel);
2739                 aNum.GetLevelVal()[ nLevel ] = rFmt.GetStart();
2740 
2741                 // --> OD 2008-01-16 #newlistlevelattrs#
2742                 sal_uInt16 nXStart( 0 );
2743                 short nTextOffset( 0 );
2744                 sal_uInt16 nNumberXPos( 0 );
2745                 if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2746                 {
2747                     nXStart = rFmt.GetAbsLSpace() / nWidthRelation;
2748                     nTextOffset = rFmt.GetCharTextDistance() / nWidthRelation;
2749                     nNumberXPos = nXStart;
2750                     sal_uInt16 nFirstLineOffset = (-rFmt.GetFirstLineOffset()) / nWidthRelation;
2751 
2752                     if(nFirstLineOffset <= nNumberXPos)
2753                         nNumberXPos = nNumberXPos - nFirstLineOffset;
2754                     else
2755                         nNumberXPos = 0;
2756                     //im draw ist das zulaeesig
2757                     if(nTextOffset < 0)
2758                         nNumberXPos = nNumberXPos + nTextOffset;
2759                 }
2760                 else if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
2761                 {
2762                     const long nTmpNumberXPos( ( rFmt.GetIndentAt() +
2763                                                  rFmt.GetFirstLineIndent() ) /
2764                                                nWidthRelation );
2765                     if ( nTmpNumberXPos < 0 )
2766                     {
2767                         nNumberXPos = 0;
2768                     }
2769                     else
2770                     {
2771                         nNumberXPos = static_cast<sal_uInt16>( nTmpNumberXPos );
2772                     }
2773                 }
2774                 // <--
2775 
2776                 sal_uInt16 nBulletWidth = 0;
2777                 if( SVX_NUM_BITMAP == (rFmt.GetNumberingType() &(~LINK_TOKEN)))
2778                 {
2779                     nBulletWidth = rFmt.IsShowSymbol() ? lcl_DrawGraphic(pVDev, rFmt,
2780                                         nNumberXPos,
2781                                             nYStart, nWidthRelation) : 0;
2782                 }
2783                 else if( SVX_NUM_CHAR_SPECIAL == rFmt.GetNumberingType() )
2784                 {
2785                     nBulletWidth =  rFmt.IsShowSymbol() ?
2786                      lcl_DrawBullet(pVDev, rFmt, nNumberXPos, nYStart, aStdFont.GetSize()) : 0;
2787                 }
2788                 else
2789                 {
2790                     pVDev->SetFont(aStdFont);
2791                     aNum.SetLevel( nLevel );
2792                     if(pActNum->IsContinuousNumbering())
2793                         aNum.GetLevelVal()[nLevel] = nPreNum;
2794                     String aText(pActNum->MakeNumString( aNum ));
2795                     Font aSaveFont = pVDev->GetFont();
2796                     Font aColorFont(aSaveFont);
2797                     Color aTmpBulletColor = rFmt.GetBulletColor();
2798                     if(aTmpBulletColor.GetColor() == COL_AUTO)
2799                         aTmpBulletColor = Color(aBackColor.IsDark() ? COL_WHITE : COL_BLACK);
2800                     else if(aTmpBulletColor == aBackColor)
2801                         aTmpBulletColor.Invert();
2802                     aColorFont.SetColor(aTmpBulletColor);
2803                     pVDev->SetFont(aColorFont);
2804                     pVDev->DrawText( Point(nNumberXPos, nYStart), aText );
2805                     pVDev->SetFont(aSaveFont);
2806                     nBulletWidth = (sal_uInt16)pVDev->GetTextWidth(aText);
2807                     nPreNum++;
2808                 }
2809                 // --> OD 2008-01-16 #newlistlevelattrs#
2810                 if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT &&
2811                      rFmt.GetLabelFollowedBy() == SvxNumberFormat::SPACE )
2812                 {
2813                     pVDev->SetFont(aStdFont);
2814                     String aText(' ');
2815                     pVDev->DrawText( Point(nNumberXPos, nYStart), aText );
2816                     nBulletWidth = nBulletWidth + (sal_uInt16)pVDev->GetTextWidth(aText);
2817                 }
2818 
2819                 // --> OD 2008-01-16 #newlistlevelattrs#
2820                 sal_uInt16 nTextXPos( 0 );
2821                 if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2822                 {
2823                     nTextXPos = nXStart;
2824                     if(nTextOffset < 0)
2825                          nTextXPos = nTextXPos + nTextOffset;
2826                     if(nNumberXPos + nBulletWidth + nTextOffset > nTextXPos )
2827                         nTextXPos = nNumberXPos + nBulletWidth + nTextOffset;
2828                 }
2829                 else if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
2830                 {
2831                     switch ( rFmt.GetLabelFollowedBy() )
2832                     {
2833                         case SvxNumberFormat::LISTTAB:
2834                         {
2835                             nTextXPos = static_cast<sal_uInt16>(
2836                                             rFmt.GetListtabPos() / nWidthRelation );
2837                             if ( nTextXPos < nNumberXPos + nBulletWidth )
2838                             {
2839                                 nTextXPos = nNumberXPos + nBulletWidth;
2840                             }
2841                         }
2842                         break;
2843                         case SvxNumberFormat::SPACE:
2844                         case SvxNumberFormat::NOTHING:
2845                         {
2846                             nTextXPos = nNumberXPos + nBulletWidth;
2847                         }
2848                         break;
2849                     }
2850 
2851                     nXStart = static_cast<sal_uInt16>( rFmt.GetIndentAt() / nWidthRelation );
2852                 }
2853                 // <--
2854 
2855                 Rectangle aRect1(Point(nTextXPos, nYStart + nFontHeight / 2), Size(aSize.Width() / 2, 2));
2856                 pVDev->SetFillColor( aBackColor );
2857                 pVDev->DrawRect( aRect1 );
2858 
2859                 Rectangle aRect2(Point(nXStart, nYStart + nLineHeight + nFontHeight / 2 ), Size(aSize.Width() / 2, 2));
2860                 pVDev->DrawRect( aRect2 );
2861                 nYStart += 2 * nLineHeight;
2862             }
2863         }
2864         else
2865         {
2866             //#i5153# painting gray or black rectangles as 'normal' numbering text
2867             String sMsg( RTL_CONSTASCII_USTRINGPARAM( "Preview") );
2868             long nWidth = pVDev->GetTextWidth(sMsg);
2869             long nTextHeight = pVDev->GetTextHeight();
2870             long nRectHeight = nTextHeight * 2 / 3;
2871             long nTopOffset = nTextHeight - nRectHeight;
2872             Color aBlackColor(COL_BLACK);
2873             if(aBlackColor == aBackColor)
2874                 aBlackColor.Invert();
2875 
2876             for( sal_uInt8 nLevel = 0; nLevel < pActNum->GetLevelCount();
2877                             ++nLevel, nYStart = nYStart + nYStep )
2878             {
2879                 const SvxNumberFormat &rFmt = pActNum->GetLevel(nLevel);
2880                 aNum.GetLevelVal()[ nLevel ] = rFmt.GetStart();
2881                 // --> OD 2008-01-31 #newlistlevelattrs#
2882                 sal_uInt16 nXStart( 0 );
2883                 if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2884                 {
2885                     nXStart = rFmt.GetAbsLSpace() / nWidthRelation;
2886                 }
2887                 else if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
2888                 {
2889                     const long nTmpXStart( ( rFmt.GetIndentAt() +
2890                                              rFmt.GetFirstLineIndent() ) /
2891                                            nWidthRelation );
2892                     if ( nTmpXStart < 0 )
2893                     {
2894                         nXStart = 0;
2895                     }
2896                     else
2897                     {
2898                         nXStart = static_cast<sal_uInt16>(nTmpXStart);
2899                     }
2900                 }
2901                 nXStart /= 2;
2902                 nXStart += 2;
2903                 // <--
2904                 sal_uInt16 nTextOffset = 2 * nXStep;
2905                 if( SVX_NUM_BITMAP == (rFmt.GetNumberingType()&(~LINK_TOKEN)) )
2906                 {
2907                     if(rFmt.IsShowSymbol())
2908                     {
2909                         nTextOffset = lcl_DrawGraphic(pVDev, rFmt, nXStart, nYStart, nWidthRelation);
2910                         nTextOffset = nTextOffset + nXStep;
2911                     }
2912                 }
2913                 else if( SVX_NUM_CHAR_SPECIAL == rFmt.GetNumberingType() )
2914                 {
2915                     if(rFmt.IsShowSymbol())
2916                     {
2917                         nTextOffset =  lcl_DrawBullet(pVDev, rFmt, nXStart, nYStart, aStdFont.GetSize());
2918                         nTextOffset = nTextOffset + nXStep;
2919                     }
2920                 }
2921                 else
2922                 {
2923                     Font aColorFont(aStdFont);
2924                     Color aTmpBulletColor = rFmt.GetBulletColor();
2925                     if(aTmpBulletColor.GetColor() == COL_AUTO)
2926                         aTmpBulletColor = Color(aBackColor.IsDark() ? COL_WHITE : COL_BLACK);
2927                     else if(aTmpBulletColor == aBackColor)
2928                         aTmpBulletColor.Invert();
2929                     aColorFont.SetColor(aTmpBulletColor);
2930                     pVDev->SetFont(aColorFont);
2931                     aNum.SetLevel( nLevel );
2932                     if(pActNum->IsContinuousNumbering())
2933                         aNum.GetLevelVal()[nLevel] = nPreNum;
2934                     String aText(pActNum->MakeNumString( aNum ));
2935                     pVDev->DrawText( Point(nXStart, nYStart), aText );
2936                     pVDev->SetFont(aStdFont);
2937                     nTextOffset = (sal_uInt16)pVDev->GetTextWidth(aText);
2938                     nTextOffset = nTextOffset + nXStep;
2939                     nPreNum++;
2940                 }
2941                 if(pOutlineNames)
2942                 {
2943                     //#i5153# outline numberings still use the style names as text
2944                     pVDev->SetFont(aStdFont);
2945                     sMsg = pOutlineNames[nLevel];
2946                     pVDev->DrawText( Point(nXStart + nTextOffset, nYStart), sMsg );
2947                 }
2948                 else
2949                 {
2950                     //#i5153# the selected rectangle(s) should be black
2951                     if( 0 != (nActLevel & (1<<nLevel)))
2952                     {
2953                         pVDev->SetFillColor( aBlackColor );
2954                         pVDev->SetLineColor( aBlackColor );
2955                     }
2956                     else
2957                     {
2958                         //#i5153# unselected levels are gray
2959                         pVDev->SetFillColor( aLineColor );
2960                         pVDev->SetLineColor( aLineColor );
2961                     }
2962                     Rectangle aRect1(Point(nXStart + nTextOffset, nYStart + nTopOffset), Size(nWidth, nRectHeight));
2963                     pVDev->DrawRect(aRect1);
2964                 }
2965             }
2966         }
2967     }
2968     DrawOutDev( Point(0,0), aSize,
2969                 Point(0,0), aSize,
2970                         *pVDev );
2971     delete pVDev;
2972 
2973 }
2974 
2975 /*-----------------03.12.97 10:02-------------------
2976 
2977 --------------------------------------------------*/
2978 SvxNumPositionTabPage::SvxNumPositionTabPage(Window* pParent,
2979                                const SfxItemSet& rSet) :
2980     SfxTabPage( pParent, CUI_RES( RID_SVXPAGE_NUM_POSITION ), rSet ),
2981     aPositionFL(    this, CUI_RES(FL_POSITION )),
2982     aLevelFT(       this, CUI_RES(FT_LEVEL    )),
2983     aLevelLB(       this, CUI_RES(LB_LEVEL  )),
2984     aDistBorderFT(  this, CUI_RES(FT_BORDERDIST )),
2985     aDistBorderMF(  this, CUI_RES(MF_BORDERDIST )),
2986     aRelativeCB(    this, CUI_RES(CB_RELATIVE       )),
2987     aIndentFT(      this, CUI_RES(FT_INDENT     )),
2988     aIndentMF(      this, CUI_RES(MF_INDENT     )),
2989     aDistNumFT(     this, CUI_RES(FT_NUMDIST        )),
2990     aDistNumMF(     this, CUI_RES(MF_NUMDIST        )),
2991     aAlignFT(       this, CUI_RES(FT_ALIGN  )),
2992     aAlignLB(       this, CUI_RES(LB_ALIGN  )),
2993     // --> OD 2008-01-10 #newlistlevelattrs#
2994     aLabelFollowedByFT( this, CUI_RES(FT_LABEL_FOLLOWED_BY) ),
2995     aLabelFollowedByLB( this, CUI_RES(LB_LABEL_FOLLOWED_BY) ),
2996     aListtabFT( this, CUI_RES(FT_LISTTAB) ),
2997     aListtabMF( this, CUI_RES(MF_LISTTAB) ),
2998     aAlign2FT( this, CUI_RES(FT_ALIGN_2) ),
2999     aAlign2LB( this, CUI_RES(LB_ALIGN_2) ),
3000     aAlignedAtFT( this, CUI_RES(FT_ALIGNED_AT) ),
3001     aAlignedAtMF( this, CUI_RES(MF_ALIGNED_AT) ),
3002     aIndentAtFT( this, CUI_RES(FT_INDENT_AT) ),
3003     aIndentAtMF( this, CUI_RES(MF_INDENT_AT) ),
3004     // <--
3005     aStandardPB(    this, CUI_RES(PB_STANDARD       )),
3006     pPreviewWIN(    new SvxNumberingPreview(this, CUI_RES(WIN_PREVIEW   ))),
3007     pActNum(0),
3008     pSaveNum(0),
3009     nActNumLvl( USHRT_MAX ),
3010     nNumItemId(SID_ATTR_NUMBERING_RULE),
3011         bModified(false),
3012         bPreset(false),
3013     bInInintControl(sal_False),
3014     // --> OD 2008-01-11 #newlistlevelattrs#
3015     bLabelAlignmentPosAndSpaceModeActive( false )
3016     // <--
3017 {
3018     FreeResource();
3019     SetExchangeSupport();
3020     pPreviewWIN->SetBackground(Wallpaper(Color(COL_TRANSPARENT)));
3021 
3022     aRelativeCB.Check();
3023     aAlignLB.SetSelectHdl(LINK(this, SvxNumPositionTabPage, EditModifyHdl_Impl));
3024     // --> OD 2008-01-10 #newlistlevelattrs#
3025     aAlign2LB.SetSelectHdl(LINK(this, SvxNumPositionTabPage, EditModifyHdl_Impl));
3026     for ( sal_uInt16 i = 0; i < aAlignLB.GetEntryCount(); ++i )
3027     {
3028         aAlign2LB.InsertEntry( aAlignLB.GetEntry( i ) );
3029     }
3030     aAlign2LB.SetDropDownLineCount( aAlign2LB.GetEntryCount() );
3031     aAlign2FT.SetText( aAlignFT.GetText() );
3032     // <--
3033 
3034     Link aLk = LINK(this, SvxNumPositionTabPage, DistanceHdl_Impl);
3035 
3036     aDistBorderMF.SetUpHdl(aLk);
3037     aDistBorderMF.SetDownHdl(aLk);
3038     aDistBorderMF.SetLoseFocusHdl(aLk);
3039 
3040     aDistNumMF.SetUpHdl(aLk);
3041     aDistNumMF.SetDownHdl(aLk);
3042     aDistNumMF.SetLoseFocusHdl(aLk);
3043 
3044     aIndentMF.SetUpHdl(aLk);
3045     aIndentMF.SetDownHdl(aLk);
3046     aIndentMF.SetLoseFocusHdl(aLk);
3047 
3048     // --> OD 2008-01-10 #newlistlevelattrs#
3049     aLabelFollowedByLB.SetDropDownLineCount( aLabelFollowedByLB.GetEntryCount() );
3050     aLabelFollowedByLB.SetSelectHdl( LINK(this, SvxNumPositionTabPage, LabelFollowedByHdl_Impl) );
3051 
3052     aLk = LINK(this, SvxNumPositionTabPage, ListtabPosHdl_Impl);
3053     aListtabMF.SetUpHdl(aLk);
3054     aListtabMF.SetDownHdl(aLk);
3055     aListtabMF.SetLoseFocusHdl(aLk);
3056 
3057     aLk = LINK(this, SvxNumPositionTabPage, AlignAtHdl_Impl);
3058     aAlignedAtMF.SetUpHdl(aLk);
3059     aAlignedAtMF.SetDownHdl(aLk);
3060     aAlignedAtMF.SetLoseFocusHdl(aLk);
3061 
3062     aLk = LINK(this, SvxNumPositionTabPage, IndentAtHdl_Impl);
3063     aIndentAtMF.SetUpHdl(aLk);
3064     aIndentAtMF.SetDownHdl(aLk);
3065     aIndentAtMF.SetLoseFocusHdl(aLk);
3066     // <--
3067 
3068     aLevelLB.SetSelectHdl(LINK(this, SvxNumPositionTabPage, LevelHdl_Impl));
3069     aRelativeCB.SetClickHdl(LINK(this, SvxNumPositionTabPage, RelativeHdl_Impl));
3070     aStandardPB.SetClickHdl(LINK(this, SvxNumPositionTabPage, StandardHdl_Impl));
3071 
3072 
3073     aRelativeCB.Check(bLastRelative);
3074     pPreviewWIN->SetPositionMode();
3075     eCoreUnit = rSet.GetPool()->GetMetric(rSet.GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE));
3076 
3077     //HACK("der Wert sollte mal sinnvol gesetzt werden")
3078     long nWidth = 10000;
3079     nWidth = OutputDevice::LogicToLogic( nWidth,
3080                                             (MapUnit)eCoreUnit, MAP_100TH_MM );
3081 
3082     aDistBorderMF.SetMax(aDistBorderMF.Normalize( nWidth ), FUNIT_100TH_MM );
3083     aDistNumMF   .SetMax(aDistNumMF   .Normalize( nWidth ), FUNIT_100TH_MM );
3084     aIndentMF    .SetMax(aIndentMF    .Normalize( nWidth ), FUNIT_100TH_MM );
3085     // --> OD 2008-02-18 #newlistlevelattrs#
3086     aListtabMF.SetMax(aListtabMF.Normalize( nWidth ), FUNIT_100TH_MM );
3087     aAlignedAtMF.SetMax(aAlignedAtMF.Normalize( nWidth ), FUNIT_100TH_MM );
3088     aIndentAtMF.SetMax(aIndentAtMF.Normalize( nWidth ), FUNIT_100TH_MM );
3089     // <--
3090     long nLast2 = nWidth /2;
3091     aDistBorderMF.SetLast( aDistBorderMF.Normalize(   nLast2 ), FUNIT_100TH_MM );
3092     aDistNumMF   .SetLast( aDistNumMF     .Normalize( nLast2 ), FUNIT_100TH_MM );
3093     aIndentMF    .SetLast( aIndentMF      .Normalize( nLast2 ), FUNIT_100TH_MM );
3094     // --> OD 2008-02-18 #newlistlevelattrs#
3095     aListtabMF.SetLast(aListtabMF.Normalize( nLast2 ), FUNIT_100TH_MM );
3096     aAlignedAtMF.SetLast(aAlignedAtMF.Normalize( nLast2 ), FUNIT_100TH_MM );
3097     aIndentAtMF.SetLast(aIndentAtMF.Normalize( nLast2 ), FUNIT_100TH_MM );
3098     // <--
3099 
3100 #if OSL_DEBUG_LEVEL > 1
3101     pDebugFixedText = new FixedText(this, 0);
3102     pDebugFixedText->Show();
3103     Size aSize(200, 20);
3104     Point aPos(250,0);
3105 
3106     pDebugFixedText->SetPosSizePixel(aPos, aSize);
3107     pDebugFixedText->SetText( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "Das ist ein Debug-Text" ) ) );
3108 #endif
3109 
3110     aStandardPB.SetAccessibleRelationMemberOf(&aPositionFL);
3111 }
3112 /*-----------------03.12.97 10:02-------------------
3113 
3114 --------------------------------------------------*/
3115 SvxNumPositionTabPage::~SvxNumPositionTabPage()
3116 {
3117     delete pActNum;
3118     delete pPreviewWIN;
3119     delete pSaveNum;
3120 #if OSL_DEBUG_LEVEL > 1
3121     delete pDebugFixedText;
3122 #endif
3123 }
3124 /*-------------------------------------------------------*/
3125 
3126 #if OSL_DEBUG_LEVEL > 1
3127 void lcl_PrintDebugOutput(FixedText& rFixed, const SvxNumberFormat& rNumFmt)
3128 {
3129 #define TWIP_TO_MM100(TWIP)     ((TWIP) >= 0 ? (((TWIP)*127L+36L)/72L) : (((TWIP)*127L-36L)/72L))
3130 
3131     sal_Char const sHash[] = " # ";
3132     if ( rNumFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
3133     {
3134         String sDebugText( UniString::CreateFromInt32( TWIP_TO_MM100(rNumFmt.GetAbsLSpace() ) ) );
3135         sDebugText.AppendAscii( RTL_CONSTASCII_STRINGPARAM( sHash ) );
3136         sDebugText += UniString::CreateFromInt32( TWIP_TO_MM100(rNumFmt.GetCharTextDistance() ) );
3137         sDebugText.AppendAscii( RTL_CONSTASCII_STRINGPARAM( sHash ) );
3138         sDebugText += UniString::CreateFromInt32( TWIP_TO_MM100(rNumFmt.GetFirstLineOffset() ) );
3139         rFixed.SetText(sDebugText);
3140     }
3141     else if ( rNumFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
3142     {
3143         String sDebugText( UniString::CreateFromInt32( TWIP_TO_MM100(rNumFmt.GetListtabPos() ) ) );
3144         sDebugText.AppendAscii( RTL_CONSTASCII_STRINGPARAM( sHash ) );
3145         sDebugText += UniString::CreateFromInt32( TWIP_TO_MM100(rNumFmt.GetFirstLineIndent() ) );
3146         sDebugText.AppendAscii( RTL_CONSTASCII_STRINGPARAM( sHash ) );
3147         sDebugText += UniString::CreateFromInt32( TWIP_TO_MM100(rNumFmt.GetIndentAt() ) );
3148         rFixed.SetText(sDebugText);
3149     }
3150 
3151 }
3152 #endif
3153 
3154 /*-----------------03.12.97 10:06-------------------
3155 
3156 --------------------------------------------------*/
3157 void SvxNumPositionTabPage::InitControls()
3158 {
3159     bInInintControl = sal_True;
3160     // --> OD 2008-01-11 #newlistlevelattrs#
3161     const bool bRelative = !bLabelAlignmentPosAndSpaceModeActive &&
3162                      aRelativeCB.IsEnabled() && aRelativeCB.IsChecked();
3163     // <--
3164     const bool bSingleSelection = aLevelLB.GetSelectEntryCount() == 1 &&
3165                             USHRT_MAX != nActNumLvl;
3166 
3167     aDistBorderMF.Enable( !bLabelAlignmentPosAndSpaceModeActive &&
3168                           ( bSingleSelection || bRelative ) );
3169     aDistBorderFT.Enable( !bLabelAlignmentPosAndSpaceModeActive &&
3170                           ( bSingleSelection || bRelative ) );
3171 
3172     bool bSetDistEmpty = false;
3173     bool bSameDistBorderNum = !bLabelAlignmentPosAndSpaceModeActive;
3174     bool bSameDist      = !bLabelAlignmentPosAndSpaceModeActive;
3175     bool bSameIndent    = !bLabelAlignmentPosAndSpaceModeActive;
3176     bool bSameAdjust    = true;
3177 
3178     // --> OD 2008-01-11 #newlistlevelattrs#
3179     bool bSameLabelFollowedBy = bLabelAlignmentPosAndSpaceModeActive;
3180     bool bSameListtab = bLabelAlignmentPosAndSpaceModeActive;
3181     bool bSameAlignAt = bLabelAlignmentPosAndSpaceModeActive;
3182     bool bSameIndentAt = bLabelAlignmentPosAndSpaceModeActive;
3183     // <--
3184 
3185     const SvxNumberFormat* aNumFmtArr[SVX_MAX_NUM];
3186     sal_uInt16 nMask = 1;
3187     sal_uInt16 nLvl = USHRT_MAX;
3188     long nFirstBorderText = 0;
3189     long nFirstBorderTextRelative = -1;
3190     for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
3191     {
3192         aNumFmtArr[i] = &pActNum->GetLevel(i);
3193         if(nActNumLvl & nMask)
3194         {
3195             if(USHRT_MAX == nLvl)
3196             {
3197                 nLvl = i;
3198                 if ( !bLabelAlignmentPosAndSpaceModeActive )
3199                 {
3200                     nFirstBorderText = nLvl > 0 ?
3201                         aNumFmtArr[nLvl]->GetAbsLSpace() + aNumFmtArr[nLvl]->GetFirstLineOffset() -
3202                         aNumFmtArr[nLvl - 1]->GetAbsLSpace() + aNumFmtArr[nLvl - 1]->GetFirstLineOffset():
3203                             aNumFmtArr[nLvl]->GetAbsLSpace() + aNumFmtArr[nLvl]->GetFirstLineOffset();
3204                 }
3205             }
3206 
3207             if( i > nLvl)
3208             {
3209                 // --> OD 2008-01-11 #newlistlevelattrs#
3210                 bSameAdjust &= aNumFmtArr[i]->GetNumAdjust() == aNumFmtArr[nLvl]->GetNumAdjust();
3211                 if ( !bLabelAlignmentPosAndSpaceModeActive )
3212                 {
3213                     if(bRelative)
3214                     {
3215                         if(nFirstBorderTextRelative == -1)
3216                             nFirstBorderTextRelative =
3217                             (aNumFmtArr[i]->GetAbsLSpace() + aNumFmtArr[i]->GetFirstLineOffset() -
3218                             aNumFmtArr[i - 1]->GetAbsLSpace() + aNumFmtArr[i - 1]->GetFirstLineOffset());
3219                         else
3220                             bSameDistBorderNum &= nFirstBorderTextRelative ==
3221                             (aNumFmtArr[i]->GetAbsLSpace() + aNumFmtArr[i]->GetFirstLineOffset() -
3222                             aNumFmtArr[i - 1]->GetAbsLSpace() + aNumFmtArr[i - 1]->GetFirstLineOffset());
3223                     }
3224                     else
3225                         bSameDistBorderNum &=
3226                         aNumFmtArr[i]->GetAbsLSpace() - aNumFmtArr[i]->GetFirstLineOffset() ==
3227                         aNumFmtArr[i - 1]->GetAbsLSpace() - aNumFmtArr[i - 1]->GetFirstLineOffset();
3228 
3229                     bSameDist       &= aNumFmtArr[i]->GetCharTextDistance() == aNumFmtArr[nLvl]->GetCharTextDistance();
3230                     bSameIndent     &= aNumFmtArr[i]->GetFirstLineOffset() == aNumFmtArr[nLvl]->GetFirstLineOffset();
3231                 }
3232                 else
3233                 {
3234                     bSameLabelFollowedBy &=
3235                         aNumFmtArr[i]->GetLabelFollowedBy() == aNumFmtArr[nLvl]->GetLabelFollowedBy();
3236                     bSameListtab &=
3237                         aNumFmtArr[i]->GetListtabPos() == aNumFmtArr[nLvl]->GetListtabPos();
3238                     bSameAlignAt &=
3239                         ( ( aNumFmtArr[i]->GetIndentAt() + aNumFmtArr[i]->GetFirstLineIndent() )
3240                             == ( aNumFmtArr[nLvl]->GetIndentAt() + aNumFmtArr[nLvl]->GetFirstLineIndent() ) );
3241                     bSameIndentAt &=
3242                         aNumFmtArr[i]->GetIndentAt() == aNumFmtArr[nLvl]->GetIndentAt();
3243                 }
3244                 // <--
3245             }
3246         }
3247         nMask <<= 1;
3248 
3249     }
3250     if (SVX_MAX_NUM <= nLvl)
3251     {
3252         OSL_ENSURE(false, "cannot happen.");
3253         return;
3254     }
3255 
3256     if(bSameDistBorderNum)
3257     {
3258         long nDistBorderNum;
3259         if(bRelative)
3260         {
3261             nDistBorderNum = (long)aNumFmtArr[nLvl]->GetAbsLSpace()+ aNumFmtArr[nLvl]->GetFirstLineOffset();
3262             if(nLvl)
3263                 nDistBorderNum -= (long)aNumFmtArr[nLvl - 1]->GetAbsLSpace()+ aNumFmtArr[nLvl - 1]->GetFirstLineOffset();
3264         }
3265         else
3266         {
3267             nDistBorderNum = (long)aNumFmtArr[nLvl]->GetAbsLSpace()+ aNumFmtArr[nLvl]->GetFirstLineOffset();
3268         }
3269         SetMetricValue(aDistBorderMF, nDistBorderNum, eCoreUnit);
3270     }
3271     else
3272         bSetDistEmpty = true;
3273 
3274 #if OSL_DEBUG_LEVEL > 1
3275     lcl_PrintDebugOutput(*pDebugFixedText, *aNumFmtArr[nLvl]);
3276 #endif
3277 
3278     const String aEmptyStr;
3279     if(bSameDist)
3280         SetMetricValue(aDistNumMF, aNumFmtArr[nLvl]->GetCharTextDistance(), eCoreUnit);
3281     else
3282         aDistNumMF.SetText(aEmptyStr);
3283     if(bSameIndent)
3284         SetMetricValue(aIndentMF, - aNumFmtArr[nLvl]->GetFirstLineOffset(), eCoreUnit);
3285     else
3286         aIndentMF.SetText(aEmptyStr);
3287 
3288     if(bSameAdjust)
3289     {
3290         sal_uInt16 nPos = 1; // zentriert
3291         if(aNumFmtArr[nLvl]->GetNumAdjust() == SVX_ADJUST_LEFT)
3292             nPos = 0;
3293         else if(aNumFmtArr[nLvl]->GetNumAdjust() == SVX_ADJUST_RIGHT)
3294             nPos = 2;
3295         aAlignLB.SelectEntryPos(nPos);
3296         // --> OD 2008-01-11 #newlistlevelattrs#
3297         aAlign2LB.SelectEntryPos( nPos );
3298         // <--
3299     }
3300     else
3301     {
3302         aAlignLB.SetNoSelection();
3303         // --> OD 2008-01-11 #newlistlevelattrs#
3304         aAlign2LB.SetNoSelection();
3305         // <--
3306     }
3307 
3308     // --> OD 2008-01-11 #newlistlevelattrs#
3309     if ( bSameLabelFollowedBy )
3310     {
3311         sal_uInt16 nPos = 0; // LISTTAB
3312         if ( aNumFmtArr[nLvl]->GetLabelFollowedBy() == SvxNumberFormat::SPACE )
3313         {
3314             nPos = 1;
3315         }
3316         else if ( aNumFmtArr[nLvl]->GetLabelFollowedBy() == SvxNumberFormat::NOTHING )
3317         {
3318             nPos = 2;
3319         }
3320         aLabelFollowedByLB.SelectEntryPos( nPos );
3321     }
3322     else
3323     {
3324         aLabelFollowedByLB.SetNoSelection();
3325     }
3326 
3327     if ( aNumFmtArr[nLvl]->GetLabelFollowedBy() == SvxNumberFormat::LISTTAB )
3328     {
3329         aListtabFT.Enable( true );
3330         aListtabMF.Enable( true );
3331         if ( bSameListtab )
3332         {
3333             SetMetricValue( aListtabMF, aNumFmtArr[nLvl]->GetListtabPos(), eCoreUnit );
3334         }
3335         else
3336         {
3337             aListtabMF.SetText(aEmptyStr);
3338         }
3339     }
3340     else
3341     {
3342         aListtabFT.Enable( false );
3343         aListtabMF.Enable( false );
3344         aListtabMF.SetText(aEmptyStr);
3345     }
3346 
3347     if ( bSameAlignAt )
3348     {
3349         SetMetricValue( aAlignedAtMF,
3350                         aNumFmtArr[nLvl]->GetIndentAt() + aNumFmtArr[nLvl]->GetFirstLineIndent(),
3351                         eCoreUnit );
3352     }
3353     else
3354     {
3355         aAlignedAtMF.SetText(aEmptyStr);
3356     }
3357 
3358     if ( bSameIndentAt )
3359     {
3360         SetMetricValue( aIndentAtMF, aNumFmtArr[nLvl]->GetIndentAt(), eCoreUnit );
3361     }
3362     else
3363     {
3364         aIndentAtMF.SetText(aEmptyStr);
3365     }
3366     // <--
3367 
3368     if ( bSetDistEmpty )
3369         aDistBorderMF.SetText(aEmptyStr);
3370 
3371     bInInintControl = sal_False;
3372 }
3373 
3374 /*-----------------03.12.97 10:02-------------------
3375 
3376 --------------------------------------------------*/
3377 void SvxNumPositionTabPage::ActivatePage(const SfxItemSet& rSet)
3378 {
3379     const SfxPoolItem* pItem;
3380     sal_uInt16 nTmpNumLvl = USHRT_MAX;
3381     const SfxItemSet* pExampleSet = GetTabDialog()->GetExampleSet();
3382     if(pExampleSet)
3383     {
3384         if(SFX_ITEM_SET == pExampleSet->GetItemState(SID_PARAM_NUM_PRESET, sal_False, &pItem))
3385             bPreset = ((const SfxBoolItem*)pItem)->GetValue();
3386         if(SFX_ITEM_SET == pExampleSet->GetItemState(SID_PARAM_CUR_NUM_LEVEL, sal_False, &pItem))
3387             nTmpNumLvl = ((const SfxUInt16Item*)pItem)->GetValue();
3388     }
3389     //
3390     if(SFX_ITEM_SET == rSet.GetItemState(nNumItemId, sal_False, &pItem))
3391     {
3392         delete pSaveNum;
3393         pSaveNum = new SvxNumRule(*((SvxNumBulletItem*)pItem)->GetNumRule());
3394     }
3395     bModified = (!pActNum->Get( 0 ) || bPreset);
3396     if(*pSaveNum != *pActNum ||
3397         nActNumLvl != nTmpNumLvl )
3398     {
3399         *pActNum = *pSaveNum;
3400         nActNumLvl = nTmpNumLvl;
3401         sal_uInt16 nMask = 1;
3402         aLevelLB.SetUpdateMode(sal_False);
3403         aLevelLB.SetNoSelection();
3404         aLevelLB.SelectEntryPos( pActNum->GetLevelCount(), nActNumLvl == USHRT_MAX);
3405         if(nActNumLvl != USHRT_MAX)
3406             for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
3407             {
3408                 if(nActNumLvl & nMask)
3409                     aLevelLB.SelectEntryPos( i, sal_True);
3410                 nMask <<= 1 ;
3411             }
3412         aRelativeCB.Enable(nActNumLvl != 1);
3413         aLevelLB.SetUpdateMode(sal_True);
3414 
3415         // --> OD 2008-01-11 #newlistlevelattrs#
3416         InitPosAndSpaceMode();
3417         ShowControlsDependingOnPosAndSpaceMode();
3418         // <--
3419 
3420         InitControls();
3421     }
3422     pPreviewWIN->SetLevel(nActNumLvl);
3423     pPreviewWIN->Invalidate();
3424 }
3425 
3426 /*-----------------03.12.97 10:02-------------------
3427 
3428 --------------------------------------------------*/
3429 int  SvxNumPositionTabPage::DeactivatePage(SfxItemSet *_pSet)
3430 {
3431     if(_pSet)
3432         FillItemSet(*_pSet);
3433     return sal_True;
3434 }
3435 
3436 /*-----------------03.12.97 10:02-------------------
3437 
3438 --------------------------------------------------*/
3439 sal_Bool SvxNumPositionTabPage::FillItemSet( SfxItemSet& rSet )
3440 {
3441     rSet.Put(SfxUInt16Item(SID_PARAM_CUR_NUM_LEVEL, nActNumLvl));
3442 
3443     if(bModified && pActNum)
3444     {
3445         *pSaveNum = *pActNum;
3446         rSet.Put(SvxNumBulletItem( *pSaveNum ), nNumItemId);
3447         rSet.Put(SfxBoolItem(SID_PARAM_NUM_PRESET, sal_False));
3448     }
3449     return bModified;
3450 }
3451 
3452 /*-----------------03.12.97 10:02-------------------
3453 
3454 --------------------------------------------------*/
3455 void SvxNumPositionTabPage::Reset( const SfxItemSet& rSet )
3456 {
3457     const SfxPoolItem* pItem;
3458     //im Draw gibt es das Item als WhichId, im Writer nur als SlotId
3459     SfxItemState eState = rSet.GetItemState(SID_ATTR_NUMBERING_RULE, sal_False, &pItem);
3460     if(eState != SFX_ITEM_SET)
3461     {
3462         nNumItemId = rSet.GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE);
3463         eState = rSet.GetItemState(nNumItemId, sal_False, &pItem);
3464 
3465         if( eState != SFX_ITEM_SET )
3466         {
3467             pItem = &static_cast< const SvxNumBulletItem& >( rSet.Get( nNumItemId, sal_True ) );
3468             eState = SFX_ITEM_SET;
3469         }
3470 
3471     }
3472     DBG_ASSERT(eState == SFX_ITEM_SET, "kein Item gefunden!");
3473     delete pSaveNum;
3474     pSaveNum = new SvxNumRule(*((SvxNumBulletItem*)pItem)->GetNumRule());
3475 
3476     // Ebenen einfuegen
3477     if(!aLevelLB.GetEntryCount())
3478     {
3479         for(sal_uInt16 i = 1; i <= pSaveNum->GetLevelCount(); i++)
3480             aLevelLB.InsertEntry(UniString::CreateFromInt32(i));
3481         if(pSaveNum->GetLevelCount() > 1)
3482         {
3483             String sEntry( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "1 - ") ) );
3484             sEntry.Append( UniString::CreateFromInt32( pSaveNum->GetLevelCount() ) );
3485             aLevelLB.InsertEntry(sEntry);
3486             aLevelLB.SelectEntry(sEntry);
3487         }
3488         else
3489             aLevelLB.SelectEntryPos(0);
3490     }
3491     else
3492         aLevelLB.SelectEntryPos(aLevelLB.GetEntryCount() - 1);
3493     sal_uInt16 nMask = 1;
3494     aLevelLB.SetUpdateMode(sal_False);
3495     aLevelLB.SetNoSelection();
3496     if(nActNumLvl == USHRT_MAX)
3497     {
3498         aLevelLB.SelectEntryPos( pSaveNum->GetLevelCount(), sal_True);
3499     }
3500     else
3501         for(sal_uInt16 i = 0; i < pSaveNum->GetLevelCount(); i++)
3502         {
3503             if(nActNumLvl & nMask)
3504                 aLevelLB.SelectEntryPos( i, sal_True);
3505             nMask <<= 1;
3506         }
3507     aLevelLB.SetUpdateMode(sal_True);
3508 
3509     if(!pActNum)
3510         pActNum = new  SvxNumRule(*pSaveNum);
3511     else if(*pSaveNum != *pActNum)
3512         *pActNum = *pSaveNum;
3513     pPreviewWIN->SetNumRule(pActNum);
3514 
3515     // --> OD 2008-01-11 #newlistlevelattrs#
3516     InitPosAndSpaceMode();
3517     ShowControlsDependingOnPosAndSpaceMode();
3518 //    const sal_Bool bDraw = pActNum->IsFeatureSupported(NUM_CONTINUOUS);
3519 //    aDistNumFT.Show(bDraw);
3520 //    aDistNumMF.Show(bDraw);
3521     // <--
3522 
3523     InitControls();
3524     bModified = sal_False;
3525 }
3526 
3527 // --> OD 2008-01-11 #newlistlevelattrs#
3528 void SvxNumPositionTabPage::InitPosAndSpaceMode()
3529 {
3530     if ( pActNum == 0 )
3531     {
3532         DBG_ASSERT( false,
3533                 "<SvxNumPositionTabPage::InitPosAndSpaceMode()> - misusage of method -> <pAktNum> has to be already set!" );
3534         return;
3535     }
3536 
3537     SvxNumberFormat::SvxNumPositionAndSpaceMode ePosAndSpaceMode =
3538                                             SvxNumberFormat::LABEL_ALIGNMENT;
3539     sal_uInt16 nMask = 1;
3540     for( sal_uInt16 i = 0; i < pActNum->GetLevelCount(); ++i )
3541     {
3542         if(nActNumLvl & nMask)
3543         {
3544             SvxNumberFormat aNumFmt( pActNum->GetLevel(i) );
3545             ePosAndSpaceMode = aNumFmt.GetPositionAndSpaceMode();
3546             if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
3547             {
3548                 break;
3549             }
3550         }
3551         nMask <<= 1;
3552     }
3553 
3554     bLabelAlignmentPosAndSpaceModeActive =
3555                     ePosAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT;
3556 }
3557 
3558 void SvxNumPositionTabPage::ShowControlsDependingOnPosAndSpaceMode()
3559 {
3560     aDistBorderFT.Show( !bLabelAlignmentPosAndSpaceModeActive );
3561     aDistBorderMF.Show( !bLabelAlignmentPosAndSpaceModeActive );
3562     aRelativeCB.Show( !bLabelAlignmentPosAndSpaceModeActive );
3563     aIndentFT.Show( !bLabelAlignmentPosAndSpaceModeActive );
3564     aIndentMF.Show( !bLabelAlignmentPosAndSpaceModeActive );
3565     aDistNumFT.Show( !bLabelAlignmentPosAndSpaceModeActive &&
3566                      pActNum->IsFeatureSupported(NUM_CONTINUOUS) );
3567     aDistNumMF.Show( !bLabelAlignmentPosAndSpaceModeActive &&
3568                      pActNum->IsFeatureSupported(NUM_CONTINUOUS));
3569     aAlignFT.Show( !bLabelAlignmentPosAndSpaceModeActive );
3570     aAlignLB.Show( !bLabelAlignmentPosAndSpaceModeActive );
3571 
3572     aLabelFollowedByFT.Show( bLabelAlignmentPosAndSpaceModeActive );
3573     aLabelFollowedByLB.Show( bLabelAlignmentPosAndSpaceModeActive );
3574     aListtabFT.Show( bLabelAlignmentPosAndSpaceModeActive );
3575     aListtabMF.Show( bLabelAlignmentPosAndSpaceModeActive );
3576     aAlign2FT.Show( bLabelAlignmentPosAndSpaceModeActive );
3577     aAlign2LB.Show( bLabelAlignmentPosAndSpaceModeActive );
3578     aAlignedAtFT.Show( bLabelAlignmentPosAndSpaceModeActive );
3579     aAlignedAtMF.Show( bLabelAlignmentPosAndSpaceModeActive );
3580     aIndentAtFT.Show( bLabelAlignmentPosAndSpaceModeActive );
3581     aIndentAtMF.Show( bLabelAlignmentPosAndSpaceModeActive );
3582 }
3583 // <--
3584 
3585 /*-----------------03.12.97 10:02-------------------
3586 
3587 --------------------------------------------------*/
3588 SfxTabPage* SvxNumPositionTabPage::Create( Window* pParent,
3589                                 const SfxItemSet& rAttrSet)
3590 {
3591     return new SvxNumPositionTabPage(pParent, rAttrSet);
3592 }
3593 
3594 /*-----------------04.12.97 12:51-------------------
3595 
3596 --------------------------------------------------*/
3597 void    SvxNumPositionTabPage::SetMetric(FieldUnit eMetric)
3598 {
3599     if(eMetric == FUNIT_MM)
3600     {
3601         aDistBorderMF .SetDecimalDigits(1);
3602         aDistNumMF    .SetDecimalDigits(1);
3603         aIndentMF     .SetDecimalDigits(1);
3604         // --> OD 2008-02-18 #newlistlevelattrs#
3605         aListtabMF.SetDecimalDigits(1);
3606         aAlignedAtMF.SetDecimalDigits(1);
3607         aIndentAtMF.SetDecimalDigits(1);
3608         // <--
3609     }
3610     aDistBorderMF .SetUnit( eMetric );
3611     aDistNumMF    .SetUnit( eMetric );
3612     aIndentMF     .SetUnit( eMetric );
3613     // --> OD 2008-02-18 #newlistlevelattrs#
3614     aListtabMF.SetUnit( eMetric );
3615     aAlignedAtMF.SetUnit( eMetric );
3616     aIndentAtMF.SetUnit( eMetric );
3617     // <--
3618 }
3619 
3620 /*-----------------03.12.97 11:06-------------------
3621 
3622 --------------------------------------------------*/
3623 IMPL_LINK( SvxNumPositionTabPage, EditModifyHdl_Impl, Edit *, EMPTYARG )
3624 {
3625     sal_uInt16 nMask = 1;
3626     for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
3627     {
3628         if(nActNumLvl & nMask)
3629         {
3630             SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
3631 
3632             // --> OD 2008-01-11 #newlistlevelattrs#
3633             const sal_uInt16 nPos = aAlignLB.IsVisible()
3634                                 ? aAlignLB.GetSelectEntryPos()
3635                                 : aAlign2LB.GetSelectEntryPos();
3636             // <--
3637             SvxAdjust eAdjust = SVX_ADJUST_CENTER;
3638             if(nPos == 0)
3639                 eAdjust = SVX_ADJUST_LEFT;
3640             else if(nPos == 2)
3641                 eAdjust = SVX_ADJUST_RIGHT;
3642             aNumFmt.SetNumAdjust( eAdjust );
3643             pActNum->SetLevel(i, aNumFmt);
3644         }
3645         nMask <<= 1;
3646     }
3647     SetModified();
3648     return 0;
3649 }
3650 /*-----------------03.12.97 11:11-------------------
3651 
3652 --------------------------------------------------*/
3653 IMPL_LINK( SvxNumPositionTabPage, LevelHdl_Impl, ListBox *, pBox )
3654 {
3655     sal_uInt16 nSaveNumLvl = nActNumLvl;
3656     nActNumLvl = 0;
3657     if(pBox->IsEntryPosSelected( pActNum->GetLevelCount() ) &&
3658             (pBox->GetSelectEntryCount() == 1 || nSaveNumLvl != 0xffff))
3659     {
3660         nActNumLvl = 0xFFFF;
3661         pBox->SetUpdateMode(sal_False);
3662         for( sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++ )
3663             pBox->SelectEntryPos( i, sal_False );
3664         pBox->SetUpdateMode(sal_True);
3665     }
3666     else if(pBox->GetSelectEntryCount())
3667     {
3668         sal_uInt16 nMask = 1;
3669         for( sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++ )
3670         {
3671             if(pBox->IsEntryPosSelected( i ))
3672                 nActNumLvl |= nMask;
3673             nMask <<= 1;
3674         }
3675         pBox->SelectEntryPos( pActNum->GetLevelCount(), sal_False );
3676     }
3677     else
3678     {
3679         nActNumLvl = nSaveNumLvl;
3680         sal_uInt16 nMask = 1;
3681         for( sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++ )
3682         {
3683             if(nActNumLvl & nMask)
3684             {
3685                 pBox->SelectEntryPos(i);
3686                 break;
3687             }
3688             nMask <<=1;
3689         }
3690     }
3691     aRelativeCB.Enable(nActNumLvl != 1);
3692     SetModified();
3693     // --> OD 2008-01-15 #newlistlevelattrs#
3694     InitPosAndSpaceMode();
3695     ShowControlsDependingOnPosAndSpaceMode();
3696     // <--
3697     InitControls();
3698     return 0;
3699 }
3700 /*-----------------03.12.97 12:24-------------------
3701 
3702 --------------------------------------------------*/
3703 IMPL_LINK( SvxNumPositionTabPage, DistanceHdl_Impl, MetricField *, pFld )
3704 {
3705     if(bInInintControl)
3706         return 0;
3707     long nValue = GetCoreValue(*pFld, eCoreUnit);
3708     sal_uInt16 nMask = 1;
3709 #if OSL_DEBUG_LEVEL > 1
3710     sal_Bool bFirst = sal_True;
3711 #endif
3712     for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
3713     {
3714         if(nActNumLvl & nMask)
3715         {
3716             SvxNumberFormat aNumFmt( pActNum->GetLevel( i ) );
3717             if(pFld == &aDistBorderMF)
3718             {
3719 
3720                 if(aRelativeCB.IsChecked())
3721                 {
3722                     if(0 == i)
3723                     {
3724                         long nTmp = aNumFmt.GetFirstLineOffset();
3725                         aNumFmt.SetAbsLSpace( sal_uInt16(nValue - nTmp));
3726                     }
3727                     else
3728                     {
3729                         long nTmp = pActNum->GetLevel( i - 1 ).GetAbsLSpace() +
3730                                     pActNum->GetLevel( i - 1 ).GetFirstLineOffset() -
3731                                     pActNum->GetLevel( i ).GetFirstLineOffset();
3732 
3733                         aNumFmt.SetAbsLSpace( sal_uInt16(nValue + nTmp));
3734                     }
3735                 }
3736                 else
3737                 {
3738                     aNumFmt.SetAbsLSpace( (short)nValue - aNumFmt.GetFirstLineOffset());
3739                 }
3740             }
3741             else if(pFld == &aDistNumMF)
3742             {
3743                 aNumFmt.SetCharTextDistance( (short)nValue );
3744             }
3745             else if(pFld == &aIndentMF)
3746             {
3747                 //jetzt muss mit dem FirstLineOffset auch der AbsLSpace veraendert werden
3748                 long nDiff = nValue + aNumFmt.GetFirstLineOffset();
3749                 long nAbsLSpace = aNumFmt.GetAbsLSpace();
3750                 aNumFmt.SetAbsLSpace(sal_uInt16(nAbsLSpace + nDiff));
3751                 aNumFmt.SetFirstLineOffset( -(short)nValue );
3752             }
3753 
3754 #if OSL_DEBUG_LEVEL > 1
3755             if(bFirst)
3756                 lcl_PrintDebugOutput(*pDebugFixedText, aNumFmt);
3757             bFirst = sal_False;
3758 #endif
3759             pActNum->SetLevel( i, aNumFmt );
3760         }
3761         nMask <<= 1;
3762     }
3763 
3764     SetModified();
3765     if(!aDistBorderMF.IsEnabled())
3766     {
3767         String aEmptyStr;
3768         aDistBorderMF.SetText(aEmptyStr);
3769     }
3770 
3771     return 0;
3772 }
3773 
3774 /*-----------------04.12.97 12:35-------------------
3775 
3776 --------------------------------------------------*/
3777 IMPL_LINK( SvxNumPositionTabPage, RelativeHdl_Impl, CheckBox *, pBox )
3778 {
3779     sal_Bool bOn = pBox->IsChecked();
3780     sal_Bool bSingleSelection = aLevelLB.GetSelectEntryCount() == 1 && USHRT_MAX != nActNumLvl;
3781     sal_Bool bSetValue = sal_False;
3782     long nValue = 0;
3783     if(bOn || bSingleSelection)
3784     {
3785         sal_uInt16 nMask = 1;
3786         sal_Bool bFirst = sal_True;
3787         bSetValue = sal_True;
3788         for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
3789         {
3790             if(nActNumLvl & nMask)
3791             {
3792                 const SvxNumberFormat &rNumFmt = pActNum->GetLevel(i);
3793                 if(bFirst)
3794                 {
3795                     nValue = rNumFmt.GetAbsLSpace() + rNumFmt.GetFirstLineOffset();
3796                     if(bOn && i)
3797                         nValue -= (pActNum->GetLevel(i - 1).GetAbsLSpace() + pActNum->GetLevel(i - 1).GetFirstLineOffset());
3798                 }
3799                 else
3800                     bSetValue = nValue ==
3801                         (rNumFmt.GetAbsLSpace() + rNumFmt.GetFirstLineOffset()) -
3802                             (pActNum->GetLevel(i - 1).GetAbsLSpace() + pActNum->GetLevel(i - 1).GetFirstLineOffset());
3803                 bFirst = sal_False;
3804             }
3805             nMask <<= 1;
3806         }
3807 
3808     }
3809     String aEmptyStr;
3810     if(bSetValue)
3811         SetMetricValue(aDistBorderMF, nValue,   eCoreUnit);
3812     else
3813         aDistBorderMF.SetText(aEmptyStr);
3814     aDistBorderMF.Enable(bOn || bSingleSelection);
3815     aDistBorderFT.Enable(bOn || bSingleSelection);
3816     bLastRelative = bOn;
3817     return 0;
3818 }
3819 
3820 // --> OD 2008-01-14 #newlistlevelattrs#
3821 IMPL_LINK( SvxNumPositionTabPage, LabelFollowedByHdl_Impl, ListBox*, EMPTYARG )
3822 {
3823     // determine value to be set at the chosen list levels
3824     SvxNumberFormat::SvxNumLabelFollowedBy eLabelFollowedBy =
3825                                                     SvxNumberFormat::LISTTAB;
3826     {
3827         const sal_uInt16 nPos = aLabelFollowedByLB.GetSelectEntryPos();
3828         if ( nPos == 1 )
3829         {
3830             eLabelFollowedBy = SvxNumberFormat::SPACE;
3831         }
3832         else if ( nPos == 2 )
3833         {
3834             eLabelFollowedBy = SvxNumberFormat::NOTHING;
3835         }
3836     }
3837 
3838     // set value at the chosen list levels
3839     bool bSameListtabPos = true;
3840     sal_uInt16 nFirstLvl = USHRT_MAX;
3841     sal_uInt16 nMask = 1;
3842     for( sal_uInt16 i = 0; i < pActNum->GetLevelCount(); ++i )
3843     {
3844         if ( nActNumLvl & nMask )
3845         {
3846             SvxNumberFormat aNumFmt( pActNum->GetLevel(i) );
3847             aNumFmt.SetLabelFollowedBy( eLabelFollowedBy );
3848             pActNum->SetLevel( i, aNumFmt );
3849 
3850             if ( nFirstLvl == USHRT_MAX )
3851             {
3852                 nFirstLvl = i;
3853             }
3854             else
3855             {
3856                 bSameListtabPos &= aNumFmt.GetListtabPos() ==
3857                         pActNum->GetLevel( nFirstLvl ).GetListtabPos();
3858             }
3859         }
3860         nMask <<= 1;
3861     }
3862 
3863     // enable/disable metric field for list tab stop position depending on
3864     // selected item following the list label.
3865     aListtabFT.Enable( eLabelFollowedBy == SvxNumberFormat::LISTTAB );
3866     aListtabMF.Enable( eLabelFollowedBy == SvxNumberFormat::LISTTAB );
3867     if ( bSameListtabPos && eLabelFollowedBy == SvxNumberFormat::LISTTAB )
3868     {
3869         SetMetricValue( aListtabMF, pActNum->GetLevel( nFirstLvl ).GetListtabPos(), eCoreUnit );
3870     }
3871     else
3872     {
3873         aListtabMF.SetText( String() );
3874     }
3875 
3876     SetModified();
3877 
3878     return 0;
3879 }
3880 // <--
3881 
3882 // --> OD 2008-01-14 #newlistlevelattrs#
3883 IMPL_LINK( SvxNumPositionTabPage, ListtabPosHdl_Impl, MetricField*, pFld )
3884 {
3885     // determine value to be set at the chosen list levels
3886     const long nValue = GetCoreValue( *pFld, eCoreUnit );
3887 
3888     // set value at the chosen list levels
3889     sal_uInt16 nMask = 1;
3890     for( sal_uInt16 i = 0; i < pActNum->GetLevelCount(); ++i )
3891     {
3892         if ( nActNumLvl & nMask )
3893         {
3894             SvxNumberFormat aNumFmt( pActNum->GetLevel(i) );
3895             aNumFmt.SetListtabPos( nValue );
3896             pActNum->SetLevel( i, aNumFmt );
3897 #if OSL_DEBUG_LEVEL > 1
3898             lcl_PrintDebugOutput(*pDebugFixedText, aNumFmt);
3899 #endif
3900         }
3901         nMask <<= 1;
3902     }
3903 
3904     SetModified();
3905 
3906     return 0;
3907 }
3908 // <--
3909 
3910 // --> OD 2008-01-14 #newlistlevelattrs#
3911 IMPL_LINK( SvxNumPositionTabPage, AlignAtHdl_Impl, MetricField*, pFld )
3912 {
3913     // determine value to be set at the chosen list levels
3914     const long nValue = GetCoreValue( *pFld, eCoreUnit );
3915 
3916     // set value at the chosen list levels
3917     sal_uInt16 nMask = 1;
3918     for( sal_uInt16 i = 0; i < pActNum->GetLevelCount(); ++i )
3919     {
3920         if ( nActNumLvl & nMask )
3921         {
3922             SvxNumberFormat aNumFmt( pActNum->GetLevel(i) );
3923             const long nFirstLineIndent = nValue - aNumFmt.GetIndentAt();
3924             aNumFmt.SetFirstLineIndent( nFirstLineIndent );
3925             pActNum->SetLevel( i, aNumFmt );
3926 #if OSL_DEBUG_LEVEL > 1
3927             lcl_PrintDebugOutput(*pDebugFixedText, aNumFmt);
3928 #endif
3929         }
3930         nMask <<= 1;
3931     }
3932 
3933     SetModified();
3934 
3935     return 0;
3936 }
3937 // <--
3938 
3939 // --> OD 2008-01-14 #newlistlevelattrs#
3940 IMPL_LINK( SvxNumPositionTabPage, IndentAtHdl_Impl, MetricField*, pFld )
3941 {
3942     // determine value to be set at the chosen list levels
3943     const long nValue = GetCoreValue( *pFld, eCoreUnit );
3944 
3945     // set value at the chosen list levels
3946     sal_uInt16 nMask = 1;
3947     for( sal_uInt16 i = 0; i < pActNum->GetLevelCount(); ++i )
3948     {
3949         if ( nActNumLvl & nMask )
3950         {
3951             SvxNumberFormat aNumFmt( pActNum->GetLevel(i) );
3952             const long nAlignedAt = aNumFmt.GetIndentAt() +
3953                                     aNumFmt.GetFirstLineIndent();
3954             aNumFmt.SetIndentAt( nValue );
3955             const long nNewFirstLineIndent = nAlignedAt - nValue;
3956             aNumFmt.SetFirstLineIndent( nNewFirstLineIndent );
3957             pActNum->SetLevel( i, aNumFmt );
3958 #if OSL_DEBUG_LEVEL > 1
3959             lcl_PrintDebugOutput(*pDebugFixedText, aNumFmt);
3960 #endif
3961         }
3962         nMask <<= 1;
3963     }
3964 
3965     SetModified();
3966 
3967     return 0;
3968 }
3969 // <--
3970 /*-----------------05.12.97 15:33-------------------
3971 
3972 --------------------------------------------------*/
3973 IMPL_LINK( SvxNumPositionTabPage, StandardHdl_Impl, PushButton *, EMPTYARG )
3974 {
3975     sal_uInt16 nMask = 1;
3976     // --> OD 2008-02-11 #newlistlevelattrs#
3977     SvxNumRule aTmpNumRule( pActNum->GetFeatureFlags(),
3978                             pActNum->GetLevelCount(),
3979                             pActNum->IsContinuousNumbering(),
3980                             SVX_RULETYPE_NUMBERING,
3981                             pActNum->GetLevel( 0 ).GetPositionAndSpaceMode() );
3982     // <--
3983     for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
3984     {
3985         if(nActNumLvl & nMask)
3986         {
3987             SvxNumberFormat aNumFmt( pActNum->GetLevel( i ) );
3988             SvxNumberFormat aTempFmt(aTmpNumRule.GetLevel( i ));
3989             // --> OD 2008-02-05 #newlistlevelattrs#
3990             aNumFmt.SetPositionAndSpaceMode( aTempFmt.GetPositionAndSpaceMode() );
3991             if ( aTempFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
3992             {
3993                 aNumFmt.SetAbsLSpace( aTempFmt.GetAbsLSpace() );
3994                 aNumFmt.SetCharTextDistance( aTempFmt.GetCharTextDistance() );
3995                 aNumFmt.SetFirstLineOffset( aTempFmt.GetFirstLineOffset() );
3996             }
3997             else if ( aTempFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
3998             {
3999                 aNumFmt.SetNumAdjust( aTempFmt.GetNumAdjust() );
4000                 aNumFmt.SetLabelFollowedBy( aTempFmt.GetLabelFollowedBy() );
4001                 aNumFmt.SetListtabPos( aTempFmt.GetListtabPos() );
4002                 aNumFmt.SetFirstLineIndent( aTempFmt.GetFirstLineIndent() );
4003                 aNumFmt.SetIndentAt( aTempFmt.GetIndentAt() );
4004             }
4005             // <--
4006 
4007             pActNum->SetLevel( i, aNumFmt );
4008         }
4009         nMask <<= 1;
4010     }
4011 
4012     InitControls();
4013     SetModified();
4014     return 0;
4015 }
4016 
4017 void SvxNumPositionTabPage::SetModified(sal_Bool bRepaint)
4018 {
4019     bModified = sal_True;
4020     if(bRepaint)
4021     {
4022         pPreviewWIN->SetLevel(nActNumLvl);
4023         pPreviewWIN->Invalidate();
4024     }
4025 }
4026 
4027 void SvxNumOptionsTabPage::SetModified(sal_Bool bRepaint)
4028 {
4029     bModified = sal_True;
4030     if(bRepaint)
4031     {
4032         pPreviewWIN->SetLevel(nActNumLvl);
4033         pPreviewWIN->Invalidate();
4034     }
4035 }
4036 
4037 //Add CHINA001
4038 void SvxNumOptionsTabPage::PageCreated(SfxAllItemSet aSet)
4039 {
4040     SFX_ITEMSET_ARG (&aSet,pListItem,SfxStringListItem,SID_CHAR_FMT_LIST_BOX,sal_False);
4041     SFX_ITEMSET_ARG (&aSet,pNumCharFmt,SfxStringItem,SID_NUM_CHAR_FMT,sal_False);
4042     SFX_ITEMSET_ARG (&aSet,pBulletCharFmt,SfxStringItem,SID_BULLET_CHAR_FMT,sal_False);
4043     SFX_ITEMSET_ARG (&aSet,pMetricItem,SfxAllEnumItem,SID_METRIC_ITEM,sal_False);
4044 
4045     if (pNumCharFmt &&pBulletCharFmt)
4046         SetCharFmts( pNumCharFmt->GetValue(),pBulletCharFmt->GetValue());
4047 
4048     if (pListItem)
4049     {
4050         ListBox& myCharFmtLB = GetCharFmtListBox();
4051         const List *pList = (pListItem)->GetList();
4052         sal_uInt32 nCount = pList->Count();;
4053         for(sal_uInt32 i = 0; i < nCount; i++)
4054         {
4055             myCharFmtLB.InsertEntry(*(const String*)(pList->GetObject(i)) );
4056 
4057         }
4058     }
4059     if (pMetricItem)
4060         SetMetric(static_cast<FieldUnit>(pMetricItem->GetValue()));
4061 }
4062 
4063 //end of add CHINA001
4064 
4065 //add CHINA001 begin
4066 
4067 void SvxNumPositionTabPage::PageCreated(SfxAllItemSet aSet)
4068 {
4069     SFX_ITEMSET_ARG (&aSet,pMetricItem,SfxAllEnumItem,SID_METRIC_ITEM,sal_False);
4070 
4071     if (pMetricItem)
4072         SetMetric(static_cast<FieldUnit>(pMetricItem->GetValue()));
4073 }
4074