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