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 ---------------------------------------------------------------------------*/
lcl_GetNumberingProvider()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 ---------------------------------------------------------------------------*/
lcl_CreateNumSettingsPtr(const Sequence<PropertyValue> & rLevelProps)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 --------------------------------------------------*/
lcl_IsNumFmtSet(SvxNumRule * pNum,sal_uInt16 nLevelMask)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
lcl_GetDefaultBulletFont()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
SvxSingleNumPickTabPage(Window * pParent,const SfxItemSet & rSet)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
~SvxSingleNumPickTabPage()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
Create(Window * pParent,const SfxItemSet & rAttrSet)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
FillItemSet(SfxItemSet & rSet)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
ActivatePage(const SfxItemSet & rSet)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
DeactivatePage(SfxItemSet * _pSet)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
Reset(const SfxItemSet & rSet)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
IMPL_LINK(SvxSingleNumPickTabPage,NumSelectHdl_Impl,ValueSet *,EMPTYARG)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 --------------------------------------------------*/
IMPL_LINK(SvxSingleNumPickTabPage,DoubleClickHdl_Impl,ValueSet *,EMPTYARG)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
SvxBulletPickTabPage(Window * pParent,const SfxItemSet & rSet)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
~SvxBulletPickTabPage()479 SvxBulletPickTabPage::~SvxBulletPickTabPage()
480 {
481 delete pActNum;
482 delete pExamplesVS;
483 delete pSaveNum;
484 }
485 /*-----------------07.02.97 12.10-------------------
486
487 --------------------------------------------------*/
488
489
Create(Window * pParent,const SfxItemSet & rAttrSet)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
FillItemSet(SfxItemSet & rSet)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
ActivatePage(const SfxItemSet & rSet)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
DeactivatePage(SfxItemSet * _pSet)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
Reset(const SfxItemSet & rSet)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
IMPL_LINK(SvxBulletPickTabPage,NumSelectHdl_Impl,ValueSet *,EMPTYARG)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 --------------------------------------------------*/
IMPL_LINK(SvxBulletPickTabPage,DoubleClickHdl_Impl,ValueSet *,EMPTYARG)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
PageCreated(SfxAllItemSet aSet)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
SvxNumPickTabPage(Window * pParent,const SfxItemSet & rSet)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
~SvxNumPickTabPage()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
Create(Window * pParent,const SfxItemSet & rAttrSet)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
FillItemSet(SfxItemSet & rSet)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
ActivatePage(const SfxItemSet & rSet)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
DeactivatePage(SfxItemSet * _pSet)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
Reset(const SfxItemSet & rSet)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
IMPL_LINK(SvxNumPickTabPage,NumSelectHdl_Impl,ValueSet *,EMPTYARG)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 --------------------------------------------------*/
IMPL_LINK(SvxNumPickTabPage,DoubleClickHdl_Impl,ValueSet *,EMPTYARG)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
PageCreated(SfxAllItemSet aSet)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
SvxBitmapPickTabPage(Window * pParent,const SfxItemSet & rSet)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
~SvxBitmapPickTabPage()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
Create(Window * pParent,const SfxItemSet & rAttrSet)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
ActivatePage(const SfxItemSet & rSet)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
DeactivatePage(SfxItemSet * _pSet)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
FillItemSet(SfxItemSet & rSet)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
Reset(const SfxItemSet & rSet)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
IMPL_LINK(SvxBitmapPickTabPage,NumSelectHdl_Impl,ValueSet *,EMPTYARG)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 --------------------------------------------------*/
IMPL_LINK(SvxBitmapPickTabPage,DoubleClickHdl_Impl,ValueSet *,EMPTYARG)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 --------------------------------------------------*/
IMPL_LINK(SvxBitmapPickTabPage,LinkBmpHdl_Impl,CheckBox *,EMPTYARG)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
SvxNumOptionsTabPage(Window * pParent,const SfxItemSet & rSet)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 --------------------------------------------------*/
~SvxNumOptionsTabPage()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 --------------------------------------------------*/
SetMetric(FieldUnit eMetric)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 --------------------------------------------------*/
Create(Window * pParent,const SfxItemSet & rAttrSet)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 --------------------------------------------------*/
ActivatePage(const SfxItemSet & rSet)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 --------------------------------------------------*/
DeactivatePage(SfxItemSet * _pSet)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 --------------------------------------------------*/
FillItemSet(SfxItemSet & rSet)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 --------------------------------------------------*/
Reset(const SfxItemSet & rSet)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 XColorListSharedPtr aColorTable;
1613
1614 if ( pDocSh )
1615 {
1616 pItem = pDocSh->GetItem( SID_COLOR_TABLE );
1617 if ( pItem )
1618 aColorTable = static_cast< const SvxColorTableItem* >(pItem)->GetColorTable();
1619 }
1620
1621 if ( !aColorTable.get() )
1622 {
1623 aColorTable = XPropertyListFactory::CreateSharedXColorList(SvtPathOptions().GetPalettePath());
1624 }
1625
1626 aBulColLB.InsertEntry( Color( COL_AUTO ), SVX_RESSTR( RID_SVXSTR_AUTOMATIC ));
1627
1628 for ( long i = 0; i < aColorTable->Count(); i++ )
1629 {
1630 XColorEntry* pEntry = aColorTable->GetColor(i);
1631 aBulColLB.InsertEntry( pEntry->GetColor(), pEntry->GetName() );
1632 }
1633 }
1634
1635 SfxObjectShell* pShell;
1636 if ( SFX_ITEM_SET == rSet.GetItemState( SID_HTML_MODE, sal_False, &pItem )
1637 || ( 0 != ( pShell = SfxObjectShell::Current()) &&
1638 0 != ( pItem = pShell->GetItem( SID_HTML_MODE ) ) ) )
1639 {
1640 sal_uInt16 nHtmlMode = ((SfxUInt16Item*)pItem)->GetValue();
1641 bHTMLMode = 0 != (nHtmlMode&HTMLMODE_ON);
1642 }
1643
1644 sal_Bool bCharFmt = pActNum->IsFeatureSupported(NUM_CHAR_STYLE);
1645 aCharFmtFT.Show(bCharFmt);
1646 aCharFmtLB.Show(bCharFmt);
1647
1648 sal_Bool bContinuous = pActNum->IsFeatureSupported(NUM_CONTINUOUS);
1649
1650 sal_Bool bAllLevel = bContinuous && !bHTMLMode;
1651 aAllLevelFT.Show(bAllLevel);
1652 aAllLevelNF.Show(bAllLevel);
1653
1654 aSameLevelFL.Show(bContinuous);
1655 aSameLevelCB.Show(bContinuous);
1656 //wieder Missbrauch: im Draw gibt es die Numerierung nur bis zum Bitmap
1657 // without SVX_NUM_NUMBER_NONE
1658 //remove types that are unsupported by Draw/Impress
1659 if(!bContinuous)
1660 {
1661 sal_uInt16 nFmtCount = aFmtLB.GetEntryCount();
1662 for(sal_uInt16 i = nFmtCount; i; i--)
1663 {
1664 sal_uInt16 nEntryData = (sal_uInt16)(sal_uLong)aFmtLB.GetEntryData(i - 1);
1665 if(/*SVX_NUM_NUMBER_NONE == nEntryData ||*/
1666 ((SVX_NUM_BITMAP|LINK_TOKEN) == nEntryData))
1667 aFmtLB.RemoveEntry(i - 1);
1668 }
1669 }
1670 //one must be enabled
1671 if(!pActNum->IsFeatureSupported(NUM_ENABLE_LINKED_BMP))
1672 {
1673 long nData = SVX_NUM_BITMAP|LINK_TOKEN;
1674 sal_uInt16 nPos = aFmtLB.GetEntryPos((void*)nData);
1675 if(LISTBOX_ENTRY_NOTFOUND != nPos)
1676 aFmtLB.RemoveEntry(nPos);
1677 }
1678 else if(!pActNum->IsFeatureSupported(NUM_ENABLE_EMBEDDED_BMP))
1679 {
1680 long nData = SVX_NUM_BITMAP;
1681 sal_uInt16 nPos = aFmtLB.GetEntryPos((void*)nData);
1682 if(LISTBOX_ENTRY_NOTFOUND != nPos)
1683 aFmtLB.RemoveEntry(nPos);
1684 }
1685 if(pActNum->IsFeatureSupported(NUM_SYMBOL_ALIGNMENT))
1686 {
1687 aAlignFT.Show();
1688 aAlignLB.Show();
1689 Size aSz(aFormatFL.GetSizePixel());
1690 aSz.Height() = aLevelFT.GetSizePixel().Height();
1691 aFormatFL.SetSizePixel(aSz);
1692 aAlignLB.SetSelectHdl(LINK(this, SvxNumOptionsTabPage, EditModifyHdl_Impl));
1693 }
1694
1695 //MegaHack: Aufgrund eines nicht fixbaren 'designfehlers' im Impress
1696 //Alle arten der numerischen Aufzaehlungen loeschen
1697 if(pActNum->IsFeatureSupported(NUM_NO_NUMBERS))
1698 {
1699 sal_uInt16 nFmtCount = aFmtLB.GetEntryCount();
1700 for(sal_uInt16 i = nFmtCount; i; i--)
1701 {
1702 sal_uInt16 nEntryData = (sal_uInt16)(sal_uLong)aFmtLB.GetEntryData(i - 1);
1703 if( /*nEntryData >= SVX_NUM_CHARS_UPPER_LETTER &&*/ nEntryData <= SVX_NUM_NUMBER_NONE)
1704 aFmtLB.RemoveEntry(i - 1);
1705 }
1706 }
1707
1708 InitControls();
1709 bModified = sal_False;
1710
1711 }
1712 /*-----------------02.12.97 13:47-------------------
1713
1714 --------------------------------------------------*/
InitControls()1715 void SvxNumOptionsTabPage::InitControls()
1716 {
1717 sal_Bool bShowBullet = sal_True;
1718 sal_Bool bShowBitmap = sal_True;
1719 sal_Bool bSameType = sal_True;
1720 sal_Bool bSameStart = sal_True;
1721 sal_Bool bSamePrefix = sal_True;
1722 sal_Bool bSameSuffix = sal_True;
1723 sal_Bool bAllLevel = sal_True;
1724 sal_Bool bSameCharFmt = sal_True;
1725 sal_Bool bSameVOrient = sal_True;
1726 sal_Bool bSameSize = sal_True;
1727 sal_Bool bSameBulColor = sal_True;
1728 sal_Bool bSameBulRelSize= sal_True;
1729 sal_Bool bSameAdjust = sal_True;
1730
1731 const SvxNumberFormat* aNumFmtArr[SVX_MAX_NUM];
1732 String sFirstCharFmt;
1733 sal_Int16 eFirstOrient = text::VertOrientation::NONE;
1734 Size aFirstSize(0,0);
1735 sal_uInt16 nMask = 1;
1736 sal_uInt16 nLvl = USHRT_MAX;
1737 sal_uInt16 nHighestLevel = 0;
1738 String aEmptyStr;
1739
1740 sal_Bool bBullColor = pActNum->IsFeatureSupported(NUM_BULLET_COLOR);
1741 sal_Bool bBullRelSize = pActNum->IsFeatureSupported(NUM_BULLET_REL_SIZE);
1742 for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
1743 {
1744 if(nActNumLvl & nMask)
1745 {
1746 aNumFmtArr[i] = &pActNum->GetLevel(i);
1747 bShowBullet &= aNumFmtArr[i]->GetNumberingType() == SVX_NUM_CHAR_SPECIAL;
1748 bShowBitmap &= (aNumFmtArr[i]->GetNumberingType()&(~LINK_TOKEN)) == SVX_NUM_BITMAP;
1749 if(USHRT_MAX == nLvl)
1750 {
1751 nLvl = i;
1752 sFirstCharFmt = aNumFmtArr[i]->GetCharFmtName();
1753 eFirstOrient = aNumFmtArr[i]->GetVertOrient();
1754 if(bShowBitmap)
1755 aFirstSize = aNumFmtArr[i]->GetGraphicSize();
1756 }
1757 if( i > nLvl)
1758 {
1759 bSameType &= aNumFmtArr[i]->GetNumberingType() == aNumFmtArr[nLvl]->GetNumberingType();
1760 bSameStart = aNumFmtArr[i]->GetStart() == aNumFmtArr[nLvl]->GetStart();
1761
1762 bSamePrefix = aNumFmtArr[i]->GetPrefix() == aNumFmtArr[nLvl]->GetPrefix();
1763 bSameSuffix = aNumFmtArr[i]->GetSuffix() == aNumFmtArr[nLvl]->GetSuffix();
1764 bAllLevel &= aNumFmtArr[i]->GetIncludeUpperLevels() == aNumFmtArr[nLvl]->GetIncludeUpperLevels();
1765 bSameCharFmt &= sFirstCharFmt == aNumFmtArr[i]->GetCharFmtName();
1766 bSameVOrient &= eFirstOrient == aNumFmtArr[i]->GetVertOrient();
1767 if(bShowBitmap && bSameSize)
1768 bSameSize &= aNumFmtArr[i]->GetGraphicSize() == aFirstSize;
1769 bSameBulColor &= aNumFmtArr[i]->GetBulletColor() == aNumFmtArr[nLvl]->GetBulletColor();
1770 bSameBulRelSize &= aNumFmtArr[i]->GetBulletRelSize() == aNumFmtArr[nLvl]->GetBulletRelSize();
1771 bSameAdjust &= aNumFmtArr[i]->GetNumAdjust() == aNumFmtArr[nLvl]->GetNumAdjust();
1772 }
1773 nHighestLevel = i;
1774 }
1775 else
1776 aNumFmtArr[i] = 0;
1777
1778 nMask <<= 1 ;
1779
1780 }
1781 SwitchNumberType(bShowBullet ? 1 : bShowBitmap ? 2 : 0);
1782 CheckForStartValue_Impl(aNumFmtArr[nLvl]->GetNumberingType());
1783 if(bShowBitmap)
1784 {
1785 if(!bSameVOrient || eFirstOrient == text::VertOrientation::NONE)
1786 aOrientLB.SetNoSelection();
1787 else
1788 aOrientLB.SelectEntryPos(
1789 sal::static_int_cast< sal_uInt16 >(eFirstOrient - 1));
1790 // kein text::VertOrientation::NONE
1791
1792 if(bSameSize)
1793 {
1794 SetMetricValue(aHeightMF, aFirstSize.Height(), eCoreUnit);
1795 SetMetricValue(aWidthMF, aFirstSize.Width(), eCoreUnit);
1796 }
1797 else
1798 {
1799 aHeightMF.SetText(aEmptyStr);
1800 aWidthMF.SetText(aEmptyStr);
1801 }
1802 }
1803
1804 if(bSameType)
1805 {
1806 sal_uInt16 nLBData = (sal_uInt16) aNumFmtArr[nLvl]->GetNumberingType();
1807 aFmtLB.SelectEntryPos(aFmtLB.GetEntryPos( (void*)sal::static_int_cast<sal_uIntPtr>( nLBData ) ));
1808 }
1809 else
1810 aFmtLB.SetNoSelection();
1811
1812 aAllLevelNF.Enable(nHighestLevel > 0 && !aSameLevelCB.IsChecked());
1813 aAllLevelNF.SetMax(nHighestLevel + 1);
1814 if(bAllLevel)
1815 {
1816 aAllLevelNF.SetValue(aNumFmtArr[nLvl]->GetIncludeUpperLevels());
1817 }
1818 else
1819 {
1820 aAllLevelNF.SetText(aEmptyStr);
1821 }
1822 if(bSameAdjust)
1823 {
1824 sal_uInt16 nPos = 1; // zentriert
1825 if(aNumFmtArr[nLvl]->GetNumAdjust() == SVX_ADJUST_LEFT)
1826 nPos = 0;
1827 else if(aNumFmtArr[nLvl]->GetNumAdjust() == SVX_ADJUST_RIGHT)
1828 nPos = 2;
1829 aAlignLB.SelectEntryPos(nPos);
1830 }
1831 else
1832 {
1833 aAlignLB.SetNoSelection();
1834 }
1835
1836 if(bBullRelSize)
1837 {
1838 if(bSameBulRelSize)
1839 aBulRelSizeMF.SetValue(aNumFmtArr[nLvl]->GetBulletRelSize());
1840 else
1841 aBulRelSizeMF.SetText(aEmptyStr);
1842 }
1843 if(bBullColor)
1844 {
1845 if(bSameBulColor)
1846 aBulColLB.SelectEntry(aNumFmtArr[nLvl]->GetBulletColor());
1847 else
1848 aBulColLB.SetNoSelection();
1849 }
1850 switch(nBullet)
1851 {
1852 case SHOW_NUMBERING:
1853 if(bSameStart)
1854 {
1855 aStartED.SetValue(aNumFmtArr[nLvl]->GetStart());
1856 }
1857 else
1858 aStartED.SetText(aEmptyStr);
1859 break;
1860 case SHOW_BULLET:
1861 {
1862 // const Font* pFnt = aNumFmtArr[Lvl]->GetBulletFont();
1863 // if(pFnt)
1864 // ChgTxtFont(aBulletFT, *pFnt);
1865 // aBulletFT.SetText(String((char)aNumFmtArr[nLvl]->GetBulletChar()));
1866 }
1867 break;
1868 case SHOW_BITMAP:
1869 break;
1870 }
1871
1872 if(bSamePrefix)
1873 aPrefixED.SetText(aNumFmtArr[nLvl]->GetPrefix());
1874 else
1875 aPrefixED.SetText(aEmptyStr);
1876 if(bSameSuffix)
1877 aSuffixED.SetText(aNumFmtArr[nLvl]->GetSuffix());
1878 else
1879 aSuffixED.SetText(aEmptyStr);
1880
1881 if(bSameCharFmt)
1882 {
1883 if(sFirstCharFmt.Len())
1884 aCharFmtLB.SelectEntry(sFirstCharFmt);
1885 else
1886 aCharFmtLB.SelectEntryPos( 0 );
1887 }
1888 else
1889 aCharFmtLB.SetNoSelection();
1890
1891 pPreviewWIN->SetLevel(nActNumLvl);
1892 pPreviewWIN->Invalidate();
1893 }
1894
1895 /*-----------------02.12.97 14:01-------------------
1896 0 - Nummer; 1 - Bullet; 2 - Bitmap
1897 --------------------------------------------------*/
1898
SwitchNumberType(sal_uInt8 nType,sal_Bool)1899 void SvxNumOptionsTabPage::SwitchNumberType( sal_uInt8 nType, sal_Bool )
1900 {
1901 if(nBullet == nType)
1902 return;
1903 nBullet = nType;
1904 sal_Bool bBitmap = sal_False;
1905 sal_Bool bBullet = sal_False;
1906 sal_Bool bEnableBitmap = sal_False;
1907 if(nType == SHOW_NUMBERING)
1908 {
1909 // Label umschalten, alten Text merken
1910 aStartFT.SetText(sStartWith);
1911
1912 }
1913 else if(nType == SHOW_BULLET)
1914 {
1915 // Label umschalten, alten Text merken
1916 aStartFT.SetText(sBullet);
1917 bBullet = sal_True;
1918 }
1919 else
1920 {
1921 bBitmap = sal_True;
1922 bEnableBitmap = sal_True;
1923 }
1924 sal_Bool bNumeric = !(bBitmap||bBullet);
1925 aPrefixFT.Show(bNumeric);
1926 aPrefixED.Show(bNumeric);
1927 aSuffixFT.Show(bNumeric);
1928 aSuffixED.Show(bNumeric);
1929
1930 sal_Bool bCharFmt = pActNum->IsFeatureSupported(NUM_CHAR_STYLE);
1931 aCharFmtFT.Show(!bBitmap && bCharFmt);
1932 aCharFmtLB.Show(!bBitmap && bCharFmt);
1933
1934 // das ist eigentlich Missbrauch, da fuer die vollst. Numerierung kein
1935 // eigenes Flag existiert
1936 sal_Bool bAllLevelFeature = pActNum->IsFeatureSupported(NUM_CONTINUOUS);
1937 sal_Bool bAllLevel = bNumeric && bAllLevelFeature && !bHTMLMode;
1938 aAllLevelFT.Show(bAllLevel);
1939 aAllLevelNF.Show(bAllLevel);
1940
1941 aStartFT.Show(!bBitmap);
1942 aStartED.Show(!(bBullet||bBitmap));
1943
1944 aBulletPB.Show(bBullet);
1945 sal_Bool bBullColor = pActNum->IsFeatureSupported(NUM_BULLET_COLOR);
1946 aBulColorFT.Show( !bBitmap && bBullColor );
1947 aBulColLB.Show( !bBitmap && bBullColor );
1948 sal_Bool bBullResSize = pActNum->IsFeatureSupported(NUM_BULLET_REL_SIZE);
1949 aBulRelSizeFT.Show( !bBitmap && bBullResSize );
1950 aBulRelSizeMF.Show( !bBitmap && bBullResSize );
1951
1952 aBitmapFT .Show(bBitmap);
1953 aBitmapMB .Show(bBitmap);
1954
1955 aSizeFT .Show(bBitmap);
1956 aWidthMF .Show(bBitmap);
1957 aMultFT .Show(bBitmap);
1958 aHeightMF .Show(bBitmap);
1959 aRatioCB .Show(bBitmap);
1960
1961 aOrientFT .Show(bBitmap && bAllLevelFeature);
1962 aOrientLB .Show(bBitmap && bAllLevelFeature);
1963
1964 aSizeFT .Enable(bEnableBitmap);
1965 aWidthMF .Enable(bEnableBitmap);
1966 aMultFT .Enable(bEnableBitmap);
1967 aHeightMF .Enable(bEnableBitmap);
1968 aRatioCB .Enable(bEnableBitmap);
1969 aOrientFT .Enable(bEnableBitmap);
1970 aOrientLB .Enable(bEnableBitmap);
1971
1972 }
1973 /*-----------------02.12.97 13:51-------------------
1974
1975 --------------------------------------------------*/
IMPL_LINK(SvxNumOptionsTabPage,LevelHdl_Impl,ListBox *,pBox)1976 IMPL_LINK( SvxNumOptionsTabPage, LevelHdl_Impl, ListBox *, pBox )
1977 {
1978 sal_uInt16 nSaveNumLvl = nActNumLvl;
1979 nActNumLvl = 0;
1980 if(pBox->IsEntryPosSelected( pActNum->GetLevelCount() ) &&
1981 (pBox->GetSelectEntryCount() == 1 || nSaveNumLvl != 0xffff))
1982 {
1983 nActNumLvl = 0xFFFF;
1984 pBox->SetUpdateMode(sal_False);
1985 for( sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++ )
1986 pBox->SelectEntryPos( i, sal_False );
1987 pBox->SetUpdateMode(sal_True);
1988 }
1989 else if(pBox->GetSelectEntryCount())
1990 {
1991 sal_uInt16 nMask = 1;
1992 for( sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++ )
1993 {
1994 if(pBox->IsEntryPosSelected( i ))
1995 nActNumLvl |= nMask;
1996 nMask <<= 1;
1997 }
1998 pBox->SelectEntryPos( pActNum->GetLevelCount(), sal_False );
1999 }
2000 else
2001 {
2002 nActNumLvl = nSaveNumLvl;
2003 sal_uInt16 nMask = 1;
2004 for( sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++ )
2005 {
2006 if(nActNumLvl & nMask)
2007 {
2008 pBox->SelectEntryPos(i);
2009 break;
2010 }
2011 nMask <<=1;
2012 }
2013 }
2014 InitControls();
2015 return 0;
2016 }
2017 /* -----------------------------05.04.2002 15:30------------------------------
2018
2019 ---------------------------------------------------------------------------*/
IMPL_LINK(SvxNumOptionsTabPage,PreviewInvalidateHdl_Impl,Timer *,EMPTYARG)2020 IMPL_LINK( SvxNumOptionsTabPage, PreviewInvalidateHdl_Impl, Timer*, EMPTYARG )
2021 {
2022 pPreviewWIN->Invalidate();
2023 return 0;
2024 }
2025 /*-----------------03.12.97 12:01-------------------
2026
2027 --------------------------------------------------*/
IMPL_LINK(SvxNumOptionsTabPage,AllLevelHdl_Impl,NumericField *,pBox)2028 IMPL_LINK( SvxNumOptionsTabPage, AllLevelHdl_Impl, NumericField*, pBox )
2029 {
2030 for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2031 {
2032 sal_uInt16 nMask = 1;
2033 for(sal_uInt16 e = 0; e < pActNum->GetLevelCount(); e++)
2034 {
2035 if(nActNumLvl & nMask)
2036 {
2037 SvxNumberFormat aNumFmt(pActNum->GetLevel(e));
2038 aNumFmt.SetIncludeUpperLevels((sal_uInt8) std::min(pBox->GetValue(), sal_Int64(e + 1)) );
2039 pActNum->SetLevel(e, aNumFmt);
2040 }
2041 nMask <<= 1;
2042 }
2043 }
2044 SetModified();
2045 return 0;
2046 }
2047
2048 /*-----------------02.12.97 08:56-------------------
2049
2050 --------------------------------------------------*/
IMPL_LINK(SvxNumOptionsTabPage,NumberTypeSelectHdl_Impl,ListBox *,pBox)2051 IMPL_LINK( SvxNumOptionsTabPage, NumberTypeSelectHdl_Impl, ListBox *, pBox )
2052 {
2053 String sSelectStyle;
2054 sal_Int16 eOldType;
2055 sal_Bool bShowOrient = sal_False;
2056 sal_Bool bBmp = sal_False;
2057 String aEmptyStr;
2058 sal_uInt16 nMask = 1;
2059 for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2060 {
2061 if(nActNumLvl & nMask)
2062 {
2063 SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
2064 eOldType = aNumFmt.GetNumberingType();
2065 // PAGEDESC gibt es nicht
2066 sal_uInt16 nNumType = (sal_uInt16)(sal_uLong)pBox->GetEntryData(pBox->GetSelectEntryPos());
2067 aNumFmt.SetNumberingType((sal_Int16)nNumType);
2068 sal_uInt16 nNumberingType = aNumFmt.GetNumberingType();
2069 if(SVX_NUM_BITMAP == (nNumberingType&(~LINK_TOKEN)))
2070 {
2071 bBmp |= 0 != aNumFmt.GetBrush();
2072 aNumFmt.SetIncludeUpperLevels( sal_False );
2073 aNumFmt.SetSuffix( aEmptyStr );
2074 aNumFmt.SetPrefix( aEmptyStr );
2075 if(!bBmp)
2076 aNumFmt.SetGraphic(aEmptyStr);
2077 pActNum->SetLevel(i, aNumFmt);
2078 SwitchNumberType(SHOW_BITMAP, bBmp );
2079 bShowOrient = sal_True;
2080 }
2081 else if( SVX_NUM_CHAR_SPECIAL == nNumberingType )
2082 {
2083 aNumFmt.SetIncludeUpperLevels( sal_False );
2084 aNumFmt.SetSuffix( aEmptyStr );
2085 aNumFmt.SetPrefix( aEmptyStr );
2086 if( !aNumFmt.GetBulletFont() )
2087 aNumFmt.SetBulletFont(&aActBulletFont);
2088 if( !aNumFmt.GetBulletChar() )
2089 aNumFmt.SetBulletChar( SVX_DEF_BULLET );
2090 pActNum->SetLevel(i, aNumFmt);
2091 SwitchNumberType(SHOW_BULLET);
2092 //ChgTxtFont(aBulletFT, *aNumFmt.GetBulletFont());
2093 //aBulletFT.SetText( aNumFmt.GetBulletChar() );
2094 // Zuweisung der Zeichenvorlage automatisch
2095 if(bAutomaticCharStyles)
2096 {
2097 sSelectStyle = sBulletCharFmtName;
2098 }
2099 }
2100 else
2101 {
2102 aNumFmt.SetPrefix( aPrefixED.GetText() );
2103 aNumFmt.SetSuffix( aSuffixED.GetText() );
2104 // aNumFmt.SetBulletFont(0);
2105 SwitchNumberType(SHOW_NUMBERING);
2106 pActNum->SetLevel(i, aNumFmt);
2107 CheckForStartValue_Impl(nNumberingType);
2108
2109 // Zuweisung der Zeichenvorlage automatisch
2110 if(bAutomaticCharStyles)
2111 {
2112 sSelectStyle = sNumCharFmtName;
2113 }
2114 }
2115 }
2116 nMask <<= 1;
2117 }
2118 sal_Bool bAllLevelFeature = pActNum->IsFeatureSupported(NUM_CONTINUOUS);
2119 if(bShowOrient && bAllLevelFeature)
2120 {
2121 aOrientFT.Show();
2122 aOrientLB.Show();
2123 }
2124 else
2125 {
2126 aOrientFT.Hide();
2127 aOrientLB.Hide();
2128 }
2129 SetModified();
2130 if(sSelectStyle.Len())
2131 {
2132 aCharFmtLB.SelectEntry(sSelectStyle);
2133 CharFmtHdl_Impl(&aCharFmtLB);
2134 // bAutomaticCharStyles wird im CharFmtHdl_Impl zurueckgesetzt
2135 bAutomaticCharStyles = sal_True;
2136 }
2137 return 0;
2138 }
2139 /* -----------------06.11.2002 14:27-----------------
2140 *
2141 * --------------------------------------------------*/
CheckForStartValue_Impl(sal_uInt16 nNumberingType)2142 void SvxNumOptionsTabPage::CheckForStartValue_Impl(sal_uInt16 nNumberingType)
2143 {
2144 sal_Bool bIsNull = aStartED.GetValue() == 0;
2145 sal_Bool bNoZeroAllowed = nNumberingType < SVX_NUM_ARABIC ||
2146 SVX_NUM_CHARS_UPPER_LETTER_N == nNumberingType ||
2147 SVX_NUM_CHARS_LOWER_LETTER_N == nNumberingType;
2148 aStartED.SetMin(bNoZeroAllowed ? 1 : 0);
2149 if(bIsNull && bNoZeroAllowed)
2150 aStartED.GetModifyHdl().Call(&aStartED);
2151 }
2152 /*-----------------03.12.97 16:43-------------------
2153
2154 --------------------------------------------------*/
IMPL_LINK(SvxNumOptionsTabPage,OrientHdl_Impl,ListBox *,pBox)2155 IMPL_LINK( SvxNumOptionsTabPage, OrientHdl_Impl, ListBox *, pBox )
2156 {
2157 sal_uInt16 nPos = pBox->GetSelectEntryPos();
2158 nPos ++; // kein VERT_NONE
2159
2160 sal_uInt16 nMask = 1;
2161 for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2162 {
2163 if(nActNumLvl & nMask)
2164 {
2165 SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
2166 if(SVX_NUM_BITMAP == (aNumFmt.GetNumberingType()&(~LINK_TOKEN)))
2167 {
2168 const SvxBrushItem* pBrushItem = aNumFmt.GetBrush();
2169 const Size& rSize = aNumFmt.GetGraphicSize();
2170 sal_Int16 eOrient = (sal_Int16)nPos;
2171 aNumFmt.SetGraphicBrush( pBrushItem, &rSize, &eOrient );
2172 pActNum->SetLevel(i, aNumFmt);
2173 }
2174 }
2175 nMask <<= 1;
2176 }
2177 SetModified(sal_False);
2178 return 0;
2179
2180 }
2181
2182 /*-----------------06.12.97 12:00-------------------
2183
2184 --------------------------------------------------*/
IMPL_LINK(SvxNumOptionsTabPage,SameLevelHdl_Impl,CheckBox *,pBox)2185 IMPL_LINK( SvxNumOptionsTabPage, SameLevelHdl_Impl, CheckBox *, pBox )
2186 {
2187 sal_Bool bSet = pBox->IsChecked();
2188 pActNum->SetContinuousNumbering(bSet);
2189 sal_Bool bRepaint = sal_False;
2190 for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2191 {
2192 SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
2193 if(aNumFmt.GetNumberingType() != SVX_NUM_NUMBER_NONE)
2194 {
2195 bRepaint = sal_True;
2196 break;
2197 }
2198 }
2199 SetModified(bRepaint);
2200 InitControls();
2201 return 0;
2202 }
2203 /* -----------------16.11.98 14:20-------------------
2204 *
2205 * --------------------------------------------------*/
IMPL_LINK(SvxNumOptionsTabPage,BulColorHdl_Impl,ColorListBox *,pBox)2206 IMPL_LINK( SvxNumOptionsTabPage, BulColorHdl_Impl, ColorListBox*, pBox )
2207 {
2208 Color nSetColor = pBox->GetSelectEntryColor();
2209
2210 sal_uInt16 nMask = 1;
2211 for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2212 {
2213 if(nActNumLvl & nMask)
2214 {
2215 SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
2216 aNumFmt.SetBulletColor(nSetColor);
2217 pActNum->SetLevel(i, aNumFmt);
2218 }
2219 nMask <<= 1;
2220 }
2221 SetModified();
2222 return 0;
2223 }
2224 /* -----------------16.11.98 14:20-------------------
2225 *
2226 * --------------------------------------------------*/
IMPL_LINK(SvxNumOptionsTabPage,BulRelSizeHdl_Impl,MetricField *,pField)2227 IMPL_LINK( SvxNumOptionsTabPage, BulRelSizeHdl_Impl, MetricField *, pField)
2228 {
2229 sal_uInt16 nRelSize = (sal_uInt16)pField->GetValue();
2230
2231 sal_uInt16 nMask = 1;
2232 for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2233 {
2234 if(nActNumLvl & nMask)
2235 {
2236 SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
2237 aNumFmt.SetBulletRelSize(nRelSize);
2238 pActNum->SetLevel(i, aNumFmt);
2239 }
2240 nMask <<= 1;
2241 }
2242 SetModified();
2243 return 0;
2244 }
2245
2246 /*-----------------02.12.97 10:50-------------------
2247
2248 --------------------------------------------------*/
IMPL_LINK(SvxNumOptionsTabPage,GraphicHdl_Impl,MenuButton *,pButton)2249 IMPL_LINK( SvxNumOptionsTabPage, GraphicHdl_Impl, MenuButton *, pButton )
2250 {
2251 sal_uInt16 nItemId = pButton->GetCurItemId();
2252 String aGrfName;
2253 Size aSize;
2254 sal_Bool bSucc(sal_False);
2255 SvxOpenGraphicDialog aGrfDlg( CUI_RES(RID_STR_EDIT_GRAPHIC) );
2256
2257 if(MN_GALLERY_ENTRY <= nItemId )
2258 {
2259 aGrfName = *((String*)aGrfNames.GetObject( nItemId - MN_GALLERY_ENTRY));
2260 Graphic aGraphic;
2261 if(GalleryExplorer::GetGraphicObj( GALLERY_THEME_BULLETS, nItemId - MN_GALLERY_ENTRY, &aGraphic))
2262 {
2263 aSize = SvxNumberFormat::GetGraphicSizeMM100(&aGraphic);
2264 bSucc = sal_True;
2265 }
2266 }
2267 else
2268 {
2269 aGrfDlg.EnableLink( sal_False );
2270 aGrfDlg.AsLink( sal_False );
2271 if ( !aGrfDlg.Execute() )
2272 {
2273 // ausgewaehlten Filter merken
2274 aGrfName = aGrfDlg.GetPath();
2275
2276 Graphic aGraphic;
2277 if( !aGrfDlg.GetGraphic(aGraphic) )
2278 {
2279 aSize = SvxNumberFormat::GetGraphicSizeMM100(&aGraphic);
2280 bSucc = sal_True;
2281 }
2282 }
2283 }
2284 if(bSucc)
2285 {
2286 aSize = OutputDevice::LogicToLogic(aSize, MAP_100TH_MM, (MapUnit)eCoreUnit);
2287
2288 sal_uInt16 nMask = 1;
2289 for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2290 {
2291 if(nActNumLvl & nMask)
2292 {
2293 SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
2294 aNumFmt.SetCharFmtName(sNumCharFmtName);
2295 aNumFmt.SetGraphic(aGrfName);
2296
2297 // Size schon mal fuer spaeteren Groessenabgleich setzen
2298 const SvxBrushItem* pBrushItem = aNumFmt.GetBrush();
2299 // initiate asynchronous loading
2300 sal_Int16 eOrient = aNumFmt.GetVertOrient();
2301 aNumFmt.SetGraphicBrush( pBrushItem, &aSize, &eOrient );
2302 aInitSize[i] = aNumFmt.GetGraphicSize();
2303
2304 pActNum->SetLevel(i, aNumFmt);
2305 }
2306 nMask <<= 1;
2307 }
2308 aRatioCB .Enable();
2309 aSizeFT .Enable();
2310 aMultFT.Enable();
2311 aWidthMF .Enable();
2312 aHeightMF.Enable();
2313 SetMetricValue(aWidthMF, aSize.Width(), eCoreUnit);
2314 SetMetricValue(aHeightMF, aSize.Height(), eCoreUnit);
2315 aOrientFT.Enable();
2316 aOrientLB.Enable();
2317 SetModified();
2318 //needed due to asynchronous loading of graphics in the SvxBrushItem
2319 aInvalidateTimer.Start();
2320 }
2321 return 0;
2322 }
2323 /* -----------------27.07.99 12:20-------------------
2324
2325 --------------------------------------------------*/
IMPL_LINK(SvxNumOptionsTabPage,PopupActivateHdl_Impl,Menu *,EMPTYARG)2326 IMPL_LINK( SvxNumOptionsTabPage, PopupActivateHdl_Impl, Menu *, EMPTYARG )
2327 {
2328 if(!bMenuButtonInitialized)
2329 {
2330 bMenuButtonInitialized = sal_True;
2331 EnterWait();
2332 PopupMenu* pPopup = aBitmapMB.GetPopupMenu()->GetPopupMenu( MN_GALLERY );
2333 GalleryExplorer::FillObjList(GALLERY_THEME_BULLETS, aGrfNames);
2334 if(aGrfNames.Count())
2335 {
2336 pPopup->RemoveItem( pPopup->GetItemPos( NUM_NO_GRAPHIC ));
2337 String aEmptyStr;
2338 GalleryExplorer::BeginLocking(GALLERY_THEME_BULLETS);
2339
2340 for(sal_uInt16 i = 0; i < aGrfNames.Count(); i++)
2341 {
2342 Graphic aGraphic;
2343 String sGrfName = *(const String*)aGrfNames.GetObject(i);
2344 INetURLObject aObj(sGrfName);
2345 if(aObj.GetProtocol() == INET_PROT_FILE)
2346 sGrfName = aObj.PathToFileName();
2347 if(GalleryExplorer::GetGraphicObj( GALLERY_THEME_BULLETS, i, &aGraphic))
2348 {
2349 Bitmap aBitmap(aGraphic.GetBitmap());
2350 Size aSize(aBitmap.GetSizePixel());
2351 if(aSize.Width() > MAX_BMP_WIDTH ||
2352 aSize.Height() > MAX_BMP_HEIGHT)
2353 {
2354 sal_Bool bWidth = aSize.Width() > aSize.Height();
2355 double nScale = bWidth ?
2356 (double)MAX_BMP_WIDTH / (double)aSize.Width():
2357 (double)MAX_BMP_HEIGHT / (double)aSize.Height();
2358 aBitmap.Scale(nScale, nScale);
2359 }
2360 Image aImage(aBitmap);
2361
2362 pPopup->InsertItem(MN_GALLERY_ENTRY + i, sGrfName, aImage );
2363 }
2364 else
2365 {
2366 Image aImage;
2367 pPopup->InsertItem(
2368 MN_GALLERY_ENTRY + i, sGrfName, aImage );
2369 }
2370 }
2371 GalleryExplorer::EndLocking(GALLERY_THEME_BULLETS);
2372 }
2373 LeaveWait();
2374 }
2375 return 0;
2376 }
2377
2378 /*-----------------02.12.97 10:58-------------------
2379
2380 --------------------------------------------------*/
IMPL_LINK(SvxNumOptionsTabPage,BulletHdl_Impl,Button *,EMPTYARG)2381 IMPL_LINK( SvxNumOptionsTabPage, BulletHdl_Impl, Button *, EMPTYARG )
2382 {
2383 SvxCharacterMap* pMap = new SvxCharacterMap( this, sal_True );
2384
2385 sal_uInt16 nMask = 1;
2386 const Font* pFmtFont = 0;
2387 sal_Bool bSameBullet = sal_True;
2388 sal_Unicode cBullet = 0;
2389 sal_Bool bFirst = sal_True;
2390 for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2391 {
2392 if(nActNumLvl & nMask)
2393 {
2394 const SvxNumberFormat& rCurFmt = pActNum->GetLevel(i);
2395 if(bFirst)
2396 {
2397 cBullet = rCurFmt.GetBulletChar();
2398 }
2399 else if(rCurFmt.GetBulletChar() != cBullet )
2400 {
2401 bSameBullet = sal_False;
2402 break;
2403 }
2404 if(!pFmtFont)
2405 pFmtFont = rCurFmt.GetBulletFont();
2406 bFirst = sal_False;
2407 }
2408 nMask <<= 1;
2409
2410 }
2411
2412 if(pFmtFont)
2413 pMap->SetCharFont(*pFmtFont);
2414 else
2415 pMap->SetCharFont(aActBulletFont);
2416 if(bSameBullet)
2417 pMap->SetChar( cBullet );
2418 if(pMap->Execute() == RET_OK)
2419 {
2420 // Font Numrules umstellen
2421 aActBulletFont = pMap->GetCharFont();
2422
2423 sal_uInt16 _nMask = 1;
2424 for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2425 {
2426 if(nActNumLvl & _nMask)
2427 {
2428 SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
2429 aNumFmt.SetBulletFont(&aActBulletFont); ;
2430 aNumFmt.SetBulletChar( (sal_Unicode) pMap->GetChar() );
2431 pActNum->SetLevel(i, aNumFmt);
2432 }
2433 _nMask <<= 1;
2434 }
2435
2436 SetModified();
2437 }
2438 delete pMap;
2439 return 0;
2440 }
2441
2442 /*-----------------03.03.97 15:21-------------------
2443
2444 --------------------------------------------------*/
2445
IMPL_LINK(SvxNumOptionsTabPage,SizeHdl_Impl,MetricField *,pField)2446 IMPL_LINK( SvxNumOptionsTabPage, SizeHdl_Impl, MetricField *, pField)
2447 {
2448 sal_Bool bWidth = pField == &aWidthMF;
2449 bLastWidthModified = bWidth;
2450 sal_Bool bRatio = aRatioCB.IsChecked();
2451 long nWidthVal = static_cast<long>(aWidthMF.Denormalize(aWidthMF.GetValue(FUNIT_100TH_MM)));
2452 long nHeightVal = static_cast<long>(aHeightMF.Denormalize(aHeightMF.GetValue(FUNIT_100TH_MM)));
2453 nWidthVal = OutputDevice::LogicToLogic( nWidthVal ,
2454 MAP_100TH_MM, (MapUnit)eCoreUnit );
2455 nHeightVal = OutputDevice::LogicToLogic( nHeightVal,
2456 MAP_100TH_MM, (MapUnit)eCoreUnit);
2457 double fSizeRatio;
2458
2459 sal_Bool bRepaint = sal_False;
2460 sal_uInt16 nMask = 1;
2461 for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2462 {
2463 if(nActNumLvl & nMask)
2464 {
2465 SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
2466 if(SVX_NUM_BITMAP == (aNumFmt.GetNumberingType()&(~LINK_TOKEN)))
2467 {
2468 Size aSize(aNumFmt.GetGraphicSize() );
2469 Size aSaveSize(aSize);
2470
2471 if (aInitSize[i].Height())
2472 fSizeRatio = (double)aInitSize[i].Width() / (double)aInitSize[i].Height();
2473 else
2474 fSizeRatio = (double)1;
2475
2476 if(bWidth)
2477 {
2478 long nDelta = nWidthVal - aInitSize[i].Width();
2479 aSize.Width() = nWidthVal;
2480 if (bRatio)
2481 {
2482 aSize.Height() = aInitSize[i].Height() + (long)((double)nDelta / fSizeRatio);
2483 aHeightMF.SetUserValue(aHeightMF.Normalize(
2484 OutputDevice::LogicToLogic( aSize.Height(), (MapUnit)eCoreUnit, MAP_100TH_MM )),
2485 FUNIT_100TH_MM);
2486 }
2487 }
2488 else
2489 {
2490 long nDelta = nHeightVal - aInitSize[i].Height();
2491 aSize.Height() = nHeightVal;
2492 if (bRatio)
2493 {
2494 aSize.Width() = aInitSize[i].Width() + (long)((double)nDelta * fSizeRatio);
2495 aWidthMF.SetUserValue(aWidthMF.Normalize(
2496 OutputDevice::LogicToLogic( aSize.Width(), (MapUnit)eCoreUnit, MAP_100TH_MM )),
2497 FUNIT_100TH_MM);
2498 }
2499 }
2500 const SvxBrushItem* pBrushItem = aNumFmt.GetBrush();
2501 sal_Int16 eOrient = aNumFmt.GetVertOrient();
2502 if(aSize != aSaveSize)
2503 bRepaint = sal_True;
2504 aNumFmt.SetGraphicBrush( pBrushItem, &aSize, &eOrient );
2505 pActNum->SetLevel(i, aNumFmt);
2506 }
2507 }
2508 nMask <<= 1;
2509 }
2510 SetModified(bRepaint);
2511 return 0;
2512 }
2513
2514 /*------------------------------------------------------------------------
2515 Beschreibung:
2516 ------------------------------------------------------------------------*/
2517
IMPL_LINK(SvxNumOptionsTabPage,RatioHdl_Impl,CheckBox *,pBox)2518 IMPL_LINK( SvxNumOptionsTabPage, RatioHdl_Impl, CheckBox *, pBox )
2519 {
2520 if (pBox->IsChecked())
2521 {
2522 if (bLastWidthModified)
2523 SizeHdl_Impl(&aWidthMF);
2524 else
2525 SizeHdl_Impl(&aHeightMF);
2526 }
2527 return 0;
2528 }
2529
2530 /*-----------------02.12.97 16:07-------------------
2531
2532 --------------------------------------------------*/
IMPL_LINK(SvxNumOptionsTabPage,CharFmtHdl_Impl,ListBox *,EMPTYARG)2533 IMPL_LINK( SvxNumOptionsTabPage, CharFmtHdl_Impl, ListBox *, EMPTYARG )
2534 {
2535 bAutomaticCharStyles = sal_False;
2536 sal_uInt16 nEntryPos = aCharFmtLB.GetSelectEntryPos();
2537 String sEntry = aCharFmtLB.GetSelectEntry();
2538 sal_uInt16 nMask = 1;
2539 String aEmptyStr;
2540 for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2541 {
2542 if(nActNumLvl & nMask)
2543 {
2544 SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
2545 if( 0 == nEntryPos )
2546 aNumFmt.SetCharFmtName(aEmptyStr);
2547 else
2548 {
2549 if(SVX_NUM_BITMAP != (aNumFmt.GetNumberingType()&(~LINK_TOKEN)))
2550 aNumFmt.SetCharFmtName(sEntry);
2551 }
2552 pActNum->SetLevel(i, aNumFmt);
2553 }
2554 nMask <<= 1;
2555 }
2556 SetModified(sal_False);
2557 return 0;
2558
2559 };
2560
2561 /*-----------------03.12.97 11:01-------------------
2562
2563 --------------------------------------------------*/
IMPL_LINK(SvxNumOptionsTabPage,EditModifyHdl_Impl,Edit *,pEdit)2564 IMPL_LINK( SvxNumOptionsTabPage, EditModifyHdl_Impl, Edit *, pEdit )
2565 {
2566 sal_Bool bPrefix = pEdit == &aPrefixED;
2567 sal_Bool bSuffix = pEdit == &aSuffixED;
2568 sal_Bool bStart = pEdit == &aStartED;
2569 sal_uInt16 nMask = 1;
2570 for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
2571 {
2572 if(nActNumLvl & nMask)
2573 {
2574 SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
2575 if(bPrefix)
2576 aNumFmt.SetPrefix( aPrefixED.GetText() );
2577 else if(bSuffix)
2578 aNumFmt.SetSuffix( aSuffixED.GetText() );
2579 else if(bStart)
2580 aNumFmt.SetStart( (sal_uInt16)aStartED.GetValue() );
2581 else //align
2582 {
2583 sal_uInt16 nPos = aAlignLB.GetSelectEntryPos();
2584 SvxAdjust eAdjust = SVX_ADJUST_CENTER;
2585 if(nPos == 0)
2586 eAdjust = SVX_ADJUST_LEFT;
2587 else if(nPos == 2)
2588 eAdjust = SVX_ADJUST_RIGHT;
2589 aNumFmt.SetNumAdjust( eAdjust );
2590 }
2591 pActNum->SetLevel(i, aNumFmt);
2592 }
2593 nMask <<= 1;
2594 }
2595 SetModified();
2596
2597 return 0;
2598 }
2599
2600 /*-----------------09.12.97 11:49-------------------
2601
2602 --------------------------------------------------*/
lcl_DrawGraphic(VirtualDevice * pVDev,const SvxNumberFormat & rFmt,sal_uInt16 nXStart,sal_uInt16 nYStart,sal_uInt16 nDivision)2603 sal_uInt16 lcl_DrawGraphic(VirtualDevice* pVDev, const SvxNumberFormat &rFmt, sal_uInt16 nXStart,
2604 sal_uInt16 nYStart, sal_uInt16 nDivision)
2605 {
2606 const SvxBrushItem* pBrushItem = rFmt.GetBrush();
2607 sal_uInt16 nRet = 0;
2608 if(pBrushItem)
2609 {
2610 const Graphic* pGrf = pBrushItem->GetGraphic();
2611 if(pGrf)
2612 {
2613 Size aGSize( rFmt.GetGraphicSize() );
2614 aGSize.Width() /= nDivision;
2615 nRet = (sal_uInt16)aGSize.Width();
2616 aGSize.Height() /= nDivision;
2617 pGrf->Draw( pVDev, Point(nXStart,nYStart),
2618 pVDev->PixelToLogic( aGSize ) );
2619 }
2620 }
2621 return nRet;
2622
2623 }
2624
2625 /*-----------------09.12.97 11:54-------------------
2626
2627 --------------------------------------------------*/
lcl_DrawBullet(VirtualDevice * pVDev,const SvxNumberFormat & rFmt,sal_uInt16 nXStart,sal_uInt16 nYStart,const Size & rSize)2628 sal_uInt16 lcl_DrawBullet(VirtualDevice* pVDev,
2629 const SvxNumberFormat& rFmt, sal_uInt16 nXStart,
2630 sal_uInt16 nYStart, const Size& rSize)
2631 {
2632 Font aTmpFont(pVDev->GetFont());
2633
2634 //per Uno kann es sein, dass kein Font gesetzt ist!
2635 Font aFont(rFmt.GetBulletFont() ? *rFmt.GetBulletFont() : aTmpFont);
2636 Size aTmpSize(rSize);
2637 aTmpSize.Width() *= rFmt.GetBulletRelSize();
2638 aTmpSize.Width() /= 100 ;
2639 aTmpSize.Height() *= rFmt.GetBulletRelSize();
2640 aTmpSize.Height() /= 100 ;
2641 // bei einer Hoehe von Null wird in Ursprungshoehe gezeichnet
2642 if(!aTmpSize.Height())
2643 aTmpSize.Height() = 1;
2644 aFont.SetSize(aTmpSize);
2645 aFont.SetTransparent(sal_True);
2646 Color aBulletColor = rFmt.GetBulletColor();
2647 if(aBulletColor.GetColor() == COL_AUTO)
2648 aBulletColor = Color(pVDev->GetFillColor().IsDark() ? COL_WHITE : COL_BLACK);
2649 else if(aBulletColor == pVDev->GetFillColor())
2650 aBulletColor.Invert();
2651 aFont.SetColor(aBulletColor);
2652 pVDev->SetFont( aFont );
2653 String aText(sal_Unicode(rFmt.GetBulletChar()));
2654 long nY = nYStart;
2655 nY -= ((aTmpSize.Height() - rSize.Height())/ 2);
2656 pVDev->DrawText( Point(nXStart, nY), aText );
2657 sal_uInt16 nRet = (sal_uInt16)pVDev->GetTextWidth(aText);
2658
2659 pVDev->SetFont(aTmpFont);
2660 return nRet;
2661 }
2662 /*-----------------02.12.97 10:34-------------------
2663 Vorschau der Numerierung painten
2664 --------------------------------------------------*/
Paint(const Rectangle &)2665 void SvxNumberingPreview::Paint( const Rectangle& /*rRect*/ )
2666 {
2667 Size aSize(PixelToLogic(GetOutputSizePixel()));
2668 Rectangle aRect(Point(0,0), aSize);
2669
2670 const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
2671 const Color aBackColor = rStyleSettings.GetFieldColor();
2672 const Color aTextColor = rStyleSettings.GetFieldTextColor();
2673
2674 VirtualDevice* pVDev = new VirtualDevice(*this);
2675 pVDev->EnableRTL( IsRTLEnabled() );
2676 pVDev->SetMapMode(GetMapMode());
2677 pVDev->SetOutputSize( aSize );
2678
2679 Color aLineColor(COL_LIGHTGRAY);
2680 if(aLineColor == aBackColor)
2681 aLineColor.Invert();
2682 pVDev->SetLineColor(aLineColor);
2683 pVDev->SetFillColor( aBackColor );
2684 pVDev->DrawRect(aRect);
2685
2686 if(pActNum)
2687 {
2688 sal_uInt16 nWidthRelation;
2689 if(nPageWidth)
2690 {
2691 nWidthRelation = sal_uInt16 (nPageWidth / aSize.Width());
2692 if(bPosition)
2693 nWidthRelation = nWidthRelation * 2 / 3;
2694 else
2695 nWidthRelation = nWidthRelation / 4;
2696 }
2697 else
2698 nWidthRelation = 30; // Kapiteldialog
2699
2700 //Hoehe pro Ebene
2701 sal_uInt16 nXStep = sal::static_int_cast< sal_uInt16 >(aSize.Width() / (3 * pActNum->GetLevelCount()));
2702 if(pActNum->GetLevelCount() < 10)
2703 nXStep /= 2;
2704 sal_uInt16 nYStart = 4;
2705 // fuer ein einziges Level darf nicht die gesamte Hoehe benutzt werden
2706 sal_uInt16 nYStep = sal::static_int_cast< sal_uInt16 >((aSize.Height() - 6)/ (pActNum->GetLevelCount() > 1 ? pActNum->GetLevelCount() : 5));
2707 aStdFont = OutputDevice::GetDefaultFont(
2708 DEFAULTFONT_UI_SANS, MsLangId::getSystemLanguage(), DEFAULTFONT_FLAGS_ONLYONE);
2709 aStdFont.SetColor(aTextColor);
2710 aStdFont.SetFillColor(aBackColor);
2711
2712 //
2713 sal_uInt16 nFontHeight = nYStep * 6 / 10;
2714 if(bPosition)
2715 nFontHeight = nYStep * 15 / 10;
2716 aStdFont.SetSize(Size( 0, nFontHeight ));
2717
2718 SvxNodeNum aNum( (sal_uInt8)0 );
2719 sal_uInt16 nPreNum = pActNum->GetLevel(0).GetStart();
2720
2721 if(bPosition)
2722 {
2723 sal_uInt16 nLineHeight = nFontHeight * 8 / 7;
2724 sal_uInt8 nStart = 0;
2725 while( !(nActLevel & (1<<nStart)) )
2726 {
2727 nStart++;
2728 }
2729 if(nStart)
2730 nStart--;
2731 sal_uInt8 nEnd = std::min( (sal_uInt8)(nStart + 3), (sal_uInt8)pActNum->GetLevelCount() );
2732 for( sal_uInt8 nLevel = nStart; nLevel < nEnd; ++nLevel )
2733 {
2734 const SvxNumberFormat &rFmt = pActNum->GetLevel(nLevel);
2735 aNum.GetLevelVal()[ nLevel ] = rFmt.GetStart();
2736
2737 // --> OD 2008-01-16 #newlistlevelattrs#
2738 sal_uInt16 nXStart( 0 );
2739 short nTextOffset( 0 );
2740 sal_uInt16 nNumberXPos( 0 );
2741 if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2742 {
2743 nXStart = rFmt.GetAbsLSpace() / nWidthRelation;
2744 nTextOffset = rFmt.GetCharTextDistance() / nWidthRelation;
2745 nNumberXPos = nXStart;
2746 sal_uInt16 nFirstLineOffset = (-rFmt.GetFirstLineOffset()) / nWidthRelation;
2747
2748 if(nFirstLineOffset <= nNumberXPos)
2749 nNumberXPos = nNumberXPos - nFirstLineOffset;
2750 else
2751 nNumberXPos = 0;
2752 //im draw ist das zulaeesig
2753 if(nTextOffset < 0)
2754 nNumberXPos = nNumberXPos + nTextOffset;
2755 }
2756 else if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
2757 {
2758 const long nTmpNumberXPos( ( rFmt.GetIndentAt() +
2759 rFmt.GetFirstLineIndent() ) /
2760 nWidthRelation );
2761 if ( nTmpNumberXPos < 0 )
2762 {
2763 nNumberXPos = 0;
2764 }
2765 else
2766 {
2767 nNumberXPos = static_cast<sal_uInt16>( nTmpNumberXPos );
2768 }
2769 }
2770 // <--
2771
2772 sal_uInt16 nBulletWidth = 0;
2773 if( SVX_NUM_BITMAP == (rFmt.GetNumberingType() &(~LINK_TOKEN)))
2774 {
2775 nBulletWidth = rFmt.IsShowSymbol() ? lcl_DrawGraphic(pVDev, rFmt,
2776 nNumberXPos,
2777 nYStart, nWidthRelation) : 0;
2778 }
2779 else if( SVX_NUM_CHAR_SPECIAL == rFmt.GetNumberingType() )
2780 {
2781 nBulletWidth = rFmt.IsShowSymbol() ?
2782 lcl_DrawBullet(pVDev, rFmt, nNumberXPos, nYStart, aStdFont.GetSize()) : 0;
2783 }
2784 else
2785 {
2786 pVDev->SetFont(aStdFont);
2787 aNum.SetLevel( nLevel );
2788 if(pActNum->IsContinuousNumbering())
2789 aNum.GetLevelVal()[nLevel] = nPreNum;
2790 String aText(pActNum->MakeNumString( aNum ));
2791 Font aSaveFont = pVDev->GetFont();
2792 Font aColorFont(aSaveFont);
2793 Color aTmpBulletColor = rFmt.GetBulletColor();
2794 if(aTmpBulletColor.GetColor() == COL_AUTO)
2795 aTmpBulletColor = Color(aBackColor.IsDark() ? COL_WHITE : COL_BLACK);
2796 else if(aTmpBulletColor == aBackColor)
2797 aTmpBulletColor.Invert();
2798 aColorFont.SetColor(aTmpBulletColor);
2799 pVDev->SetFont(aColorFont);
2800 pVDev->DrawText( Point(nNumberXPos, nYStart), aText );
2801 pVDev->SetFont(aSaveFont);
2802 nBulletWidth = (sal_uInt16)pVDev->GetTextWidth(aText);
2803 nPreNum++;
2804 }
2805 // --> OD 2008-01-16 #newlistlevelattrs#
2806 if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT &&
2807 rFmt.GetLabelFollowedBy() == SvxNumberFormat::SPACE )
2808 {
2809 pVDev->SetFont(aStdFont);
2810 String aText(' ');
2811 pVDev->DrawText( Point(nNumberXPos, nYStart), aText );
2812 nBulletWidth = nBulletWidth + (sal_uInt16)pVDev->GetTextWidth(aText);
2813 }
2814
2815 // --> OD 2008-01-16 #newlistlevelattrs#
2816 sal_uInt16 nTextXPos( 0 );
2817 if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2818 {
2819 nTextXPos = nXStart;
2820 if(nTextOffset < 0)
2821 nTextXPos = nTextXPos + nTextOffset;
2822 if(nNumberXPos + nBulletWidth + nTextOffset > nTextXPos )
2823 nTextXPos = nNumberXPos + nBulletWidth + nTextOffset;
2824 }
2825 else if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
2826 {
2827 switch ( rFmt.GetLabelFollowedBy() )
2828 {
2829 case SvxNumberFormat::LISTTAB:
2830 {
2831 nTextXPos = static_cast<sal_uInt16>(
2832 rFmt.GetListtabPos() / nWidthRelation );
2833 if ( nTextXPos < nNumberXPos + nBulletWidth )
2834 {
2835 nTextXPos = nNumberXPos + nBulletWidth;
2836 }
2837 }
2838 break;
2839 case SvxNumberFormat::SPACE:
2840 case SvxNumberFormat::NOTHING:
2841 {
2842 nTextXPos = nNumberXPos + nBulletWidth;
2843 }
2844 break;
2845 }
2846
2847 nXStart = static_cast<sal_uInt16>( rFmt.GetIndentAt() / nWidthRelation );
2848 }
2849 // <--
2850
2851 Rectangle aRect1(Point(nTextXPos, nYStart + nFontHeight / 2), Size(aSize.Width() / 2, 2));
2852 pVDev->SetFillColor( aBackColor );
2853 pVDev->DrawRect( aRect1 );
2854
2855 Rectangle aRect2(Point(nXStart, nYStart + nLineHeight + nFontHeight / 2 ), Size(aSize.Width() / 2, 2));
2856 pVDev->DrawRect( aRect2 );
2857 nYStart += 2 * nLineHeight;
2858 }
2859 }
2860 else
2861 {
2862 //#i5153# painting gray or black rectangles as 'normal' numbering text
2863 String sMsg( RTL_CONSTASCII_USTRINGPARAM( "Preview") );
2864 long nWidth = pVDev->GetTextWidth(sMsg);
2865 long nTextHeight = pVDev->GetTextHeight();
2866 long nRectHeight = nTextHeight * 2 / 3;
2867 long nTopOffset = nTextHeight - nRectHeight;
2868 Color aBlackColor(COL_BLACK);
2869 if(aBlackColor == aBackColor)
2870 aBlackColor.Invert();
2871
2872 for( sal_uInt8 nLevel = 0; nLevel < pActNum->GetLevelCount();
2873 ++nLevel, nYStart = nYStart + nYStep )
2874 {
2875 const SvxNumberFormat &rFmt = pActNum->GetLevel(nLevel);
2876 aNum.GetLevelVal()[ nLevel ] = rFmt.GetStart();
2877 // --> OD 2008-01-31 #newlistlevelattrs#
2878 sal_uInt16 nXStart( 0 );
2879 if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
2880 {
2881 nXStart = rFmt.GetAbsLSpace() / nWidthRelation;
2882 }
2883 else if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
2884 {
2885 const long nTmpXStart( ( rFmt.GetIndentAt() +
2886 rFmt.GetFirstLineIndent() ) /
2887 nWidthRelation );
2888 if ( nTmpXStart < 0 )
2889 {
2890 nXStart = 0;
2891 }
2892 else
2893 {
2894 nXStart = static_cast<sal_uInt16>(nTmpXStart);
2895 }
2896 }
2897 nXStart /= 2;
2898 nXStart += 2;
2899 // <--
2900 sal_uInt16 nTextOffset = 2 * nXStep;
2901 if( SVX_NUM_BITMAP == (rFmt.GetNumberingType()&(~LINK_TOKEN)) )
2902 {
2903 if(rFmt.IsShowSymbol())
2904 {
2905 nTextOffset = lcl_DrawGraphic(pVDev, rFmt, nXStart, nYStart, nWidthRelation);
2906 nTextOffset = nTextOffset + nXStep;
2907 }
2908 }
2909 else if( SVX_NUM_CHAR_SPECIAL == rFmt.GetNumberingType() )
2910 {
2911 if(rFmt.IsShowSymbol())
2912 {
2913 nTextOffset = lcl_DrawBullet(pVDev, rFmt, nXStart, nYStart, aStdFont.GetSize());
2914 nTextOffset = nTextOffset + nXStep;
2915 }
2916 }
2917 else
2918 {
2919 Font aColorFont(aStdFont);
2920 Color aTmpBulletColor = rFmt.GetBulletColor();
2921 if(aTmpBulletColor.GetColor() == COL_AUTO)
2922 aTmpBulletColor = Color(aBackColor.IsDark() ? COL_WHITE : COL_BLACK);
2923 else if(aTmpBulletColor == aBackColor)
2924 aTmpBulletColor.Invert();
2925 aColorFont.SetColor(aTmpBulletColor);
2926 pVDev->SetFont(aColorFont);
2927 aNum.SetLevel( nLevel );
2928 if(pActNum->IsContinuousNumbering())
2929 aNum.GetLevelVal()[nLevel] = nPreNum;
2930 String aText(pActNum->MakeNumString( aNum ));
2931 pVDev->DrawText( Point(nXStart, nYStart), aText );
2932 pVDev->SetFont(aStdFont);
2933 nTextOffset = (sal_uInt16)pVDev->GetTextWidth(aText);
2934 nTextOffset = nTextOffset + nXStep;
2935 nPreNum++;
2936 }
2937 if(pOutlineNames)
2938 {
2939 //#i5153# outline numberings still use the style names as text
2940 pVDev->SetFont(aStdFont);
2941 sMsg = pOutlineNames[nLevel];
2942 pVDev->DrawText( Point(nXStart + nTextOffset, nYStart), sMsg );
2943 }
2944 else
2945 {
2946 //#i5153# the selected rectangle(s) should be black
2947 if( 0 != (nActLevel & (1<<nLevel)))
2948 {
2949 pVDev->SetFillColor( aBlackColor );
2950 pVDev->SetLineColor( aBlackColor );
2951 }
2952 else
2953 {
2954 //#i5153# unselected levels are gray
2955 pVDev->SetFillColor( aLineColor );
2956 pVDev->SetLineColor( aLineColor );
2957 }
2958 Rectangle aRect1(Point(nXStart + nTextOffset, nYStart + nTopOffset), Size(nWidth, nRectHeight));
2959 pVDev->DrawRect(aRect1);
2960 }
2961 }
2962 }
2963 }
2964 DrawOutDev( Point(0,0), aSize,
2965 Point(0,0), aSize,
2966 *pVDev );
2967 delete pVDev;
2968
2969 }
2970
2971 /*-----------------03.12.97 10:02-------------------
2972
2973 --------------------------------------------------*/
SvxNumPositionTabPage(Window * pParent,const SfxItemSet & rSet)2974 SvxNumPositionTabPage::SvxNumPositionTabPage(Window* pParent,
2975 const SfxItemSet& rSet) :
2976 SfxTabPage( pParent, CUI_RES( RID_SVXPAGE_NUM_POSITION ), rSet ),
2977 aPositionFL( this, CUI_RES(FL_POSITION )),
2978 aLevelFT( this, CUI_RES(FT_LEVEL )),
2979 aLevelLB( this, CUI_RES(LB_LEVEL )),
2980 aDistBorderFT( this, CUI_RES(FT_BORDERDIST )),
2981 aDistBorderMF( this, CUI_RES(MF_BORDERDIST )),
2982 aRelativeCB( this, CUI_RES(CB_RELATIVE )),
2983 aIndentFT( this, CUI_RES(FT_INDENT )),
2984 aIndentMF( this, CUI_RES(MF_INDENT )),
2985 aDistNumFT( this, CUI_RES(FT_NUMDIST )),
2986 aDistNumMF( this, CUI_RES(MF_NUMDIST )),
2987 aAlignFT( this, CUI_RES(FT_ALIGN )),
2988 aAlignLB( this, CUI_RES(LB_ALIGN )),
2989 // --> OD 2008-01-10 #newlistlevelattrs#
2990 aLabelFollowedByFT( this, CUI_RES(FT_LABEL_FOLLOWED_BY) ),
2991 aLabelFollowedByLB( this, CUI_RES(LB_LABEL_FOLLOWED_BY) ),
2992 aListtabFT( this, CUI_RES(FT_LISTTAB) ),
2993 aListtabMF( this, CUI_RES(MF_LISTTAB) ),
2994 aAlign2FT( this, CUI_RES(FT_ALIGN_2) ),
2995 aAlign2LB( this, CUI_RES(LB_ALIGN_2) ),
2996 aAlignedAtFT( this, CUI_RES(FT_ALIGNED_AT) ),
2997 aAlignedAtMF( this, CUI_RES(MF_ALIGNED_AT) ),
2998 aIndentAtFT( this, CUI_RES(FT_INDENT_AT) ),
2999 aIndentAtMF( this, CUI_RES(MF_INDENT_AT) ),
3000 // <--
3001 aStandardPB( this, CUI_RES(PB_STANDARD )),
3002 pPreviewWIN( new SvxNumberingPreview(this, CUI_RES(WIN_PREVIEW ))),
3003 pActNum(0),
3004 pSaveNum(0),
3005 nActNumLvl( USHRT_MAX ),
3006 nNumItemId(SID_ATTR_NUMBERING_RULE),
3007 bModified(false),
3008 bPreset(false),
3009 bInInintControl(sal_False),
3010 // --> OD 2008-01-11 #newlistlevelattrs#
3011 bLabelAlignmentPosAndSpaceModeActive( false )
3012 // <--
3013 {
3014 FreeResource();
3015 SetExchangeSupport();
3016 pPreviewWIN->SetBackground(Wallpaper(Color(COL_TRANSPARENT)));
3017
3018 aRelativeCB.Check();
3019 aAlignLB.SetSelectHdl(LINK(this, SvxNumPositionTabPage, EditModifyHdl_Impl));
3020 // --> OD 2008-01-10 #newlistlevelattrs#
3021 aAlign2LB.SetSelectHdl(LINK(this, SvxNumPositionTabPage, EditModifyHdl_Impl));
3022 for ( sal_uInt16 i = 0; i < aAlignLB.GetEntryCount(); ++i )
3023 {
3024 aAlign2LB.InsertEntry( aAlignLB.GetEntry( i ) );
3025 }
3026 aAlign2LB.SetDropDownLineCount( aAlign2LB.GetEntryCount() );
3027 aAlign2FT.SetText( aAlignFT.GetText() );
3028 // <--
3029
3030 Link aLk = LINK(this, SvxNumPositionTabPage, DistanceHdl_Impl);
3031
3032 aDistBorderMF.SetUpHdl(aLk);
3033 aDistBorderMF.SetDownHdl(aLk);
3034 aDistBorderMF.SetLoseFocusHdl(aLk);
3035
3036 aDistNumMF.SetUpHdl(aLk);
3037 aDistNumMF.SetDownHdl(aLk);
3038 aDistNumMF.SetLoseFocusHdl(aLk);
3039
3040 aIndentMF.SetUpHdl(aLk);
3041 aIndentMF.SetDownHdl(aLk);
3042 aIndentMF.SetLoseFocusHdl(aLk);
3043
3044 // --> OD 2008-01-10 #newlistlevelattrs#
3045 aLabelFollowedByLB.SetDropDownLineCount( aLabelFollowedByLB.GetEntryCount() );
3046 aLabelFollowedByLB.SetSelectHdl( LINK(this, SvxNumPositionTabPage, LabelFollowedByHdl_Impl) );
3047
3048 aLk = LINK(this, SvxNumPositionTabPage, ListtabPosHdl_Impl);
3049 aListtabMF.SetUpHdl(aLk);
3050 aListtabMF.SetDownHdl(aLk);
3051 aListtabMF.SetLoseFocusHdl(aLk);
3052
3053 aLk = LINK(this, SvxNumPositionTabPage, AlignAtHdl_Impl);
3054 aAlignedAtMF.SetUpHdl(aLk);
3055 aAlignedAtMF.SetDownHdl(aLk);
3056 aAlignedAtMF.SetLoseFocusHdl(aLk);
3057
3058 aLk = LINK(this, SvxNumPositionTabPage, IndentAtHdl_Impl);
3059 aIndentAtMF.SetUpHdl(aLk);
3060 aIndentAtMF.SetDownHdl(aLk);
3061 aIndentAtMF.SetLoseFocusHdl(aLk);
3062 // <--
3063
3064 aLevelLB.SetSelectHdl(LINK(this, SvxNumPositionTabPage, LevelHdl_Impl));
3065 aRelativeCB.SetClickHdl(LINK(this, SvxNumPositionTabPage, RelativeHdl_Impl));
3066 aStandardPB.SetClickHdl(LINK(this, SvxNumPositionTabPage, StandardHdl_Impl));
3067
3068
3069 aRelativeCB.Check(bLastRelative);
3070 pPreviewWIN->SetPositionMode();
3071 eCoreUnit = rSet.GetPool()->GetMetric(rSet.GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE));
3072
3073 //HACK("der Wert sollte mal sinnvol gesetzt werden")
3074 long nWidth = 10000;
3075 nWidth = OutputDevice::LogicToLogic( nWidth,
3076 (MapUnit)eCoreUnit, MAP_100TH_MM );
3077
3078 aDistBorderMF.SetMax(aDistBorderMF.Normalize( nWidth ), FUNIT_100TH_MM );
3079 aDistNumMF .SetMax(aDistNumMF .Normalize( nWidth ), FUNIT_100TH_MM );
3080 aIndentMF .SetMax(aIndentMF .Normalize( nWidth ), FUNIT_100TH_MM );
3081 // --> OD 2008-02-18 #newlistlevelattrs#
3082 aListtabMF.SetMax(aListtabMF.Normalize( nWidth ), FUNIT_100TH_MM );
3083 aAlignedAtMF.SetMax(aAlignedAtMF.Normalize( nWidth ), FUNIT_100TH_MM );
3084 aIndentAtMF.SetMax(aIndentAtMF.Normalize( nWidth ), FUNIT_100TH_MM );
3085 // <--
3086 long nLast2 = nWidth /2;
3087 aDistBorderMF.SetLast( aDistBorderMF.Normalize( nLast2 ), FUNIT_100TH_MM );
3088 aDistNumMF .SetLast( aDistNumMF .Normalize( nLast2 ), FUNIT_100TH_MM );
3089 aIndentMF .SetLast( aIndentMF .Normalize( nLast2 ), FUNIT_100TH_MM );
3090 // --> OD 2008-02-18 #newlistlevelattrs#
3091 aListtabMF.SetLast(aListtabMF.Normalize( nLast2 ), FUNIT_100TH_MM );
3092 aAlignedAtMF.SetLast(aAlignedAtMF.Normalize( nLast2 ), FUNIT_100TH_MM );
3093 aIndentAtMF.SetLast(aIndentAtMF.Normalize( nLast2 ), FUNIT_100TH_MM );
3094 // <--
3095
3096 #if OSL_DEBUG_LEVEL > 1
3097 pDebugFixedText = new FixedText(this, 0);
3098 pDebugFixedText->Show();
3099 Size aSize(200, 20);
3100 Point aPos(250,0);
3101
3102 pDebugFixedText->SetPosSizePixel(aPos, aSize);
3103 pDebugFixedText->SetText( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "Das ist ein Debug-Text" ) ) );
3104 #endif
3105
3106 aStandardPB.SetAccessibleRelationMemberOf(&aPositionFL);
3107 }
3108 /*-----------------03.12.97 10:02-------------------
3109
3110 --------------------------------------------------*/
~SvxNumPositionTabPage()3111 SvxNumPositionTabPage::~SvxNumPositionTabPage()
3112 {
3113 delete pActNum;
3114 delete pPreviewWIN;
3115 delete pSaveNum;
3116 #if OSL_DEBUG_LEVEL > 1
3117 delete pDebugFixedText;
3118 #endif
3119 }
3120 /*-------------------------------------------------------*/
3121
3122 #if OSL_DEBUG_LEVEL > 1
lcl_PrintDebugOutput(FixedText & rFixed,const SvxNumberFormat & rNumFmt)3123 void lcl_PrintDebugOutput(FixedText& rFixed, const SvxNumberFormat& rNumFmt)
3124 {
3125 #define TWIP_TO_MM100(TWIP) ((TWIP) >= 0 ? (((TWIP)*127L+36L)/72L) : (((TWIP)*127L-36L)/72L))
3126
3127 sal_Char const sHash[] = " # ";
3128 if ( rNumFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
3129 {
3130 String sDebugText( UniString::CreateFromInt32( TWIP_TO_MM100(rNumFmt.GetAbsLSpace() ) ) );
3131 sDebugText.AppendAscii( RTL_CONSTASCII_STRINGPARAM( sHash ) );
3132 sDebugText += UniString::CreateFromInt32( TWIP_TO_MM100(rNumFmt.GetCharTextDistance() ) );
3133 sDebugText.AppendAscii( RTL_CONSTASCII_STRINGPARAM( sHash ) );
3134 sDebugText += UniString::CreateFromInt32( TWIP_TO_MM100(rNumFmt.GetFirstLineOffset() ) );
3135 rFixed.SetText(sDebugText);
3136 }
3137 else if ( rNumFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
3138 {
3139 String sDebugText( UniString::CreateFromInt32( TWIP_TO_MM100(rNumFmt.GetListtabPos() ) ) );
3140 sDebugText.AppendAscii( RTL_CONSTASCII_STRINGPARAM( sHash ) );
3141 sDebugText += UniString::CreateFromInt32( TWIP_TO_MM100(rNumFmt.GetFirstLineIndent() ) );
3142 sDebugText.AppendAscii( RTL_CONSTASCII_STRINGPARAM( sHash ) );
3143 sDebugText += UniString::CreateFromInt32( TWIP_TO_MM100(rNumFmt.GetIndentAt() ) );
3144 rFixed.SetText(sDebugText);
3145 }
3146
3147 }
3148 #endif
3149
3150 /*-----------------03.12.97 10:06-------------------
3151
3152 --------------------------------------------------*/
InitControls()3153 void SvxNumPositionTabPage::InitControls()
3154 {
3155 bInInintControl = sal_True;
3156 // --> OD 2008-01-11 #newlistlevelattrs#
3157 const bool bRelative = !bLabelAlignmentPosAndSpaceModeActive &&
3158 aRelativeCB.IsEnabled() && aRelativeCB.IsChecked();
3159 // <--
3160 const bool bSingleSelection = aLevelLB.GetSelectEntryCount() == 1 &&
3161 USHRT_MAX != nActNumLvl;
3162
3163 aDistBorderMF.Enable( !bLabelAlignmentPosAndSpaceModeActive &&
3164 ( bSingleSelection || bRelative ) );
3165 aDistBorderFT.Enable( !bLabelAlignmentPosAndSpaceModeActive &&
3166 ( bSingleSelection || bRelative ) );
3167
3168 bool bSetDistEmpty = false;
3169 bool bSameDistBorderNum = !bLabelAlignmentPosAndSpaceModeActive;
3170 bool bSameDist = !bLabelAlignmentPosAndSpaceModeActive;
3171 bool bSameIndent = !bLabelAlignmentPosAndSpaceModeActive;
3172 bool bSameAdjust = true;
3173
3174 // --> OD 2008-01-11 #newlistlevelattrs#
3175 bool bSameLabelFollowedBy = bLabelAlignmentPosAndSpaceModeActive;
3176 bool bSameListtab = bLabelAlignmentPosAndSpaceModeActive;
3177 bool bSameAlignAt = bLabelAlignmentPosAndSpaceModeActive;
3178 bool bSameIndentAt = bLabelAlignmentPosAndSpaceModeActive;
3179 // <--
3180
3181 const SvxNumberFormat* aNumFmtArr[SVX_MAX_NUM];
3182 sal_uInt16 nMask = 1;
3183 sal_uInt16 nLvl = USHRT_MAX;
3184 long nFirstBorderText = 0;
3185 long nFirstBorderTextRelative = -1;
3186 for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
3187 {
3188 aNumFmtArr[i] = &pActNum->GetLevel(i);
3189 if(nActNumLvl & nMask)
3190 {
3191 if(USHRT_MAX == nLvl)
3192 {
3193 nLvl = i;
3194 if ( !bLabelAlignmentPosAndSpaceModeActive )
3195 {
3196 nFirstBorderText = nLvl > 0 ?
3197 aNumFmtArr[nLvl]->GetAbsLSpace() + aNumFmtArr[nLvl]->GetFirstLineOffset() -
3198 aNumFmtArr[nLvl - 1]->GetAbsLSpace() + aNumFmtArr[nLvl - 1]->GetFirstLineOffset():
3199 aNumFmtArr[nLvl]->GetAbsLSpace() + aNumFmtArr[nLvl]->GetFirstLineOffset();
3200 }
3201 }
3202
3203 if( i > nLvl)
3204 {
3205 // --> OD 2008-01-11 #newlistlevelattrs#
3206 bSameAdjust &= aNumFmtArr[i]->GetNumAdjust() == aNumFmtArr[nLvl]->GetNumAdjust();
3207 if ( !bLabelAlignmentPosAndSpaceModeActive )
3208 {
3209 if(bRelative)
3210 {
3211 if(nFirstBorderTextRelative == -1)
3212 nFirstBorderTextRelative =
3213 (aNumFmtArr[i]->GetAbsLSpace() + aNumFmtArr[i]->GetFirstLineOffset() -
3214 aNumFmtArr[i - 1]->GetAbsLSpace() + aNumFmtArr[i - 1]->GetFirstLineOffset());
3215 else
3216 bSameDistBorderNum &= nFirstBorderTextRelative ==
3217 (aNumFmtArr[i]->GetAbsLSpace() + aNumFmtArr[i]->GetFirstLineOffset() -
3218 aNumFmtArr[i - 1]->GetAbsLSpace() + aNumFmtArr[i - 1]->GetFirstLineOffset());
3219 }
3220 else
3221 bSameDistBorderNum &=
3222 aNumFmtArr[i]->GetAbsLSpace() - aNumFmtArr[i]->GetFirstLineOffset() ==
3223 aNumFmtArr[i - 1]->GetAbsLSpace() - aNumFmtArr[i - 1]->GetFirstLineOffset();
3224
3225 bSameDist &= aNumFmtArr[i]->GetCharTextDistance() == aNumFmtArr[nLvl]->GetCharTextDistance();
3226 bSameIndent &= aNumFmtArr[i]->GetFirstLineOffset() == aNumFmtArr[nLvl]->GetFirstLineOffset();
3227 }
3228 else
3229 {
3230 bSameLabelFollowedBy &=
3231 aNumFmtArr[i]->GetLabelFollowedBy() == aNumFmtArr[nLvl]->GetLabelFollowedBy();
3232 bSameListtab &=
3233 aNumFmtArr[i]->GetListtabPos() == aNumFmtArr[nLvl]->GetListtabPos();
3234 bSameAlignAt &=
3235 ( ( aNumFmtArr[i]->GetIndentAt() + aNumFmtArr[i]->GetFirstLineIndent() )
3236 == ( aNumFmtArr[nLvl]->GetIndentAt() + aNumFmtArr[nLvl]->GetFirstLineIndent() ) );
3237 bSameIndentAt &=
3238 aNumFmtArr[i]->GetIndentAt() == aNumFmtArr[nLvl]->GetIndentAt();
3239 }
3240 // <--
3241 }
3242 }
3243 nMask <<= 1;
3244
3245 }
3246 if (SVX_MAX_NUM <= nLvl)
3247 {
3248 OSL_ENSURE(false, "cannot happen.");
3249 return;
3250 }
3251
3252 if(bSameDistBorderNum)
3253 {
3254 long nDistBorderNum;
3255 if(bRelative)
3256 {
3257 nDistBorderNum = (long)aNumFmtArr[nLvl]->GetAbsLSpace()+ aNumFmtArr[nLvl]->GetFirstLineOffset();
3258 if(nLvl)
3259 nDistBorderNum -= (long)aNumFmtArr[nLvl - 1]->GetAbsLSpace()+ aNumFmtArr[nLvl - 1]->GetFirstLineOffset();
3260 }
3261 else
3262 {
3263 nDistBorderNum = (long)aNumFmtArr[nLvl]->GetAbsLSpace()+ aNumFmtArr[nLvl]->GetFirstLineOffset();
3264 }
3265 SetMetricValue(aDistBorderMF, nDistBorderNum, eCoreUnit);
3266 }
3267 else
3268 bSetDistEmpty = true;
3269
3270 #if OSL_DEBUG_LEVEL > 1
3271 lcl_PrintDebugOutput(*pDebugFixedText, *aNumFmtArr[nLvl]);
3272 #endif
3273
3274 const String aEmptyStr;
3275 if(bSameDist)
3276 SetMetricValue(aDistNumMF, aNumFmtArr[nLvl]->GetCharTextDistance(), eCoreUnit);
3277 else
3278 aDistNumMF.SetText(aEmptyStr);
3279 if(bSameIndent)
3280 SetMetricValue(aIndentMF, - aNumFmtArr[nLvl]->GetFirstLineOffset(), eCoreUnit);
3281 else
3282 aIndentMF.SetText(aEmptyStr);
3283
3284 if(bSameAdjust)
3285 {
3286 sal_uInt16 nPos = 1; // zentriert
3287 if(aNumFmtArr[nLvl]->GetNumAdjust() == SVX_ADJUST_LEFT)
3288 nPos = 0;
3289 else if(aNumFmtArr[nLvl]->GetNumAdjust() == SVX_ADJUST_RIGHT)
3290 nPos = 2;
3291 aAlignLB.SelectEntryPos(nPos);
3292 // --> OD 2008-01-11 #newlistlevelattrs#
3293 aAlign2LB.SelectEntryPos( nPos );
3294 // <--
3295 }
3296 else
3297 {
3298 aAlignLB.SetNoSelection();
3299 // --> OD 2008-01-11 #newlistlevelattrs#
3300 aAlign2LB.SetNoSelection();
3301 // <--
3302 }
3303
3304 // --> OD 2008-01-11 #newlistlevelattrs#
3305 if ( bSameLabelFollowedBy )
3306 {
3307 sal_uInt16 nPos = 0; // LISTTAB
3308 if ( aNumFmtArr[nLvl]->GetLabelFollowedBy() == SvxNumberFormat::SPACE )
3309 {
3310 nPos = 1;
3311 }
3312 else if ( aNumFmtArr[nLvl]->GetLabelFollowedBy() == SvxNumberFormat::NOTHING )
3313 {
3314 nPos = 2;
3315 }
3316 aLabelFollowedByLB.SelectEntryPos( nPos );
3317 }
3318 else
3319 {
3320 aLabelFollowedByLB.SetNoSelection();
3321 }
3322
3323 if ( aNumFmtArr[nLvl]->GetLabelFollowedBy() == SvxNumberFormat::LISTTAB )
3324 {
3325 aListtabFT.Enable( true );
3326 aListtabMF.Enable( true );
3327 if ( bSameListtab )
3328 {
3329 SetMetricValue( aListtabMF, aNumFmtArr[nLvl]->GetListtabPos(), eCoreUnit );
3330 }
3331 else
3332 {
3333 aListtabMF.SetText(aEmptyStr);
3334 }
3335 }
3336 else
3337 {
3338 aListtabFT.Enable( false );
3339 aListtabMF.Enable( false );
3340 aListtabMF.SetText(aEmptyStr);
3341 }
3342
3343 if ( bSameAlignAt )
3344 {
3345 SetMetricValue( aAlignedAtMF,
3346 aNumFmtArr[nLvl]->GetIndentAt() + aNumFmtArr[nLvl]->GetFirstLineIndent(),
3347 eCoreUnit );
3348 }
3349 else
3350 {
3351 aAlignedAtMF.SetText(aEmptyStr);
3352 }
3353
3354 if ( bSameIndentAt )
3355 {
3356 SetMetricValue( aIndentAtMF, aNumFmtArr[nLvl]->GetIndentAt(), eCoreUnit );
3357 }
3358 else
3359 {
3360 aIndentAtMF.SetText(aEmptyStr);
3361 }
3362 // <--
3363
3364 if ( bSetDistEmpty )
3365 aDistBorderMF.SetText(aEmptyStr);
3366
3367 bInInintControl = sal_False;
3368 }
3369
3370 /*-----------------03.12.97 10:02-------------------
3371
3372 --------------------------------------------------*/
ActivatePage(const SfxItemSet & rSet)3373 void SvxNumPositionTabPage::ActivatePage(const SfxItemSet& rSet)
3374 {
3375 const SfxPoolItem* pItem;
3376 sal_uInt16 nTmpNumLvl = USHRT_MAX;
3377 const SfxItemSet* pExampleSet = GetTabDialog()->GetExampleSet();
3378 if(pExampleSet)
3379 {
3380 if(SFX_ITEM_SET == pExampleSet->GetItemState(SID_PARAM_NUM_PRESET, sal_False, &pItem))
3381 bPreset = ((const SfxBoolItem*)pItem)->GetValue();
3382 if(SFX_ITEM_SET == pExampleSet->GetItemState(SID_PARAM_CUR_NUM_LEVEL, sal_False, &pItem))
3383 nTmpNumLvl = ((const SfxUInt16Item*)pItem)->GetValue();
3384 }
3385 //
3386 if(SFX_ITEM_SET == rSet.GetItemState(nNumItemId, sal_False, &pItem))
3387 {
3388 delete pSaveNum;
3389 pSaveNum = new SvxNumRule(*((SvxNumBulletItem*)pItem)->GetNumRule());
3390 }
3391 bModified = (!pActNum->Get( 0 ) || bPreset);
3392 if(*pSaveNum != *pActNum ||
3393 nActNumLvl != nTmpNumLvl )
3394 {
3395 *pActNum = *pSaveNum;
3396 nActNumLvl = nTmpNumLvl;
3397 sal_uInt16 nMask = 1;
3398 aLevelLB.SetUpdateMode(sal_False);
3399 aLevelLB.SetNoSelection();
3400 aLevelLB.SelectEntryPos( pActNum->GetLevelCount(), nActNumLvl == USHRT_MAX);
3401 if(nActNumLvl != USHRT_MAX)
3402 for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
3403 {
3404 if(nActNumLvl & nMask)
3405 aLevelLB.SelectEntryPos( i, sal_True);
3406 nMask <<= 1 ;
3407 }
3408 aRelativeCB.Enable(nActNumLvl != 1);
3409 aLevelLB.SetUpdateMode(sal_True);
3410
3411 // --> OD 2008-01-11 #newlistlevelattrs#
3412 InitPosAndSpaceMode();
3413 ShowControlsDependingOnPosAndSpaceMode();
3414 // <--
3415
3416 InitControls();
3417 }
3418 pPreviewWIN->SetLevel(nActNumLvl);
3419 pPreviewWIN->Invalidate();
3420 }
3421
3422 /*-----------------03.12.97 10:02-------------------
3423
3424 --------------------------------------------------*/
DeactivatePage(SfxItemSet * _pSet)3425 int SvxNumPositionTabPage::DeactivatePage(SfxItemSet *_pSet)
3426 {
3427 if(_pSet)
3428 FillItemSet(*_pSet);
3429 return sal_True;
3430 }
3431
3432 /*-----------------03.12.97 10:02-------------------
3433
3434 --------------------------------------------------*/
FillItemSet(SfxItemSet & rSet)3435 sal_Bool SvxNumPositionTabPage::FillItemSet( SfxItemSet& rSet )
3436 {
3437 rSet.Put(SfxUInt16Item(SID_PARAM_CUR_NUM_LEVEL, nActNumLvl));
3438
3439 if(bModified && pActNum)
3440 {
3441 *pSaveNum = *pActNum;
3442 rSet.Put(SvxNumBulletItem( *pSaveNum ), nNumItemId);
3443 rSet.Put(SfxBoolItem(SID_PARAM_NUM_PRESET, sal_False));
3444 }
3445 return bModified;
3446 }
3447
3448 /*-----------------03.12.97 10:02-------------------
3449
3450 --------------------------------------------------*/
Reset(const SfxItemSet & rSet)3451 void SvxNumPositionTabPage::Reset( const SfxItemSet& rSet )
3452 {
3453 const SfxPoolItem* pItem;
3454 //im Draw gibt es das Item als WhichId, im Writer nur als SlotId
3455 SfxItemState eState = rSet.GetItemState(SID_ATTR_NUMBERING_RULE, sal_False, &pItem);
3456 if(eState != SFX_ITEM_SET)
3457 {
3458 nNumItemId = rSet.GetPool()->GetWhich(SID_ATTR_NUMBERING_RULE);
3459 eState = rSet.GetItemState(nNumItemId, sal_False, &pItem);
3460
3461 if( eState != SFX_ITEM_SET )
3462 {
3463 pItem = &static_cast< const SvxNumBulletItem& >( rSet.Get( nNumItemId, sal_True ) );
3464 eState = SFX_ITEM_SET;
3465 }
3466
3467 }
3468 DBG_ASSERT(eState == SFX_ITEM_SET, "kein Item gefunden!");
3469 delete pSaveNum;
3470 pSaveNum = new SvxNumRule(*((SvxNumBulletItem*)pItem)->GetNumRule());
3471
3472 // Ebenen einfuegen
3473 if(!aLevelLB.GetEntryCount())
3474 {
3475 for(sal_uInt16 i = 1; i <= pSaveNum->GetLevelCount(); i++)
3476 aLevelLB.InsertEntry(UniString::CreateFromInt32(i));
3477 if(pSaveNum->GetLevelCount() > 1)
3478 {
3479 String sEntry( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "1 - ") ) );
3480 sEntry.Append( UniString::CreateFromInt32( pSaveNum->GetLevelCount() ) );
3481 aLevelLB.InsertEntry(sEntry);
3482 aLevelLB.SelectEntry(sEntry);
3483 }
3484 else
3485 aLevelLB.SelectEntryPos(0);
3486 }
3487 else
3488 aLevelLB.SelectEntryPos(aLevelLB.GetEntryCount() - 1);
3489 sal_uInt16 nMask = 1;
3490 aLevelLB.SetUpdateMode(sal_False);
3491 aLevelLB.SetNoSelection();
3492 if(nActNumLvl == USHRT_MAX)
3493 {
3494 aLevelLB.SelectEntryPos( pSaveNum->GetLevelCount(), sal_True);
3495 }
3496 else
3497 for(sal_uInt16 i = 0; i < pSaveNum->GetLevelCount(); i++)
3498 {
3499 if(nActNumLvl & nMask)
3500 aLevelLB.SelectEntryPos( i, sal_True);
3501 nMask <<= 1;
3502 }
3503 aLevelLB.SetUpdateMode(sal_True);
3504
3505 if(!pActNum)
3506 pActNum = new SvxNumRule(*pSaveNum);
3507 else if(*pSaveNum != *pActNum)
3508 *pActNum = *pSaveNum;
3509 pPreviewWIN->SetNumRule(pActNum);
3510
3511 // --> OD 2008-01-11 #newlistlevelattrs#
3512 InitPosAndSpaceMode();
3513 ShowControlsDependingOnPosAndSpaceMode();
3514 // const sal_Bool bDraw = pActNum->IsFeatureSupported(NUM_CONTINUOUS);
3515 // aDistNumFT.Show(bDraw);
3516 // aDistNumMF.Show(bDraw);
3517 // <--
3518
3519 InitControls();
3520 bModified = sal_False;
3521 }
3522
3523 // --> OD 2008-01-11 #newlistlevelattrs#
InitPosAndSpaceMode()3524 void SvxNumPositionTabPage::InitPosAndSpaceMode()
3525 {
3526 if ( pActNum == 0 )
3527 {
3528 DBG_ASSERT( false,
3529 "<SvxNumPositionTabPage::InitPosAndSpaceMode()> - misusage of method -> <pAktNum> has to be already set!" );
3530 return;
3531 }
3532
3533 SvxNumberFormat::SvxNumPositionAndSpaceMode ePosAndSpaceMode =
3534 SvxNumberFormat::LABEL_ALIGNMENT;
3535 sal_uInt16 nMask = 1;
3536 for( sal_uInt16 i = 0; i < pActNum->GetLevelCount(); ++i )
3537 {
3538 if(nActNumLvl & nMask)
3539 {
3540 SvxNumberFormat aNumFmt( pActNum->GetLevel(i) );
3541 ePosAndSpaceMode = aNumFmt.GetPositionAndSpaceMode();
3542 if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
3543 {
3544 break;
3545 }
3546 }
3547 nMask <<= 1;
3548 }
3549
3550 bLabelAlignmentPosAndSpaceModeActive =
3551 ePosAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT;
3552 }
3553
ShowControlsDependingOnPosAndSpaceMode()3554 void SvxNumPositionTabPage::ShowControlsDependingOnPosAndSpaceMode()
3555 {
3556 aDistBorderFT.Show( !bLabelAlignmentPosAndSpaceModeActive );
3557 aDistBorderMF.Show( !bLabelAlignmentPosAndSpaceModeActive );
3558 aRelativeCB.Show( !bLabelAlignmentPosAndSpaceModeActive );
3559 aIndentFT.Show( !bLabelAlignmentPosAndSpaceModeActive );
3560 aIndentMF.Show( !bLabelAlignmentPosAndSpaceModeActive );
3561 aDistNumFT.Show( !bLabelAlignmentPosAndSpaceModeActive &&
3562 pActNum->IsFeatureSupported(NUM_CONTINUOUS) );
3563 aDistNumMF.Show( !bLabelAlignmentPosAndSpaceModeActive &&
3564 pActNum->IsFeatureSupported(NUM_CONTINUOUS));
3565 aAlignFT.Show( !bLabelAlignmentPosAndSpaceModeActive );
3566 aAlignLB.Show( !bLabelAlignmentPosAndSpaceModeActive );
3567
3568 aLabelFollowedByFT.Show( bLabelAlignmentPosAndSpaceModeActive );
3569 aLabelFollowedByLB.Show( bLabelAlignmentPosAndSpaceModeActive );
3570 aListtabFT.Show( bLabelAlignmentPosAndSpaceModeActive );
3571 aListtabMF.Show( bLabelAlignmentPosAndSpaceModeActive );
3572 aAlign2FT.Show( bLabelAlignmentPosAndSpaceModeActive );
3573 aAlign2LB.Show( bLabelAlignmentPosAndSpaceModeActive );
3574 aAlignedAtFT.Show( bLabelAlignmentPosAndSpaceModeActive );
3575 aAlignedAtMF.Show( bLabelAlignmentPosAndSpaceModeActive );
3576 aIndentAtFT.Show( bLabelAlignmentPosAndSpaceModeActive );
3577 aIndentAtMF.Show( bLabelAlignmentPosAndSpaceModeActive );
3578 }
3579 // <--
3580
3581 /*-----------------03.12.97 10:02-------------------
3582
3583 --------------------------------------------------*/
Create(Window * pParent,const SfxItemSet & rAttrSet)3584 SfxTabPage* SvxNumPositionTabPage::Create( Window* pParent,
3585 const SfxItemSet& rAttrSet)
3586 {
3587 return new SvxNumPositionTabPage(pParent, rAttrSet);
3588 }
3589
3590 /*-----------------04.12.97 12:51-------------------
3591
3592 --------------------------------------------------*/
SetMetric(FieldUnit eMetric)3593 void SvxNumPositionTabPage::SetMetric(FieldUnit eMetric)
3594 {
3595 if(eMetric == FUNIT_MM)
3596 {
3597 aDistBorderMF .SetDecimalDigits(1);
3598 aDistNumMF .SetDecimalDigits(1);
3599 aIndentMF .SetDecimalDigits(1);
3600 // --> OD 2008-02-18 #newlistlevelattrs#
3601 aListtabMF.SetDecimalDigits(1);
3602 aAlignedAtMF.SetDecimalDigits(1);
3603 aIndentAtMF.SetDecimalDigits(1);
3604 // <--
3605 }
3606 aDistBorderMF .SetUnit( eMetric );
3607 aDistNumMF .SetUnit( eMetric );
3608 aIndentMF .SetUnit( eMetric );
3609 // --> OD 2008-02-18 #newlistlevelattrs#
3610 aListtabMF.SetUnit( eMetric );
3611 aAlignedAtMF.SetUnit( eMetric );
3612 aIndentAtMF.SetUnit( eMetric );
3613 // <--
3614 }
3615
3616 /*-----------------03.12.97 11:06-------------------
3617
3618 --------------------------------------------------*/
IMPL_LINK(SvxNumPositionTabPage,EditModifyHdl_Impl,Edit *,EMPTYARG)3619 IMPL_LINK( SvxNumPositionTabPage, EditModifyHdl_Impl, Edit *, EMPTYARG )
3620 {
3621 sal_uInt16 nMask = 1;
3622 for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
3623 {
3624 if(nActNumLvl & nMask)
3625 {
3626 SvxNumberFormat aNumFmt(pActNum->GetLevel(i));
3627
3628 // --> OD 2008-01-11 #newlistlevelattrs#
3629 const sal_uInt16 nPos = aAlignLB.IsVisible()
3630 ? aAlignLB.GetSelectEntryPos()
3631 : aAlign2LB.GetSelectEntryPos();
3632 // <--
3633 SvxAdjust eAdjust = SVX_ADJUST_CENTER;
3634 if(nPos == 0)
3635 eAdjust = SVX_ADJUST_LEFT;
3636 else if(nPos == 2)
3637 eAdjust = SVX_ADJUST_RIGHT;
3638 aNumFmt.SetNumAdjust( eAdjust );
3639 pActNum->SetLevel(i, aNumFmt);
3640 }
3641 nMask <<= 1;
3642 }
3643 SetModified();
3644 return 0;
3645 }
3646 /*-----------------03.12.97 11:11-------------------
3647
3648 --------------------------------------------------*/
IMPL_LINK(SvxNumPositionTabPage,LevelHdl_Impl,ListBox *,pBox)3649 IMPL_LINK( SvxNumPositionTabPage, LevelHdl_Impl, ListBox *, pBox )
3650 {
3651 sal_uInt16 nSaveNumLvl = nActNumLvl;
3652 nActNumLvl = 0;
3653 if(pBox->IsEntryPosSelected( pActNum->GetLevelCount() ) &&
3654 (pBox->GetSelectEntryCount() == 1 || nSaveNumLvl != 0xffff))
3655 {
3656 nActNumLvl = 0xFFFF;
3657 pBox->SetUpdateMode(sal_False);
3658 for( sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++ )
3659 pBox->SelectEntryPos( i, sal_False );
3660 pBox->SetUpdateMode(sal_True);
3661 }
3662 else if(pBox->GetSelectEntryCount())
3663 {
3664 sal_uInt16 nMask = 1;
3665 for( sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++ )
3666 {
3667 if(pBox->IsEntryPosSelected( i ))
3668 nActNumLvl |= nMask;
3669 nMask <<= 1;
3670 }
3671 pBox->SelectEntryPos( pActNum->GetLevelCount(), sal_False );
3672 }
3673 else
3674 {
3675 nActNumLvl = nSaveNumLvl;
3676 sal_uInt16 nMask = 1;
3677 for( sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++ )
3678 {
3679 if(nActNumLvl & nMask)
3680 {
3681 pBox->SelectEntryPos(i);
3682 break;
3683 }
3684 nMask <<=1;
3685 }
3686 }
3687 aRelativeCB.Enable(nActNumLvl != 1);
3688 SetModified();
3689 // --> OD 2008-01-15 #newlistlevelattrs#
3690 InitPosAndSpaceMode();
3691 ShowControlsDependingOnPosAndSpaceMode();
3692 // <--
3693 InitControls();
3694 return 0;
3695 }
3696 /*-----------------03.12.97 12:24-------------------
3697
3698 --------------------------------------------------*/
IMPL_LINK(SvxNumPositionTabPage,DistanceHdl_Impl,MetricField *,pFld)3699 IMPL_LINK( SvxNumPositionTabPage, DistanceHdl_Impl, MetricField *, pFld )
3700 {
3701 if(bInInintControl)
3702 return 0;
3703 long nValue = GetCoreValue(*pFld, eCoreUnit);
3704 sal_uInt16 nMask = 1;
3705 #if OSL_DEBUG_LEVEL > 1
3706 sal_Bool bFirst = sal_True;
3707 #endif
3708 for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
3709 {
3710 if(nActNumLvl & nMask)
3711 {
3712 SvxNumberFormat aNumFmt( pActNum->GetLevel( i ) );
3713 if(pFld == &aDistBorderMF)
3714 {
3715
3716 if(aRelativeCB.IsChecked())
3717 {
3718 if(0 == i)
3719 {
3720 long nTmp = aNumFmt.GetFirstLineOffset();
3721 aNumFmt.SetAbsLSpace( sal_uInt16(nValue - nTmp));
3722 }
3723 else
3724 {
3725 long nTmp = pActNum->GetLevel( i - 1 ).GetAbsLSpace() +
3726 pActNum->GetLevel( i - 1 ).GetFirstLineOffset() -
3727 pActNum->GetLevel( i ).GetFirstLineOffset();
3728
3729 aNumFmt.SetAbsLSpace( sal_uInt16(nValue + nTmp));
3730 }
3731 }
3732 else
3733 {
3734 aNumFmt.SetAbsLSpace( (short)nValue - aNumFmt.GetFirstLineOffset());
3735 }
3736 }
3737 else if(pFld == &aDistNumMF)
3738 {
3739 aNumFmt.SetCharTextDistance( (short)nValue );
3740 }
3741 else if(pFld == &aIndentMF)
3742 {
3743 //jetzt muss mit dem FirstLineOffset auch der AbsLSpace veraendert werden
3744 long nDiff = nValue + aNumFmt.GetFirstLineOffset();
3745 long nAbsLSpace = aNumFmt.GetAbsLSpace();
3746 aNumFmt.SetAbsLSpace(sal_uInt16(nAbsLSpace + nDiff));
3747 aNumFmt.SetFirstLineOffset( -(short)nValue );
3748 }
3749
3750 #if OSL_DEBUG_LEVEL > 1
3751 if(bFirst)
3752 lcl_PrintDebugOutput(*pDebugFixedText, aNumFmt);
3753 bFirst = sal_False;
3754 #endif
3755 pActNum->SetLevel( i, aNumFmt );
3756 }
3757 nMask <<= 1;
3758 }
3759
3760 SetModified();
3761 if(!aDistBorderMF.IsEnabled())
3762 {
3763 String aEmptyStr;
3764 aDistBorderMF.SetText(aEmptyStr);
3765 }
3766
3767 return 0;
3768 }
3769
3770 /*-----------------04.12.97 12:35-------------------
3771
3772 --------------------------------------------------*/
IMPL_LINK(SvxNumPositionTabPage,RelativeHdl_Impl,CheckBox *,pBox)3773 IMPL_LINK( SvxNumPositionTabPage, RelativeHdl_Impl, CheckBox *, pBox )
3774 {
3775 sal_Bool bOn = pBox->IsChecked();
3776 sal_Bool bSingleSelection = aLevelLB.GetSelectEntryCount() == 1 && USHRT_MAX != nActNumLvl;
3777 sal_Bool bSetValue = sal_False;
3778 long nValue = 0;
3779 if(bOn || bSingleSelection)
3780 {
3781 sal_uInt16 nMask = 1;
3782 sal_Bool bFirst = sal_True;
3783 bSetValue = sal_True;
3784 for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
3785 {
3786 if(nActNumLvl & nMask)
3787 {
3788 const SvxNumberFormat &rNumFmt = pActNum->GetLevel(i);
3789 if(bFirst)
3790 {
3791 nValue = rNumFmt.GetAbsLSpace() + rNumFmt.GetFirstLineOffset();
3792 if(bOn && i)
3793 nValue -= (pActNum->GetLevel(i - 1).GetAbsLSpace() + pActNum->GetLevel(i - 1).GetFirstLineOffset());
3794 }
3795 else
3796 bSetValue = nValue ==
3797 (rNumFmt.GetAbsLSpace() + rNumFmt.GetFirstLineOffset()) -
3798 (pActNum->GetLevel(i - 1).GetAbsLSpace() + pActNum->GetLevel(i - 1).GetFirstLineOffset());
3799 bFirst = sal_False;
3800 }
3801 nMask <<= 1;
3802 }
3803
3804 }
3805 String aEmptyStr;
3806 if(bSetValue)
3807 SetMetricValue(aDistBorderMF, nValue, eCoreUnit);
3808 else
3809 aDistBorderMF.SetText(aEmptyStr);
3810 aDistBorderMF.Enable(bOn || bSingleSelection);
3811 aDistBorderFT.Enable(bOn || bSingleSelection);
3812 bLastRelative = bOn;
3813 return 0;
3814 }
3815
3816 // --> OD 2008-01-14 #newlistlevelattrs#
IMPL_LINK(SvxNumPositionTabPage,LabelFollowedByHdl_Impl,ListBox *,EMPTYARG)3817 IMPL_LINK( SvxNumPositionTabPage, LabelFollowedByHdl_Impl, ListBox*, EMPTYARG )
3818 {
3819 // determine value to be set at the chosen list levels
3820 SvxNumberFormat::SvxNumLabelFollowedBy eLabelFollowedBy =
3821 SvxNumberFormat::LISTTAB;
3822 {
3823 const sal_uInt16 nPos = aLabelFollowedByLB.GetSelectEntryPos();
3824 if ( nPos == 1 )
3825 {
3826 eLabelFollowedBy = SvxNumberFormat::SPACE;
3827 }
3828 else if ( nPos == 2 )
3829 {
3830 eLabelFollowedBy = SvxNumberFormat::NOTHING;
3831 }
3832 }
3833
3834 // set value at the chosen list levels
3835 bool bSameListtabPos = true;
3836 sal_uInt16 nFirstLvl = USHRT_MAX;
3837 sal_uInt16 nMask = 1;
3838 for( sal_uInt16 i = 0; i < pActNum->GetLevelCount(); ++i )
3839 {
3840 if ( nActNumLvl & nMask )
3841 {
3842 SvxNumberFormat aNumFmt( pActNum->GetLevel(i) );
3843 aNumFmt.SetLabelFollowedBy( eLabelFollowedBy );
3844 pActNum->SetLevel( i, aNumFmt );
3845
3846 if ( nFirstLvl == USHRT_MAX )
3847 {
3848 nFirstLvl = i;
3849 }
3850 else
3851 {
3852 bSameListtabPos &= aNumFmt.GetListtabPos() ==
3853 pActNum->GetLevel( nFirstLvl ).GetListtabPos();
3854 }
3855 }
3856 nMask <<= 1;
3857 }
3858
3859 // enable/disable metric field for list tab stop position depending on
3860 // selected item following the list label.
3861 aListtabFT.Enable( eLabelFollowedBy == SvxNumberFormat::LISTTAB );
3862 aListtabMF.Enable( eLabelFollowedBy == SvxNumberFormat::LISTTAB );
3863 if ( bSameListtabPos && eLabelFollowedBy == SvxNumberFormat::LISTTAB )
3864 {
3865 SetMetricValue( aListtabMF, pActNum->GetLevel( nFirstLvl ).GetListtabPos(), eCoreUnit );
3866 }
3867 else
3868 {
3869 aListtabMF.SetText( String() );
3870 }
3871
3872 SetModified();
3873
3874 return 0;
3875 }
3876 // <--
3877
3878 // --> OD 2008-01-14 #newlistlevelattrs#
IMPL_LINK(SvxNumPositionTabPage,ListtabPosHdl_Impl,MetricField *,pFld)3879 IMPL_LINK( SvxNumPositionTabPage, ListtabPosHdl_Impl, MetricField*, pFld )
3880 {
3881 // determine value to be set at the chosen list levels
3882 const long nValue = GetCoreValue( *pFld, eCoreUnit );
3883
3884 // set value at the chosen list levels
3885 sal_uInt16 nMask = 1;
3886 for( sal_uInt16 i = 0; i < pActNum->GetLevelCount(); ++i )
3887 {
3888 if ( nActNumLvl & nMask )
3889 {
3890 SvxNumberFormat aNumFmt( pActNum->GetLevel(i) );
3891 aNumFmt.SetListtabPos( nValue );
3892 pActNum->SetLevel( i, aNumFmt );
3893 #if OSL_DEBUG_LEVEL > 1
3894 lcl_PrintDebugOutput(*pDebugFixedText, aNumFmt);
3895 #endif
3896 }
3897 nMask <<= 1;
3898 }
3899
3900 SetModified();
3901
3902 return 0;
3903 }
3904 // <--
3905
3906 // --> OD 2008-01-14 #newlistlevelattrs#
IMPL_LINK(SvxNumPositionTabPage,AlignAtHdl_Impl,MetricField *,pFld)3907 IMPL_LINK( SvxNumPositionTabPage, AlignAtHdl_Impl, MetricField*, pFld )
3908 {
3909 // determine value to be set at the chosen list levels
3910 const long nValue = GetCoreValue( *pFld, eCoreUnit );
3911
3912 // set value at the chosen list levels
3913 sal_uInt16 nMask = 1;
3914 for( sal_uInt16 i = 0; i < pActNum->GetLevelCount(); ++i )
3915 {
3916 if ( nActNumLvl & nMask )
3917 {
3918 SvxNumberFormat aNumFmt( pActNum->GetLevel(i) );
3919 const long nFirstLineIndent = nValue - aNumFmt.GetIndentAt();
3920 aNumFmt.SetFirstLineIndent( nFirstLineIndent );
3921 pActNum->SetLevel( i, aNumFmt );
3922 #if OSL_DEBUG_LEVEL > 1
3923 lcl_PrintDebugOutput(*pDebugFixedText, aNumFmt);
3924 #endif
3925 }
3926 nMask <<= 1;
3927 }
3928
3929 SetModified();
3930
3931 return 0;
3932 }
3933 // <--
3934
3935 // --> OD 2008-01-14 #newlistlevelattrs#
IMPL_LINK(SvxNumPositionTabPage,IndentAtHdl_Impl,MetricField *,pFld)3936 IMPL_LINK( SvxNumPositionTabPage, IndentAtHdl_Impl, MetricField*, pFld )
3937 {
3938 // determine value to be set at the chosen list levels
3939 const long nValue = GetCoreValue( *pFld, eCoreUnit );
3940
3941 // set value at the chosen list levels
3942 sal_uInt16 nMask = 1;
3943 for( sal_uInt16 i = 0; i < pActNum->GetLevelCount(); ++i )
3944 {
3945 if ( nActNumLvl & nMask )
3946 {
3947 SvxNumberFormat aNumFmt( pActNum->GetLevel(i) );
3948 const long nAlignedAt = aNumFmt.GetIndentAt() +
3949 aNumFmt.GetFirstLineIndent();
3950 aNumFmt.SetIndentAt( nValue );
3951 const long nNewFirstLineIndent = nAlignedAt - nValue;
3952 aNumFmt.SetFirstLineIndent( nNewFirstLineIndent );
3953 pActNum->SetLevel( i, aNumFmt );
3954 #if OSL_DEBUG_LEVEL > 1
3955 lcl_PrintDebugOutput(*pDebugFixedText, aNumFmt);
3956 #endif
3957 }
3958 nMask <<= 1;
3959 }
3960
3961 SetModified();
3962
3963 return 0;
3964 }
3965 // <--
3966 /*-----------------05.12.97 15:33-------------------
3967
3968 --------------------------------------------------*/
IMPL_LINK(SvxNumPositionTabPage,StandardHdl_Impl,PushButton *,EMPTYARG)3969 IMPL_LINK( SvxNumPositionTabPage, StandardHdl_Impl, PushButton *, EMPTYARG )
3970 {
3971 sal_uInt16 nMask = 1;
3972 // --> OD 2008-02-11 #newlistlevelattrs#
3973 SvxNumRule aTmpNumRule( pActNum->GetFeatureFlags(),
3974 pActNum->GetLevelCount(),
3975 pActNum->IsContinuousNumbering(),
3976 SVX_RULETYPE_NUMBERING,
3977 pActNum->GetLevel( 0 ).GetPositionAndSpaceMode() );
3978 // <--
3979 for(sal_uInt16 i = 0; i < pActNum->GetLevelCount(); i++)
3980 {
3981 if(nActNumLvl & nMask)
3982 {
3983 SvxNumberFormat aNumFmt( pActNum->GetLevel( i ) );
3984 SvxNumberFormat aTempFmt(aTmpNumRule.GetLevel( i ));
3985 // --> OD 2008-02-05 #newlistlevelattrs#
3986 aNumFmt.SetPositionAndSpaceMode( aTempFmt.GetPositionAndSpaceMode() );
3987 if ( aTempFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
3988 {
3989 aNumFmt.SetAbsLSpace( aTempFmt.GetAbsLSpace() );
3990 aNumFmt.SetCharTextDistance( aTempFmt.GetCharTextDistance() );
3991 aNumFmt.SetFirstLineOffset( aTempFmt.GetFirstLineOffset() );
3992 }
3993 else if ( aTempFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
3994 {
3995 aNumFmt.SetNumAdjust( aTempFmt.GetNumAdjust() );
3996 aNumFmt.SetLabelFollowedBy( aTempFmt.GetLabelFollowedBy() );
3997 aNumFmt.SetListtabPos( aTempFmt.GetListtabPos() );
3998 aNumFmt.SetFirstLineIndent( aTempFmt.GetFirstLineIndent() );
3999 aNumFmt.SetIndentAt( aTempFmt.GetIndentAt() );
4000 }
4001 // <--
4002
4003 pActNum->SetLevel( i, aNumFmt );
4004 }
4005 nMask <<= 1;
4006 }
4007
4008 InitControls();
4009 SetModified();
4010 return 0;
4011 }
4012
SetModified(sal_Bool bRepaint)4013 void SvxNumPositionTabPage::SetModified(sal_Bool bRepaint)
4014 {
4015 bModified = sal_True;
4016 if(bRepaint)
4017 {
4018 pPreviewWIN->SetLevel(nActNumLvl);
4019 pPreviewWIN->Invalidate();
4020 }
4021 }
4022
SetModified(sal_Bool bRepaint)4023 void SvxNumOptionsTabPage::SetModified(sal_Bool bRepaint)
4024 {
4025 bModified = sal_True;
4026 if(bRepaint)
4027 {
4028 pPreviewWIN->SetLevel(nActNumLvl);
4029 pPreviewWIN->Invalidate();
4030 }
4031 }
4032
4033 //Add CHINA001
PageCreated(SfxAllItemSet aSet)4034 void SvxNumOptionsTabPage::PageCreated(SfxAllItemSet aSet)
4035 {
4036 SFX_ITEMSET_ARG (&aSet,pListItem,SfxStringListItem,SID_CHAR_FMT_LIST_BOX,sal_False);
4037 SFX_ITEMSET_ARG (&aSet,pNumCharFmt,SfxStringItem,SID_NUM_CHAR_FMT,sal_False);
4038 SFX_ITEMSET_ARG (&aSet,pBulletCharFmt,SfxStringItem,SID_BULLET_CHAR_FMT,sal_False);
4039 SFX_ITEMSET_ARG (&aSet,pMetricItem,SfxAllEnumItem,SID_METRIC_ITEM,sal_False);
4040
4041 if (pNumCharFmt &&pBulletCharFmt)
4042 SetCharFmts( pNumCharFmt->GetValue(),pBulletCharFmt->GetValue());
4043
4044 if (pListItem)
4045 {
4046 ListBox& myCharFmtLB = GetCharFmtListBox();
4047 const List *pList = (pListItem)->GetList();
4048 sal_uInt32 nCount = pList->Count();;
4049 for(sal_uInt32 i = 0; i < nCount; i++)
4050 {
4051 myCharFmtLB.InsertEntry(*(const String*)(pList->GetObject(i)) );
4052
4053 }
4054 }
4055 if (pMetricItem)
4056 SetMetric(static_cast<FieldUnit>(pMetricItem->GetValue()));
4057 }
4058
4059 //end of add CHINA001
4060
4061 //add CHINA001 begin
4062
PageCreated(SfxAllItemSet aSet)4063 void SvxNumPositionTabPage::PageCreated(SfxAllItemSet aSet)
4064 {
4065 SFX_ITEMSET_ARG (&aSet,pMetricItem,SfxAllEnumItem,SID_METRIC_ITEM,sal_False);
4066
4067 if (pMetricItem)
4068 SetMetric(static_cast<FieldUnit>(pMetricItem->GetValue()));
4069 }
4070