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