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